summaryrefslogtreecommitdiff
path: root/lib/bundler/injector.rb
diff options
context:
space:
mode:
authorAgrim Mittal <agrimmittal97@gmail.com>2018-05-15 20:42:09 +0530
committerAgrim Mittal <agrimmittal97@gmail.com>2018-06-28 15:35:16 +0530
commitff0a776f55b35b4402fb646be2fa9dfebc2b0499 (patch)
tree85ed504d0c6ace2701d7abaceb36b6b076ab744b /lib/bundler/injector.rb
parent1fb0c8ff19847857c2b6a2dc162be0feab004e7e (diff)
downloadbundler-ff0a776f55b35b4402fb646be2fa9dfebc2b0499.tar.gz
Add check for gems that removes other gems
Diffstat (limited to 'lib/bundler/injector.rb')
-rw-r--r--lib/bundler/injector.rb69
1 files changed, 50 insertions, 19 deletions
diff --git a/lib/bundler/injector.rb b/lib/bundler/injector.rb
index f2de050b60..6cb30b0eda 100644
--- a/lib/bundler/injector.rb
+++ b/lib/bundler/injector.rb
@@ -61,31 +61,27 @@ module Bundler
# @param [Pathname] lockfile_path The lockfile from which to remove dependencies.
# @return [Array]
def remove(gemfile_path, lockfile_path)
+ # get initial gemfile snap shot
+ initial_gemfile = IO.readlines(gemfile_path)
+
# evaluate the Gemfile we have
builder = Dsl.new
builder.eval_gemfile(Bundler.default_gemfile)
+ # remove gems from dependencies
removed_deps = remove_gems_from_dependencies(builder, @deps)
- @definition = builder.to_definition(lockfile_path, {})
-
- remove_gems_from_gemfile(@deps, gemfile_path)
-
- # evalute the new gemfile to look for any failure cases
- builder2 = Dsl.new
- builder2.eval_gemfile(Bundler.default_gemfile)
+ # gemfile after removing requested gems
+ cleaned_gemfile = remove_gems_from_gemfile(@deps, gemfile_path)
- # record gems which could not be removed due to some reasons
- errored_gems = builder2.dependencies & removed_deps
-
- # warn user regarding those gems
- Bundler.ui.warn "#{errored_gems.map(&:name).join(", ")} could not be removed." unless errored_gems.empty?
-
- # write out the lockfile
- @definition.lock(lockfile_path)
+ # write the new gemfile
+ write_to_gemfile(gemfile_path, cleaned_gemfile)
- # return actual removed deps
- removed_deps - errored_gems
+ # check for errors
+ # including extra gems being removed
+ # or some gems not being removed
+ # and return the actual removed deps
+ cross_check_for_errors(gemfile_path, builder.dependencies, removed_deps, initial_gemfile)
end
private
@@ -179,8 +175,13 @@ module Bundler
# remove any empty (and nested) blocks
%w[group source env install_if].each {|block| remove_nested_blocks(new_gemfile, block) }
- # write the new gemfile
- SharedHelpers.filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts new_gemfile.join.chomp } }
+ new_gemfile.join.chomp
+ end
+
+ # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
+ # @param [String] contents Content to written to Gemfile.
+ def write_to_gemfile(gemfile_path, contents)
+ SharedHelpers.filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts contents } }
end
# @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
@@ -206,5 +207,35 @@ module Bundler
gemfile.reject!(&:nil?)
end
end
+
+ # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
+ # @param [Array] original_deps Array of original dependencies.
+ # @param [Array] removed_deps Array of removed dependencies.
+ # @param [Array] initial_gemfile Contents of original Gemfile before any operation.
+ def cross_check_for_errors(gemfile_path, original_deps, removed_deps, initial_gemfile)
+ # evalute the new gemfile to look for any failure cases
+ builder = Dsl.new
+ builder.eval_gemfile(Bundler.default_gemfile)
+
+ # record gems which were removed but not requested
+ extra_removed_gems = original_deps - builder.dependencies
+
+ # if some extra gems were removed then raise error
+ # and revert Gemfile to original
+ unless extra_removed_gems.empty?
+ write_to_gemfile(gemfile_path, initial_gemfile.join)
+
+ raise InvalidOption, "Gems could not be removed."
+ end
+
+ # record gems which could not be removed due to some reasons
+ errored_deps = builder.dependencies & removed_deps
+
+ # warn user regarding those gems
+ Bundler.ui.warn "#{errored_deps.map(&:name).join(", ")} could not be removed." unless errored_deps.empty?
+
+ # return actual removed dependencies
+ removed_deps - errored_deps
+ end
end
end