schacon-grit 0.9.4 → 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.
@@ -115,7 +115,7 @@ module Grit
115
115
  def initialize(mode, filename, sha1o)
116
116
  @mode = 0
117
117
  mode.each_byte do |i|
118
- @mode = (@mode << 3) | (i-'0'[0])
118
+ @mode = (@mode << 3) | (i-'0'.getord(0))
119
119
  end
120
120
  @name = filename
121
121
  @sha1 = sha1o
@@ -179,8 +179,14 @@ module Grit
179
179
 
180
180
  def self.read_bytes_until(io, char)
181
181
  string = ''
182
- while ((next_char = io.getc.chr) != char) && !io.eof
183
- string += next_char
182
+ if RUBY_VERSION > '1.9'
183
+ while ((next_char = io.getc) != char) && !io.eof
184
+ string += next_char
185
+ end
186
+ else
187
+ while ((next_char = io.getc.chr) != char) && !io.eof
188
+ string += next_char
189
+ end
184
190
  end
185
191
  string
186
192
  end
@@ -219,6 +225,16 @@ module Grit
219
225
  @entry.collect { |e| [[e.format_mode, e.format_type, e.sha1].join(' '), e.name].join("\t") }.join("\n")
220
226
  end
221
227
 
228
+ def to_hash
229
+ hash = {}
230
+ @entry.each do |e|
231
+ hash[e.name] = { 'mode' => e.format_mode,
232
+ 'type' => e.format_type,
233
+ 'sha' => e.sha1 }
234
+ end
235
+ hash
236
+ end
237
+
222
238
  def actual_raw
223
239
  #@entry.collect { |e| e.raw.join(' '), e.name].join("\t") }.join("\n")
224
240
  end
@@ -243,9 +259,6 @@ module Grit
243
259
  author = UserInfo.new(value)
244
260
  when "committer"
245
261
  committer = UserInfo.new(value)
246
- else
247
- warn "unknown header '%s' in commit %s" % \
248
- [key, rawobject.sha1.unpack("H*")[0]]
249
262
  end
250
263
  end
251
264
  if not tree && author && committer
@@ -281,6 +294,16 @@ module Grit
281
294
  output += @message.split("\n").map { |l| ' ' + l }.join("\n") + "\n\n"
282
295
  end
283
296
 
297
+ def to_hash
298
+ h = {}
299
+ h['tree'] = @tree
300
+ h['author'] = @author
301
+ h['committer'] = @committer
302
+ h['message'] = @message
303
+ h['parents'] = @parent
304
+ h
305
+ end
306
+
284
307
  end
285
308
 
286
309
  class Tag < GitObject
@@ -12,7 +12,7 @@
12
12
  module Grit
13
13
  module GitRuby
14
14
  module Internal
15
- class Mmap
15
+ class FileWindow
16
16
  def initialize(file, version = 1)
17
17
  @file = file
18
18
  @offset = nil
@@ -46,7 +46,7 @@ module Grit
46
46
  end
47
47
  @offset = offset + len ? len : 1
48
48
  if not len
49
- @file.read(1)[0]
49
+ @file.read(1).getord(0)
50
50
  else
51
51
  @file.read(len)
52
52
  end
@@ -29,7 +29,7 @@ module Grit
29
29
  begin
30
30
  return nil unless sha1[0...2] && sha1[2..39]
31
31
  path = @directory + '/' + sha1[0...2] + '/' + sha1[2..39]
32
- get_raw_object(File.read(path))
32
+ get_raw_object(File.open(path, 'rb').read)
33
33
  rescue Errno::ENOENT
34
34
  nil
35
35
  end
@@ -76,7 +76,7 @@ module Grit
76
76
  content = Zlib::Deflate.deflate(store)
77
77
 
78
78
  FileUtils.mkdir_p(@directory+'/'+sha1[0...2])
79
- File.open(path, 'w') do |f|
79
+ File.open(path, 'wb') do |f|
80
80
  f.write content
81
81
  end
82
82
  end
