schacon-git 1.0.7 → 1.1.1

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/lib.rb CHANGED
@@ -7,14 +7,12 @@ module Git
7
7
 
8
8
  class Lib
9
9
 
10
- @git_dir = nil
11
- @git_index_file = nil
12
- @git_work_dir = nil
13
- @path = nil
14
-
15
- @logger = nil
16
-
17
10
  def initialize(base = nil, logger = nil)
11
+ @git_dir = nil
12
+ @git_index_file = nil
13
+ @git_work_dir = nil
14
+ @path = nil
15
+
18
16
  if base.is_a?(Git::Base)
19
17
  @git_dir = base.repo.path
20
18
  @git_index_file = base.index.path if base.index
@@ -24,9 +22,7 @@ module Git
24
22
  @git_index_file = base[:index]
25
23
  @git_work_dir = base[:working_directory]
26
24
  end
27
- if logger
28
- @logger = logger
29
- end
25
+ @logger = logger
30
26
  end
31
27
 
32
28
  def init
@@ -39,18 +35,22 @@ module Git
39
35
  # {:working_directory} otherwise
40
36
  #
41
37
  # accepts options:
42
- # :remote - name of remote (rather than 'origin')
43
- # :bare - no working directory
38
+ # :remote:: name of remote (rather than 'origin')
39
+ # :bare:: no working directory
40
+ # :depth:: the number of commits back to pull
44
41
  #
45
42
  # TODO - make this work with SSH password or auth_key
46
43
  #
47
44
  def clone(repository, name, opts = {})
48
45
  @path = opts[:path] || '.'
49
- opts[:path] ? clone_dir = File.join(@path, name) : clone_dir = name
46
+ clone_dir = opts[:path] ? File.join(@path, name) : name
50
47
 
51
48
  arr_opts = []
52
49
  arr_opts << "--bare" if opts[:bare]
53
- arr_opts << "-o #{opts[:remote]}" if opts[:remote]
50
+ arr_opts << "-o" << opts[:remote] if opts[:remote]
51
+ arr_opts << "--depth" << opts[:depth].to_i if opts[:depth] && opts[:depth].to_i > 0
52
+
53
+ arr_opts << '--'
54
54
  arr_opts << repository
55
55
  arr_opts << clone_dir
56
56
 
@@ -66,46 +66,41 @@ module Git
66
66
  def log_commits(opts = {})
67
67
  arr_opts = ['--pretty=oneline']
68
68
  arr_opts << "-#{opts[:count]}" if opts[:count]
69
- arr_opts << "--since=\"#{opts[:since]}\"" if opts[:since].is_a? String
70
- arr_opts << "--until=\"#{opts[:until]}\"" if opts[:until].is_a? String
71
- arr_opts << "--grep=\"#{opts[:grep]}\"" if opts[:grep].is_a? String
72
- arr_opts << "--author=\"#{opts[:author]}\"" if opts[:author].is_a? String
69
+ arr_opts << "--since=#{opts[:since]}" if opts[:since].is_a? String
70
+ arr_opts << "--until=#{opts[:until]}" if opts[:until].is_a? String
71
+ arr_opts << "--grep=#{opts[:grep]}" if opts[:grep].is_a? String
72
+ arr_opts << "--author=#{opts[:author]}" if opts[:author].is_a? String
73
73
  arr_opts << "#{opts[:between][0].to_s}..#{opts[:between][1].to_s}" if (opts[:between] && opts[:between].size == 2)
74
74
  arr_opts << opts[:object] if opts[:object].is_a? String
75
- arr_opts << '-- ' + opts[:path_limiter] if opts[:path_limiter].is_a? String
76
-
75
+ arr_opts << '--' << opts[:path_limiter] if opts[:path_limiter].is_a? String
76
+
77
77
  command_lines('log', arr_opts, true).map { |l| l.split.first }
78
78
  end
79
79
 
80
80
  def full_log_commits(opts = {})
81
81
  arr_opts = ['--pretty=raw']
82
82
  arr_opts << "-#{opts[:count]}" if opts[:count]
