git-blame-game 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # git-blame-game
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/charleseff/git-blame-game.png)]
4
+
3
5
  <img src="https://github.com/charleseff/git-blame-game/raw/master/public/pensive-kanye.png" />
4
6
 
5
7
  git-blame-game is an interactive command-line tool for chaining 'git blame' calls to drill-down to the real culprit for the line of code you care about. When one `git blame` does not tell the whole story.
@@ -44,11 +46,11 @@ git-blame-game is an interactive command-line tool for chaining 'git blame' call
44
46
  end
45
47
 
46
48
 
47
- Do you need to git blame chain further (y/n) > y
49
+ Do you need to git blame chain further? (y/n) > y
48
50
 
49
51
  1) add.rb
50
52
 
51
- Enter the number (from 1 to 1) of the file to git blame chain into > 1
53
+ Enter the number from the above list (from 1 to 1) of the file to git blame chain into > 1
52
54
 
53
55
  de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
54
56
  de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 2) def add_4(x)
@@ -91,12 +93,12 @@ git-blame-game is an interactive command-line tool for chaining 'git blame' call
91
93
  puts add_4(9) # should be 13
92
94
 
93
95
 
94
- Do you need to git blame chain further (y/n) > y
96
+ Do you need to git blame chain further? (y/n) > y
95
97
 
96
98
  1) add.rb
97
99
  2) blah.rb
98
100
 
99
- Enter the number (from 1 to 2) of the file to git blame chain into > 2
101
+ Enter the number from the above list (from 1 to 2) of the file to git blame chain into > 2
100
102
 
101
103
  ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 1) def add_4(x)
102
104
  63b41ee4 (Bob Barker 2012-01-14 14:46:53 -0800 2) x + 5
@@ -125,7 +127,7 @@ git-blame-game is an interactive command-line tool for chaining 'git blame' call
125
127
  puts add_4(9) # should be 13
126
128
 
127
129
 
128
- Do you need to git blame chain further (y/n) > n
130
+ Do you need to git blame chain further? (y/n) > n
129
131
 
130
132
  The responsible commit is:
131
133
 
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rubygems'
4
+ require 'cucumber'
5
+ require 'cucumber/rake/task'
6
+ require 'rspec/core/rake_task'
7
+
8
+ Cucumber::Rake::Task.new(:features)
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ task :default => [:spec, :features]
data/TODO ADDED
@@ -0,0 +1,5 @@
1
+ - add special highlighting for in the 'git show' for the line of code (or also the file) that has been chosen to git blame chain into
2
+ - add ability to go back a step if you made a mistake
3
+ - (maybe) add support for one-file mode (maybe make it default too?)
4
+ - add pull request for aruba?
5
+ - add pull request for colorize (decolorize)
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
3
+ require 'git-blame-game'
4
+
5
+ aliases = %w(blame praise annotate ann)
6
+
7
+ options = {}
8
+ OptionParser.new do |opts|
9
+ opts.banner = <<-END.gsub(/^[ \t]+/m, '')
10
+ Usage: git-blame-game [options] path/to/filename
11
+ END
12
+
13
+ opts.separator ""
14
+ opts.separator "Options:"
15
+
16
+ opts.on("-s", "--sha", "--SHA [SHA]", String, "Set initial SHA (defaults to HEAD)") do |sha|
17
+ options[:sha] = sha
18
+ end
19
+
20
+ opts.on_tail("-h", "--help", "Show this message") do
21
+ puts opts
22
+ puts "\nAliases: " + aliases.map{|a| ["git-#{a}-game", "git #{a}-game"]}.flatten.join(", ")
23
+ exit
24
+ end
25
+
26
+ end.parse!
27
+
28
+ path_to_file = ARGV[0]
29
+ raise OptionParser::MissingArgument.new("You must specify a path to a file ") if not path_to_file
30
+
31
+ GitBlameGame.new(path_to_file, options).run
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
3
+ require 'git-blame-game'
4
+
5
+ aliases = %w(blame praise annotate ann)
6
+
7
+ options = {}
8
+ OptionParser.new do |opts|
9
+ opts.banner = <<-END.gsub(/^[ \t]+/m, '')
10
+ Usage: git-blame-game [options] path/to/filename
11
+ END
12
+
13
+ opts.separator ""
14
+ opts.separator "Options:"
15
+
16
+ opts.on("-s", "--sha", "--SHA [SHA]", String, "Set initial SHA (defaults to HEAD)") do |sha|
17
+ options[:sha] = sha
18
+ end
19
+
20
+ opts.on_tail("-h", "--help", "Show this message") do
21
+ puts opts
22
+ puts "\nAliases: " + aliases.map{|a| ["git-#{a}-game", "git #{a}-game"]}.flatten.join(", ")
23
+ exit
24
+ end
25
+
26
+ end.parse!
27
+
28
+ path_to_file = ARGV[0]
29
+ raise OptionParser::MissingArgument.new("You must specify a path to a file ") if not path_to_file
30
+
31
+ GitBlameGame.new(path_to_file, options).run
@@ -1,10 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
3
+ require 'git-blame-game'
3
4
 
