rubyfarm-bisect 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +18 -8
- data/exe/rubyfarm-bisect +27 -3
- data/exe/rubyfarm-bisect-core +5 -3
- data/rubyfarm-bisect.gemspec +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 579c655b1499377ecf225a7f9c30eff0aece7a85954bf15510d2f6f4ba9e2f55
|
4
|
+
data.tar.gz: 0c73556465406ce122586ae14be3dea1dba9f3e4c29d569315238e69eafb8a78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a6b28203ee2b3b4c49c2cea9734a90648b10831e57f37de7c92183fe23b91c50343d33c858abbf54d802db92b03e11be26f0bfe15ada945c4baff365ae499fe
|
7
|
+
data.tar.gz: 0cb2739a1bee909dc0101395852029093d2cb7d9ab274271d5aa2519aaa06eac28ecac46115611dad6d74195127233a32e37966cafec8480cec996cc90c6dc81
|
data/README.md
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
# rubyfarm-bisect
|
2
2
|
|
3
3
|
This tool allows you to do "git bisect" MRI revisions easily.
|
4
|
-
Instead of compiling each revision locally, it uses ["
|
5
|
-
|
4
|
+
Instead of compiling each revision locally, it uses ["rubylang/rubyfarm" repository](https://hub.docker.com/r/rubylang/rubyfarm/tags/) in DockerHub, which contains all MRI revisions since r57410 that were successfully built.
|
5
|
+
|
6
|
+
By using rubyfarm-bisect, you don't have to worry about:
|
7
|
+
|
8
|
+
* Compilation failure ("exit 125"). rubyfarm-bisect handles it.
|
9
|
+
* The range of bisect. rubyfarm-bisect has a good default.
|
10
|
+
* The order of good and bad commits. rubyfarm-bisect automatically detects the order.
|
6
11
|
|
7
12
|
## How to setup
|
8
13
|
|
@@ -15,13 +20,13 @@ $ gem install rubyfarm-biesct
|
|
15
20
|
You also need to be able to use "docker" command without "sudo".
|
16
21
|
|
17
22
|
```
|
18
|
-
$ docker run --rm -t
|
19
|
-
Unable to find image '
|
20
|
-
r60001: Pulling from
|
23
|
+
$ docker run --rm -t rubylang/rubyfarm:r60001 ruby -v
|
24
|
+
Unable to find image 'rubylang/rubyfarm:r60001' locally
|
25
|
+
r60001: Pulling from rubylang/rubyfarm
|
21
26
|
|
22
27
|
*snip*
|
23
28
|
|
24
|
-
Status: Downloaded newer image for
|
29
|
+
Status: Downloaded newer image for rubylang/rubyfarm:r60001
|
25
30
|
ruby 2.5.0dev (2017-09-23 trunk 60001) [x86_64-linux]
|
26
31
|
```
|
27
32
|
|
@@ -33,19 +38,24 @@ The simplest way:
|
|
33
38
|
$ rubyfarm-bisect ruby -e '<your test code>'
|
34
39
|
```
|
35
40
|
|
36
|
-
which assumes that `<your test code>` runs successfully at r57410, and fails at
|
41
|
+
which assumes that `<your test code>` runs successfully at r57410, and fails at "trunk".
|
37
42
|
|
38
43
|
### `-g`/`-b`: specify a good/bad commit range
|
39
44
|
|
40
45
|
You can specify good and bad commits for git bisect:
|
41
46
|
|
42
47
|
```
|
43
|
-
$ rubyfarm-bisect -g 7c1b30a6 -b
|
48
|
+
$ rubyfarm-bisect -g 7c1b30a6 -b trunk ruby -e '<your test code>'
|
44
49
|
```
|
45
50
|
|
46
51
|
`-g` is a good commit, and `-b` is a bad commit.
|
47
52
|
The arguments must be a SVN revision (e.g., "r60000"), or a commit hash of [git.ruby-lang.org/ruby.git](https://git.ruby-lang.org/ruby.git) (e.g., 7c1b30a6).
|
48
53
|
|
54
|
+
You don't have to worry about which is good and bad:
|
55
|
+
|
56
|
+
* rubyfarm-bisect first checks if the good commit is an ancestor of the bad one. If not, it swaps the good and bad ones.
|
57
|
+
* rubyfarm-bisect then checks if the test passes at the good (older) commit. If it does not pass the test, it works as a "reversed" mode; it tries to find the first "good" commit.
|
58
|
+
|
49
59
|
### `-u`: specify a git url
|
50
60
|
|
51
61
|
This tool clones [the git repository of ruby](https://git.ruby-lang.org/ruby.git) into temporary directory, which takes some minutes.
|
data/exe/rubyfarm-bisect
CHANGED
@@ -9,19 +9,21 @@ ORIGINAL_GIT_PATH = "https://git.ruby-lang.org/ruby.git"
|
|
9
9
|
CORE = File.join(__dir__, "rubyfarm-bisect-core")
|
10
10
|
|
11
11
|
good_commit = FIRST_COMMIT
|
12
|
-
bad_commit = "
|
12
|
+
bad_commit = "trunk"
|
13
13
|
git_url = ORIGINAL_GIT_PATH
|
14
14
|
mounts = []
|
15
|
+
auto = true
|
15
16
|
|
16
17
|
opt = OptionParser.new
|
17
18
|
opt.on("-u URL", "--git-url URL", "URL of git repository (defalut: #{ ORIGINAL_GIT_PATH })") {|v| git_url = v }
|
18
19
|
opt.on("-g COMMIT", "--good-commit COMMIT", "good commit (defalut: 7c1b30a)") {|v| good_commit = v }
|
19
|
-
opt.on("-b COMMIT", "--bad-commit COMMIT", "bad commit (defalut:
|
20
|
+
opt.on("-b COMMIT", "--bad-commit COMMIT", "bad commit (defalut: trunk)") {|v| bad_commit = v }
|
20
21
|
opt.on("-m PATH", "--mount-volume PATH", "mount PATH to /root (default: none)") {|v| mounts << v }
|
21
22
|
opt.on("-t", "--test-rb", "run test.rb") do
|
22
23
|
mounts = ["test.rb"]
|
23
24
|
ARGV.concat(["ruby", "/root/test.rb"])
|
24
25
|
end
|
26
|
+
opt.on("--no-auto", "disable automatic detection of the order (good->bad or bad->good)") { auto = false }
|
25
27
|
opt.order!(ARGV)
|
26
28
|
|
27
29
|
mounts = mounts.flat_map do |path|
|
@@ -54,8 +56,30 @@ Dir.mktmpdir do |dir|
|
|
54
56
|
system("git", "clone", git_url)
|
55
57
|
puts "\e[0m"
|
56
58
|
Dir.chdir("ruby") do
|
59
|
+
good_commit = solve_rev[good_commit]
|
60
|
+
bad_commit = solve_rev[bad_commit]
|
61
|
+
|
62
|
+
if !system("git", "merge-base", "--is-ancestor", solve_rev[good_commit], solve_rev[bad_commit])
|
63
|
+
puts "\e[1m\e[32m#{ good_commit } is not an ancestor of #{ bad_commit }. Try to reverse.\e[0m"
|
64
|
+
good_commit, bad_commit = bad_commit, good_commit
|
65
|
+
if !system("git", "merge-base", "--is-ancestor", solve_rev[good_commit], solve_rev[bad_commit])
|
66
|
+
puts "\e[1m\e[32m#{ good_commit } is not an ancestor of #{ bad_commit }. Aborting.\e[0m"
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
order = "normal"
|
72
|
+
if auto
|
73
|
+
system("git", "checkout", solve_rev[good_commit])
|
74
|
+
if !system(CORE, "--", *ARGV)
|
75
|
+
puts "\e[1m\e[32mThe beginning commit #{ good_commit } doesn't pass the test. Find the first good commit. \e[0m"
|
76
|
+
order = "reversed"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
57
80
|
system("git", "bisect", "start", solve_rev[bad_commit], solve_rev[good_commit])
|
58
|
-
|
81
|
+
env = { "RUBYFARM_BISECT_ORDER" => order }
|
82
|
+
system(env, "git", "bisect", "run", CORE, *mounts, "--", *ARGV)
|
59
83
|
end
|
60
84
|
end
|
61
85
|
end
|
data/exe/rubyfarm-bisect-core
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
require "shellwords"
|
4
4
|
|
5
|
-
REPOSITORY = "
|
5
|
+
REPOSITORY = "rubylang/rubyfarm"
|
6
6
|
|
7
7
|
puts
|
8
|
-
rev =
|
8
|
+
rev = `git rev-parse HEAD`.chomp
|
9
9
|
log = -> msg do
|
10
10
|
puts "\e[1m\e[32mrubyfarm-bisect[#{ rev }]: #{ msg }\e[0m"
|
11
11
|
end
|
@@ -15,7 +15,7 @@ run = -> color, *cmd do
|
|
15
15
|
system(*cmd)
|
16
16
|
print "\e[0m"
|
17
17
|
end
|
18
|
-
tag = "
|
18
|
+
tag = REPOSITORY + ":#{ rev }"
|
19
19
|
|
20
20
|
run["\e[34m", "docker", "image", "inspect", "-f", "ok", tag]
|
21
21
|
unless $?.success?
|
@@ -36,4 +36,6 @@ status = $?.exitstatus
|
|
36
36
|
msg = { 0 => "good", 125 => "skip" }[status] || "bad"
|
37
37
|
log["status = #{ status } (#{ rev } is #{ msg })"]
|
38
38
|
puts
|
39
|
+
exit 125 if status == 125
|
40
|
+
exit(status == 0 ? 1 : 0) if ENV["RUBYFARM_BISECT_ORDER"] == "reversed"
|
39
41
|
exit status
|
data/rubyfarm-bisect.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyfarm-bisect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yusuke Endoh
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -74,8 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
requirements: []
|
77
|
-
|
78
|
-
rubygems_version: 2.7.3
|
77
|
+
rubygems_version: 3.0.1
|
79
78
|
signing_key:
|
80
79
|
specification_version: 4
|
81
80
|
summary: '"git bisect" ruby without compilation trouble'
|