83
- arr_opts << "--since=\"#{opts[:since]}\"" if opts[:since].is_a? String
84
- arr_opts << "--until=\"#{opts[:until]}\"" if opts[:until].is_a? String
85
- arr_opts << "--grep=\"#{opts[:grep]}\"" if opts[:grep].is_a? String
86
- arr_opts << "--author=\"#{opts[:author]}\"" if opts[:author].is_a? String
83
+ arr_opts << "--skip=#{opts[:skip]}" if opts[:skip]
84
+ arr_opts << "--since=#{opts[:since]}" if opts[:since].is_a? String
85
+ arr_opts << "--until=#{opts[:until]}" if opts[:until].is_a? String
86
+ arr_opts << "--grep=#{opts[:grep]}" if opts[:grep].is_a? String
87
+ arr_opts << "--author=#{opts[:author]}" if opts[:author].is_a? String
87
88
  arr_opts << "#{opts[:between][0].to_s}..#{opts[:between][1].to_s}" if (opts[:between] && opts[:between].size == 2)
88
89
  arr_opts << opts[:object] if opts[:object].is_a? String
89
- arr_opts << '-- ' + opts[:path_limiter] if opts[:path_limiter].is_a? String
90
+ arr_opts << '--' << opts[:path_limiter] if opts[:path_limiter].is_a? String
90
91
 
91
92
  full_log = command_lines('log', arr_opts, true)
92
93
  process_commit_data(full_log)
93
94
  end
94
95
 
95
96
  def revparse(string)
96
- if /\w{40}/.match(string) # passing in a sha - just no-op it
97
- return string
97
+ return string if string =~ /[A-Fa-f0-9]{40}/ # passing in a sha - just no-op it
98
+ rev = ['head', 'remotes', 'tags'].map do |d|
99
+ File.join(@git_dir, 'refs', d, string)
100
+ end.find do |path|
101
+ File.file?(path)
98
102
  end
99
-
100
- head = File.join(@git_dir, 'refs', 'heads', string)
101
- return File.read(head).chomp if File.file?(head)
102
-
103
- head = File.join(@git_dir, 'refs', 'remotes', string)
104
- return File.read(head).chomp if File.file?(head)
105
-
106
- head = File.join(@git_dir, 'refs', 'tags', string)
107
- return File.read(head).chomp if File.file?(head)
108
-
103
+ return File.read(rev).chomp if rev
109
104
  command('rev-parse', string)
110
105
  end
111
106
 
@@ -125,10 +120,10 @@ module Git
125
120
  def commit_data(sha)
126
121
  sha = sha.to_s
127
122
  cdata = command_lines('cat-file', ['commit', sha])
128
- process_commit_data(cdata, sha)
123
+ process_commit_data(cdata, sha, 0)
129
124
  end
130
125
 
131
- def process_commit_data(data, sha = nil)
126
+ def process_commit_data(data, sha = nil, indent = 4)
132
127
  in_message = false
133
128
 
134
129
  if sha
@@ -139,11 +134,11 @@ module Git
139
134
 
140
135
  data.each do |line|
141
136
  line = line.chomp
142
- if in_message && line != ''
143
- hsh['message'] += line + "\n"
144
- end
145
-
146
- if (line != '') && !in_message
137
+ if line == ''
138
+ in_message = !in_message
139
+ elsif in_message
140
+ hsh['message'] << line[indent..-1] << "\n"
141
+ else
147
142
  data = line.split
148
143
  key = data.shift
149
144
  value = data.join(' ')
@@ -157,10 +152,6 @@ module Git
157
152
  else
158
153
  hsh[key] = value
159
154
  end
160
- elsif in_message && line == ''
161
- in_message = false
162
- else
163
- in_message = true
164
155
  end
165
156
  end
166
157
 
@@ -179,7 +170,7 @@ module Git
179
170
  def ls_tree(sha)
180
171
  data = {'blob' => {}, 'tree' => {}}
181
172
 
182
- command_lines('ls-tree', sha.to_s).each do |line|
173
+ command_lines('ls-tree', sha).each do |line|
183
174
  (info, filenm) = line.split("\t")
184
175
  (mode, type, sha) = info.split
185
176
  data[type][filenm] = {:mode => mode, :sha => sha}
@@ -189,11 +180,11 @@ module Git
189
180
  end
190
181
 
191
182
  def mv(file1, file2)
192
- command_lines('mv', [file1, file2])
183
+ command_lines('mv', ['--', file1, file2])
193
184
  end
194
185
 
195
186
  def full_tree(sha)
196
- command_lines('ls-tree', ['-r', sha.to_s])
187
+ command_lines('ls-tree', ['-r', sha])
197
188
  end