4
- require "rubygems"
5
- require 'colorize'
6
- require 'optparse'
7
- require 'git-blame-game/git_blame_game'
5
+ aliases = %w(blame praise annotate ann)
8
6
 
9
7
  options = {}
10
8
  OptionParser.new do |opts|
@@ -21,6 +19,7 @@ OptionParser.new do |opts|
21
19
 
22
20
  opts.on_tail("-h", "--help", "Show this message") do
23
21
  puts opts
22
+ puts "\nAliases: " + aliases.map{|a| ["git-#{a}-game", "git #{a}-game"]}.flatten.join(", ")
24
23
  exit
25
24
  end
26
25
 
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
3
+ require 'git-blame-game'
4
+
5
+ aliases = %w(blame praise annotate ann)
6
+
7
+ options = {}
8
+ OptionParser.new do |opts|
9
+ opts.banner = <<-END.gsub(/^[ \t]+/m, '')
10
+ Usage: git-blame-game [options] path/to/filename
11
+ END
12
+
13
+ opts.separator ""
14
+ opts.separator "Options:"
15
+
16
+ opts.on("-s", "--sha", "--SHA [SHA]", String, "Set initial SHA (defaults to HEAD)") do |sha|
17
+ options[:sha] = sha
18
+ end
19
+
20
+ opts.on_tail("-h", "--help", "Show this message") do
21
+ puts opts
22
+ puts "\nAliases: " + aliases.map{|a| ["git-#{a}-game", "git #{a}-game"]}.flatten.join(", ")
23
+ exit
24
+ end
25
+
26
+ end.parse!
27
+
28
+ path_to_file = ARGV[0]
29
+ raise OptionParser::MissingArgument.new("You must specify a path to a file ") if not path_to_file
30
+
31
+ GitBlameGame.new(path_to_file, options).run
@@ -0,0 +1,143 @@
1
+ Feature: The happy path
2
+
3
+ Scenario: Happy path
4
+ Given I cd to "test/fixtures/sample_git_repo"
5
+ When I run `../../../bin/git-blame-game add.rb` interactively
6
+ Then I should see:
7
+ """
8
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
9
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 2) def add_4(y)
10
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 3) y + 5
11
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
12
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
13
+
14
+ (h for help) >
15
+ """
16
+ When I type "3"
17
+ Then I should see:
18
+ """
19
+ commit 5087eab56af9b0901a1b190de14f29867307c140
20
+ Author: Danny Dover <developers+danny@foo.com>
21
+ Date: Sat Jan 14 14:50:06 2012 -0800
22
+
23
+ I like y's better
24
+
25
+ diff --git a/add.rb b/add.rb
26
+ index 44be98f..898a812 100644
27
+ --- a/add.rb
28
+ +++ b/add.rb
29
+ @@ -1,5 +1,5 @@
30
+ module Add
31
+ - def add_4(x)
32
+ - x + 5
33
+ + def add_4(y)
34
+ + y + 5
35
+ end
36
+ end
37
+
38
+
39
+ 1) add.rb (or 's' for same)
40
+
41
+ (h for help) >
42
+ """
43
+ When I type "1"
44
+ Then I should see:
45
+ """
46
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
47
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 2) def add_4(x)
48
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 3) x + 5
49
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
50
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
51
+
52
+ (h for help) >
53
+ """
54
+ When I type "3"
55
+ Then I should see:
56
+ """
57
+ commit de2a1d78f80e02a515cdd3aa0420dd6ee35b510b
58
+ Author: Carmen Cummings <developers+carmen@foo.com>
59
+ Date: Sat Jan 14 14:49:00 2012 -0800
60
+
61
+ moving add_4 to module
62
+
63
+ diff --git a/add.rb b/add.rb
64
+ new file mode 100644
65
+ index 0000000..44be98f
66
+ --- /dev/null
67
+ +++ b/add.rb
68
+ @@ -0,0 +1,5 @@
69
+ +module Add
70
+ + def add_4(x)
71
+ + x + 5
72
+ + end
73
+ +end
74
+
75
+ diff --git a/blah.rb b/blah.rb
76
+ index 0424947..38b7511 100644
77
+ --- a/blah.rb
78
+ +++ b/blah.rb
79
+ @@ -1,5 +1,5 @@
80
+ -def add_4(x)
81
+ - x + 5
82
+ -end
83
+ +$:.unshift(File.dirname(__FILE__))
84
+ +require 'add'
85
+ +include Add
86
+
87
+ puts add_4(9) # should be 13
88
+
89
+
90
+ 1) add.rb (or 's' for same)
91
+ 2) blah.rb
92
+
93
+ (h for help) >
94
+ """
95
+ When I type "2"
96
+ Then I should see:
97
+ """
98
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 1) def add_4(x)
99
+ 63b41ee4 (Bob Barker 2012-01-14 14:46:53 -0800 2) x + 5
100
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 3) end
101
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 4)
102
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 5) puts add_4(9) # should be 13
103
+
104
+ (h for help) >
105
+ """
106
+ When I type "2"
107
+ Then I should see:
108
+ """
109
+ commit 63b41ee41653991aa00ce9687e3f403efd4c29d4
110
+ Author: Bob Barker <developers+bob@foo.com>
111
+ Date: Sat Jan 14 14:46:53 2012 -0800
112
+
113
+ being bad
114
+
115
+ diff --git a/blah.rb b/blah.rb
116
+ index 626a42b..0424947 100644
117
+ --- a/blah.rb
118
+ +++ b/blah.rb
119
+ @@ -1,5 +1,5 @@
120
+ def add_4(x)
121
+ - x + 4
122
+ + x + 5
123
+ end
124
+
125
+ puts add_4(9) # should be 13
126
+
127
+
128
+ 1) blah.rb (or 's' for same)
129
+
130
+ (h for help) >
131
+ """
132
+ When I type "q"
133
+ Then I should see:
134
+ """
135
+ The responsible commit is:
136
+
137
+ commit 63b41ee41653991aa00ce9687e3f403efd4c29d4
138
+ Author: Bob Barker <developers+bob@foo.com>
139
+ Date: Sat Jan 14 14:46:53 2012 -0800
140
+
141
+ being bad
142
+ """
143
+
@@ -0,0 +1,244 @@
1
+ Feature: Other scenarios
2
+
3
+ Scenario: Getting help
4
+ When I run `bin/git-blame-game --help`
5
+ Then it should pass with:
6
+ """
7
+ Usage: git-blame-game [options] path/to/filename
8
+ """
9
+
10
+ Scenario: Without a filepath:
11
+ When I run `bin/git-blame-game`
12
+ Then it should fail with:
13
+ """
14
+ missing argument: You must specify a path to a file
15
+ """
16
+
17
+ Scenario: Specifying a file that doesn't exist:
18
+ When I run `bin/git-blame-game file/that/doesnt/exist.rb`
19
+ Then it should fail with:
20
+ """
21
+ fatal: no such path file/that/doesnt/exist.rb in HEAD
22
+ """
23
+
24
+ Scenario: Invalid input on git blame view:
25
+ Given I cd to "test/fixtures/sample_git_repo"
26
+ When I run `../../../bin/git-blame-game add.rb` interactively
27
+ And I type "foobar"
28
+ Then I should see:
29
+ """
30
+ Invalid input. Enter:
31
+ - the line number from the above list (from 1 to 5) you are git blaming.
32
+ - the sha to git blame chain into.
33
+ - 'r' to re-view the git blame
34
+
35
+ (h for help) >
36
+ """
37
+
38
+ Scenario: Invalid input on git show view:
39
+ Given I cd to "test/fixtures/sample_git_repo"
40
+ When I run `../../../bin/git-blame-game add.rb` interactively
41
+ And I type "3"
42
+ And I type "blah"
43
+ Then I should see:
44
+ """
45
+ Invalid input. Enter:
46
+ - 'q' to quit, if you have found the offending commit
47
+ - the number from the above list (from 1 to 1) of the file to git blame chain into.
48
+ - the filepath to git blame chain into.
49
+ - 's' to git blame chain into the 'same' file as before
50
+ - 'r' to re-view the git show
51
+
52
+ (h for help) >
53
+ """
54
+
55
+ Scenario: With a SHA:
56
+ Given I cd to "test/fixtures/sample_git_repo"
57
+ When I run `../../../bin/git-blame-game blah.rb --sha=63b41ee41653991aa00ce9687e3f403efd4c29d4` interactively
58
+ Then I should see:
59
+ """
60
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 1) def add_4(x)
61
+ 63b41ee4 (Bob Barker 2012-01-14 14:46:53 -0800 2) x + 5
62
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 3) end
63
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 4)
64
+ ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 5) puts add_4(9) # should be 13
65
+ """
66
+
67
+ Scenario: Entering the SHA instead of the number
68
+ Given I cd to "test/fixtures/sample_git_repo"
69
+ When I run `../../../bin/git-blame-game add.rb` interactively
70
+ When I type "5087eab5"
71
+ Then I should see:
72
+ """
73
+ commit 5087eab56af9b0901a1b190de14f29867307c140
74
+ Author: Danny Dover <developers+danny@foo.com>
75
+ Date: Sat Jan 14 14:50:06 2012 -0800
76
+
77
+ I like y's better
78
+
79
+ diff --git a/add.rb b/add.rb
80
+ index 44be98f..898a812 100644
81
+ --- a/add.rb
82
+ +++ b/add.rb
83
+ @@ -1,5 +1,5 @@
84
+ module Add
85
+ - def add_4(x)
86
+ - x + 5
87
+ + def add_4(y)
88
+ + y + 5
89
+ end
90
+ end
91
+
92
+ """
93
+
94
+ Scenario: Entering 's' for the same file to git blame into
95
+ Given I cd to "test/fixtures/sample_git_repo"
96
+ When I run `../../../bin/git-blame-game add.rb` interactively
97
+ When I type "3"
98
+ Then I should see:
99
+ """
100
+ 1) add.rb
101
+ """
102
+ When I type "s"
103
+ Then I should see:
104
+ """
105
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
106
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 2) def add_4(x)
107
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 3) x + 5
108
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
109
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
110
+ """
111
+
112
+ Scenario: Entering the filename for the file to git blame into:
113
+ Given I cd to "test/fixtures/sample_git_repo"
114
+ When I run `../../../bin/git-blame-game add.rb` interactively
115
+ When I type "3"
116
+ Then I should see:
117
+ """
118
+ 1) add.rb (or 's' for same)
119
+ """
120
+ When I type "add.rb"
121
+ Then I should see:
122
+ """
123
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
124
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 2) def add_4(x)
125
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 3) x + 5
126
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
127
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
128
+ """
129
+
130
+ Scenario: Re-viewing a git blame:
131
+ Given I cd to "test/fixtures/sample_git_repo"
132
+ When I run `../../../bin/git-blame-game add.rb` interactively
133
+ Then I should see:
134
+ """
135
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
136
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 2) def add_4(y)
137
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 3) y + 5
138
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
139
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
140
+ """
141
+ When I type "r"
142
+ Then I should see:
143
+ """
144
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
145
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 2) def add_4(y)
146
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 3) y + 5
147
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
148
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
149
+ """
150
+
151
+ Scenario: Re-viewing a git show:
152
+ Given I cd to "test/fixtures/sample_git_repo"
153
+ When I run `../../../bin/git-blame-game add.rb` interactively
154
+ And I type "3"
155
+ Then I should see:
156
+ """
157
+ commit 5087eab56af9b0901a1b190de14f29867307c140
158
+ Author: Danny Dover <developers+danny@foo.com>
159
+ Date: Sat Jan 14 14:50:06 2012 -0800
160
+
161
+ I like y's better
162
+
163
+ diff --git a/add.rb b/add.rb
164
+ index 44be98f..898a812 100644
165
+ --- a/add.rb
166
+ +++ b/add.rb
167
+ @@ -1,5 +1,5 @@
168
+ module Add
169
+ - def add_4(x)
170
+ - x + 5
171
+ + def add_4(y)
172
+ + y + 5
173
+ end
174
+ end
175
+
176
+
177
+ 1) add.rb (or 's' for same)
178
+ """
179
+ When I type "r"
180
+ Then I should see:
181
+ """
182
+ commit 5087eab56af9b0901a1b190de14f29867307c140
183
+ Author: Danny Dover <developers+danny@foo.com>
184
+ Date: Sat Jan 14 14:50:06 2012 -0800
185
+
186
+ I like y's better
187
+
188
+ diff --git a/add.rb b/add.rb
189
+ index 44be98f..898a812 100644
190
+ --- a/add.rb
191
+ +++ b/add.rb
192
+ @@ -1,5 +1,5 @@
193
+ module Add
194
+ - def add_4(x)
195
+ - x + 5
196
+ + def add_4(y)
197
+ + y + 5
198
+ end
199
+ end
200
+
201
+
202
+ 1) add.rb (or 's' for same)
203
+ """
204
+
205
+ Scenario: Getting help interactively for git blame:
206
+ Given I cd to "test/fixtures/sample_git_repo"
207
+ When I run `../../../bin/git-blame-game add.rb` interactively
208
+ Then I should see:
209
+ """
210
+ (h for help) >
211
+ """
212
+ When I type "h"
213
+ Then I should see:
214
+ """
215
+ Enter:
216
+ - the line number from the above list (from 1 to 5) you are git blaming.
217
+ - the sha to git blame chain into.
218
+ - 'r' to re-view the git blame
219
+
220
+ (h for help) >
221
+ """
222
+
223
+ Scenario: Getting help interactively for git show:
224
+ Given I cd to "test/fixtures/sample_git_repo"
225
+ When I run `../../../bin/git-blame-game add.rb` interactively
226
+ And I type "3"
227
+ Then I should see:
228
+ """
229
+ (h for help) >
230
+ """
231
+ When I type "h"
232
+ Then I should see:
233
+ """
234
+ Enter:
235
+ - 'q' to quit, if you have found the offending commit
236
+ - the number from the above list (from 1 to 1) of the file to git blame chain into.
237
+ - the filepath to git blame chain into.
238
+ - 's' to git blame chain into the 'same' file as before
239
+ - 'r' to re-view the git show
240
+
241
+ (h for help) >
242
+ """
243
+
244
+
@@ -1,3 +1,26 @@
1
+ World(ArubaExt)
2
+
1
3
  Then /^the output should contain, ignoring spaces:$/ do |expected|
