summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-03-27 15:41:56 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-03-28 17:17:51 +0900
commit6b05f125bb721ee7f2c91b7744475f947d3a8295 (patch)
tree817764b3e6f31319bc1557c9614e0a559f760552 /tool
parent98b409cb9ce2c93c8df7e0f0713e1e771c84c047 (diff)
downloadruby-6b05f125bb721ee7f2c91b7744475f947d3a8295.tar.gz
Skip commits only for tools
Get rid of accidents like 67feb782f947046f65951303893713052a19a546.
Diffstat (limited to 'tool')
-rwxr-xr-xtool/sync_default_gems.rb16
-rwxr-xr-xtool/test/test_sync_default_gems.rb73
2 files changed, 89 insertions, 0 deletions
diff --git a/tool/sync_default_gems.rb b/tool/sync_default_gems.rb
index 83cac39a49..467063b968 100755
--- a/tool/sync_default_gems.rb
+++ b/tool/sync_default_gems.rb
@@ -583,6 +583,22 @@ module SyncDefaultGems
next
end
+ tools = pipe_readlines(%W"git diff --name-only -z HEAD~..HEAD -- test/lib/ tool/")
+ unless tools.empty?
+ system(*%W"git checkout HEAD~ --", *tools)
+ if system(*%W"git diff --quiet HEAD~")
+ `git reset HEAD~ --` && `git checkout .` && `git clean -fd`
+ puts "Skip commit #{sha} only for tools"
+ next
+ end
+ unless system(*%W"git commit --amend --no-edit --", *tools)
+ failed_commits << sha
+ `git reset HEAD~ --` && `git checkout .` && `git clean -fd`
+ puts "Failed to pick #{sha}"
+ next
+ end
+ end
+
head = `git log --format=%H -1 HEAD`.chomp
system(*%w"git reset --quiet HEAD~ --")
amend = replace_rdoc_ref_all
diff --git a/tool/test/test_sync_default_gems.rb b/tool/test/test_sync_default_gems.rb
index 3987b1bec5..c49763572f 100755
--- a/tool/test/test_sync_default_gems.rb
+++ b/tool/test/test_sync_default_gems.rb
@@ -73,4 +73,77 @@ module Test_SyncDefaultGems
assert_message_filter(expected, trailers, [expected, "", trailers].join("\n"))
end
end
+
+ class TestSyncWithCommits < Test::Unit::TestCase
+ def setup
+ super
+ @target = nil
+ pend "No git" unless system("git --version", out: IO::NULL)
+ @testdir = Dir.mktmpdir("sync")
+ @git_config = ENV["GIT_CONFIG_GLOBAL"]
+ ENV["GIT_CONFIG_GLOBAL"] = @testdir + "/gitconfig"
+ system(*%W"git config --global user.email test@ruby-lang.org")
+ system(*%W"git config --global user.name", "Ruby")
+ @target = "sync-test"
+ SyncDefaultGems::REPOSITORIES[@target.to_sym] = ["ruby/#{@target}", "default"]
+ @sha = {}
+ @origdir = Dir.pwd
+ Dir.chdir(@testdir)
+ ["src", @target].each do |dir|
+ system(*%W"git init -q -b default #{dir}", exception: true)
+ Dir.mkdir("#{dir}/tool")
+ File.write("#{dir}/tool/ok", "#!/bin/sh\n""echo ok\n")
+ system(*%W"git add tool/ok", exception: true, chdir: dir)
+ system(*%W"git commit -q -m", "Add tool #{dir}", exception: true, chdir: dir)
+ @sha[dir] = IO.popen(%W[git log --format=%H -1], chdir: dir, &:read).chomp
+ end
+ system(*%W"git remote add #{@target} ../#{@target}", exception: true, chdir: "src")
+ end
+
+ def teardown
+ if @target
+ Dir.chdir(@origdir)
+ SyncDefaultGems::REPOSITORIES.delete(@target.to_sym)
+ ENV["GIT_CONFIG_GLOBAL"] = @git_config
+ FileUtils.rm_rf(@testdir)
+ end
+ super
+ end
+
+ def capture_process_output_to(outputs)
+ IO.pipe do |r, w|
+ orig = outputs.map {|out| out.dup}
+ outputs.each {|out| out.reopen(w)}
+ w.close
+ reader = Thread.start {r.read}
+ yield
+ ensure
+ outputs.each {|out| o = orig.shift; out.reopen(o); o.close}
+ return reader.value
+ end
+ end
+
+ def capture_process_outputs
+ out = err = nil
+ synchronize do
+ out = capture_process_output_to(STDOUT) do
+ err = capture_process_output_to(STDERR) do
+ yield
+ end
+ end
+ end
+ return out, err
+ end
+
+ def test_skip_tool
+ system(*%W"git rm -q tool/ok", exception: true, chdir: @target)
+ system(*%W"git commit -q -m", "Remove tool", exception: true, chdir: @target)
+ out = capture_process_output_to([STDOUT, STDERR]) do
+ Dir.chdir("src") do
+ SyncDefaultGems.sync_default_gems_with_commits(@target, true)
+ end
+ end
+ assert_equal(@sha["src"], IO.popen(%W[git log --format=%H -1], chdir: "src", &:read).chomp, out)
+ end
+ end
end