198
189
 
199
190
  def tree_depth(sha)
@@ -207,8 +198,7 @@ module Git
207
198
  def branches_all
208
199
  arr = []
209
200
  command_lines('branch', '-a').each do |b|
210
- current = false
211
- current = true if b[0, 2] == '* '
201
+ current = (b[0, 2] == '* ')
212
202
  arr << [b.gsub('* ', '').strip, current]
213
203
  end
214
204
  arr
@@ -230,14 +220,16 @@ module Git
230
220
  # [tree-ish] = [[line_no, match], [line_no, match2]]
231
221
  # [tree-ish] = [[line_no, match], [line_no, match2]]
232
222
  def grep(string, opts = {})
233
- opts[:object] = 'HEAD' if !opts[:object]
223
+ opts[:object] ||= 'HEAD'
234
224
 
235
225
  grep_opts = ['-n']
236
226
  grep_opts << '-i' if opts[:ignore_case]
237
227
  grep_opts << '-v' if opts[:invert_match]
238
- grep_opts << "-e '#{string}'"
228
+ grep_opts << '-e'
229
+ grep_opts << string
239
230
  grep_opts << opts[:object] if opts[:object].is_a?(String)
240
- grep_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
231
+ grep_opts << '--' << opts[:path_limiter] if opts[:path_limiter].is_a? String
232
+
241
233
  hsh = {}
242
234
  command_lines('grep', grep_opts).each do |line|
243
235
  if m = /(.*)\:(\d+)\:(.*)/.match(line)
@@ -252,8 +244,8 @@ module Git
252
244
  diff_opts = ['-p']
253
245
  diff_opts << obj1
254
246
  diff_opts << obj2 if obj2.is_a?(String)
255
- diff_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
256
-
247
+ diff_opts << '--' << opts[:path_limiter] if opts[:path_limiter].is_a? String
248
+
257
249
  command('diff', diff_opts)
258
250
  end
259
251
 
@@ -261,8 +253,8 @@ module Git
261
253
  diff_opts = ['--numstat']
262
254
  diff_opts << obj1
263
255
  diff_opts << obj2 if obj2.is_a?(String)
264
- diff_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
265
-
256
+ diff_opts << '--' << opts[:path_limiter] if opts[:path_limiter].is_a? String
257
+
266
258
  hsh = {:total => {:insertions => 0, :deletions => 0, :lines => 0, :files => 0}, :files => {}}
267
259
 
268
260
  command_lines('diff', diff_opts).each do |file|
@@ -306,12 +298,18 @@ module Git
306
298
  command_lines('ls-files', '--stage').each do |line|
307
299
  (info, file) = line.split("\t")
308
300
  (mode, sha, stage) = info.split
301
+ file = eval(file) if file =~ /^\".*\"$/ # This takes care of quoted strings returned from git
309
302
  hsh[file] = {:path => file, :mode_index => mode, :sha_index => sha, :stage => stage}
310
303
  end
311
304
  hsh
312
305
  end
313
306
 
314
307
 
308
+ def ignored_files
309
+ command_lines('ls-files', ['--others', '-i', '--exclude-standard'])
310
+ end
311
+
312
+
315
313
  def config_remote(name)
316
314
  hsh = {}
317
315
  config_list.each do |key, value|
@@ -323,8 +321,7 @@ module Git
323
321
  end
324
322
 
325
323
  def config_get(name)
326
- c = config_list
327
- c[name]
324
+ config_list[name]
328
325
  #command('config', ['--get', name])
329
326
  end
330
327
 
@@ -362,46 +359,56 @@ module Git
362
359
  ## WRITE COMMANDS ##
363
360
 
364
361
  def config_set(name, value)
365
- command('config', [name, "'#{value}'"])
362
+ command('config', [name, value])
366
363
  end
367
364
 
368
365
  def add(path = '.')
369
- path = path.join(' ') if path.is_a?(Array)
370
- command('add', path)
366
+ arr_opts = ['--']
367
+ if path.is_a?(Array)
368
+ arr_opts += path
369
+ else
370
+ arr_opts << path
371
+ end
372
+ command('add', arr_opts)
371
373
  end
372
374
 
373
375
  def remove(path = '.', opts = {})
374
- path = path.join(' ') if path.is_a?(Array)
375
-
376
376
  arr_opts = ['-f'] # overrides the up-to-date check by default