2
- assert_partial_output(expected.gsub("\s",''), all_output.gsub("\s",''))
4
+ assert_partial_output(expected.gsub("\s", ''), all_output.gsub("\s", ''))
5
+ end
6
+
7
+ Then /^I should see:$/ do |expected|
8
+ assert_seen(expected)
9
+ end
10
+
11
+ Then /^the next bit of output should contain, ignoring spaces:$/ do |expected|
12
+ assert_seen(expected)
13
+ end
14
+
15
+ def assert_seen(expected)
16
+ @seen_output ||= ''
17
+ expected = unescape(expected.gsub("\s", ''))
18
+ wait_until_expectation do
19
+ @all_output = only_processes[0].output(@aruba_keep_ansi)
20
+
21
+ actual = unescape(@all_output[@seen_output.size..-1].gsub("\s", ''))
22
+
23
+ actual.should include(expected)
24
+ end
25
+ @seen_output = @all_output
3
26
  end
@@ -0,0 +1,41 @@
1
+ # extension methods for Aruba
2
+ module ArubaExt
3
+
4
+ def wait_until(seconds = 5)
5
+ timeout(seconds) { yield }
6
+ end
7
+
8
+ def timeout(seconds = 50, &block)
9
+ start_time = Time.now
10
+
11
+ result = nil
12
+
13
+ until result
14
+ return result if result = yield
15
+
16
+ delay = seconds - (Time.now - start_time)
17
+ if delay <= 0
18
+ raise TimeoutError, "timed out"
19
+ end
20
+
21
+ sleep(0.05)
22
+ end
23
+ end
24
+
25
+ def wait_until_expectation
26
+ begin
27
+ exception = nil
28
+ wait_until do
29
+ begin
30
+ yield
31
+ true
32
+ rescue RSpec::Expectations::ExpectationNotMetError => e
33
+ exception = e
34
+ false
35
+ end
36
+ end
37
+ rescue TimeoutError
38
+ raise exception
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,5 @@
1
+ # NOTE: these features assumes a standard install of git with no .gitconfig options, which may alter git output
2
+
1
3
  require 'aruba/cucumber'
