summaryrefslogtreecommitdiff
path: root/tasks/bundle_util.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tasks/bundle_util.rb')
-rw-r--r--tasks/bundle_util.rb93
1 files changed, 93 insertions, 0 deletions
diff --git a/tasks/bundle_util.rb b/tasks/bundle_util.rb
new file mode 100644
index 0000000000..91ffa1f317
--- /dev/null
+++ b/tasks/bundle_util.rb
@@ -0,0 +1,93 @@
+require "shellwords"
+
+module BundleUtil
+ PLATFORMS = { "windows" => %w{ruby x86-mingw32} }
+
+ def project_root
+ File.expand_path("../..", __FILE__)
+ end
+
+ def bundle_platform
+ File.join(project_root, "tasks", "bin", "bundle-platform")
+ end
+
+ # Parse the output of "bundle outdated" and get the list of gems that
+ # were outdated
+ def parse_bundle_outdated(bundle_outdated_output)
+ result = []
+ bundle_outdated_output.each_line do |line|
+ if line =~ /^\s*\* (.+) \(newest ([^,]+), installed ([^,)])*/
+ gem_name, newest_version, installed_version = $1, $2, $3
+ result << [ line, gem_name ]
+ end
+ end
+ result
+ end
+
+ def with_bundle_unfrozen
+ bundle "config --delete frozen"
+ begin
+ yield
+ ensure
+ bundle "config --local frozen 1"
+ end
+ end
+
+ # Run bundle-platform with the given ruby platform(s)
+ def bundle(args, gemfile: nil, platform: nil, cwd: nil, extract_output: false, delete_gemfile_lock: false)
+ args = args.split(/\s+/)
+ if cwd
+ prefix = "[#{cwd}] "
+ end
+ cwd = File.expand_path(cwd || ".", project_root)
+ Bundler.with_clean_env do
+ Dir.chdir(cwd) do
+ gemfile ||= "Gemfile"
+ gemfile = File.expand_path(gemfile, cwd)
+ raise "No platform #{platform} (supported: #{PLATFORMS.keys.join(", ")})" if platform && !PLATFORMS[platform]
+
+ # First delete the gemfile.lock
+ if delete_gemfile_lock
+ if File.exist?("#{gemfile}.lock")
+ puts "Deleting #{gemfile}.lock ..."
+ File.delete("#{gemfile}.lock")
+ end
+ end
+
+ # Run the bundle command
+ ruby_platforms = platform ? PLATFORMS[platform].join(" ") : "ruby"
+ cmd = Shellwords.join([bundle_platform, ruby_platforms, *args])
+ puts "#{prefix}#{Shellwords.join(["bundle", *args])}#{platform ? " for #{platform} platform" : ""}:"
+ with_gemfile(gemfile) do
+ puts "#{prefix}BUNDLE_GEMFILE=#{gemfile}"
+ puts "#{prefix}> #{cmd}"
+ if extract_output
+ `#{cmd}`
+ else
+ unless system(bundle_platform, ruby_platforms, *args)
+ raise "#{bundle_platform} failed: exit code #{$?}"
+ end
+ end
+ end
+ end
+ end
+ end
+
+ def with_gemfile(gemfile)
+ old_gemfile = ENV["BUNDLE_GEMFILE"]
+ ENV["BUNDLE_GEMFILE"] = gemfile
+ begin
+ yield
+ ensure
+ if old_gemfile
+ ENV["BUNDLE_GEMFILE"] = old_gemfile
+ else
+ ENV.delete("BUNDLE_GEMFILE")
+ end
+ end
+ end
+
+ def platforms
+ PLATFORMS.keys
+ end
+end