@@ -102,7 +102,7 @@ module Grit
102
102
  # private
103
103
  def unpack_object_header_gently(buf)
104
104
  used = 0
105
- c = buf[used]
105
+ c = buf.getord(used)
106
106
  used += 1
107
107
 
108
108
  type = (c >> 4) & 7;
@@ -112,7 +112,7 @@ module Grit
112
112
  if buf.length <= used
113
113
  raise LooseObjectError, "object file too short"
114
114
  end
115
- c = buf[used]
115
+ c = buf.getord(used)
116
116
  used += 1
117
117
 
118
118
  size += (c & 0x7f) << shift
@@ -127,8 +127,8 @@ module Grit
127
127
  private :unpack_object_header_gently
128
128
 
129
129
  def legacy_loose_object?(buf)
130
- word = (buf[0] << 8) + buf[1]
131
- buf[0] == 0x78 && word % 31 == 0
130
+ word = (buf.getord(0) << 8) + buf.getord(1)
131
+ buf.getord(0) == 0x78 && word % 31 == 0
132
132
  end
133
133
  private :legacy_loose_object?
134
134
  end
@@ -11,7 +11,7 @@
11
11
 
12
12
  require 'zlib'
13
13
  require 'grit/git-ruby/internal/raw_object'
14
- require 'grit/git-ruby/internal/mmap'
14
+ require 'grit/git-ruby/internal/file_window'
15
15
 
16
16
  PACK_SIGNATURE = "PACK"
17
17
  PACK_IDX_SIGNATURE = "\377tOc"
@@ -36,6 +36,8 @@ module Grit
36
36
  EntrySize = OffsetSize + SHA1Size
37
37
  EntrySizeV2 = SHA1Size + CrcSize + OffsetSize
38
38
 
39
+ attr_reader :size, :name
40
+
39
41
  def initialize(file)
40
42
  if file =~ /\.idx$/
41
43
  file = file[0...-3] + 'pack'
@@ -48,9 +50,9 @@ module Grit
48
50
  def with_idx(index_file = nil)
49
51
  if !index_file
50
52
  index_file = @name
51
- idxfile = File.open(@name[0...-4]+'idx')
53
+ idxfile = File.open(@name[0...-4]+'idx', 'rb')
52
54
  else
53
- idxfile = File.open(index_file)
55
+ idxfile = File.open(index_file, 'rb')
54
56
  end
55
57
 
56
58
  # read header
@@ -66,14 +68,14 @@ module Grit
66
68
  @version = 1
67
69
  end
68
70
 
69
- idx = Mmap.new(idxfile, @version)
71
+ idx = FileWindow.new(idxfile, @version)
70
72
  yield idx
71
73
  idx.unmap
72
74
  idxfile.close
73
75
  end
74
76
 
75
77
  def with_packfile
76
- packfile = File.open(@name)
78
+ packfile = File.open(@name, 'rb')
77
79
  yield packfile
78
80
  packfile.close
79
81
  end
@@ -189,7 +191,7 @@ module Grit
189
191
  end
190
192
 
191
193
  def find_object_in_index(idx, sha1)
192
- slot = sha1[0]
194
+ slot = sha1.getord(0)
193
195
  return nil if !slot
194
196
  first, last = @offsets[slot,2]
195
197
  while first < last
@@ -248,13 +250,13 @@ module Grit
248
250
  obj_offset = offset
249
251
  packfile.seek(offset)
250
252
 
251
- c = packfile.read(1)[0]
253
+ c = packfile.read(1).getord(0)
252
254
  size = c & 0xf
253
255
  type = (c >> 4) & 7
254
256
  shift = 4
255
257
  offset += 1
256
258
  while c & 0x80 != 0
257
- c = packfile.read(1)[0]
259
+ c = packfile.read(1).getord(0)
258
260
  size |= ((c & 0x7f) << shift)
259
261
  shift += 7
260
262
  offset += 1
@@ -265,7 +267,7 @@ module Grit
265
267
  case type
266
268
  when OBJ_OFS_DELTA, OBJ_REF_DELTA