2
4
 
3
5
  def unzip_git_repo_if_needed!
@@ -15,6 +17,5 @@ end
15
17
 
16
18
  Before do
17
19
  unzip_git_repo_if_needed!
18
-
19
20
  set_relative_dir_for_aruba!
20
- end
21
+ end
@@ -1,2 +1,4 @@
1
- # Load nothing - just keep the file here to keep bundler happy.
2
-
1
+ require 'rubygems'
2
+ require 'colorize'
3
+ require 'optparse'
4
+ require 'git-blame-game/git_blame_game'
@@ -5,76 +5,135 @@ class GitBlameGame
5
5
  end
6
6
 
7
7
  def run
8
- while loop;
9
- end
10
- end
8
+ loop do
9
+ p_flush("\n")
11
10
 
12
- GIT_BLAME_REGEX = /(.+?) /
11
+ sha_to_show = show_git_blame_and_prompt_for_sha
13
12
 
14
- def loop
15
- puts
16
- out = run_idempotent_git_command("git blame #{@sha} -- #{@path_to_file}")
17
- exit $?.exitstatus unless $?.success?
13
+ p_flush("\n")
14
+ files_changed = `git show --pretty="format:" --name-only #{sha_to_show}`.split("\n")[1..-1]
18
15
 
19
- lines = out.split("\n")
20
- count = lines.count
16
+ @path_to_file = prompt_for_file(files_changed, sha_to_show)
17
+ @sha = "#{sha_to_show}^"
18
+ end
19
+ end
21
20
 
