git_statistics 0.2.0 → 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.
@@ -0,0 +1,365 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ include GitStatistics
3
+
4
+ describe Collector do
5
+
6
+ collector = Collector.new(false)
7
+
8
+ describe "#collect_branches" do
9
+ context "with many branches" do
10
+ branches = collector.collect_branches(fixture("git_many_branches.txt"))
11
+ it {branches.size.should == 2}
12
+ it {branches[0].should == "issue_2"}
13
+ it {branches[1].should == "master"}
14
+ end
15
+
16
+ context "with zero branches" do
17
+ branches = collector.collect_branches(fixture("git_zero_branches.txt"))
18
+ it {branches.size.should == 1}
19
+ it {branches[0].should == "master"}
20
+ end
21
+ end
22
+
23
+ describe "#extract_change_file" do
24
+ context "with a simple changed file" do
25
+ line = "37 30 lib/file.rb"
26
+ file = collector.extract_change_file(line)
27
+ it {file[:additions].should == 37}
28
+ it {file[:deletions].should == 30}
29
+ it {file[:file].should == "lib/file.rb"}
30
+ end
31
+
32
+ context "with a simple rename/copy changed file" do
33
+ line = "11 3 old_file.rb => lib/file.rb"
34
+ file = collector.extract_change_file(line)
35
+ it {file[:additions].should == 11}
36
+ it {file[:deletions].should == 3}
37
+ it {file[:file].should == "lib/file.rb"}
38
+ it {file[:old_file].should == "old_file.rb"}
39
+ end
40
+
41
+ context "with a complex rename/copy changed file" do
42
+ line = "- - lib/{old_dir => new_dir}/file.rb"
43
+ file = collector.extract_change_file(line)
44
+ it {file[:additions].should == 0}
45
+ it {file[:deletions].should == 0}
46
+ it {file[:file].should == "lib/new_dir/file.rb"}
47
+ it {file[:old_file].should == "lib/old_dir/file.rb"}
48
+ end
49
+ end
50
+
51
+ describe "#extract_create_delete_file" do
52
+ context "with a create changed file" do
53
+ line = "create mode 100644 lib/dir/file.rb"
54
+ file = collector.extract_create_delete_file(line)
55
+ it {file[:status].should == "create"}
56
+ it {file[:file].should == "lib/dir/file.rb"}
57
+ end
58
+
59
+ context "with a delete changed file" do
60
+ line = "delete mode 100644 lib/file.rb"
61
+ file = collector.extract_create_delete_file(line)
62
+ it {file[:status].should == "delete"}
63
+ it {file[:file].should == "lib/file.rb"}
64
+ end
65
+ end
66
+
67
+ describe "#extract_rename_copy_file" do
68
+ context "with a rename changed file" do
69
+ line = "rename lib/{old_dir => new_dir}/file.rb (100%)"
70
+ file = collector.extract_rename_copy_file(line)
71
+ it {file[:status].should == "rename"}
72
+ it {file[:old_file].should == "lib/old_dir/file.rb"}
73
+ it {file[:new_file].should == "lib/new_dir/file.rb"}
74
+ it {file[:similar].should == 100}
75
+ end
76
+
77
+ context "with a copy changed file" do
78
+ line = "copy lib/dir/{old_file.rb => new_file.rb} (75%)"
79
+ file = collector.extract_rename_copy_file(line)
80
+ it {file[:status].should == "copy"}
81
+ it {file[:old_file].should == "lib/dir/old_file.rb"}
82
+ it {file[:new_file].should == "lib/dir/new_file.rb"}
83
+ it {file[:similar].should == 75}
84
+ end
85
+ end
86
+
87
+ describe "#acquire_commit_data" do
88
+ context "no parent, first commit" do
89
+ collector.commits.clear
90
+ input = fixture("commit_buffer_information_first.txt").read
91
+ commit_data = collector.acquire_commit_data(input)
92
+ it {commit_data[:sha].should == "111111aa111a11111a11aa11aaaa11a111111a11"}
93
+ it {commit_data[:data][:author].should == "Test Author"}
94
+ it {commit_data[:data][:author_email].should == "author@test.com"}
95
+ it {commit_data[:data][:time].should == "2011-01-11 11:11:11 +0000"}
96
+ it {commit_data[:data][:merge].should be_false}
97
+ end
98
+
99
+ context "without merge, one parent" do
100
+ collector.commits.clear
101
+ input = fixture("commit_buffer_information.txt").read
102
+ commit_data = collector.acquire_commit_data(input)
103
+ it {commit_data[:sha].should == "111111aa111a11111a11aa11aaaa11a111111a11"}
104
+ it {commit_data[:data][:author].should == "Test Author"}
105
+ it {commit_data[:data][:author_email].should == "author@test.com"}
106
+ it {commit_data[:data][:time].should == "2011-01-11 11:11:11 +0000"}
107
+ it {commit_data[:data][:merge].should be_false}
108
+ end
109
+
110
+ context "with merge, two parents" do
111
+ collector.commits.clear
112
+ input = fixture("commit_buffer_information_with_merge.txt").read
113
+ commit_data = collector.acquire_commit_data(input)
114
+ it {commit_data[:sha].should == "111111aa111a11111a11aa11aaaa11a111111a11"}
115
+ it {commit_data[:data][:author].should == "Test Author"}
116
+ it {commit_data[:data][:author_email].should == "author@test.com"}
117
+ it {commit_data[:data][:time].should == "2011-01-11 11:11:11 +0000"}
118
+ it {commit_data[:data][:merge].should be_true}
119
+ end
120
+ end
121
+
122
+ describe "#identify_changed_files" do
123
+ context "with no changes" do
124
+ buffer = []
125
+ files = collector.identify_changed_files(buffer)
126
+ it {files.size.should == 0}
127
+ it {files[0].should == nil}
128
+ end
129
+
130
+ context "with all types (create,delete,rename,copy) of files" do
131
+ # Create buffer which is an array of cleaned lines
132
+ buffer = []
133
+ fixture("commit_buffer_changes.txt").readlines.each do |line|
134
+ buffer << Utilities.clean_string(line)
135
+ end
136
+
137
+ files = collector.identify_changed_files(buffer)
138
+ it {files.size.should == 5}
139
+
140
+ it {files[0][:additions].should == 45}
141
+ it {files[0][:deletions].should == 1}
142
+ it {files[0][:file].should == "dir/README"}
143
+
144
+ it {files[1][:additions].should == 6}
145
+ it {files[1][:deletions].should == 5}
146
+ it {files[1][:old_file].should == "dir/lib/old_dir/copy_file.rb"}
147
+ it {files[1][:file].should == "dir/lib/new_dir/copy_file.rb"}
148
+ it {files[1][:status].should == "copy"}
149
+
150
+ it {files[2][:additions].should == 0}
151
+ it {files[2][:deletions].should == 0}
152
+ it {files[2][:old_file].should == "dir/lib/rename/old_file.rb"}
153
+ it {files[2][:file].should == "dir/lib/rename/new_file.rb"}
154
+ it {files[2][:status].should == "rename"}
155
+
156
+ it {files[3][:additions].should == 0}
157
+ it {files[3][:deletions].should == 127}
158
+ it {files[3][:file].should == "dir/lib/delete_file.rb"}
159
+ it {files[3][:status].should == "delete"}
160
+
161
+ it {files[4][:additions].should == 60}
162
+ it {files[4][:deletions].should == 0}
163
+ it {files[4][:file].should == "dir/lib/create_file.rb"}
164
+ it {files[4][:status].should == "create"}
165
+ end
166
+ end
167
+
168
+ describe "#extract_commit" do
169
+ context "with valid buffer" do
170
+ collector.commits.clear
171
+ buffer = []
172
+ fixture("commit_buffer_whole.txt").readlines.each do |line|
173
+ buffer << Utilities.clean_string(line)
174
+ end
175
+ data = collector.extract_commit(buffer)
176
+
177
+ it {data[:author].should == "Kevin Jalbert"}
178
+ it {data[:author_email].should == "kevin.j.jalbert@gmail.com"}
179
+ it {data[:time].should == "2012-04-12 14:13:56 -0400"}
180
+
181
+ it {data[:merge].should == false}
182
+ it {data[:additions].should == 30}
183
+ it {data[:deletions].should == 2}
184
+ it {data[:create].should == 1}
185
+
186
+ it {data[:files][0][:name].should == "Gemfile"}
187
+ it {data[:files][0][:additions].should == 0}
188
+ it {data[:files][0][:deletions].should == 1}
189
+ it {data[:files][0][:status].should == nil}
190
+ it {data[:files][0][:binary].should == false}
191
+ it {data[:files][0][:image].should == false}
192
+ it {data[:files][0][:vendored].should == false}
193
+ it {data[:files][0][:generated].should == false}
194
+ it {data[:files][0][:language].should == "Ruby"}
195
+
196
+ it {data[:files][1][:name].should == "Gemfile.lock"}
197
+ it {data[:files][1][:additions].should == 30}
198
+ it {data[:files][1][:deletions].should == 0}
199
+ it {data[:files][1][:status].should == "create"}
200
+ it {data[:files][1][:binary].should == false}
201
+ it {data[:files][1][:image].should == false}
202
+ it {data[:files][1][:vendored].should == false}
203
+ it {data[:files][1][:generated].should == true}
204
+ it {data[:files][1][:language].should == "Unknown"}
205
+
206
+ it {data[:files][2][:name].should == "lib/git_statistics/initialize.rb"}
207
+ it {data[:files][2][:additions].should == 0}
208
+ it {data[:files][2][:deletions].should == 1}
209
+ it {data[:files][2][:status].should == nil}
210
+ it {data[:files][2][:binary].should == false}
211
+ it {data[:files][2][:image].should == false}
212
+ it {data[:files][2][:vendored].should == false}
213
+ it {data[:files][2][:generated].should == false}
214
+ it {data[:files][2][:language].should == "Ruby"}
215
+ end
216
+
217
+ context "with buffer that has no file changes" do
218
+ collector.commits.clear
219
+ buffer = []
220
+ fixture("commit_buffer_information.txt").readlines.each do |line|
221
+ buffer << Utilities.clean_string(line)
222
+ end
223
+ data = collector.extract_commit(buffer)
224
+
225
+ it {data.should == nil}
226
+ end
227
+
228
+ context "with invalid buffer" do
229
+ collector.commits.clear
230
+ buffer = "invalid input"
231
+ data = collector.extract_commit(buffer)
232
+
233
+ it {data.should == nil}
234
+ end
235
+ end
236
+
237
+ describe "#fall_back_collect_commit" do
238
+ context "with valid sha" do
239
+ buffer = collector.fall_back_collect_commit("260bc61e2c42930d91f3503c5849b0a2351275cf")
240
+
241
+ # Create buffer which is an array of cleaned lines
242
+ expected = []
243
+ fixture("commit_buffer_whole.txt").readlines.each do |line|
244
+ expected << Utilities.clean_string(line)
245
+ end
246
+
247
+ it {buffer.should == expected}
248
+ end
249
+
250
+ context "with invalid sha" do
251
+ buffer = collector.fall_back_collect_commit("111111aa111a11111a11aa11aaaa11a111111a11")
252
+ it {buffer.should == nil}
253
+ end
254
+ end
255
+
256
+ describe "#get_blob" do
257
+ sha = "695b487432e8a1ede765b4e3efda088ab87a77f8" # Commit within repository
258
+
259
+ context "with valid blob" do
260
+ file = {:file => "Gemfile.lock"}
261
+ blob = collector.get_blob(sha, file)
262
+
263
+ it {blob.instance_of?(Grit::Blob).should be_true}
264
+ it {blob.name.should == file[:file].split(File::Separator).last}
265
+ end
266
+
267
+ context "with invalid blob" do
268
+ file = {:file => "dir/nothing.rb"}
269
+ blob = collector.get_blob(sha, file)
270
+
271
+ it {blob.should == nil}
272
+ end
273
+
274
+ context "with deleted file" do
275
+ file = {:file => "spec/collector_spec.rb"}
276
+ blob = collector.get_blob(sha, file)
277
+
278
+ it {blob.instance_of?(Grit::Blob).should be_true}
279
+ it {blob.name.should == file[:file].split(File::Separator).last}
280
+ end
281
+ end
282
+
283
+ describe "#process_blob" do
284
+ sha = "695b487432e8a1ede765b4e3efda088ab87a77f8" # Commit within repository
285
+
286
+ context "with status (delete) blob" do
287
+ file = {:file => "spec/collector_spec.rb",
288
+ :additions => 0,
289
+ :deletions => 6,
290
+ :status => "delete"}
291
+
292
+ blob = collector.get_blob(sha, file)
293
+ data = Hash.new(0)
294
+ data[:files] = []
295
+ data = collector.process_blob(data, blob, file)
296
+ data_file = data[:files].first
297
+
298
+ it {data[:additions].should == file[:additions]}
299
+ it {data[:deletions].should == file[:deletions]}
300
+
301
+ it {data_file[:name].should == file[:file]}
302
+ it {data_file[:additions].should == file[:additions]}
303
+ it {data_file[:deletions].should == file[:deletions]}
304
+ it {data_file[:status].should == file[:status]}
305
+ it {data_file[:binary].should == false}
306
+ it {data_file[:image].should == false}
307
+ it {data_file[:vendored].should == false}
308
+ it {data_file[:generated].should == false}
309
+ it {data_file[:language].should == "Ruby"}
310
+ end
311
+
312
+ context "with invalid language blob" do
313
+ file = {:file => "Gemfile.lock",
314
+ :additions => 33,
315
+ :deletions => 11,
316
+ :status => nil}
317
+
318
+ blob = collector.get_blob(sha, file)
319
+ data = Hash.new(0)
320
+ data[:files] = []
321
+ data = collector.process_blob(data, blob, file)
322
+ data_file = data[:files].first
323
+
324
+ it {data[:additions].should == file[:additions]}
325
+ it {data[:deletions].should == file[:deletions]}
326
+
327
+ it {data_file[:name].should == file[:file]}
328
+ it {data_file[:additions].should == file[:additions]}
329
+ it {data_file[:deletions].should == file[:deletions]}
330
+ it {data_file[:status].should == nil}
331
+ it {data_file[:binary].should == false}
332
+ it {data_file[:image].should == false}
333
+ it {data_file[:vendored].should == false}
334
+ it {data_file[:generated].should == true}
335
+ it {data_file[:language].should == "Unknown"}
336
+ end
337
+
338
+ context "with valid language blob" do
339
+ file = {:file => "README.md",
340
+ :additions => 7,
341
+ :deletions => 3,
342
+ :status => nil}
343
+
344
+ blob = collector.get_blob(sha, file)
345
+ data = Hash.new(0)
346
+ data[:files] = []
347
+ data = collector.process_blob(data, blob, file)
348
+ data_file = data[:files].first
349
+
350
+ it {data[:additions].should == file[:additions]}
351
+ it {data[:deletions].should == file[:deletions]}
352
+
353
+ it {data_file[:name].should == file[:file]}
354
+ it {data_file[:additions].should == file[:additions]}
355
+ it {data_file[:deletions].should == file[:deletions]}
356
+ it {data_file[:status].should == nil}
357
+ it {data_file[:binary].should == false}
358
+ it {data_file[:image].should == false}
359
+ it {data_file[:vendored].should == false}
360
+ it {data_file[:generated].should == false}
361
+ it {data_file[:language].should == "Markdown"}
362
+ end
363
+ end
364
+
365
+ end
@@ -0,0 +1,238 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ include GitStatistics
3
+
4
+ describe Commits do
5
+ collector = Collector.new(false)
6
+
7
+ describe "#author_top_n_type" do
8
+ context "with valid data" do
9
+ commits = Commits.new
10
+ commits.load(fixture("multiple_authors.json"))
11
+
12
+ commits.calculate_statistics(false, false)
13
+ stats = commits.author_top_n_type(:deletions)
14
+
15
+ # Check stats for first author
16
+ author_1 = "John Smith"
17
+ it {stats.has_key?(author_1).should be_true}
18
+ it {stats[author_1][:commits].should == 1}
19
+ it {stats[author_1][:additions].should == 64}
20
+ it {stats[author_1][:deletions].should == 16}
21
+
22
+ it {stats[author_1][:languages][:Ruby][:additions].should == 64}
23
+ it {stats[author_1][:languages][:Ruby][:deletions].should == 16}
24
+
25
+ # Check stats for second author
26
+ author_2 = "Kevin Jalbert"
27
+ it {stats.has_key?(author_2).should be_true}
28
+ it {stats[author_2][:commits].should == 1}
29
+ it {stats[author_2][:additions].should == 73}
30
+ it {stats[author_2][:deletions].should == 0}
31
+ it {stats[author_2][:create].should == 2}
32
+
33
+ it {stats[author_2][:languages][:Markdown][:additions].should == 11}
34
+ it {stats[author_2][:languages][:Markdown][:deletions].should == 0}
35
+ it {stats[author_2][:languages][:Markdown][:create].should== 1}
36
+ it {stats[author_2][:languages][:Ruby][:additions].should == 62}
37
+ it {stats[author_2][:languages][:Ruby][:deletions].should == 0}
38
+ it {stats[author_2][:languages][:Ruby][:create].should == 1}
39
+ end
40
+
41
+ context "with invalid type" do
42
+ commits = Commits.new
43
+ commits.load(fixture("multiple_authors.json"))
44
+
45
+ commits.calculate_statistics(false, false)
46
+ stats = commits.author_top_n_type(:wrong)
47
+
48
+ it {stats.should == nil}
49
+ end
50
+
51
+ context "with invalid data" do
52
+ commits = Commits.new
53
+
54
+ commits.calculate_statistics(false, false)
55
+ stats = commits.author_top_n_type(:deletions)
56
+
57
+ it {stats.should == nil}
58
+ end
59
+ end
60
+
61
+ describe "#calculate_statistics" do
62
+ context "with email" do
63
+ commits = Commits.new
64
+ commits.load(fixture("single_author_pretty.json"))
65
+
66
+ commits.calculate_statistics(true, false)
67
+ stats = commits.author_top_n_type(:commits)
68
+
69
+ author = "kevin.j.jalbert@gmail.com"
70
+ it {stats.has_key?(author).should be_true}
71
+ it {stats[author][:commits].should == 1}
72
+ it {stats[author][:additions].should == 73}
73
+ it {stats[author][:deletions].should == 0}
74
+ it {stats[author][:create].should == 2}
75
+
76
+ it {stats[author][:languages][:Markdown][:additions].should == 11}
77
+ it {stats[author][:languages][:Markdown][:deletions].should == 0}
78
+ it {stats[author][:languages][:Ruby][:additions].should == 62}
79
+ it {stats[author][:languages][:Ruby][:deletions].should == 0}
80
+ it {stats[author][:languages][:Ruby][:create].should == 1}
81
+ end
82
+
83
+ context "with merge" do
84
+ commits = Commits.new
85
+ commits.load(fixture("single_author_pretty.json"))
86
+
87
+ commits.calculate_statistics(false, true)
88
+ stats = commits.author_top_n_type(:commits)
89
+
90
+ author = "Kevin Jalbert"
91
+ it {stats.has_key?(author).should be_true}
92
+ it {stats[author][:commits].should == 2}
93
+ it {stats[author][:additions].should == 153}
94
+ it {stats[author][:deletions].should == 5}
95
+ it {stats[author][:create].should == 3}
96
+ it {stats[author][:merges].should == 1}
97
+
98
+ it {stats[author][:languages][:Markdown][:additions].should == 18}
99
+ it {stats[author][:languages][:Markdown][:deletions].should == 1}
100
+ it {stats[author][:languages][:Ruby][:additions].should == 135}
101
+ it {stats[author][:languages][:Ruby][:deletions].should == 4}
102
+ it {stats[author][:languages][:Ruby][:create].should == 2}
103
+ end
104
+ end
105
+
106
+ describe "#add_language_stats" do
107
+ file = {:additions => 10,
108
+ :deletions => 5}
109
+
110
+ context "with file language" do
111
+ commits = Commits.new
112
+ data = Hash.new(0)
113
+ data[:languages] = {}
114
+
115
+ file[:language] = "Ruby"
116
+
117
+ data = commits.add_language_stats(data, file)
118
+
119
+ it {data[:languages][:Ruby][:additions].should == 10}
120
+ it {data[:languages][:Ruby][:deletions].should == 5}
121
+ end
122
+
123
+ context "with multiple files" do
124
+ commits = Commits.new
125
+ data = Hash.new(0)
126
+ data[:languages] = {}
127
+
128
+ # First file is "Ruby"
129
+ file[:language] = "Ruby"
130
+ data = commits.add_language_stats(data, file)
131
+
132
+ # Second file is "Java"
133
+ file[:language] = "Java"
134
+ data = commits.add_language_stats(data, file)
135
+
136
+ # Third file is "Ruby"
137
+ file[:language] = "Ruby"
138
+ data = commits.add_language_stats(data, file)
139
+
140
+ it {data[:languages][:Ruby][:additions].should == 20}
141
+ it {data[:languages][:Ruby][:deletions].should == 10}
142
+ it {data[:languages][:Java][:additions].should == 10}
143
+ it {data[:languages][:Java][:deletions].should == 5}
144
+ end
145
+ end
146
+
147
+ describe "#add_commit_stats" do
148
+ commit = {:additions => 10,
149
+ :deletions => 5,
150
+ :merge => false}
151
+
152
+ context "with valid commit" do
153
+ commits = Commits.new
154
+ data = Hash.new(0)
155
+
156
+ data = commits.add_commit_stats(data, commit)
157
+
158
+ it {data[:commits].should == 1}
159
+ it {data[:additions].should == 10}
160
+ it {data[:deletions].should == 5}
161
+ it {data[:merges].should == 0}
162
+ end
163
+
164
+ context "with multiple commits" do
165
+ commits = Commits.new
166
+ data = Hash.new(0)
167
+
168
+ data = commits.add_commit_stats(data, commit)
169
+
170
+ # Second commit has merge status
171
+ commit[:merge] = true
172
+
173
+ data = commits.add_commit_stats(data, commit)
174
+
175
+ it {data[:commits].should == 2}
176
+ it {data[:additions].should == 20}
177
+ it {data[:deletions].should == 10}
178
+ it {data[:merges].should == 1}
179
+ end
180
+
181
+ context "with commit that has file status changes" do
182
+ commits = Commits.new
183
+ data = Hash.new(0)
184
+ commit[:create] = 1
185
+ commit[:delete] = 2
186
+ commit[:rename] = 3
187
+ commit[:copy] = 4
188
+
189
+ data = commits.add_commit_stats(data, commit)
190
+
191
+ it {data[:commits].should == 1}
192
+ it {data[:additions].should == 10}
193
+ it {data[:deletions].should == 5}
194
+ it {data[:create].should == 1}
195
+ it {data[:delete].should == 2}
196
+ it {data[:rename].should == 3}
197
+ it {data[:copy].should == 4}
198
+ end
199
+
200
+ context "with merge commit" do
201
+ commits = Commits.new
202
+ data = Hash.new(0)
203
+ commit[:merge] = true
204
+
205
+ data = commits.add_commit_stats(data, commit)
206
+
207
+ it {data[:commits].should == 1}
208
+ it {data[:additions].should == 10}
209
+ it {data[:deletions].should == 5}
210
+ it {data[:merges].should == 1}
211
+ end
212
+ end
213
+
214
+ describe "#save and #load" do
215
+ context "with pretty" do
216
+ commits = Commits.new
217
+ commits.load(fixture("single_author_pretty.json"))
218
+ commits.save("tmp.json", true)
219
+
220
+ same = FileUtils.compare_file("tmp.json", fixture("single_author_pretty.json"))
221
+ FileUtils.remove_file("tmp.json")
222
+
223
+ it {same.should be_true}
224
+ end
225
+
226
+ context "with no pretty" do
227
+ commits = Commits.new
228
+ commits.load(fixture("multiple_authors.json"))
229
+ commits.save("tmp.json", false)
230
+
231
+ same = FileUtils.compare_file("tmp.json", fixture("multiple_authors.json"))
232
+ FileUtils.remove_file("tmp.json")
233
+
234
+ it {same.should be_true}
235
+ end
236
+ end
237
+
238
+ end
@@ -0,0 +1,9 @@
1
+ 45 1 dir/README
2
+ 6 5 dir/lib/{old_dir => new_dir}/copy_file.rb
3
+ 0 0 dir/lib/rename/{old_file.rb => new_file.rb}
4
+ 0 127 dir/lib/delete_file.rb
5
+ 60 0 dir/lib/create_file.rb
6
+ copy dir/lib/{old_dir => new_dir}/copy_file.rb (65%)
7
+ rename dir/lib/rename/{old_file.rb => new_file.rb} (100%)
8
+ delete mode 100644 dir/lib/delete_file.rb
9
+ create mode 100644 dir/lib/create_file.rb
@@ -0,0 +1 @@
1
+ 111111aa111a11111a11aa11aaaa11a111111a11,Test Author,author@test.com,2011-01-11 11:11:11 +0000,22bbbb2
@@ -0,0 +1 @@
1
+ 111111aa111a11111a11aa11aaaa11a111111a11,Test Author,author@test.com,2011-01-11 11:11:11 +0000,
@@ -0,0 +1 @@
1
+ 111111aa111a11111a11aa11aaaa11a111111a11,Test Author,author@test.com,2011-01-11 11:11:11 +0000,22bbbb2 33cccc3
@@ -0,0 +1,6 @@
1
+ 260bc61e2c42930d91f3503c5849b0a2351275cf,Kevin Jalbert,kevin.j.jalbert@gmail.com,2012-04-12 14:13:56 -0400,caf6716
2
+
3
+ 0 1 Gemfile
4
+ 30 0 Gemfile.lock
5
+ 0 1 lib/git_statistics/initialize.rb
6
+ create mode 100644 Gemfile.lock
@@ -0,0 +1,2 @@
1
+ * issue_2
2
+ master
@@ -0,0 +1 @@
1
+ * master
@@ -0,0 +1,4 @@
1
+ All authors(2) sorted by commits
2
+ ----------------------------------------------------------------------------------------------------------------
3
+ Name/Email | Language | Commits | Additions | Deletions | Creates | Deletes | Renames | Copies | Merges |
4
+ ----------------------------------------------------------------------------------------------------------------
@@ -0,0 +1,2 @@
1
+ | Markdown | | 11 | 0 | 1 | 0 | 0 | 0 | 0 |
2
+ | Ruby | | 62 | 0 | 1 | 0 | 0 | 0 | 0 |
@@ -0,0 +1 @@
1
+ {"0e82e507e5b64a1140623c702015b97b1b3f7f81":{"author":"Kevin Jalbert","author_email":"kevin.j.jalbert@gmail.com","time":"2012-04-04 13:46:56 -0400","files":[{"name":"README.md","additions":11,"deletions":0,"status":"create","binary":false,"image":false,"vendored":false,"generated":false,"language":"Markdown"},{"name":"git_statistics.rb","additions":62,"deletions":0,"status":"create","binary":false,"image":false,"vendored":false,"generated":false,"language":"Ruby"}],"merge":false,"create":2,"additions":73,"deletions":0},"fe947ea47b3d6240f2bb103ff51636038b3bb1d7":{"author":"John Smith","author_email":"john.smith@sample.com","time":"2012-04-04 19:22:04 -0400","files":[{"name":"git_statistics.rb","additions":64,"deletions":16,"status":null,"binary":false,"image":false,"vendored":false,"generated":false,"language":"Ruby"}],"merge":false,"additions":64,"deletions":16},"354e8a3795470d75388549d7326d9c12f6e0bf1a":{"author":"Kevin Jalbert","author_email":"kevin.j.jalbert@gmail.com","time":"2012-04-04 23:50:04 -0400","files":[{"name":"README.md","additions":7,"deletions":1,"status":null,"binary":false,"image":false,"vendored":false,"generated":false,"language":"Markdown"},{"name":"commits.rb","additions":64,"deletions":0,"status":"create","binary":false,"image":false,"vendored":false,"generated":false,"language":"Ruby"},{"name":"git_statistics.rb","additions":9,"deletions":4,"status":null,"binary":false,"image":false,"vendored":false,"generated":false,"language":"Ruby"}],"merge":true,"additions":80,"deletions":5,"create":1}}