267
269
  data, type = unpack_deltified(packfile, type, offset, obj_offset, size, options)
268
- #puts type
270
+ #puts "Type: #{type}"
269
271
  when OBJ_COMMIT, OBJ_TREE, OBJ_BLOB, OBJ_TAG
270
272
  data = unpack_compressed(offset, size)
271
273
  else
@@ -281,10 +283,10 @@ module Grit
281
283
 
282
284
  if type == OBJ_OFS_DELTA
283
285
  i = 0
284
- c = data[i]
286
+ c = data.getord(i)
285
287
  base_offset = c & 0x7f
286
288
  while c & 0x80 != 0
287
- c = data[i += 1]
289
+ c = data.getord(i += 1)
288
290
  base_offset += 1
289
291
  base_offset <<= 7
290
292
  base_offset |= c & 0x7f
@@ -335,18 +337,18 @@ module Grit
335
337
  dest_size, pos = patch_delta_header_size(delta, pos)
336
338
  dest = ""
337
339
  while pos < delta.size
338
- c = delta[pos]
340
+ c = delta.getord(pos)
339
341
  pos += 1
340
342
  if c & 0x80 != 0
341
343
  pos -= 1
342
344
  cp_off = cp_size = 0
343
- cp_off = delta[pos += 1] if c & 0x01 != 0
344
- cp_off |= delta[pos += 1] << 8 if c & 0x02 != 0
345
- cp_off |= delta[pos += 1] << 16 if c & 0x04 != 0
346
- cp_off |= delta[pos += 1] << 24 if c & 0x08 != 0
347
- cp_size = delta[pos += 1] if c & 0x10 != 0
348
- cp_size |= delta[pos += 1] << 8 if c & 0x20 != 0
349
- cp_size |= delta[pos += 1] << 16 if c & 0x40 != 0
345
+ cp_off = delta.getord(pos += 1) if c & 0x01 != 0
346
+ cp_off |= delta.getord(pos += 1) << 8 if c & 0x02 != 0
347
+ cp_off |= delta.getord(pos += 1) << 16 if c & 0x04 != 0
348
+ cp_off |= delta.getord(pos += 1) << 24 if c & 0x08 != 0
349
+ cp_size = delta.getord(pos += 1) if c & 0x10 != 0
350
+ cp_size |= delta.getord(pos += 1) << 8 if c & 0x20 != 0
351
+ cp_size |= delta.getord(pos += 1) << 16 if c & 0x40 != 0
350
352
  cp_size = 0x10000 if cp_size == 0
351
353
  pos += 1
352
354
  dest += base[cp_off,cp_size]
@@ -365,7 +367,7 @@ module Grit
365
367
  size = 0
366
368
  shift = 0
367
369
  begin
368
- c = delta[pos]
370
+ c = delta.getord(pos)
369
371
  if c == nil
370
372
  raise PackFormatError, 'invalid delta header'
371
373
  end
@@ -163,8 +163,14 @@ module Grit
163
163
 
164
164
  def self.read_bytes_until(io, char)
165
165
  string = ''
166
- while ((next_char = io.getc.chr) != char) && !io.eof
167
- string += next_char
166
+ if RUBY_VERSION > '1.9'
167
+ while ((next_char = io.getc) != char) && !io.eof
168
+ string += next_char
169
+ end
170
+ else
171
+ while ((next_char = io.getc.chr) != char) && !io.eof
172
+ string += next_char
173
+ end
168
174
  end
169
175
  string
170
176
  end
@@ -37,7 +37,7 @@ module Grit
37
37
  def initialize(git_dir, options = {})
38
38
  @git_dir = git_dir
39
39
  @options = options
40
- @packs = []
40
+ #@packs = []
41
41
  end
42
42
 
43
43
  # returns the loose objects object lazily
@@ -92,7 +92,7 @@ module Grit
92
92
  return o if o
93
93
  end
94
94
 
95
- # puts "*#{sha1o}*"
95
+ puts "*#{sha1o}*"
96
96
  raise NoSuchShaFound