22
- line = prompt_for_line(count)
23
- sha_to_show = lines[line-1][GIT_BLAME_REGEX, 1]
21
+ private
22
+ def show_git_blame_and_prompt_for_sha
23
+ git_blame_out = `#{git_blame_cmd}`
24
+ exit $?.exitstatus unless $?.success?
25
+ sha_list = get_sha_list(git_blame_out)
26
+ print_git_blame_and_prompt
27
+ prompt_for_sha(sha_list)
28
+ end
24
29
 
25
- puts
26
- system "git show #{sha_to_show}"
27
- files_changed = `git show --pretty="format:" --name-only #{sha_to_show}`.split("\n")[1..-1]
30
+ def prompt_for_sha(shas)
31
+ loop do
32
+ input = $stdin.gets.strip
33
+ # sha was entered, return it:
34
+ return input if shas.include? input
35
+
36
+ if input =~ /\A\d+\Z/
37
+ input = input.to_i
38
+ return shas[input - 1] if input <= shas.count && input >= 1
39
+ end
40
+
41
+ if input == 'r'
42
+ print_git_blame_and_prompt
43
+ elsif input == 'h'
44
+ p_flush prompt_for_sha_message(shas.count)
45
+ else
46
+ p_flush "\nInvalid input. " + prompt_for_sha_message(shas.count)
47
+ end
48
+ end
49
+ end
28
50
 
29
- @path_to_file = prompt_for_file(files_changed,sha_to_show)
30
- @sha = "#{sha_to_show}^"
51
+ def print_git_blame_and_prompt
52
+ system git_blame_cmd
53
+ p_flush "\n" + simple_prompt
54
+ end
31
55
 
32
- true
56
+ def git_blame_cmd
57
+ "git blame #{@sha} -- #{@path_to_file}"
33
58
  end
34
59
 