377
377
  arr_opts << ['-r'] if opts[:recursive]
378
- arr_opts << path
378
+ arr_opts << '--'
379
+ if path.is_a?(Array)
380
+ arr_opts += path
381
+ else
382
+ arr_opts << path
383
+ end
379
384
 
380
385
  command('rm', arr_opts)
381
386
  end
382
387
 
383
388
  def commit(message, opts = {})
384
- arr_opts = ["-m '#{message}'"]
389
+ arr_opts = ['-m', message]
385
390
  arr_opts << '-a' if opts[:add_all]
391
+ arr_opts << '--allow-empty' if opts[:allow_empty]
392
+ arr_opts << "--author" << opts[:author] if opts[:author]
386
393
  command('commit', arr_opts)
387
394
  end
388
395
 
389
396
  def reset(commit, opts = {})
390
397
  arr_opts = []
391
398
  arr_opts << '--hard' if opts[:hard]
392
- arr_opts << commit.to_s if commit
399
+ arr_opts << commit if commit
393
400
  command('reset', arr_opts)
394
401
  end
395
402
 
396
403
  def apply(patch_file)
397
404
  arr_opts = []
398
- arr_opts << patch_file.to_s if patch_file
405
+ arr_opts << '--' << patch_file if patch_file
399
406
  command('apply', arr_opts)
400
407
  end
401
408
 
402
409
  def apply_mail(patch_file)
403
410
  arr_opts = []
404
- arr_opts << patch_file.to_s if patch_file
411
+ arr_opts << '--' << patch_file if patch_file
405
412
  command('am', arr_opts)
406
413
  end
407
414
 
@@ -418,14 +425,16 @@ module Git
418
425
  end
419
426
 
420
427
  def stash_save(message)
421
- output = command('stash save', [message])
422
- return false unless output.match(/HEAD is now at/)
423
- return true
428
+ output = command('stash save', ['--', message])
429
+ output =~ /HEAD is now at/
424
430
  end
425
431
 
426
- def stash_apply(id)
427
- command('stash apply', [id])
428
- # Already uptodate! ---???? What then
432
+ def stash_apply(id = nil)
433
+ if id
434
+ command('stash apply', [id])
435
+ else
436
+ command('stash apply')
437
+ end
429
438
  end
430
439
 
431
440
  def stash_clear
@@ -447,23 +456,23 @@ module Git
447
456
  def checkout(branch, opts = {})
448
457
  arr_opts = []
449
458
  arr_opts << '-f' if opts[:force]
450
- arr_opts << ["-b '#{opts[:new_branch]}'"] if opts[:new_branch]
451
- arr_opts << branch.to_s
459
+ arr_opts << '-b' << opts[:new_branch] if opts[:new_branch]
460
+ arr_opts << branch
452
461
 
453
462
  command('checkout', arr_opts)
454
463
  end
455
464
 
456
465
  def checkout_file(version, file)
457
466
  arr_opts = []
458
- arr_opts << version.to_s
459
- arr_opts << file.to_s
467
+ arr_opts << version
468
+ arr_opts << file
460
469
  command('checkout', arr_opts)
461
470
  end
462
471
 
463
472
  def merge(branch, message = nil)
464
473
  arr_opts = []
465
- arr_opts << ["-m '#{message}'"] if message
466
- arr_opts << branch.to_a.join(' ')
474
+ arr_opts << '-m' << message if message
475
+ arr_opts += [branch]
467
476
  command('merge', arr_opts)
468
477
  end
469
478
 
@@ -475,15 +484,13 @@ module Git
475
484
  unmerged
476
485
  end
477
486
 
478
- def conflicts #yields :file, :your, :their
487
+ def conflicts # :yields: file, your, their
479
488
  self.unmerged.each do |f|
480
489
  your = Tempfile.new("YOUR-#{File.basename(f)}").path
481
- arr_opts = [":2:#{f}", ">#{your}"]
482
- command('show', arr_opts)
490
+ command('show', ":2:#{f}", true, "> #{escape your}")
483
491
 
484
492
  their = Tempfile.new("THEIR-#{File.basename(f)}").path
485
- arr_opts = [":3:#{f}", ">#{their}"]
486
- command('show', arr_opts)
493
+ command('show', ":3:#{f}", true, "> #{escape their}")
487
494
  yield(f, your, their)
488
495
  end