97
97
  end
98
98
 
@@ -185,16 +185,15 @@ module Grit
185
185
  def get_raw_tree(sha)
186
186
  o = get_raw_object_by_sha1(sha)
187
187
  if o.type == :commit
188
- tree = cat_file(get_object_by_sha1(sha).tree)
188
+ cat_file(get_object_by_sha1(sha).tree)
189
189
  elsif o.type == :tag
190
190
  commit_sha = get_object_by_sha1(sha).object
191
- tree = cat_file(get_object_by_sha1(commit_sha).tree)
192
- else
193
- tree = cat_file(sha)
191
+ cat_file(get_object_by_sha1(commit_sha).tree)
192
+ elsif o.type == :tree
193
+ cat_file(sha)
194
194
  end
195
- return tree
196
195
  end
197
-
196
+
198
197
  # return array of tree entries
199
198
  ## TODO : refactor this to remove the fugly
200
199
  def ls_tree_path(sha, path, append = nil)
@@ -376,37 +375,41 @@ module Grit
376
375
  else
377
376
  tree2 = get_object_by_sha1(commit_obj1.parent.first).tree
378
377
  end
379
-
378
+
380
379
  qdiff = quick_diff(tree1, tree2)
381
-
380
+
382
381
  qdiff.sort.each do |diff_arr|
382
+ path, status, treeSHA1, treeSHA2 = *diff_arr
383
383
  format, lines, output = :unified, 3, ''
384
384
  file_length_difference = 0
385
-
386
- fileA = (diff_arr[2]) ? cat_file(diff_arr[2]) : ''
387
- fileB = (diff_arr[3]) ? cat_file(diff_arr[3]) : ''
388
-
389
- sha1 = (diff_arr[2]) ? diff_arr[2] : '0000000000000000000000000000000000000000'
390
- sha2 = (diff_arr[3]) ? diff_arr[3] : '0000000000000000000000000000000000000000'
385
+
386
+ fileA = treeSHA1 ? cat_file(treeSHA1) : ''
387
+ fileB = treeSHA2 ? cat_file(treeSHA2) : ''
388
+
389
+ sha1 = treeSHA1 || '0000000000000000000000000000000000000000'
390
+ sha2 = treeSHA2 || '0000000000000000000000000000000000000000'
391
391
 
392
392
  data_old = fileA.split(/\n/).map! { |e| e.chomp }
393
393
  data_new = fileB.split(/\n/).map! { |e| e.chomp }
394
-
395
- diffs = Difference::LCS.diff(data_old, data_new)
394
+
395
+ diffs = Difference::LCS.diff(data_old, data_new)
396
396
  next if diffs.empty?
397
397
 
398
- header = 'diff --git a/' + diff_arr[0].gsub('./', '') + ' b/' + diff_arr[0].gsub('./', '')
398
+ a_path = "a/#{path.gsub('./', '')}"
399
+ b_path = "b/#{path.gsub('./', '')}"
400
+
401
+ header = "diff --git #{a_path} #{b_path}"
399
402
  if options[:full_index]
400
403
  header << "\n" + 'index ' + sha1 + '..' + sha2
401
- header << ' 100644' if diff_arr[3] # hard coding this because i don't think we use it
404
+ header << ' 100644' if treeSHA2 # hard coding this because i don't think we use it
402
405
  else
403
406
  header << "\n" + 'index ' + sha1[0,7] + '..' + sha2[0,7]
404
- header << ' 100644' if diff_arr[3] # hard coding this because i don't think we use it
407
+ header << ' 100644' if treeSHA2 # hard coding this because i don't think we use it
405
408
  end
406
- header << "\n--- " + 'a/' + diff_arr[0].gsub('./', '')
407
- header << "\n+++ " + 'b/' + diff_arr[0].gsub('./', '')
409
+ header << "\n--- " + (treeSHA1 ? a_path : '/dev/null')
410
+ header << "\n+++ " + (treeSHA2 ? b_path : '/dev/null')
408
411
  header += "\n"