35
- def prompt_for_file(files_changed,sha)
36
- print "\n" + gbc_color("Do you need to git blame chain further (y/n) >") + ' '
37
- input = $stdin.gets.strip.downcase
38
- until %w{y n}.include?(input)
39
- print "\n" + gbc_color("Invalid input. Enter y or n >") + ' '
40
- input = $stdin.gets.strip.downcase
41
- end
60
+ GIT_BLAME_REGEX = /(.+?) /
42
61
 
43
- if input == 'n'
44
- print "\n" + gbc_color("The responsible commit is:") + "\n\n"
45
- system "git log #{sha} -n 1"
46
- exit 0
47
- end
62
+ def get_sha_list(git_blame_out)
63
+ git_blame_out.strip.split("\n").map { |line| line[GIT_BLAME_REGEX, 1] }
64
+ end
48
65
 
49
- puts
50
- files_changed.each_with_index do |file,index|
51
- "%-10s %-12s %-15s %-48s %-s\n"
52
- printf("%3d) #{file}\n", index+1)
66
+ def prompt_for_file(files_changed, sha)
67
+ print_file_prompt(files_changed, sha)
68
+
69
+ loop do
70
+ input = $stdin.gets.strip
71
+ if input == 'q'
72
+ p_flush "\n" + color("The responsible commit is:") + "\n\n"
73
+ system "git log #{sha} -n 1"
74
+ exit 0
75
+ end
76
+ return @path_to_file if input == 's'
77
+ return input if files_changed.include? input
78
+
79
+ if input =~ /\A\d+\Z/
80
+ input = input.to_i
81
+ return files_changed[input-1] if input >= 1 && input <= files_changed.count
82
+ end
83
+
84
+ if input == 'r'
85
+ print_file_prompt(files_changed, sha)
86
+ elsif input == 'h'
87
+ p_flush prompt_for_file_message(files_changed.count)
88
+ else
89
+ p_flush "\nInvalid input. " + prompt_for_file_message(files_changed.count)
90
+ end
53
91
  end
92
+ end
54
93
 
55
- print "\n" + gbc_color("Enter the number (from 1 to #{files_changed.size}) of the file to git blame chain into >") + ' '
56
- until (input = $stdin.gets.strip.to_i) >= 1 && input <= files_changed.size
57
- print "\n" + gbc_color("Invalid input. Enter a number from 1 to #{files_changed.size} >") + ' '
94
+ def print_file_prompt(files, sha)
95
+ system "git show #{sha}"
96
+ print("\n")
97
+ files.each_with_index do |file, index|
98
+ line = sprintf("%3d) #{file}", index+1)
99
+ line += ' ' + orange_color("(or 's' for same)") if file == @path_to_file
100
+ print line + "\n"
58
101
  end
102
+ p_flush "\n" + simple_prompt
103
+ end
59
104
 
60
- return files_changed[input-1]
105
+ def prompt_for_file_message(count)
106
+ "Enter:\n" +
107
+ " - 'q' to quit, if you have found the offending commit\n" +
108
+ " - the number from the above list (from 1 to #{count}) of the file to git blame chain into.\n" +
109
+ " - the filepath to git blame chain into.\n" +
110
+ " - 's' to git blame chain into the 'same' file as before\n" +
111
+ " - 'r' to re-view the git show\n\n" +
112
+ simple_prompt
113
+ end
61
114
 
115
+ def simple_prompt
116
+ color("(h for help) >") + ' '
62
117
  end
63
118
 
64
- def prompt_for_line(count)
65
- print "\n" + gbc_color("Which line are you concerned with? (1 to #{count}) >") + ' '
66
- until (input = $stdin.gets.strip.to_i) >= 1 && input <= count
67
- print "\n" + gbc_color("Invalid input. Enter a number from 1 to #{count} >") + ' '
68
- end
69
- input
119
+ def prompt_for_sha_message(count)
120
+ "Enter:\n" +
121
+ " - the line number from the above list (from 1 to #{count}) you are git blaming.\n" +
122
+ " - the sha to git blame chain into.\n" +
123
+ " - 'r' to re-view the git blame\n\n" + simple_prompt
70
124
  end
71
125
 
72
- def run_idempotent_git_command(cmd)
73
- system cmd
74
- `#{cmd}`
126
+ def p_flush(str)
127
+ $stdout.print str
128
+ $stdout.flush
75
129
  end
76
130
 
77
- def gbc_color(s)
131
+ def color(s)
78
132
  s.colorize(:color => :light_white, :background => :magenta)
79
133
  end
134
+
135
+ def orange_color(s)
136
+ s.colorize(:color => :yellow, :background => :black)
137
+ end
138
+
80
139
  end
@@ -1,7 +1,7 @@
1
1
  module Git
2
2
  module Blame
3
3
  module Game
