Skip to content

Commit

Permalink
First attempt on fetching
Browse files Browse the repository at this point in the history
  • Loading branch information
Hannes Georg committed Jun 16, 2013
1 parent 1e105f3 commit 81000ba
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/multi_git/git_backend/remote.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ def initialize( repo, url, push_url = url )
@push_urls = Array(push_url)
end

def fetch(*refspecs)
rs = parse_fetch_refspec(*refspecs)
repository.__backend__['fetch',fetch_urls.first,*rs.map(&:to_s)]
end

end
end
end
21 changes: 21 additions & 0 deletions lib/multi_git/jgit_backend/remote.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ def name
FETCH_URL_KEY = 'url'.to_java
PUSH_URL_KEY = 'pushurl'.to_java

FETCH = Java::OrgEclipseJgitTransport::Transport::Operation::FETCH
PUSH = Java::OrgEclipseJgitTransport::Transport::Operation::PUSH

def initialize( repository, url, push_url = url )
@repository = repository
conf = Java::OrgEclipseJgitLib::Config.new
Expand All @@ -44,10 +47,28 @@ def push_urls
pu.any? ? pu : fetch_urls
end

def fetch( *refspecs )
rs = parse_fetch_refspec(*refspecs).map{|refspec| Java::OrgEclipseJgitTransport::RefSpec.new(refspec.to_s) }
use_transport( FETCH ) do | transport |
transport.fetch( transport_monitor, rs )
end
end

private

attr :java_config

def use_transport( op )
tr = Java::OrgEclipseJgitTransport::Transport.open(repository.__backend__, java_config, op)
yield tr
ensure
tr.close
end

def transport_monitor
Java::OrgEclipseJgitLib::NullProgressMonitor::INSTANCE
end

end
end
end
4 changes: 4 additions & 0 deletions lib/multi_git/refspec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ def inspect
['#<',self.class,' ',forced ? '+':'',from,':',to,'>'].join
end

def to_s
[forced ? '+':'',from,':',to].join
end

class Parser

REF = %r{\A(\+?)([a-zA-Z/0-9_*]+)?(?:(:)([a-zA-Z/0-9_*]+)?)?\z}
Expand Down
17 changes: 17 additions & 0 deletions lib/multi_git/remote.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,23 @@ module Persistent
# @param name [String]
# @return [Persistent]
abstract :save

protected

def refspec_parser
RefSpec::Parser.new("refs/remotes/#{name}/")
end

end

protected

def parse_fetch_refspec(*refspecs)
refspec_parser[*refspecs]
end

def refspec_parser
RefSpec::Parser.new("refs/remotes//")
end

end
Expand Down
13 changes: 13 additions & 0 deletions lib/multi_git/rugged_backend/remote.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,19 @@ class Persistent < self

end

def fetch(*refspecs)
rs = parse_fetch_refspec(*refspecs)
cl = Rugged::Remote.new(repository.__backend__, fetch_urls.first)
cl.clear_refspecs
rs.each do |spec|
cl.add_fetch(spec.to_s)
end
cl.connect(:fetch) do |r|
r.download
end
cl.update_tips!
end

end
end
end
51 changes: 51 additions & 0 deletions spec/shared/remote.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,54 @@

end

describe '#remote#fetch', remote: true do

let(:repository){ subject.open(tempdir, init: true) }

let(:remote_tempdir){ Dir.mktmpdir }

before(:each) do
remote = MultiGit.open(remote_tempdir, init:true, bare:true)
remote.branch('master').update do
MultiGit::Commit::Builder.new do
tree.file "foo", "bar"
at Time.new(2010,1,1,12,0,0)
end
end
remote['HEAD'].update do
remote.branch('master')
end
end

after(:each) do
FileUtils.rm_rf(remote_tempdir)
end

context 'by url' do

let(:remote){ repository.remote(remote_tempdir) }

it "can fetch stuff" do
remote.fetch('master:foo/master')
repository.branch('foo/master').target.oid.should == 'f1df07b6610bd7135015e8c00e7531f861f9c5bc'
end

end

context 'by existing name' do

before(:each) do
`cd #{tempdir}; git init --bare ; git remote add origin #{remote_tempdir}`
end

let(:remote){ repository.remote('origin') }

it "can fetch stuff" do
remote.fetch('master')
repository.branch('origin/master').target.oid.should == 'f1df07b6610bd7135015e8c00e7531f861f9c5bc'
end

end

end

0 comments on commit 81000ba

Please sign in to comment.