multi_git 0.0.1.beta1 → 0.0.1.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/multi_git/backend.rb +4 -0
- data/lib/multi_git/blob.rb +19 -0
- data/lib/multi_git/directory.rb +17 -0
- data/lib/multi_git/error.rb +6 -0
- data/lib/multi_git/executeable.rb +10 -2
- data/lib/multi_git/file.rb +5 -1
- data/lib/multi_git/git_backend/ref.rb +15 -0
- data/lib/multi_git/git_backend/remote.rb +12 -0
- data/lib/multi_git/handle.rb +1 -1
- data/lib/multi_git/jgit_backend/ref.rb +4 -2
- data/lib/multi_git/jgit_backend/remote.rb +10 -0
- data/lib/multi_git/ref.rb +82 -57
- data/lib/multi_git/refspec.rb +22 -10
- data/lib/multi_git/remote.rb +14 -3
- data/lib/multi_git/rugged_backend/ref.rb +41 -2
- data/lib/multi_git/rugged_backend/remote.rb +14 -0
- data/lib/multi_git/tree/builder.rb +37 -0
- data/lib/multi_git/tree.rb +7 -2
- data/lib/multi_git/tree_entry.rb +14 -19
- data/lib/multi_git/version.rb +1 -1
- metadata +95 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 568f2ff3c702a98fe88e7f5ac6a1d80f2eae7b17
|
4
|
+
data.tar.gz: fac8b206478b5fef7c8ebd2e0872832415da0ec4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0092bb34f79f968ded7539c858a72daaf309c5c772130433001d8088ab2519224e0ea72e6d606136e925bbf99770c678b33385d06fbc72ea6f541063ab57645
|
7
|
+
data.tar.gz: 4ad11a12904c0de1560345983ccac9b5fc6fecf71f63f0fc3183d501b78f02cda0e0de4568c4b8fa5a4b3278d9290204a61fbdb45e28eae828f8436bd128de6a
|
data/lib/multi_git/backend.rb
CHANGED
data/lib/multi_git/blob.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'stringio'
|
2
2
|
require 'multi_git/object'
|
3
3
|
require 'multi_git/builder'
|
4
|
+
require 'digest/sha1'
|
4
5
|
module MultiGit
|
5
6
|
module Blob
|
6
7
|
|
@@ -8,6 +9,17 @@ module MultiGit
|
|
8
9
|
def type
|
9
10
|
:blob
|
10
11
|
end
|
12
|
+
|
13
|
+
def ==(other)
|
14
|
+
return false unless other.respond_to? :oid
|
15
|
+
return oid == other.oid
|
16
|
+
end
|
17
|
+
|
18
|
+
def inspect
|
19
|
+
['<',self.class,' ',oid,'>'].join
|
20
|
+
end
|
21
|
+
|
22
|
+
alias to_s inspect
|
11
23
|
end
|
12
24
|
|
13
25
|
class Builder < StringIO
|
@@ -39,6 +51,13 @@ module MultiGit
|
|
39
51
|
rewind
|
40
52
|
return repo.write(read)
|
41
53
|
end
|
54
|
+
|
55
|
+
def oid
|
56
|
+
dig = Digest::SHA1.new
|
57
|
+
dig << "blob #{size}\0"
|
58
|
+
dig << content
|
59
|
+
return dig.hexdigest
|
60
|
+
end
|
42
61
|
end
|
43
62
|
|
44
63
|
include Object
|
data/lib/multi_git/directory.rb
CHANGED
@@ -75,6 +75,23 @@ module MultiGit
|
|
75
75
|
]
|
76
76
|
end
|
77
77
|
|
78
|
+
extend Forwardable
|
79
|
+
|
80
|
+
delegate (Tree::Builder.instance_methods - self.instance_methods) => :object
|
81
|
+
|
82
|
+
def from
|
83
|
+
defined?(@from) ? @from : @from = make_from
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def make_from
|
89
|
+
if object.from.nil?
|
90
|
+
nil
|
91
|
+
else
|
92
|
+
Directory::Builder.new(parent, name, object.from)
|
93
|
+
end
|
94
|
+
end
|
78
95
|
end
|
79
96
|
|
80
97
|
include Base
|
data/lib/multi_git/error.rb
CHANGED
@@ -4,9 +4,17 @@ module MultiGit
|
|
4
4
|
|
5
5
|
class Executeable < File
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
module Base
|
8
|
+
def mode
|
9
|
+
Utils::MODE_EXECUTEABLE
|
10
|
+
end
|
9
11
|
end
|
12
|
+
|
13
|
+
class Builder < File::Builder
|
14
|
+
include Base
|
15
|
+
end
|
16
|
+
|
17
|
+
include Base
|
10
18
|
end
|
11
19
|
|
12
20
|
end
|
data/lib/multi_git/file.rb
CHANGED
@@ -24,12 +24,16 @@ module MultiGit
|
|
24
24
|
end
|
25
25
|
Blob::Builder.new(*args)
|
26
26
|
end
|
27
|
+
|
28
|
+
extend Forwardable
|
29
|
+
|
30
|
+
delegate (Blob::Builder.instance_methods - self.instance_methods) => :object
|
27
31
|
end
|
28
32
|
|
29
33
|
include Base
|
30
34
|
extend Forwardable
|
31
35
|
|
32
|
-
delegate (Blob.instance_methods -
|
36
|
+
delegate (Blob.instance_methods - self.instance_methods) => :object
|
33
37
|
end
|
34
38
|
|
35
39
|
end
|
@@ -17,6 +17,8 @@ module MultiGit
|
|
17
17
|
|
18
18
|
SYMBOLIC_REF_LINE = /\Aref: ([a-z0-9_]+(?:\/[a-z0-9_]+)*)\Z/i.freeze
|
19
19
|
OID_REF_LINE = /\A(\h{40})\Z/i.freeze
|
20
|
+
PACKED_REFS = 'packed-refs'.freeze
|
21
|
+
PACKED_REF_LINE = /\A(\h{40}) (\S+)\Z/
|
20
22
|
|
21
23
|
def read!
|
22
24
|
begin
|
@@ -30,6 +32,19 @@ module MultiGit
|
|
30
32
|
end
|
31
33
|
rescue Errno::ENOENT
|
32
34
|
# doesn't exists
|
35
|
+
# query packed refs
|
36
|
+
begin
|
37
|
+
packed = IO.read(::File.join(repository.git_dir, PACKED_REFS))
|
38
|
+
packed.each_line do |line|
|
39
|
+
if line =~ PACKED_REF_LINE
|
40
|
+
if $2 == name
|
41
|
+
@target = repository.read($1)
|
42
|
+
break
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
rescue Errno::ENOENT
|
47
|
+
end
|
33
48
|
end
|
34
49
|
end
|
35
50
|
end
|
@@ -40,8 +40,20 @@ module MultiGit
|
|
40
40
|
def fetch(*refspecs)
|
41
41
|
rs = parse_fetch_refspec(*refspecs)
|
42
42
|
repository.__backend__['fetch',fetch_urls.first,*rs.map(&:to_s)]
|
43
|
+
return self
|
43
44
|
end
|
44
45
|
|
46
|
+
def push(*refspecs)
|
47
|
+
rs = parse_push_refspec(*refspecs)
|
48
|
+
repository.__backend__['push',*push_urls,*rs.map(&:to_s)]
|
49
|
+
return self
|
50
|
+
end
|
51
|
+
|
52
|
+
def save( name )
|
53
|
+
begin
|
54
|
+
rescue Cmd::Error::ExitCode128
|
55
|
+
end
|
56
|
+
end
|
45
57
|
end
|
46
58
|
end
|
47
59
|
end
|
data/lib/multi_git/handle.rb
CHANGED
@@ -8,8 +8,10 @@ module MultiGit
|
|
8
8
|
# HACK!
|
9
9
|
# @api private
|
10
10
|
# @visibility private
|
11
|
-
|
12
|
-
|
11
|
+
if defined? Java::OrgEclipseJgitStorageFile::RefDirectoryUpdate
|
12
|
+
class Java::OrgEclipseJgitStorageFile::RefDirectoryUpdate
|
13
|
+
public :tryLock, :unlock, :doUpdate, :doDelete
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
# @api developer
|
@@ -52,6 +52,16 @@ module MultiGit
|
|
52
52
|
use_transport( FETCH ) do | transport |
|
53
53
|
transport.fetch( transport_monitor, rs )
|
54
54
|
end
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def push( *refspecs )
|
59
|
+
rs = parse_push_refspec(*refspecs).map{|refspec| Java::OrgEclipseJgitTransport::RefSpec.new(refspec.to_s) }
|
60
|
+
use_transport( PUSH ) do | transport |
|
61
|
+
toPush = transport.findRemoteRefUpdatesFor( rs )
|
62
|
+
transport.push( transport_monitor, toPush )
|
63
|
+
end
|
64
|
+
self
|
55
65
|
end
|
56
66
|
|
57
67
|
private
|
data/lib/multi_git/ref.rb
CHANGED
@@ -73,29 +73,82 @@ module MultiGit
|
|
73
73
|
end
|
74
74
|
|
75
75
|
# @api developer
|
76
|
-
|
76
|
+
module Locking
|
77
|
+
def lock_file_path
|
78
|
+
::File.join(repository.git_dir, name + '.lock')
|
79
|
+
end
|
77
80
|
|
78
|
-
|
81
|
+
def acquire_lock
|
82
|
+
f = ::File.open(lock_file_path, ::File::CREAT | ::File::RDWR | ::File::EXCL )
|
83
|
+
f.flock(::File::LOCK_EX)
|
84
|
+
return f
|
85
|
+
end
|
86
|
+
|
87
|
+
def release_lock(lock)
|
88
|
+
::File.unlink(lock.path)
|
89
|
+
lock.flock(::File::LOCK_UN)
|
90
|
+
lock.close
|
91
|
+
end
|
79
92
|
|
80
93
|
def ensure_dir!
|
81
|
-
FileUtils.mkdir_p(::File.dirname(
|
94
|
+
FileUtils.mkdir_p(::File.dirname(lock_file_path))
|
95
|
+
end
|
96
|
+
|
97
|
+
def file_path
|
98
|
+
::File.join(repository.git_dir, name)
|
82
99
|
end
|
100
|
+
end
|
83
101
|
|
84
|
-
|
102
|
+
# @api developer
|
103
|
+
class FileUpdater < Updater
|
104
|
+
|
105
|
+
protected
|
106
|
+
|
107
|
+
include Locking
|
108
|
+
|
109
|
+
def open_file!
|
85
110
|
mode = ::File::WRONLY | ::File::TRUNC
|
86
|
-
|
111
|
+
3.times do
|
87
112
|
begin
|
88
113
|
return ::File.open(file_path, mode | ::File::CREAT)
|
89
114
|
rescue Errno::EEXIST
|
90
|
-
raise Error::ConcurrentRefUpdate
|
91
115
|
end
|
92
|
-
else
|
93
116
|
begin
|
94
117
|
return ::File.open(file_path, mode)
|
95
118
|
rescue Errno::ENOENT
|
96
|
-
raise Error::ConcurrentRefUpdate
|
97
119
|
end
|
98
120
|
end
|
121
|
+
raise "Unable to open ref file for update"
|
122
|
+
end
|
123
|
+
|
124
|
+
def update!( nx )
|
125
|
+
str = object_to_ref_str(nx)
|
126
|
+
begin
|
127
|
+
file = open_file!
|
128
|
+
file.puts(str)
|
129
|
+
file.flush
|
130
|
+
ensure
|
131
|
+
file.close if file
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def remove!
|
136
|
+
begin
|
137
|
+
::File.unlink(file_path)
|
138
|
+
rescue Errno::ENOENT
|
139
|
+
end
|
140
|
+
begin
|
141
|
+
inf = ::File.open(packed_ref_path, ::File::RDONLY)
|
142
|
+
outf = ::File.open(packed_ref_path, ::File::WRONLY | ::File::TRUNC)
|
143
|
+
nb = "#{name}\n"
|
144
|
+
inf.each_line do |line|
|
145
|
+
next if line.end_with?(nb)
|
146
|
+
outf.write(line)
|
147
|
+
end
|
148
|
+
inf.close
|
149
|
+
outf.close
|
150
|
+
rescue Errno::ENOENT
|
151
|
+
end
|
99
152
|
end
|
100
153
|
|
101
154
|
def object_to_ref_str(object)
|
@@ -106,90 +159,54 @@ module MultiGit
|
|
106
159
|
end
|
107
160
|
end
|
108
161
|
|
109
|
-
def
|
110
|
-
::File.join(repository.git_dir,
|
111
|
-
end
|
112
|
-
|
113
|
-
def lock_file_path
|
114
|
-
::File.join(repository.git_dir, name + '.lock')
|
115
|
-
end
|
116
|
-
|
117
|
-
def acquire_lock
|
118
|
-
::File.open(lock_file_path, ::File::CREAT | ::File::RDWR | ::File::EXCL )
|
119
|
-
end
|
120
|
-
|
121
|
-
def release_lock(lock)
|
122
|
-
::File.unlink(lock.path)
|
123
|
-
lock.flock(::File::LOCK_UN)
|
162
|
+
def packed_ref_path
|
163
|
+
::File.join(repository.git_dir, 'packed-refs')
|
124
164
|
end
|
125
|
-
|
126
165
|
end
|
127
166
|
|
128
167
|
# @api developer
|
129
|
-
|
168
|
+
module PessimisticUpdater
|
130
169
|
|
131
170
|
def initialize(*_)
|
132
171
|
super
|
133
172
|
ensure_dir!
|
134
173
|
@lock = acquire_lock
|
135
174
|
# safe now
|
136
|
-
|
175
|
+
self.ref = ref.reload
|
137
176
|
end
|
138
177
|
|
139
178
|
def update(new)
|
140
|
-
old = target
|
141
179
|
nx = super
|
142
180
|
if nx
|
143
|
-
|
144
|
-
begin
|
145
|
-
file = open_file(!old.nil?)
|
146
|
-
file.puts(str)
|
147
|
-
file.flush
|
148
|
-
ensure
|
149
|
-
file.close if file
|
150
|
-
end
|
181
|
+
update!(nx)
|
151
182
|
else
|
152
|
-
|
183
|
+
remove!
|
153
184
|
end
|
154
185
|
return nx
|
155
186
|
end
|
156
187
|
|
157
188
|
def destroy!
|
158
|
-
release_lock(@lock)
|
189
|
+
release_lock(@lock) if @lock
|
159
190
|
end
|
160
191
|
end
|
161
192
|
|
162
193
|
# @api developer
|
163
|
-
|
194
|
+
module OptimisticUpdater
|
164
195
|
|
165
196
|
def update(new)
|
166
197
|
ensure_dir!
|
198
|
+
lock = acquire_lock
|
167
199
|
begin
|
168
|
-
|
169
|
-
if
|
170
|
-
content = ::File.read(file_path).chomp
|
171
|
-
if content != object_to_ref_str(target)
|
172
|
-
raise Error::ConcurrentRefUpdate
|
173
|
-
end
|
174
|
-
elsif !target.nil?
|
200
|
+
current = ref.reload.target
|
201
|
+
if current != target
|
175
202
|
raise Error::ConcurrentRefUpdate
|
176
203
|
end
|
177
204
|
old = target
|
178
205
|
nx = super
|
179
206
|
if nx.nil?
|
180
|
-
|
181
|
-
return nx
|
182
|
-
end
|
183
|
-
::File.unlink(file_path)
|
207
|
+
remove!
|
184
208
|
else
|
185
|
-
|
186
|
-
file = open_file( !old.nil? )
|
187
|
-
str = object_to_ref_str(nx)
|
188
|
-
file.puts( str )
|
189
|
-
file.flush
|
190
|
-
ensure
|
191
|
-
file.close if file
|
192
|
-
end
|
209
|
+
update!(nx)
|
193
210
|
end
|
194
211
|
return nx
|
195
212
|
ensure
|
@@ -198,6 +215,14 @@ module MultiGit
|
|
198
215
|
end
|
199
216
|
end
|
200
217
|
|
218
|
+
class OptimisticFileUpdater < FileUpdater
|
219
|
+
include OptimisticUpdater
|
220
|
+
end
|
221
|
+
|
222
|
+
class PessimisticFileUpdater < FileUpdater
|
223
|
+
include PessimisticUpdater
|
224
|
+
end
|
225
|
+
|
201
226
|
class RecklessUpdater < Updater
|
202
227
|
def update( new )
|
203
228
|
pu = PessimisticFileUpdater.new( ref )
|
data/lib/multi_git/refspec.rb
CHANGED
@@ -49,19 +49,31 @@ module MultiGit
|
|
49
49
|
@to_base = to_base
|
50
50
|
end
|
51
51
|
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
52
|
+
# @overload [](*args)
|
53
|
+
# @param args [RefSpec, String, Hash, Range, ...]
|
54
|
+
# @return [Array<RefSpec>]
|
55
|
+
#
|
56
|
+
# @overload [](*args, options)
|
57
|
+
# @param args [RefSpec, String, Hash, Range, ...]
|
58
|
+
# @param options [Hash]
|
59
|
+
# @option options [Boolean] :forced (false)
|
60
|
+
# @return [Array<RefSpec>]
|
55
61
|
def [](*args)
|
62
|
+
forced = false
|
63
|
+
if args.last.kind_of? Hash
|
64
|
+
options = args.pop.dup
|
65
|
+
forced = options.delete(:forced){ false }
|
66
|
+
args << options
|
67
|
+
end
|
56
68
|
args.collect_concat do |arg|
|
57
69
|
if arg.kind_of? RefSpec
|
58
70
|
[arg]
|
59
71
|
elsif arg.kind_of? String
|
60
|
-
[parse_string(arg)]
|
72
|
+
[parse_string(arg, forced)]
|
61
73
|
elsif arg.kind_of? Hash
|
62
|
-
arg.map{|k,v| parse_pair(k,v) }
|
74
|
+
arg.map{|k,v| parse_pair(k,v, forced) }
|
63
75
|
elsif arg.kind_of? Range
|
64
|
-
[parse_pair(arg.begin, arg.end)]
|
76
|
+
[parse_pair(arg.begin, arg.end, forced)]
|
65
77
|
else
|
66
78
|
raise ArgumentError, "Expected a String, Hash or Range. Got #{arg.inspect}"
|
67
79
|
end
|
@@ -69,7 +81,7 @@ module MultiGit
|
|
69
81
|
end
|
70
82
|
|
71
83
|
private
|
72
|
-
def parse_string(string)
|
84
|
+
def parse_string(string, forced)
|
73
85
|
if ma = REF.match(string)
|
74
86
|
if ma[2]
|
75
87
|
from = normalize(from_base, ma[2])
|
@@ -79,12 +91,12 @@ module MultiGit
|
|
79
91
|
else
|
80
92
|
to = normalize(to_base, ma[2])
|
81
93
|
end
|
82
|
-
RefSpec.new( from, to, ma[1] == '+' )
|
94
|
+
RefSpec.new( from, to, forced || (ma[1] == '+') )
|
83
95
|
end
|
84
96
|
end
|
85
97
|
|
86
|
-
def parse_pair(a,b)
|
87
|
-
RefSpec.new( normalize(from_base,a.to_s), normalize(to_base,b.to_s) )
|
98
|
+
def parse_pair(a,b, forced)
|
99
|
+
RefSpec.new( normalize(from_base,a.to_s), normalize(to_base,b.to_s), forced )
|
88
100
|
end
|
89
101
|
|
90
102
|
def normalize(base, name)
|
data/lib/multi_git/remote.rb
CHANGED
@@ -19,10 +19,12 @@ module MultiGit
|
|
19
19
|
|
20
20
|
# @!method fetch( *refspecs )
|
21
21
|
# @param refspecs [RefSpec, String, Range, Hash, ...]
|
22
|
+
# @return self
|
22
23
|
abstract :fetch
|
23
24
|
|
24
25
|
# @!method push( *refspecs )
|
25
26
|
# @param refspecs [RefSpec, String, Range, Hash, ...]
|
27
|
+
# @return self
|
26
28
|
abstract :push
|
27
29
|
|
28
30
|
# @!method save( name )
|
@@ -45,7 +47,7 @@ module MultiGit
|
|
45
47
|
|
46
48
|
protected
|
47
49
|
|
48
|
-
def
|
50
|
+
def fetch_refspec_parser
|
49
51
|
RefSpec::Parser.new("refs/remotes/#{name}/")
|
50
52
|
end
|
51
53
|
|
@@ -54,13 +56,22 @@ module MultiGit
|
|
54
56
|
protected
|
55
57
|
|
56
58
|
def parse_fetch_refspec(*refspecs)
|
57
|
-
|
59
|
+
fetch_refspec_parser[*refspecs]
|
58
60
|
end
|
59
61
|
|
60
|
-
def
|
62
|
+
def parse_push_refspec(*refspecs)
|
63
|
+
push_refspec_parser[*refspecs]
|
64
|
+
end
|
65
|
+
|
66
|
+
def fetch_refspec_parser
|
61
67
|
RefSpec::Parser.new("refs/remotes//")
|
62
68
|
end
|
63
69
|
|
70
|
+
def push_refspec_parser
|
71
|
+
RefSpec::Parser.new('refs/heads/')
|
72
|
+
end
|
73
|
+
|
74
|
+
|
64
75
|
end
|
65
76
|
|
66
77
|
end
|
@@ -30,10 +30,49 @@ module MultiGit
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
# @api private
|
34
|
+
# @visibility private
|
34
35
|
attr :rugged_ref
|
36
|
+
|
37
|
+
private
|
38
|
+
class Updater < MultiGit::Ref::Updater
|
39
|
+
include MultiGit::Ref::Locking
|
40
|
+
protected
|
41
|
+
def update!(nx)
|
42
|
+
Rugged::Reference.create(repository.__backend__, name, object_to_ref_str(nx), true)
|
43
|
+
end
|
44
|
+
def remove!
|
45
|
+
ref.rugged_ref.delete!
|
46
|
+
end
|
47
|
+
def object_to_ref_str(nx)
|
48
|
+
case( nx )
|
49
|
+
when MultiGit::Object then nx.oid
|
50
|
+
when Ref then nx.name
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# nerf release_lock, rugged does that for us
|
55
|
+
def release_lock(_)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class OptimisticUpdater < Updater
|
60
|
+
include MultiGit::Ref::OptimisticUpdater
|
61
|
+
end
|
62
|
+
|
63
|
+
class PessimisticUpdater < Updater
|
64
|
+
include MultiGit::Ref::PessimisticUpdater
|
65
|
+
end
|
66
|
+
|
67
|
+
def pessimistic_updater
|
68
|
+
PessimisticUpdater
|
69
|
+
end
|
70
|
+
|
71
|
+
def optimistic_updater
|
72
|
+
OptimisticUpdater
|
73
|
+
end
|
74
|
+
|
35
75
|
end
|
36
76
|
|
37
77
|
end
|
38
|
-
|
39
78
|
end
|
@@ -42,6 +42,10 @@ module MultiGit
|
|
42
42
|
|
43
43
|
end
|
44
44
|
|
45
|
+
def save( name )
|
46
|
+
rugged_remote.rename!( name )
|
47
|
+
end
|
48
|
+
|
45
49
|
if Rugged::Remote.instance_methods.include? :clear_refspecs
|
46
50
|
def fetch(*refspecs)
|
47
51
|
rs = parse_fetch_refspec(*refspecs)
|
@@ -61,6 +65,16 @@ module MultiGit
|
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
68
|
+
def push(*refspecs)
|
69
|
+
rs = parse_push_refspec(*refspecs).map(&:to_s)
|
70
|
+
# rugged cannot push to multiple locations currently
|
71
|
+
push_urls.each do | pu |
|
72
|
+
cl = Rugged::Remote.new(repository.__backend__, pu)
|
73
|
+
cl.clear_refspecs
|
74
|
+
cl.push(rs)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
64
78
|
end
|
65
79
|
end
|
66
80
|
end
|
@@ -11,6 +11,7 @@ module MultiGit
|
|
11
11
|
include Tree::Base
|
12
12
|
|
13
13
|
attr :entries
|
14
|
+
attr :from
|
14
15
|
|
15
16
|
def initialize(from = nil, &block)
|
16
17
|
@entries = {}
|
@@ -163,6 +164,12 @@ module MultiGit
|
|
163
164
|
}
|
164
165
|
end
|
165
166
|
|
167
|
+
def executeable(name, content = nil, &block)
|
168
|
+
set(name){|parent, name|
|
169
|
+
Executeable::Builder.new(parent, name, content, &block)
|
170
|
+
}
|
171
|
+
end
|
172
|
+
|
166
173
|
def directory(name, &block)
|
167
174
|
set(name){|parent, name|
|
168
175
|
Directory::Builder.new(parent, name, &block)
|
@@ -183,6 +190,36 @@ module MultiGit
|
|
183
190
|
self
|
184
191
|
end
|
185
192
|
|
193
|
+
# Checks if the file at the given path was changed.
|
194
|
+
#
|
195
|
+
# @param [String] path
|
196
|
+
#
|
197
|
+
# @example from scratch
|
198
|
+
# builder = MultiGit::Tree::Builder.new
|
199
|
+
# builder.file('a_file','some content')
|
200
|
+
# builder.changed? 'a_file' #=> eq true
|
201
|
+
# builder.changed? 'another_file' #=> eq false
|
202
|
+
def changed?( path )
|
203
|
+
begin
|
204
|
+
new = traverse(path)
|
205
|
+
rescue Error::EntryDoesNotExist
|
206
|
+
return false unless from
|
207
|
+
begin
|
208
|
+
old = from.traverse(path)
|
209
|
+
rescue Error::EntryDoesNotExist
|
210
|
+
return false
|
211
|
+
end
|
212
|
+
return true
|
213
|
+
end
|
214
|
+
return true unless from
|
215
|
+
begin
|
216
|
+
old = from.traverse(path)
|
217
|
+
rescue Error::EntryDoesNotExist
|
218
|
+
return true
|
219
|
+
end
|
220
|
+
return new != old
|
221
|
+
end
|
222
|
+
|
186
223
|
end
|
187
224
|
|
188
225
|
include DSL
|
data/lib/multi_git/tree.rb
CHANGED
@@ -60,10 +60,10 @@ module MultiGit
|
|
60
60
|
# do nothing
|
61
61
|
else
|
62
62
|
if !current.respond_to? :entry
|
63
|
-
raise MultiGit::Error::
|
63
|
+
raise MultiGit::Error::NotADirectory, "Can't traverse to #{path} from #{self.inspect}: #{current.inspect} doesn't contain an entry named #{part.inspect}"
|
64
64
|
end
|
65
65
|
entry = current.entry(part)
|
66
|
-
raise MultiGit::Error::
|
66
|
+
raise MultiGit::Error::EntryDoesNotExist, "Can't traverse to #{path} from #{self.inspect}: #{current.inspect} doesn't contain an entry named #{part.inspect}" unless entry
|
67
67
|
# may be a symlink
|
68
68
|
if entry.respond_to? :target
|
69
69
|
# this is a symlink
|
@@ -170,6 +170,11 @@ module MultiGit
|
|
170
170
|
entries.keys
|
171
171
|
end
|
172
172
|
|
173
|
+
def ==( other )
|
174
|
+
return false unless other.respond_to? :entries
|
175
|
+
entries == other.entries
|
176
|
+
end
|
177
|
+
|
173
178
|
end
|
174
179
|
|
175
180
|
include Base
|
data/lib/multi_git/tree_entry.rb
CHANGED
@@ -3,21 +3,11 @@ require 'multi_git/object'
|
|
3
3
|
require 'multi_git/builder'
|
4
4
|
require 'multi_git/walkable'
|
5
5
|
module MultiGit
|
6
|
-
|
7
|
-
base = Class.new
|
8
|
-
|
9
|
-
# @!parse
|
10
|
-
# class TreeEntry < TreeEntry::Base
|
11
|
-
# end
|
12
|
-
TreeEntry = Class.new(base)
|
13
|
-
|
14
6
|
# A tree entry is like a {MultiGit::Object} or a {MultiGit::Builder} but it
|
15
7
|
# also has knows it's parent tree.
|
16
8
|
class TreeEntry
|
17
9
|
|
18
|
-
Base
|
19
|
-
|
20
|
-
class Base
|
10
|
+
module Base
|
21
11
|
|
22
12
|
include Walkable
|
23
13
|
|
@@ -56,11 +46,20 @@ module MultiGit
|
|
56
46
|
end
|
57
47
|
end
|
58
48
|
|
59
|
-
|
49
|
+
def ==(other)
|
50
|
+
return false unless other.respond_to?(:path) && other.respond_to?(:object) && other.respond_to?(:mode)
|
51
|
+
return (path == other.path) && (object == other.object) && (mode == other.mode)
|
52
|
+
end
|
60
53
|
|
61
|
-
|
54
|
+
def inspect
|
55
|
+
['#<', self.class.name,'@',path,' ', object.inspect, '>'].join
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Builder# < Base
|
62
60
|
|
63
61
|
include MultiGit::Builder
|
62
|
+
include Base
|
64
63
|
|
65
64
|
# @return [MultiGit::Builder]
|
66
65
|
attr :object
|
@@ -78,26 +77,22 @@ module MultiGit
|
|
78
77
|
super( parent, name , make_inner(*args) )
|
79
78
|
instance_eval(&block) if block
|
80
79
|
end
|
81
|
-
|
82
80
|
end
|
83
81
|
|
84
82
|
# @return [MultiGit::Object]
|
85
83
|
attr :object
|
86
84
|
|
87
85
|
include MultiGit::Object
|
86
|
+
include Base
|
88
87
|
|
89
88
|
extend Forwardable
|
90
89
|
|
91
|
-
delegate
|
90
|
+
delegate [:oid, :content, :to_io, :bytesize] => :object
|
92
91
|
|
93
92
|
def to_builder
|
94
93
|
self.class::Builder.new(parent, name, object)
|
95
94
|
end
|
96
95
|
|
97
|
-
def inspect
|
98
|
-
['#<', self.class.name,' ',path,' ', oid, '>'].join
|
99
|
-
end
|
100
|
-
|
101
96
|
|
102
97
|
end
|
103
98
|
|
data/lib/multi_git/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multi_git
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.
|
4
|
+
version: 0.0.1.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hannes Georg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -38,6 +38,48 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: coveralls
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: kramdown
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
84
|
name: simplecov
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,64 +100,65 @@ executables: []
|
|
58
100
|
extensions: []
|
59
101
|
extra_rdoc_files: []
|
60
102
|
files:
|
61
|
-
- lib/multi_git/
|
62
|
-
- lib/multi_git/
|
63
|
-
- lib/multi_git/
|
64
|
-
- lib/multi_git/config/schema.rb
|
65
|
-
- lib/multi_git/config/default_schema.rb
|
66
|
-
- lib/multi_git/utils.rb
|
67
|
-
- lib/multi_git/backend.rb
|
68
|
-
- lib/multi_git/symlink.rb
|
103
|
+
- lib/multi_git/handle.rb
|
104
|
+
- lib/multi_git/commit.rb
|
105
|
+
- lib/multi_git/walkable.rb
|
69
106
|
- lib/multi_git/executeable.rb
|
70
|
-
- lib/multi_git/
|
107
|
+
- lib/multi_git/tree/builder.rb
|
108
|
+
- lib/multi_git/submodule.rb
|
109
|
+
- lib/multi_git/blob.rb
|
71
110
|
- lib/multi_git/object.rb
|
72
|
-
- lib/multi_git/
|
73
|
-
- lib/multi_git/git_backend/repository.rb
|
74
|
-
- lib/multi_git/git_backend/object.rb
|
75
|
-
- lib/multi_git/git_backend/remote.rb
|
76
|
-
- lib/multi_git/git_backend/blob.rb
|
77
|
-
- lib/multi_git/git_backend/ref.rb
|
78
|
-
- lib/multi_git/git_backend/cmd.rb
|
79
|
-
- lib/multi_git/git_backend/config.rb
|
80
|
-
- lib/multi_git/git_backend/commit.rb
|
81
|
-
- lib/multi_git/remote.rb
|
111
|
+
- lib/multi_git/directory.rb
|
82
112
|
- lib/multi_git/jgit_backend.rb
|
83
|
-
- lib/multi_git/
|
84
|
-
- lib/multi_git/ref.rb
|
85
|
-
- lib/multi_git/error.rb
|
86
|
-
- lib/multi_git/jgit_backend/tree.rb
|
87
|
-
- lib/multi_git/jgit_backend/rewindeable_io.rb
|
88
|
-
- lib/multi_git/jgit_backend/repository.rb
|
89
|
-
- lib/multi_git/jgit_backend/object.rb
|
90
|
-
- lib/multi_git/jgit_backend/remote.rb
|
91
|
-
- lib/multi_git/jgit_backend/blob.rb
|
92
|
-
- lib/multi_git/jgit_backend/ref.rb
|
93
|
-
- lib/multi_git/jgit_backend/config.rb
|
94
|
-
- lib/multi_git/jgit_backend/commit.rb
|
95
|
-
- lib/multi_git/submodule.rb
|
113
|
+
- lib/multi_git/version.rb
|
96
114
|
- lib/multi_git/file.rb
|
97
|
-
- lib/multi_git/
|
98
|
-
- lib/multi_git/
|
99
|
-
- lib/multi_git/
|
100
|
-
- lib/multi_git/
|
101
|
-
- lib/multi_git/rugged_backend/blob.rb
|
102
|
-
- lib/multi_git/rugged_backend/ref.rb
|
103
|
-
- lib/multi_git/rugged_backend/config.rb
|
104
|
-
- lib/multi_git/rugged_backend/commit.rb
|
115
|
+
- lib/multi_git/error.rb
|
116
|
+
- lib/multi_git/refspec.rb
|
117
|
+
- lib/multi_git/backend.rb
|
118
|
+
- lib/multi_git/tree.rb
|
105
119
|
- lib/multi_git/config.rb
|
106
|
-
- lib/multi_git/
|
107
|
-
- lib/multi_git/
|
108
|
-
- lib/multi_git/
|
120
|
+
- lib/multi_git/ref.rb
|
121
|
+
- lib/multi_git/builder.rb
|
122
|
+
- lib/multi_git/remote.rb
|
123
|
+
- lib/multi_git/git_backend/commit.rb
|
124
|
+
- lib/multi_git/git_backend/blob.rb
|
125
|
+
- lib/multi_git/git_backend/object.rb
|
126
|
+
- lib/multi_git/git_backend/cmd.rb
|
127
|
+
- lib/multi_git/git_backend/tree.rb
|
128
|
+
- lib/multi_git/git_backend/config.rb
|
129
|
+
- lib/multi_git/git_backend/ref.rb
|
130
|
+
- lib/multi_git/git_backend/remote.rb
|
131
|
+
- lib/multi_git/git_backend/repository.rb
|
132
|
+
- lib/multi_git/symlink.rb
|
133
|
+
- lib/multi_git/repository.rb
|
134
|
+
- lib/multi_git/git_backend.rb
|
135
|
+
- lib/multi_git/config/default_schema.rb
|
136
|
+
- lib/multi_git/config/schema.rb
|
109
137
|
- lib/multi_git/rugged_backend.rb
|
110
|
-
- lib/multi_git/
|
138
|
+
- lib/multi_git/utils.rb
|
111
139
|
- lib/multi_git/tree_entry.rb
|
112
|
-
- lib/multi_git/
|
113
|
-
- lib/multi_git/
|
114
|
-
- lib/multi_git/
|
115
|
-
- lib/multi_git/
|
140
|
+
- lib/multi_git/backend_set.rb
|
141
|
+
- lib/multi_git/rugged_backend/commit.rb
|
142
|
+
- lib/multi_git/rugged_backend/blob.rb
|
143
|
+
- lib/multi_git/rugged_backend/object.rb
|
144
|
+
- lib/multi_git/rugged_backend/tree.rb
|
145
|
+
- lib/multi_git/rugged_backend/config.rb
|
146
|
+
- lib/multi_git/rugged_backend/ref.rb
|
147
|
+
- lib/multi_git/rugged_backend/remote.rb
|
148
|
+
- lib/multi_git/rugged_backend/repository.rb
|
149
|
+
- lib/multi_git/jgit_backend/commit.rb
|
150
|
+
- lib/multi_git/jgit_backend/blob.rb
|
151
|
+
- lib/multi_git/jgit_backend/object.rb
|
152
|
+
- lib/multi_git/jgit_backend/tree.rb
|
153
|
+
- lib/multi_git/jgit_backend/config.rb
|
154
|
+
- lib/multi_git/jgit_backend/ref.rb
|
155
|
+
- lib/multi_git/jgit_backend/remote.rb
|
156
|
+
- lib/multi_git/jgit_backend/repository.rb
|
157
|
+
- lib/multi_git/jgit_backend/rewindeable_io.rb
|
116
158
|
- lib/multi_git.rb
|
117
159
|
homepage: https://github.com/hannesg/multi_git
|
118
|
-
licenses:
|
160
|
+
licenses:
|
161
|
+
- GPL-3
|
119
162
|
metadata: {}
|
120
163
|
post_install_message:
|
121
164
|
rdoc_options: []
|
@@ -134,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
177
|
requirements:
|
135
178
|
- jar 'org.eclipse.jgit:org.eclipse.jgit'
|
136
179
|
rubyforge_project:
|
137
|
-
rubygems_version: 2.
|
180
|
+
rubygems_version: 2.1.4
|
138
181
|
signing_key:
|
139
182
|
specification_version: 4
|
140
183
|
summary: Use all the git
|