4
- VERSION = "0.0.1"
4
+ VERSION = "0.1.0"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe GitBlameGame do
4
+
5
+ let(:git_blame_game) { GitBlameGame.new('some_file') }
6
+ let(:sha_list) { %w(de2a1d78 5087eab5 5087eab5 de2a1d78 de2a1d78) }
7
+
8
+ before do
9
+ $stdout.stub(:print)
10
+ end
11
+
12
+ describe "#get_sha_list" do
13
+ let(:git_blame_out) {
14
+ <<-END.gsub(/^[ \t]+/m, '')
15
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
16
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 2) def add_4(y)
17
+ 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 3) y + 5
18
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
19
+ de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
20
+ END
21
+ }
22
+
23
+ it "should return a list of shas" do
24
+ git_blame_game.send(:get_sha_list,git_blame_out).should == sha_list
25
+ end
26
+ end
27
+
28
+ describe "prompt_for_sha" do
29
+ before do
30
+ $stdin.should_receive(:gets).and_return(input)
31
+ end
32
+ context "when user enters a correct sha" do
33
+ let(:input) { '5087eab5' }
34
+ it "should return the correct sha" do
35
+ git_blame_game.send(:prompt_for_sha, sha_list).should == '5087eab5'
36
+ end
37
+ end
38
+ context "when user enters a correct number" do
39
+ let(:input) { '1' }
40
+ it "should return the correct sha" do
41
+ git_blame_game.send(:prompt_for_sha, sha_list).should == 'de2a1d78'
42
+ end
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1 @@
1
+ require 'git-blame-game'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-blame-game
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-15 00:00:00.000000000 Z
12
+ date: 2012-01-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aruba
16
- requirement: &18572720 !ruby/object:Gem::Requirement
16
+ requirement: &18258680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *18572720
24
+ version_requirements: *18258680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: colorize
27
- requirement: &18572180 !ruby/object:Gem::Requirement
27
+ requirement: &18257780 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,29 +32,41 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *18572180
35
+ version_requirements: *18257780
36
36
  description: When one `git blame` is not enough
37
37
  email:
38
38
  - charles.finkel@gmail.com
39
39
  executables:
40
+ - git-ann-game
41
+ - git-annotate-game
40
42
  - git-blame-game
43
+ - git-praise-game
41
44
  extensions: []
42
45
  extra_rdoc_files: []
43
46
  files:
44
47
  - .gitignore
45
48
  - .rvmrc
49
+ - .travis.yml
46
50
  - Gemfile
47
51
  - README.md
48
52
  - Rakefile
53
+ - TODO
54
+ - bin/git-ann-game
55
+ - bin/git-annotate-game
49
56
  - bin/git-blame-game
50
- - features/blaming.feature
57
+ - bin/git-praise-game
58
+ - features/happy_path.feature
59
+ - features/other_scenarios.feature
51
60
  - features/step_definitions/gbc_steps.rb
61
+ - features/support/aruba_ext.rb
52
62
  - features/support/env.rb
53
63
  - git-blame-game.gemspec
54
64
  - lib/git-blame-game.rb
55
65
  - lib/git-blame-game/git_blame_game.rb
56
66
  - lib/git-blame-game/version.rb
57
67
  - public/pensive-kanye.png
68
+ - spec/git-blame-game/git_blame_game_spec.rb
69
+ - spec/spec_helper.rb
58
70
  - test/fixtures/sample_git_repo.zip
59
71
  homepage: https://github.com/charleseff/git-blame-game
60
72
  licenses: []