409
-
412
+
410
413
  oldhunk = hunk = nil
411
414
 
412
415
  diffs.each do |piece|
@@ -664,6 +667,7 @@ module Grit
664
667
  private
665
668
 
666
669
  def initloose
670
+ @loaded = []
667
671
  @loose = []
668
672
  load_loose(git_path('objects'))
669
673
  load_alternate_loose(git_path('objects'))
@@ -675,6 +679,7 @@ module Grit
675
679
  alt = File.join(path, 'info/alternates')
676
680
  if File.exists?(alt)
677
681
  File.readlines(alt).each do |line|
682
+ next if @loaded.include?(line.chomp)
678
683
  if line[0, 2] == '..'
679
684
  line = File.expand_path(File.join(@git_dir, line))
680
685
  end
@@ -685,12 +690,14 @@ module Grit
685
690
  end
686
691
 
687
692
  def load_loose(path)
693
+ @loaded << path
688
694
  return if !File.exists?(path)
689
695
  @loose << Grit::GitRuby::Internal::LooseStorage.new(path)
690
696
  end
691
697
 
692
698
  def initpacks
693
699
  close
700
+ @loaded_packs = []
694
701
  @packs = []
695
702
  load_packs(git_path("objects/pack"))
696
703
  load_alternate_packs(git_path('objects'))
@@ -705,6 +712,7 @@ module Grit
705
712
  line = File.expand_path(File.join(@git_dir, line))
706
713
  end
707
714
  full_pack = File.join(line.chomp, 'pack')
715
+ next if @loaded_packs.include?(full_pack)
708
716
  load_packs(full_pack)
709
717
  load_alternate_packs(File.join(line.chomp))
710
718
  end
@@ -712,6 +720,7 @@ module Grit
712
720
  end
713
721
 
714
722
  def load_packs(path)
723
+ @loaded_packs << path
715
724
  return if !File.exists?(path)
716
725
  Dir.open(path) do |dir|
717
726
  dir.each do |entry|
data/lib/grit/git.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'tempfile'
1
2
  module Grit
2
3
 
3
4
  class Git
@@ -13,13 +14,33 @@ module Grit
13
14
  undef_method :clone
14
15
 
15
16
  include GitRuby
16
-
17
+
18
+ def exist?
19
+ File.exist?(self.git_dir)
20
+ end
21
+
22
+ def put_raw_object(content, type)
23
+ ruby_git.put_raw_object(content, type)
24
+ end
25
+
26
+ def object_exists?(object_id)
27
+ ruby_git.object_exists?(object_id)
28
+ end
29
+
17
30
  class << self
18
- attr_accessor :git_binary, :git_timeout
31
+ attr_accessor :git_binary, :git_timeout, :git_max_size
19
32
  end
20
33
 
21
- self.git_binary = "/usr/bin/env git"
22
- self.git_timeout = 10
34
+ self.git_binary = "/usr/bin/env git"
35
+ self.git_timeout = 10
36
+ self.git_max_size = 5242880 # 5.megabytes
37
+
38
+ def self.with_timeout(timeout = 10.seconds)
39
+ old_timeout = Grit::Git.git_timeout
40
+ Grit::Git.git_timeout = timeout
41
+ yield
42
+ Grit::Git.git_timeout = old_timeout
43
+ end
23
44
 
24
45
  attr_accessor :git_dir, :bytes_read
25
46
 
@@ -28,6 +49,152 @@ module Grit
28
49
  self.bytes_read = 0
29
50
  end
30
51
 
