git-autobisect 0.2.2 → 0.3.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.
- data/lib/git/autobisect/version.rb +1 -1
- data/lib/git/autobisect.rb +1 -1
- metadata +7 -14
- data/.travis.yml +0 -4
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -28
- data/Rakefile +0 -6
- data/Readme.md +0 -47
- data/git-autobisect.gemspec +0 -13
- data/spec/git-autobisect_spec.rb +0 -169
data/lib/git/autobisect.rb
CHANGED
@@ -12,7 +12,7 @@ module Git
|
|
12
12
|
return 1
|
13
13
|
end
|
14
14
|
|
15
|
-
command = "(bundle check || bundle) && (#{command})" if File.exist?("Gemfile")
|
15
|
+
command = "(bundle check || (test -f vendor/cache && bundle --local --quiet) || bundle --quiet) && (#{command})" if File.exist?("Gemfile")
|
16
16
|
|
17
17
|
run_command(command, options) || 0
|
18
18
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-autobisect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Michael Grosser
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-07-03 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email: michael@grosser.it
|
@@ -18,16 +18,9 @@ executables:
|
|
18
18
|
extensions: []
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
|
-
- .travis.yml
|
22
|
-
- Gemfile
|
23
|
-
- Gemfile.lock
|
24
|
-
- Rakefile
|
25
|
-
- Readme.md
|
26
21
|
- bin/git-autobisect
|
27
|
-
- git-autobisect.gemspec
|
28
22
|
- lib/git/autobisect.rb
|
29
23
|
- lib/git/autobisect/version.rb
|
30
|
-
- spec/git-autobisect_spec.rb
|
31
24
|
homepage: http://github.com/grosser/git-autobisect
|
32
25
|
licenses:
|
33
26
|
- MIT
|
@@ -36,26 +29,26 @@ rdoc_options: []
|
|
36
29
|
require_paths:
|
37
30
|
- lib
|
38
31
|
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
none: false
|
39
33
|
requirements:
|
40
34
|
- - ! '>='
|
41
35
|
- !ruby/object:Gem::Version
|
42
36
|
version: '0'
|
43
37
|
segments:
|
44
38
|
- 0
|
45
|
-
hash:
|
46
|
-
none: false
|
39
|
+
hash: -4176001779097613862
|
47
40
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
48
42
|
requirements:
|
49
43
|
- - ! '>='
|
50
44
|
- !ruby/object:Gem::Version
|
51
45
|
version: '0'
|
52
46
|
segments:
|
53
47
|
- 0
|
54
|
-
hash:
|
55
|
-
none: false
|
48
|
+
hash: -4176001779097613862
|
56
49
|
requirements: []
|
57
50
|
rubyforge_project:
|
58
|
-
rubygems_version: 1.8.
|
51
|
+
rubygems_version: 1.8.25
|
59
52
|
signing_key:
|
60
53
|
specification_version: 3
|
61
54
|
summary: Find the first broken commit without having to learn git bisect
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
git-autobisect (0.2.2)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: http://rubygems.org/
|
8
|
-
specs:
|
9
|
-
bump (0.3.5)
|
10
|
-
diff-lcs (1.1.3)
|
11
|
-
rake (0.9.2.2)
|
12
|
-
rspec (2.11.0)
|
13
|
-
rspec-core (~> 2.11.0)
|
14
|
-
rspec-expectations (~> 2.11.0)
|
15
|
-
rspec-mocks (~> 2.11.0)
|
16
|
-
rspec-core (2.11.1)
|
17
|
-
rspec-expectations (2.11.3)
|
18
|
-
diff-lcs (~> 1.1.3)
|
19
|
-
rspec-mocks (2.11.3)
|
20
|
-
|
21
|
-
PLATFORMS
|
22
|
-
ruby
|
23
|
-
|
24
|
-
DEPENDENCIES
|
25
|
-
bump
|
26
|
-
git-autobisect!
|
27
|
-
rake
|
28
|
-
rspec (~> 2)
|
data/Rakefile
DELETED
data/Readme.md
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
Find the first broken commit without having to learn git bisect.
|
2
|
-
|
3
|
-
- automagically bundles if necessary
|
4
|
-
- stops at first bad commit
|
5
|
-
- takes binary steps (HEAD~1, HEAD~2, HEAD~4, HEAD~8)
|
6
|
-
|
7
|
-
Install
|
8
|
-
=======
|
9
|
-
|
10
|
-
gem install git-autobisect
|
11
|
-
|
12
|
-
Usage
|
13
|
-
=====
|
14
|
-
|
15
|
-
cd your project
|
16
|
-
# run a test that has a non-0 exit status
|
17
|
-
git-autobisect 'rspec spec/models/user_spec.rb'
|
18
|
-
... grab a coffee ...
|
19
|
-
---> The first bad commit is a4328fa
|
20
|
-
git show
|
21
|
-
|
22
|
-
### Options
|
23
|
-
|
24
|
-
-m, --max N Inspect commits between HEAD..HEAD~<max>
|
25
|
-
-s, --start N Use N (instead of 1) as initial step and keep muliplying by 2
|
26
|
-
|
27
|
-
TIPS
|
28
|
-
====
|
29
|
-
- do not fail if test file is missing `[ ! -f spec/my_spec.rb ] || rspec spec/my_spec.rb`
|
30
|
-
|
31
|
-
TODO
|
32
|
-
====
|
33
|
-
- option for max-step-size so you can use a finer grained approach
|
34
|
-
- option to disable `bundle check || bundle` injection
|
35
|
-
- option to consider a build failed if it finishes faster then x seconds
|
36
|
-
|
37
|
-
Development
|
38
|
-
===========
|
39
|
-
- `bundle && bundle exec rake`
|
40
|
-
- Tests run a lot faster without `bundle exec`
|
41
|
-
|
42
|
-
Author
|
43
|
-
======
|
44
|
-
[Michael Grosser](http://grosser.it)<br/>
|
45
|
-
michael@grosser.it<br/>
|
46
|
-
License: MIT<br/>
|
47
|
-
[](https://travis-ci.org/grosser/git-autobisect)
|
data/git-autobisect.gemspec
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
2
|
-
name = "git-autobisect"
|
3
|
-
require "git/autobisect/version"
|
4
|
-
|
5
|
-
Gem::Specification.new name, Git::Autobisect::Version do |s|
|
6
|
-
s.summary = "Find the first broken commit without having to learn git bisect"
|
7
|
-
s.authors = ["Michael Grosser"]
|
8
|
-
s.email = "michael@grosser.it"
|
9
|
-
s.homepage = "http://github.com/grosser/#{name}"
|
10
|
-
s.files = `git ls-files`.split("\n")
|
11
|
-
s.executables = ["git-autobisect"]
|
12
|
-
s.license = "MIT"
|
13
|
-
end
|
data/spec/git-autobisect_spec.rb
DELETED
@@ -1,169 +0,0 @@
|
|
1
|
-
ROOT = File.expand_path('../../', __FILE__)
|
2
|
-
|
3
|
-
describe "git-autobisect" do
|
4
|
-
def run(command, options={})
|
5
|
-
result = `#{command} 2>&1`
|
6
|
-
message = (options[:fail] ? "SUCCESS BUT SHOULD FAIL" : "FAIL")
|
7
|
-
raise "[#{message}] #{result} [#{command}]" if $?.success? == !!options[:fail]
|
8
|
-
result
|
9
|
-
end
|
10
|
-
|
11
|
-
def autobisect(args, options={})
|
12
|
-
run "#{ROOT}/bin/git-autobisect #{args}", options
|
13
|
-
end
|
14
|
-
|
15
|
-
def current_commit
|
16
|
-
run "git log --oneline | head -1"
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_irrelevant_commit(name="b")
|
20
|
-
run "echo #{rand} >> #{name} && git add #{name} && git commit -m 'added #{name}'"
|
21
|
-
end
|
22
|
-
|
23
|
-
def remove_a
|
24
|
-
run "git rm a && git commit -m 'remove a'"
|
25
|
-
end
|
26
|
-
|
27
|
-
before do
|
28
|
-
Dir.chdir ROOT
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "basics" do
|
32
|
-
it "shows its usage without arguments" do
|
33
|
-
autobisect("", :fail => true).should include("Usage")
|
34
|
-
end
|
35
|
-
|
36
|
-
it "shows its usage with -h" do
|
37
|
-
autobisect("-h").should include("Usage")
|
38
|
-
end
|
39
|
-
|
40
|
-
it "shows its usage with --help" do
|
41
|
-
autobisect("--help").should include("Usage")
|
42
|
-
end
|
43
|
-
|
44
|
-
it "shows its version with -v" do
|
45
|
-
autobisect("-v").should =~ /^git-autobisect \d+\.\d+\.\d+$/
|
46
|
-
end
|
47
|
-
|
48
|
-
it "shows its version with --version" do
|
49
|
-
autobisect("-v").should =~ /^git-autobisect \d+\.\d+\.\d+$/
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "bisecting" do
|
54
|
-
before do
|
55
|
-
run "rm -rf spec/tmp ; mkdir spec/tmp"
|
56
|
-
Dir.chdir "spec/tmp"
|
57
|
-
run "git init && touch a && git add a && git commit -m 'added a'"
|
58
|
-
end
|
59
|
-
|
60
|
-
it "stops when the first commit works" do
|
61
|
-
autobisect("'test 1'", :fail => true).should include("HEAD is not broken")
|
62
|
-
end
|
63
|
-
|
64
|
-
it "stops when no commit works" do
|
65
|
-
autobisect("test", :fail => true).should include("No good commit found")
|
66
|
-
end
|
67
|
-
|
68
|
-
context "--max" do
|
69
|
-
let(:command){ "'test -e a' --max 5" }
|
70
|
-
|
71
|
-
it "finds if a commit works inside of max range" do
|
72
|
-
remove_a
|
73
|
-
3.times{ add_irrelevant_commit }
|
74
|
-
autobisect(command).should_not include("No good commit found")
|
75
|
-
end
|
76
|
-
|
77
|
-
it "stops when no commit works inside of max range" do
|
78
|
-
remove_a
|
79
|
-
5.times{ add_irrelevant_commit }
|
80
|
-
autobisect(command, :fail => true).should include("No good commit found")
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context "--start" do
|
85
|
-
let(:command){ "'test -e a' --start 5" }
|
86
|
-
|
87
|
-
it "starts at given point" do
|
88
|
-
remove_a
|
89
|
-
30.times{ add_irrelevant_commit }
|
90
|
-
result = autobisect(command)
|
91
|
-
result.scan(/HEAD~\d+/).should == ["HEAD~4", "HEAD~9", "HEAD~19", "HEAD~31"]
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
it "finds the first broken commit for 1 commit" do
|
96
|
-
remove_a
|
97
|
-
result = autobisect("'test -e a'")
|
98
|
-
result.should_not include("bisect run")
|
99
|
-
result.should =~ /is the first bad commit.*remove a/m
|
100
|
-
end
|
101
|
-
|
102
|
-
it "finds the first broken commit for multiple commits" do
|
103
|
-
remove_a
|
104
|
-
result = autobisect("'test -e a'")
|
105
|
-
result.should_not include("bisect run success")
|
106
|
-
result.should =~ /is the first bad commit.*remove a/m
|
107
|
-
end
|
108
|
-
|
109
|
-
it "can run a complex command" do
|
110
|
-
10.times{ add_irrelevant_commit }
|
111
|
-
remove_a
|
112
|
-
10.times{ add_irrelevant_commit }
|
113
|
-
result = autobisect("'sleep 0.01 && test -e a'")
|
114
|
-
result.should include("bisect run success")
|
115
|
-
result.should =~ /is the first bad commit.*remove a/m
|
116
|
-
end
|
117
|
-
|
118
|
-
it "is fast for a large number of commits" do
|
119
|
-
# build a ton of commits
|
120
|
-
40.times do |i|
|
121
|
-
add_irrelevant_commit("#{i}_good")
|
122
|
-
end
|
123
|
-
run "git rm a && git commit -m 'remove a'"
|
124
|
-
40.times do |i|
|
125
|
-
add_irrelevant_commit("#{i}_bad")
|
126
|
-
end
|
127
|
-
|
128
|
-
# ran successful ?
|
129
|
-
result = autobisect("'echo a >> count && test -e a'")
|
130
|
-
result.should include("bisect run success")
|
131
|
-
result.should =~ /is the first bad commit.*remove a/m
|
132
|
-
|
133
|
-
# ran fast?
|
134
|
-
File.read('count').count('a').should < 20
|
135
|
-
end
|
136
|
-
|
137
|
-
it "stays at the first broken commit" do
|
138
|
-
remove_a
|
139
|
-
autobisect("'test -e a'")
|
140
|
-
current_commit.should include("remove a")
|
141
|
-
end
|
142
|
-
|
143
|
-
context "with multiple good commits after broken commit" do
|
144
|
-
before do
|
145
|
-
add_irrelevant_commit "b"
|
146
|
-
add_irrelevant_commit "c"
|
147
|
-
add_irrelevant_commit "d"
|
148
|
-
add_irrelevant_commit "e" # first good
|
149
|
-
remove_a
|
150
|
-
add_irrelevant_commit "f" # last bad
|
151
|
-
add_irrelevant_commit "g"
|
152
|
-
end
|
153
|
-
|
154
|
-
it "finds the first broken commit for n commits" do
|
155
|
-
result = autobisect("'test -e a'")
|
156
|
-
result.should include("bisect run success")
|
157
|
-
result.should =~ /is the first bad commit.*remove a/m
|
158
|
-
current_commit.should include("remove a")
|
159
|
-
end
|
160
|
-
|
161
|
-
it "does not run test too often" do
|
162
|
-
result = autobisect("'echo a >> count && test -e a'")
|
163
|
-
result.should include("bisect run success")
|
164
|
-
result.should include("added e")
|
165
|
-
File.read('count').count('a').should == 4
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|