@@ -1,195 +0,0 @@
1
- Feature: Blaming
2
-
3
- Scenario: Getting help
4
- When I run `bin/git-blame-game --help`
5
- Then it should pass with:
6
- """
7
- Usage: git-blame-game [options] path/to/filename
8
- """
9
-
10
- Scenario: Without a filepath:
11
- When I run `bin/git-blame-game`
12
- Then it should fail with:
13
- """
14
- missing argument: You must specify a path to a file
15
- """
16
-
17
- Scenario: Specifying a file that doesn't exist:
18
- When I run `bin/git-blame-game file/that/doesnt/exist.rb`
19
- Then it should fail with:
20
- """
21
- fatal: no such path file/that/doesnt/exist.rb in HEAD
22
- """
23
-
24
- Scenario: Without a SHA:
25
- Given I cd to "test/fixtures/sample_git_repo"
26
- When I run `../../../bin/git-blame-game add.rb` interactively
27
- When I type "foobar"
28
- When I type "3"
29
- When I type "blah"
30
- When I type "y"
31
- When I type "1"
32
- When I type "3"
33
- When I type "y"
34
- When I type "2"
35
- When I type "2"
36
- When I type "n"
37
- Then the output should contain, ignoring spaces:
38
- """
39
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
40
- 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 2) def add_4(y)
41
- 5087eab5 (Danny Dover 2012-01-14 14:50:06 -0800 3) y + 5
42
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
43
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
44
-
45
- Which line are you concerned with? (1 to 5) >
46
- Invalid input. Enter a number from 1 to 5 >
47
- commit 5087eab56af9b0901a1b190de14f29867307c140 (HEAD, master)
48
- Author: Danny Dover <developers+danny@foo.com>
49
- Date: Sat Jan 14 14:50:06 2012 -0800
50
-
51
- I like y's better
52
-
53
- diff --git a/add.rb b/add.rb
54
- index 44be98f..898a812 100644
55
- --- a/add.rb
56
- +++ b/add.rb
57
- @@ -1,5 +1,5 @@
58
- module Add
59
- - def add_4(x)
60
- - x + 5
61
- + def add_4(y)
62
- + y + 5
63
- end
64
- end
65
-
66
-
67
- Do you need to git blame chain further (y/n) >
68
- Invalid input. Enter y or n >
69
- 1) add.rb
70
-
71
- Enter the number (from 1 to 1) of the file to git blame chain into >
72
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 1) module Add
73
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 2) def add_4(x)
74
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 3) x + 5
75
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 4) end
76
- de2a1d78 (Carmen Cummings 2012-01-14 14:49:00 -0800 5) end
77
-
78
- Which line are you concerned with? (1 to 5) >
79
- commit de2a1d78f80e02a515cdd3aa0420dd6ee35b510b
80
- Author: Carmen Cummings <developers+carmen@foo.com>
81
- Date: Sat Jan 14 14:49:00 2012 -0800
82
-
83
- moving add_4 to module
84
-
85
- diff --git a/add.rb b/add.rb
86
- new file mode 100644
87
- index 0000000..44be98f
88
- --- /dev/null
89
- +++ b/add.rb
90
- @@ -0,0 +1,5 @@
91
- +module Add
92
- + def add_4(x)
93
- + x + 5
94
- + end
95
- +end
96
-
97
- diff --git a/blah.rb b/blah.rb
98
- index 0424947..38b7511 100644
99
- --- a/blah.rb
100
- +++ b/blah.rb
101
- @@ -1,5 +1,5 @@
102
- -def add_4(x)
103
- - x + 5
104
- -end
105
- +$:.unshift(File.dirname(__FILE__))
106
- +require 'add'
107
- +include Add
108
-
109
- puts add_4(9) # should be 13
110
-
111
-
112
- Do you need to git blame chain further (y/n) >
113
- 1) add.rb
114
- 2) blah.rb
115
-
116
- Enter the number (from 1 to 2) of the file to git blame chain into >
117
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 1) def add_4(x)
118
- 63b41ee4 (Bob Barker 2012-01-14 14:46:53 -0800 2) x + 5
119
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 3) end
120
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 4)
121
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 5) puts add_4(9) # should be 13
122
-
123
- Which line are you concerned with? (1 to 5) >
124
- commit 63b41ee41653991aa00ce9687e3f403efd4c29d4
125
- Author: Bob Barker <developers+bob@foo.com>
126
- Date: Sat Jan 14 14:46:53 2012 -0800
127
-
128
- being bad
129
-
130
- diff --git a/blah.rb b/blah.rb
131
- index 626a42b..0424947 100644
132
- --- a/blah.rb
133
- +++ b/blah.rb
134
- @@ -1,5 +1,5 @@
135
- def add_4(x)
136
- - x + 4
137
- + x + 5
138
- end
139
-
140
- puts add_4(9) # should be 13
141
-
142
-
143
- Do you need to git blame chain further (y/n) >
144
- The responsible commit is:
145
-
146
- commit 63b41ee41653991aa00ce9687e3f403efd4c29d4
147
- Author: Bob Barker <developers+bob@foo.com>
148
- Date: Sat Jan 14 14:46:53 2012 -0800
149
-
150
- being bad
151
-
152
- """
153
-
154
- Scenario: With a SHA:
155
- Given I cd to "test/fixtures/sample_git_repo"
156
- When I run `../../../bin/git-blame-game blah.rb --sha=63b41ee41653991aa00ce9687e3f403efd4c29d4` interactively
157
- When I type "2"
158
- When I type "n"
159
- Then the output should contain, ignoring spaces:
160
- """
161
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 1) def add_4(x)
162
- 63b41ee4 (Bob Barker 2012-01-14 14:46:53 -0800 2) x + 5
163
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 3) end
164
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 4)
165
- ^f603a9a (Alice Amos 2012-01-14 14:46:18 -0800 5) puts add_4(9) # should be 13
166
-
167
- Which line are you concerned with? (1 to 5) >
168
- commit 63b41ee41653991aa00ce9687e3f403efd4c29d4
169
- Author: Bob Barker <developers+bob@foo.com>
170
- Date: Sat Jan 14 14:46:53 2012 -0800
171
-
172
- being bad
173
-
174
- diff --git a/blah.rb b/blah.rb
175
- index 626a42b..0424947 100644
176
- --- a/blah.rb
177
- +++ b/blah.rb
178
- @@ -1,5 +1,5 @@
179
- def add_4(x)
180
- - x + 4
181
- + x + 5
182
- end
183
-
184
- puts add_4(9) # should be 13
185
-
186
-
187
- Do you need to git blame chain further (y/n) >
188
- The responsible commit is:
189
-
190
- commit 63b41ee41653991aa00ce9687e3f403efd4c29d4
191
- Author: Bob Barker <developers+bob@foo.com>
192
- Date: Sat Jan 14 14:46:53 2012 -0800
193
-
194
- being bad
195
- """