52
+ def shell_escape(str)
53
+ str.to_s.gsub("'", "\\\\'").gsub(";", '\\;')
54
+ end
55
+ alias_method :e, :shell_escape
56
+
57
+ # Check if a normal file exists on the filesystem
58
+ # +file+ is the relative path from the Git dir
59
+ #
60
+ # Returns Boolean
61
+ def fs_exist?(file)
62
+ File.exist?(File.join(self.git_dir, file))
63
+ end
64
+
65
+ # Read a normal file from the filesystem.
66
+ # +file+ is the relative path from the Git dir
67
+ #
68
+ # Returns the String contents of the file
69
+ def fs_read(file)
70
+ File.open(File.join(self.git_dir, file)).read
71
+ end
72
+
73
+ # Write a normal file to the filesystem.
74
+ # +file+ is the relative path from the Git dir
75
+ # +contents+ is the String content to be written
76
+ #
77
+ # Returns nothing
78
+ def fs_write(file, contents)
79
+ path = File.join(self.git_dir, file)
80
+ FileUtils.mkdir_p(File.dirname(path))
81
+ File.open(path, 'w') do |f|
82
+ f.write(contents)
83
+ end
84
+ end
85
+
86
+ # Delete a normal file from the filesystem
87
+ # +file+ is the relative path from the Git dir
88
+ #
89
+ # Returns nothing
90
+ def fs_delete(file)
91
+ FileUtils.rm_rf(File.join(self.git_dir, file))
92
+ end
93
+
94
+ # Move a normal file
95
+ # +from+ is the relative path to the current file
96
+ # +to+ is the relative path to the destination file
97
+ #
98
+ # Returns nothing
99
+ def fs_move(from, to)
100
+ FileUtils.mv(File.join(self.git_dir, from), File.join(self.git_dir, to))
101
+ end
102
+
103
+ # Make a directory
104
+ # +dir+ is the relative path to the directory to create
105
+ #
106
+ # Returns nothing
107
+ def fs_mkdir(dir)
108
+ FileUtils.mkdir_p(File.join(self.git_dir, dir))
109
+ end
110
+
111
+ # Chmod the the file or dir and everything beneath
112
+ # +file+ is the relative path from the Git dir
113
+ #
114
+ # Returns nothing
115
+ def fs_chmod(mode, file = '/')
116
+ FileUtils.chmod_R(mode, File.join(self.git_dir, file))
117
+ end
118
+
119
+ # Create a new directory
120
+ # +path+ is an absolute path
121
+ #
122
+ # Returns nothing
123
+ def fs_mkdir(path)
124
+ FileUtils.mkdir_p(path)
125
+ end
126
+
127
+ def fs_exist(path)
128
+ File.exist?(path)
129
+ end
130
+
131
+ def list_remotes
132
+ remotes = []
133
+ Dir.chdir(File.join(self.git_dir, 'refs/remotes')) do
134
+ remotes = Dir.glob('*')
135
+ end
136
+ remotes
137
+ rescue
138
+ []
139
+ end
140
+
141
+ def create_tempfile(seed, unlink = false)
142
+ path = Tempfile.new(seed).path
143
+ File.unlink(path) if unlink
144
+ return path
145
+ end
146
+
147
+ def check_applies(head_sha, applies_sha)
148
+ git_index = create_tempfile('index', true)
149
+ (o1, exit1) = raw_git("git read-tree #{head_sha} 2>/dev/null", git_index)
150
+ (o2, exit2) = raw_git("git diff #{applies_sha}^ #{applies_sha} | git apply --check --cached >/dev/null 2>/dev/null", git_index)
151
+ return (exit1 + exit2)
152
+ end
153
+
154
+ def get_patch(applies_sha)
155
+ git_index = create_tempfile('index', true)
156
+ (patch, exit2) = raw_git("git diff #{applies_sha}^ #{applies_sha}", git_index)
157
+ patch
158
+ end
159
+
160
+ def apply_patch(head_sha, patch)
161
+ git_index = create_tempfile('index', true)
162
+
163
+ git_patch = create_tempfile('patch')
164
+ File.open(git_patch, 'w+') { |f| f.print patch }
165
+
166
+ raw_git("git read-tree #{head_sha} 2>/dev/null", git_index)
167
+ (op, exit) = raw_git("git apply --cached < #{git_patch}", git_index)
168
+ if exit == 0
169
+ return raw_git("git write-tree", git_index).first.chomp
170
+ end
171
+ false
172
+ end
173
+
174
+ # RAW CALLS WITH ENV SETTINGS
175
+ def raw_git_call(command, index)
176
+ tmp = ENV['GIT_INDEX_FILE']
177
+ ENV['GIT_INDEX_FILE'] = index
178
+ out = `#{command}`
179
+ after = ENV['GIT_INDEX_FILE'] # someone fucking with us ??
180
+ ENV['GIT_INDEX_FILE'] = tmp
181
+ if after != index
182
+ raise 'environment was changed for the git call'
183
+ end
184
+ [out, $?.exitstatus]
185
+ end
186
+
187
+ def raw_git(command, index)
188
+ output = nil
189
+ Dir.chdir(self.git_dir) do
190
+ output = raw_git_call(command, index)
191
+ end
192
+ output
193
+ end
194
+ # RAW CALLS WITH ENV SETTINGS END
195
+
196
+
197
+
31
198
  # Run the given git command with the specified arguments and return