489
496
  end
@@ -491,6 +498,7 @@ module Git
491
498
  def remote_add(name, url, opts = {})
492
499
  arr_opts = ['add']
493
500
  arr_opts << '-f' if opts[:with_fetch]
501
+ arr_opts << '--'
494
502
  arr_opts << name
495
503
  arr_opts << url
496
504
 
@@ -500,7 +508,7 @@ module Git
500
508
  # this is documented as such, but seems broken for some reason
501
509
  # i'll try to get around it some other way later
502
510
  def remote_remove(name)
503
- command('remote', ['rm', name])
511
+ command('remote', ['rm', '--', name])
504
512
  end
505
513
 
506
514
  def remotes
@@ -517,11 +525,12 @@ module Git
517
525
 
518
526
 
519
527
  def fetch(remote)
520
- command('fetch', remote.to_s)
528
+ command('fetch', remote)
521
529
  end
522
530
 
523
- def push(remote, branch = 'master')
524
- command('push', [remote.to_s, branch.to_s])
531
+ def push(remote, branch = 'master', tags = false)
532
+ command('push', [remote, branch])
533
+ command('push', ['--tags', remote]) if tags
525
534
  end
526
535
 
527
536
  def tag_sha(tag_name)
@@ -543,7 +552,7 @@ module Git
543
552
  def read_tree(treeish, opts = {})
544
553
  arr_opts = []
545
554
  arr_opts << "--prefix=#{opts[:prefix]}" if opts[:prefix]
546
- arr_opts << treeish.to_a.join(' ')
555
+ arr_opts += [treeish]
547
556
  command('read-tree', arr_opts)
548
557
  end
549
558
 
@@ -552,21 +561,20 @@ module Git
552
561
  end
553
562
 
554
563
  def commit_tree(tree, opts = {})
555
- opts[:message] = "commit tree #{tree}" if !opts[:message]
564
+ opts[:message] ||= "commit tree #{tree}"
556
565
  t = Tempfile.new('commit-message')
557
566
  t.write(opts[:message])
558
567
  t.close
559
568
 
560
569
  arr_opts = []
561
570
  arr_opts << tree
562
- arr_opts << "-p #{opts[:parent]}" if opts[:parent]
563
- opts[:parents].each { |p| arr_opts << "-p #{p.to_s}" } if opts[:parents]
564
- arr_opts << "< #{t.path}"
565
- command('commit-tree', arr_opts)
571
+ arr_opts << '-p' << opts[:parent] if opts[:parent]
572
+ arr_opts += [opts[:parents]].map { |p| ['-p', p] }.flatten if opts[:parents]
573
+ command('commit-tree', arr_opts, true, "< #{escape t.path}")
566
574
  end
567
575
 
568
576
  def update_ref(branch, commit)
569
- command('update-ref', [branch.to_s, commit.to_s])
577
+ command('update-ref', [branch, commit])
570
578
  end
571
579
 
572
580
  def checkout_index(opts = {})
@@ -574,7 +582,8 @@ module Git
574
582
  arr_opts << "--prefix=#{opts[:prefix]}" if opts[:prefix]
575
583
  arr_opts << "--force" if opts[:force]
576
584
  arr_opts << "--all" if opts[:all]
577
- arr_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
585
+ arr_opts << '--' << opts[:path_limiter] if opts[:path_limiter].is_a? String
586
+
578
587
  command('checkout-index', arr_opts)
579
588
  end
580
589
 
@@ -586,43 +595,39 @@ module Git
586
595
  # :remote
587
596
  # :path
588
597
  def archive(sha, file = nil, opts = {})
589
- opts[:format] = 'zip' if !opts[:format]
598
+ opts[:format] ||= 'zip'
590
599
 
591
600
  if opts[:format] == 'tgz'
592
601
  opts[:format] = 'tar'
593
602
  opts[:add_gzip] = true
594
603
  end
595
604
 
596
- if !file
597
- file = Tempfile.new('archive').path
598
- end
605
+ file ||= Tempfile.new('archive').path
599
606
 
600
607
  arr_opts = []
601
608
  arr_opts << "--format=#{opts[:format]}" if opts[:format]
602
609
  arr_opts << "--prefix=#{opts[:prefix]}" if opts[:prefix]
603
610
  arr_opts << "--remote=#{opts[:remote]}" if opts[:remote]
