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/README +7 -1
- data/lib/git/base.rb +51 -47
- data/lib/git/branch.rb +3 -5
- data/lib/git/branches.rb +4 -13
- data/lib/git/diff.rb +20 -17
- data/lib/git/lib.rb +126 -117
- data/lib/git/log.rb +20 -18
- data/lib/git/object.rb +63 -86
- data/lib/git/remote.rb +1 -3
- data/lib/git/stash.rb +2 -1
- data/lib/git/stashes.rb +5 -10
- data/lib/git/status.rb +7 -15
- data/lib/git.rb +14 -0
- metadata +6 -7
- data/tests/all_tests.rb +0 -4
- data/tests/test_helper.rb +0 -77
data/README
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
== Git Library for Ruby
|
2
2
|
|
3
|
-
Library for using Git in Ruby.
|
3
|
+
Library for using Git in Ruby. Test.
|
4
4
|
|
5
5
|
= Homepage
|
6
6
|
|
@@ -12,6 +12,12 @@ Git public hosting of the project source code is at:
|
|
12
12
|
|
13
13
|
http://github/schacon/ruby-git
|
14
14
|
|
15
|
+
= Install
|
16
|
+
|
17
|
+
You can install Ruby/Git like this:
|
18
|
+
|
19
|
+
$ sudo gem install schacon-git --source=http://gems.github.com
|
20
|
+
|
15
21
|
= Major Objects
|
16
22
|
|
17
23
|
Git::Base - this is the object returned from a Git.open or Git.clone.
|
data/lib/git/base.rb
CHANGED
@@ -2,28 +2,15 @@ module Git
|
|
2
2
|
|
3
3
|
class Base
|
4
4
|
|
5
|
-
@working_directory = nil
|
6
|
-
@repository = nil
|
7
|
-
@index = nil
|
8
|
-
|
9
|
-
@lib = nil
|
10
|
-
@logger = nil
|
11
|
-
|
12
5
|
# opens a bare Git Repository - no working directory options
|
13
6
|
def self.bare(git_dir, opts = {})
|
14
|
-
|
15
|
-
git_options = default.merge(opts)
|
16
|
-
|
17
|
-
self.new(git_options)
|
7
|
+
self.new({:repository => git_dir}.merge(opts))
|
18
8
|
end
|
19
9
|
|
20
10
|
# opens a new Git Project from a working directory
|
21
11
|
# you can specify non-standard git_dir and index file in the options
|
22
|
-
def self.open(working_dir, opts={})
|
23
|
-
|
24
|
-
git_options = default.merge(opts)
|
25
|
-
|
26
|
-
self.new(git_options)
|
12
|
+
def self.open(working_dir, opts={})
|
13
|
+
self.new({:working_directory => working_dir}.merge(opts))
|
27
14
|
end
|
28
15
|
|
29
16
|
# initializes a git repository
|
@@ -33,19 +20,17 @@ module Git
|
|
33
20
|
# :index_file
|
34
21
|
#
|
35
22
|
def self.init(working_dir, opts = {})
|
36
|
-
|
37
|
-
|
38
|
-
|
23
|
+
opts = {
|
24
|
+
:working_directory => working_dir,
|
25
|
+
:repository => File.join(working_dir, '.git')
|
26
|
+
}.merge(opts)
|
39
27
|
|
40
|
-
if
|
41
|
-
# if !working_dir, make it
|
42
|
-
FileUtils.mkdir_p(git_options[:working_directory]) if !File.directory?(git_options[:working_directory])
|
43
|
-
end
|
28
|
+
FileUtils.mkdir_p(opts[:working_directory]) if opts[:working_directory] && !File.directory?(opts[:working_directory])
|
44
29
|
|
45
30
|
# run git_init there
|
46
|
-
Git::Lib.new(
|
31
|
+
Git::Lib.new(opts).init
|
47
32
|
|
48
|
-
self.new(
|
33
|
+
self.new(opts)
|
49
34
|
end
|
50
35
|
|
51
36
|
# clones a git repository locally
|
@@ -68,17 +53,19 @@ module Git
|
|
68
53
|
|
69
54
|
def initialize(options = {})
|
70
55
|
if working_dir = options[:working_directory]
|
71
|
-
options[:repository]
|
72
|
-
options[:index]
|
56
|
+
options[:repository] ||= File.join(working_dir, '.git')
|
57
|
+
options[:index] ||= File.join(working_dir, '.git', 'index')
|
73
58
|
end
|
74
59
|
if options[:log]
|
75
60
|
@logger = options[:log]
|
76
61
|
@logger.info("Starting Git")
|
62
|
+
else
|
63
|
+
@logger = nil
|
77
64
|
end
|
78
|
-
|
79
|
-
@working_directory = Git::WorkingDirectory.new(options[:working_directory])
|
80
|
-
@repository = Git::Repository.new(options[:repository])
|
81
|
-
@index = Git::Index.new(options[:index], false)
|
65
|
+
|
66
|
+
@working_directory = options[:working_directory] ? Git::WorkingDirectory.new(options[:working_directory]) : nil
|
67
|
+
@repository = options[:repository] ? Git::Repository.new(options[:repository]) : nil
|
68
|
+
@index = options[:index] ? Git::Index.new(options[:index], false) : nil
|
82
69
|
end
|
83
70
|
|
84
71
|
|
@@ -120,7 +107,7 @@ module Git
|
|
120
107
|
# @git.add
|
121
108
|
# @git.commit('message')
|
122
109
|
# end
|
123
|
-
def chdir
|
110
|
+
def chdir # :yields: the Git::Path
|
124
111
|
Dir.chdir(dir.path) do
|
125
112
|
yield dir.path
|
126
113
|
end
|
@@ -197,6 +184,24 @@ module Git
|
|
197
184
|
def branch(branch_name = 'master')
|
198
185
|
Git::Branch.new(self, branch_name)
|
199
186
|
end
|
187
|
+
|
188
|
+
# returns +true+ if the branch exists locally
|
189
|
+
def is_local_branch?(branch)
|
190
|
+
branch_names = self.branches.local.map {|b| b.name}
|
191
|
+
branch_names.include?(branch)
|
192
|
+
end
|
193
|
+
|
194
|
+
# returns +true+ if the branch exists remotely
|
195
|
+
def is_remote_branch?(branch)
|
196
|
+
branch_names = self.branches.local.map {|b| b.name}
|
197
|
+
branch_names.include?(branch)
|
198
|
+
end
|
199
|
+
|
200
|
+
# returns +true+ if the branch exists
|
201
|
+
def is_branch?(branch)
|
202
|
+
branch_names = self.branches.map {|b| b.name}
|
203
|
+
branch_names.include?(branch)
|
204
|
+
end
|
200
205
|
|
201
206
|
# returns a Git::Remote object
|
202
207
|
def remote(remote_name = 'origin')
|
@@ -229,8 +234,8 @@ module Git
|
|
229
234
|
# puts "\t line #{match[0]}: '#{match[1]}'"
|
230
235
|
# end
|
231
236
|
# end
|
232
|
-
def grep(string)
|
233
|
-
self.object('HEAD').grep(string)
|
237
|
+
def grep(string, path_limiter = nil, opts = {})
|
238
|
+
self.object('HEAD').grep(string, path_limiter, opts)
|
234
239
|
end
|
235
240
|
|
236
241
|
# returns a Git::Diff object
|
@@ -260,6 +265,11 @@ module Git
|
|
260
265
|
end
|
261
266
|
|
262
267
|
# commits all pending changes in the index file to the git repository
|
268
|
+
#
|
269
|
+
# options:
|
270
|
+
# :add_all
|
271
|
+
# :allow_empty
|
272
|
+
# :author
|
263
273
|
def commit(message, opts = {})
|
264
274
|
self.lib.commit(message, opts)
|
265
275
|
end
|
@@ -293,8 +303,8 @@ module Git
|
|
293
303
|
#
|
294
304
|
# @git.config('remote.remote-name.push', 'refs/heads/master:refs/heads/master')
|
295
305
|
#
|
296
|
-
def push(remote = 'origin', branch = 'master')
|
297
|
-
self.lib.push(remote, branch)
|
306
|
+
def push(remote = 'origin', branch = 'master', tags = false)
|
307
|
+
self.lib.push(remote, branch, tags)
|
298
308
|
end
|
299
309
|
|
300
310
|
# merges one or more branches into the current working branch
|
@@ -305,9 +315,7 @@ module Git
|
|
305
315
|
end
|
306
316
|
|
307
317
|
# iterates over the files which are unmerged
|
308
|
-
#
|
309
|
-
# yields file, your_version, their_version
|
310
|
-
def each_conflict(&block)
|
318
|
+
def each_conflict(&block) # :yields: file, your_version, their_version
|
311
319
|
self.lib.conflicts(&block)
|
312
320
|
end
|
313
321
|
|
@@ -330,9 +338,7 @@ module Git
|
|
330
338
|
# @git.merge('scotts_git/master')
|
331
339
|
#
|
332
340
|
def add_remote(name, url, opts = {})
|
333
|
-
if url.is_a?(Git::Base)
|
334
|
-
url = url.repo.path
|
335
|
-
end
|
341
|
+
url = url.repo.path if url.is_a?(Git::Base)
|
336
342
|
self.lib.remote_add(name, url, opts)
|
337
343
|
Git::Remote.new(self, name)
|
338
344
|
end
|
@@ -374,14 +380,12 @@ module Git
|
|
374
380
|
end
|
375
381
|
|
376
382
|
def apply_mail(file)
|
377
|
-
if File.exists?(file)
|
378
|
-
self.lib.apply_mail(file)
|
379
|
-
end
|
383
|
+
self.lib.apply_mail(file) if File.exists?(file)
|
380
384
|
end
|
381
385
|
|
382
386
|
## LOWER LEVEL INDEX OPERATIONS ##
|
383
387
|
|
384
|
-
def with_index(new_index)
|
388
|
+
def with_index(new_index) # :yields: new_index
|
385
389
|
old_index = @index
|
386
390
|
set_index(new_index, false)
|
387
391
|
return_value = yield @index
|
@@ -426,7 +430,7 @@ module Git
|
|
426
430
|
self.lib.ls_files
|
427
431
|
end
|
428
432
|
|
429
|
-
def with_working(work_dir)
|
433
|
+
def with_working(work_dir) # :yields: the Git::WorkingDirectory
|
430
434
|
return_value = false
|
431
435
|
old_working = @working_directory
|
432
436
|
set_working(work_dir)
|
data/lib/git/branch.rb
CHANGED
@@ -3,14 +3,12 @@ module Git
|
|
3
3
|
|
4
4
|
attr_accessor :full, :remote, :name
|
5
5
|
|
6
|
-
@base = nil
|
7
|
-
@gcommit = nil
|
8
|
-
@stashes = nil
|
9
|
-
|
10
6
|
def initialize(base, name)
|
11
7
|
@remote = nil
|
12
8
|
@full = name
|
13
9
|
@base = base
|
10
|
+
@gcommit = nil
|
11
|
+
@stashes = nil
|
14
12
|
|
15
13
|
parts = name.split('/')
|
16
14
|
if parts[1]
|
@@ -22,7 +20,7 @@ module Git
|
|
22
20
|
end
|
23
21
|
|
24
22
|
def gcommit
|
25
|
-
@gcommit
|
23
|
+
@gcommit ||= @base.gcommit(@full)
|
26
24
|
@gcommit
|
27
25
|
end
|
28
26
|
|
data/lib/git/branches.rb
CHANGED
@@ -4,9 +4,6 @@ module Git
|
|
4
4
|
class Branches
|
5
5
|
include Enumerable
|
6
6
|
|
7
|
-
@base = nil
|
8
|
-
@branches = nil
|
9
|
-
|
10
7
|
def initialize(base)
|
11
8
|
@branches = {}
|
12
9
|
|
@@ -31,10 +28,8 @@ module Git
|
|
31
28
|
@branches.size
|
32
29
|
end
|
33
30
|
|
34
|
-
def each
|
35
|
-
@branches.each
|
36
|
-
yield b
|
37
|
-
end
|
31
|
+
def each(&block)
|
32
|
+
@branches.values.each(&block)
|
38
33
|
end
|
39
34
|
|
40
35
|
def [](symbol)
|
@@ -44,14 +39,10 @@ module Git
|
|
44
39
|
def to_s
|
45
40
|
out = ''
|
46
41
|
@branches.each do |k, b|
|
47
|
-
|
48
|
-
out += "* " + b.to_s + "\n"
|
49
|
-
else
|
50
|
-
out += " " + b.to_s + "\n"
|
51
|
-
end
|
42
|
+
out << (b.current ? '* ' : ' ') << b.to_s << "\n"
|
52
43
|
end
|
53
44
|
out
|
54
45
|
end
|
55
46
|
|
56
47
|
end
|
57
|
-
end
|
48
|
+
end
|
data/lib/git/diff.rb
CHANGED
@@ -4,20 +4,17 @@ module Git
|
|
4
4
|
class Diff
|
5
5
|
include Enumerable
|
6
6
|
|
7
|
-
@base = nil
|
8
|
-
@from = nil
|
9
|
-
@to = nil
|
10
|
-
@path = nil
|
11
|
-
|
12
|
-
@full_diff = nil
|
13
|
-
@full_diff_files = nil
|
14
|
-
@stats = nil
|
15
|
-
|
16
7
|
def initialize(base, from = nil, to = nil)
|
17
8
|
@base = base
|
18
9
|
@from = from.to_s
|
19
10
|
@to = to.to_s
|
11
|
+
|
12
|
+
@path = nil
|
13
|
+
@full_diff = nil
|
14
|
+
@full_diff_files = nil
|
15
|
+
@stats = nil
|
20
16
|
end
|
17
|
+
attr_reader :from, :to
|
21
18
|
|
22
19
|
def path(path)
|
23
20
|
@path = path
|
@@ -63,11 +60,9 @@ module Git
|
|
63
60
|
@full_diff_files.assoc(key)[1]
|
64
61
|
end
|
65
62
|
|
66
|
-
def each
|
63
|
+
def each(&block) # :yields: each Git::DiffFile in turn
|
67
64
|
process_full
|
68
|
-
@full_diff_files.
|
69
|
-
yield file[1]
|
70
|
-
end
|
65
|
+
@full_diff_files.map { |file| file[1] }.each(&block)
|
71
66
|
end
|
72
67
|
|
73
68
|
class DiffFile
|
@@ -82,6 +77,11 @@ module Git
|
|
82
77
|
@src = hash[:src]
|
83
78
|
@dst = hash[:dst]
|
84
79
|
@type = hash[:type]
|
80
|
+
@binary = hash[:binary]
|
81
|
+
end
|
82
|
+
|
83
|
+
def binary?
|
84
|
+
!!@binary
|
85
85
|
end
|
86
86
|
|
87
87
|
def blob(type = :dst)
|
@@ -96,20 +96,20 @@ module Git
|
|
96
96
|
private
|
97
97
|
|
98
98
|
def cache_full
|
99
|
-
|
99
|
+
unless @full_diff
|
100
100
|
@full_diff = @base.lib.diff_full(@from, @to, {:path_limiter => @path})
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
104
|
def process_full
|
105
|
-
|
105
|
+
unless @full_diff_files
|
106
106
|
cache_full
|
107
107
|
@full_diff_files = process_full_diff
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
111
|
def cache_stats
|
112
|
-
|
112
|
+
unless @stats
|
113
113
|
@stats = @base.lib.diff_stats(@from, @to, {:path_limiter => @path})
|
114
114
|
end
|
115
115
|
end
|
@@ -133,6 +133,9 @@ module Git
|
|
133
133
|
final[current_file][:type] = m[1]
|
134
134
|
final[current_file][:mode] = m[2]
|
135
135
|
end
|
136
|
+
if m = /^Binary files /.match(line)
|
137
|
+
final[current_file][:binary] = true
|
138
|
+
end
|
136
139
|
final[current_file][:patch] << "\n" + line
|
137
140
|
end
|
138
141
|
end
|
@@ -140,4 +143,4 @@ module Git
|
|
140
143
|
end
|
141
144
|
|
142
145
|
end
|
143
|
-
end
|
146
|
+
end
|