summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/bundler/injector.rb15
-rw-r--r--spec/bundler/commands/remove_spec.rb24
2 files changed, 37 insertions, 2 deletions
diff --git a/lib/bundler/injector.rb b/lib/bundler/injector.rb
index 767c5ff2fe..6694642246 100644
--- a/lib/bundler/injector.rb
+++ b/lib/bundler/injector.rb
@@ -180,8 +180,19 @@ module Bundler
def remove_gems_from_gemfile(gems, gemfile_path)
patterns = /gem\s+(['"])#{Regexp.union(gems)}\1|gem\s*\((['"])#{Regexp.union(gems)}\2\)/
- # remove lines which match the regex
- new_gemfile = IO.readlines(gemfile_path).reject {|line| line.match(patterns) }
+ new_gemfile = []
+ multiline_removal = false
+ IO.readlines(gemfile_path).each do |line|
+ if line.match(patterns)
+ multiline_removal = line.rstrip.end_with?(",")
+ # skip lines which match the regex
+ next
+ end
+
+ # skip followup lines until line does not end with ','
+ new_gemfile << line unless multiline_removal
+ multiline_removal = line.rstrip.end_with?(",") if multiline_removal
+ end
# remove line \n and append them with other strings
new_gemfile.each_with_index do |_line, index|
diff --git a/spec/bundler/commands/remove_spec.rb b/spec/bundler/commands/remove_spec.rb
index ef313928e2..3b255cd03d 100644
--- a/spec/bundler/commands/remove_spec.rb
+++ b/spec/bundler/commands/remove_spec.rb
@@ -44,6 +44,30 @@ RSpec.describe "bundle remove" do
source "#{file_uri_for(gem_repo1)}"
G
end
+
+ context "when gem is specified in multiple lines" do
+ it "shows success for removed gem" do
+ gemfile <<-G
+ source '#{file_uri_for(gem_repo1)}'
+
+ gem 'git'
+ gem 'rack',
+ git: 'https://github.com/rack/rack',
+ branch: 'master'
+ gem 'nokogiri'
+ G
+
+ bundle! "remove rack"
+
+ expect(out).to include("rack was removed.")
+ gemfile_should_be <<-G
+ source '#{file_uri_for(gem_repo1)}'
+
+ gem 'git'
+ gem 'nokogiri'
+ G
+ end
+ end
end
context "when gem is not present in gemfile" do