зеркало из https://github.com/github/grit.git
217 строки
5.6 KiB
Plaintext
217 строки
5.6 KiB
Plaintext
diff --git a/lib/grit.rb b/lib/grit.rb
|
|
index 6afcf64..9e78ddf 100644
|
|
--- a/lib/grit.rb
|
|
+++ b/lib/grit.rb
|
|
@@ -5,12 +5,10 @@ require 'fileutils'
|
|
require 'time'
|
|
|
|
# stdlib
|
|
-require 'timeout'
|
|
|
|
# third party
|
|
require 'rubygems'
|
|
require 'mime/types'
|
|
-require 'open4'
|
|
|
|
# internal requires
|
|
require 'grit/lazy'
|
|
diff --git a/lib/grit/git.rb b/lib/grit/git.rb
|
|
index ad42ff5..61919df 100644
|
|
--- a/lib/grit/git.rb
|
|
+++ b/lib/grit/git.rb
|
|
@@ -1,36 +1,18 @@
|
|
-trap("CHLD") do
|
|
- begin
|
|
- Process.wait(-1, Process::WNOHANG)
|
|
- rescue Object
|
|
- end
|
|
-end
|
|
-
|
|
module Grit
|
|
|
|
class Git
|
|
- class GitTimeout < RuntimeError
|
|
- attr_reader :command, :bytes_read
|
|
-
|
|
- def initialize(command = nil, bytes_read = nil)
|
|
- @command = command
|
|
- @bytes_read = bytes_read
|
|
- end
|
|
- end
|
|
-
|
|
undef_method :clone
|
|
|
|
class << self
|
|
- attr_accessor :git_binary, :git_timeout
|
|
+ attr_accessor :git_binary
|
|
end
|
|
|
|
- self.git_binary = "/usr/bin/env git"
|
|
- self.git_timeout = 5
|
|
+ self.git_binary = "/usr/bin/env git"
|
|
|
|
- attr_accessor :git_dir, :bytes_read
|
|
+ attr_accessor :git_dir
|
|
|
|
def initialize(git_dir)
|
|
- self.git_dir = git_dir
|
|
- self.bytes_read = 0
|
|
+ self.git_dir = git_dir
|
|
end
|
|
|
|
# Run the given git command with the specified arguments and return
|
|
@@ -44,43 +26,16 @@ module Grit
|
|
#
|
|
# Returns String
|
|
def method_missing(cmd, options = {}, *args)
|
|
- timeout = options.delete(:timeout)
|
|
- timeout = true if timeout.nil?
|
|
-
|
|
opt_args = transform_options(options)
|
|
ext_args = args.map { |a| a == '--' ? a : "'#{a}'" }
|
|
|
|
call = "#{Git.git_binary} --git-dir='#{self.git_dir}' #{cmd.to_s.gsub(/_/, '-')} #{(opt_args + ext_args).join(' ')}"
|
|
puts call if Grit.debug
|
|
- response = timeout ? sh(call) : wild_sh(call)
|
|
+ response = `#{call}`
|
|
puts response if Grit.debug
|
|
response
|
|
end
|
|
-
|
|
- def sh(command)
|
|
- pid, _, io, _ = Open4.popen4(command)
|
|
- ret = Timeout.timeout(self.class.git_timeout) { io.read }
|
|
- @bytes_read += ret.size
|
|
-
|
|
- if @bytes_read > 5242880 # 5.megabytes
|
|
- bytes = @bytes_read
|
|
- @bytes_read = 0
|
|
- raise GitTimeout.new(command, bytes)
|
|
- end
|
|
-
|
|
- ret
|
|
- rescue Object => e
|
|
- Process.kill('KILL', pid) rescue nil
|
|
- bytes = @bytes_read
|
|
- @bytes_read = 0
|
|
- raise GitTimeout.new(command, bytes)
|
|
- end
|
|
-
|
|
- def wild_sh(command)
|
|
- pid, _, io, _ = Open4.popen4(command)
|
|
- io.read
|
|
- end
|
|
-
|
|
+
|
|
# Transform Ruby style options into git command line options
|
|
# +options+ is a hash of Ruby style options
|
|
#
|
|
@@ -109,4 +64,4 @@ module Grit
|
|
end
|
|
end # Git
|
|
|
|
-end # Grit
|
|
+end # Grit
|
|
\ No newline at end of file
|
|
diff --git a/lib/grit/head.rb b/lib/grit/head.rb
|
|
index 6865bf0..86f29c2 100644
|
|
--- a/lib/grit/head.rb
|
|
+++ b/lib/grit/head.rb
|
|
@@ -1,5 +1,4 @@
|
|
module Grit
|
|
- HEAD_PREFIX = 'refs/heads'
|
|
|
|
# A Head is a named reference to a Commit. Every Head instance contains a name
|
|
# and a Commit object.
|
|
@@ -34,7 +33,7 @@ module Grit
|
|
|
|
actual_options = default_options.merge(options)
|
|
|
|
- output = repo.git.for_each_ref(actual_options, HEAD_PREFIX)
|
|
+ output = repo.git.for_each_ref(actual_options, "refs/heads")
|
|
|
|
self.list_from_string(repo, output)
|
|
end
|
|
@@ -78,7 +77,7 @@ module Grit
|
|
# Returns Grit::Head (baked)
|
|
def self.from_string(repo, line)
|
|
full_name, id = line.split("\0")
|
|
- name = full_name.sub("#{HEAD_PREFIX}/", '')
|
|
+ name = full_name.split("/").last
|
|
commit = Commit.create(repo, :id => id)
|
|
self.new(name, commit)
|
|
end
|
|
diff --git a/test/fixtures/for_each_ref b/test/fixtures/for_each_ref
|
|
index 9f3bece..e56f526 100644
|
|
Binary files a/test/fixtures/for_each_ref and b/test/fixtures/for_each_ref differ
|
|
diff --git a/test/test_git.rb b/test/test_git.rb
|
|
index adbdc6d..dcc5fdc 100644
|
|
--- a/test/test_git.rb
|
|
+++ b/test/test_git.rb
|
|
@@ -18,35 +18,4 @@ class TestGit < Test::Unit::TestCase
|
|
|
|
assert_equal ["-s", "-t"], @git.transform_options({:s => true, :t => true}).sort
|
|
end
|
|
-
|
|
- def test_uses_custom_sh_method
|
|
- @git.expects(:sh)
|
|
- @git.something
|
|
- end
|
|
-
|
|
- def test_can_skip_timeout
|
|
- @git.expects(:wild_sh)
|
|
- @git.something(:timeout => false)
|
|
- end
|
|
-
|
|
- def test_raises_if_too_many_bytes
|
|
- @git.instance_variable_set(:@bytes_read, 6000000)
|
|
- assert_raises Grit::Git::GitTimeout do
|
|
- @git.something
|
|
- end
|
|
- end
|
|
-
|
|
- def test_raises_on_slow_shell
|
|
- Grit::Git.git_timeout = 0.5
|
|
- Open4.expects(:popen4).returns([ nil, nil, mock(:read => proc { sleep 1 }), nil ])
|
|
- assert_raises Grit::Git::GitTimeout do
|
|
- @git.something
|
|
- end
|
|
- end
|
|
-
|
|
- def test_works_fine_if_quick
|
|
- output = 'output'
|
|
- Open4.expects(:popen4).returns([ nil, nil, mock(:read => output), nil ])
|
|
- assert_equal output, @git.something
|
|
- end
|
|
end
|
|
diff --git a/test/test_head.rb b/test/test_head.rb
|
|
index baaae85..6b97822 100644
|
|
--- a/test/test_head.rb
|
|
+++ b/test/test_head.rb
|
|
@@ -3,20 +3,15 @@ require File.dirname(__FILE__) + '/helper'
|
|
class TestHead < Test::Unit::TestCase
|
|
def setup
|
|
@r = Repo.new(GRIT_REPO)
|
|
- Git.any_instance.expects(:for_each_ref).returns(fixture('for_each_ref'))
|
|
end
|
|
|
|
# inspect
|
|
|
|
def test_inspect
|
|
+ Git.any_instance.expects(:for_each_ref).returns(fixture('for_each_ref'))
|
|
+
|
|
head = @r.heads.first
|
|
+
|
|
assert_equal %Q{#<Grit::Head "#{head.name}">}, head.inspect
|
|
end
|
|
-
|
|
- # heads with slashes
|
|
-
|
|
- def test_heads_with_slashes
|
|
- head = @r.heads.last
|
|
- assert_equal %Q{#<Grit::Head "mojombo/master">}, head.inspect
|
|
- end
|
|
-end
|
|
+end
|
|
\ No newline at end of file
|