604
611
  arr_opts << sha
605
- arr_opts << opts[:path] if opts[:path]
606
- arr_opts << '| gzip' if opts[:add_gzip]
607
- arr_opts << "> #{file.to_s}"
608
- command('archive', arr_opts)
612
+ arr_opts << '--' << opts[:path] if opts[:path]
613
+ command('archive', arr_opts, true, (opts[:add_gzip] ? '| gzip' : '') + " > #{escape file}")
609
614
  return file
610
615
  end
611
616
 
612
617
  private
613
618
 
614
- def command_lines(cmd, opts = [], chdir = true)
619
+ def command_lines(cmd, opts = [], chdir = true, redirect = '')
615
620
  command(cmd, opts, chdir).split("\n")
616
621
  end
617
622
 
618
- def command(cmd, opts = [], chdir = true, &block)
619
- ENV['GIT_DIR'] = @git_dir if (@git_dir != ENV['GIT_DIR'])
620
- ENV['GIT_INDEX_FILE'] = @git_index_file if (@git_index_file != ENV['GIT_INDEX_FILE'])
621
- ENV['GIT_WORK_TREE'] = @git_work_dir if (@git_work_dir != ENV['GIT_WORK_TREE'])
623
+ def command(cmd, opts = [], chdir = true, redirect = '', &block)
624
+ ENV['GIT_DIR'] = @git_dir
625
+ ENV['GIT_INDEX_FILE'] = @git_index_file
626
+ ENV['GIT_WORK_TREE'] = @git_work_dir
622
627
  path = @git_work_dir || @git_dir || @path
623
628
 
624
- opts = opts.to_a.join(' ')
625
- git_cmd = "git #{cmd} #{opts} 2>&1"
629
+ opts = [opts].flatten.map {|s| escape(s) }.join(' ')
630
+ git_cmd = "git #{cmd} #{opts} #{redirect} 2>&1"
626
631
 
627
632
  out = nil
628
633
  if chdir && (Dir.getwd != path)
@@ -652,6 +657,10 @@ module Git
652
657
  `#{git_cmd}`.chomp
653
658
  end
654
659
  end
655
-
660
+
661
+ def escape(s)
662
+ "'" + s.to_s.gsub('\'', '\'\\\'\'') + "'"
663
+ end
664
+
656
665
  end
657
666
  end
data/lib/git/log.rb CHANGED
@@ -4,22 +4,20 @@ module Git
4
4
  class Log
5
5
  include Enumerable
6
6
 
7
- @base = nil
8
- @commits = nil
9
-
10
- @object = nil
11
- @path = nil
12
- @count = nil
13
- @since = nil
14
- @until = nil
15
- @between = nil
16
-
17
- @dirty_flag = nil
18
-
19
7
  def initialize(base, count = 30)
20
8
  dirty_log
21
9
  @base = base
22
10
  @count = count
11
+
12
+ @commits = nil
13
+ @author = nil
14
+ @grep = nil
15
+ @object = nil
16
+ @path = nil
17
+ @since = nil
18
+ @skip = nil
19
+ @until = nil
20
+ @between = nil
23
21
  end
24
22
 
25
23
  def object(objectish)
@@ -46,6 +44,12 @@ module Git
46
44
  return self
47
45
  end
48
46
 
47
+ def skip(num)
48
+ dirty_log
49
+ @skip = num
50
+ return self
51
+ end
52
+
49
53
  def since(date)
50
54
  dirty_log
51
55
  @since = date
@@ -76,11 +80,9 @@ module Git
76
80
  @commits.size rescue nil
77
81
  end
78
82
 
79
- def each
83
+ def each(&block)
80
84
  check_log
81
- @commits.each do |c|
82
- yield c
83
- end
85
+ @commits.each(&block)
84
86
  end
85
87
 
86
88
  def first
@@ -105,11 +107,11 @@ module Git
105
107
  def run_log
106
108
  log = @base.lib.full_log_commits(:count => @count, :object => @object,
107
109
  :path_limiter => @path, :since => @since,
108
- :author => @author, :grep => @grep,
110
+ :author => @author, :grep => @grep, :skip => @skip,
109
111
  :until => @until, :between => @between)
110
112
  @commits = log.map { |c| Git::Object::Commit.new(@base, c['sha'], c) }
111
113
  end
112
114
 
113
115
  end
114
116
 
115
- end
117
+ end