32
199
  # the result as a String
33
200
  # +cmd+ is the command
@@ -42,14 +209,21 @@ module Grit
42
209
  run('', cmd, '', options, args)
43
210
  end
44
211
 
212
+ # Bypass any pure Ruby implementations and go straight to the native Git command
213
+ #
214
+ # Returns String
215
+ def native(cmd, options = {}, *args)
216
+ method_missing(cmd, options, *args)
217
+ end
218
+
45
219
  def run(prefix, cmd, postfix, options, args)
46
- timeout = options.delete(:timeout)
220
+ timeout = options.delete(:timeout) rescue nil
47
221
  timeout = true if timeout.nil?
48
222
 
49
223
  opt_args = transform_options(options)
50
- ext_args = args.reject { |a| a.empty? }.map { |a| (a == '--' || a[0].chr == '|') ? a : "'#{a}'" }
51
-
52
- call = "#{prefix}#{Git.git_binary} --git-dir='#{self.git_dir}' #{cmd.to_s.gsub(/_/, '-')} #{(opt_args + ext_args).join(' ')}#{postfix}"
224
+ ext_args = args.reject { |a| a.empty? }.map { |a| (a == '--' || a[0].chr == '|' || Grit.no_quote) ? a : "'#{e(a)}'" }
225
+
226
+ call = "#{prefix}#{Git.git_binary} --git-dir='#{self.git_dir}' #{cmd.to_s.gsub(/_/, '-')} #{(opt_args + ext_args).join(' ')}#{e(postfix)}"
53
227
  Grit.log(call) if Grit.debug
54
228
  response, err = timeout ? sh(call) : wild_sh(call)
55
229
  Grit.log(response) if Grit.debug
@@ -63,7 +237,7 @@ module Grit
63
237
  Timeout.timeout(self.class.git_timeout) do
64
238
  while tmp = stdout.read(1024)
65
239
  ret += tmp
66
- if (@bytes_read += tmp.size) > 5242880 # 5.megabytes
240
+ if (@bytes_read += tmp.size) > self.class.git_max_size
67
241
  bytes = @bytes_read
68
242
  @bytes_read = 0
69
243
  raise GitTimeout.new(command, bytes)
@@ -107,16 +281,20 @@ module Grit
107
281
  if opt.to_s.size == 1
108
282
  if options[opt] == true
109
283
  args << "-#{opt}"
284
+ elsif options[opt] == false
285
+ # ignore
110
286
  else
111
287
  val = options.delete(opt)
112
- args << "-#{opt.to_s} '#{val}'"
288
+ args << "-#{opt.to_s} '#{e(val)}'"
113
289
  end
114
290
  else
115
291
  if options[opt] == true
116
292
  args << "--#{opt.to_s.gsub(/_/, '-')}"
293
+ elsif options[opt] == false
294
+ # ignore
117
295
  else
118
296
  val = options.delete(opt)
119
- args << "--#{opt.to_s.gsub(/_/, '-')}='#{val}'"
297
+ args << "--#{opt.to_s.gsub(/_/, '-')}='#{e(val)}'"
120
298
  end
121
299
  end
122
300
  end