clc-git 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,128 @@
1
+ module Git
2
+
3
+ # object that holds the last X commits on given branch
4
+ class Log
5
+ include Enumerable
6
+
7
+ def initialize(base, count = 30)
8
+ dirty_log
9
+ @base = base
10
+ @count = count
11
+
12
+ @commits = nil
13
+ @author = nil
14
+ @grep = nil
15
+ @object = nil
16
+ @path = nil
17
+ @since = nil
18
+ @skip = nil
19
+ @until = nil
20
+ @between = nil
21
+ end
22
+
23
+ def object(objectish)
24
+ dirty_log
25
+ @object = objectish
26
+ return self
27
+ end
28
+
29
+ def author(regex)
30
+ dirty_log
31
+ @author = regex
32
+ return self
33
+ end
34
+
35
+ def grep(regex)
36
+ dirty_log
37
+ @grep = regex
38
+ return self
39
+ end
40
+
41
+ def path(path)
42
+ dirty_log
43
+ @path = path
44
+ return self
45
+ end
46
+
47
+ def skip(num)
48
+ dirty_log
49
+ @skip = num
50
+ return self
51
+ end
52
+
53
+ def since(date)
54
+ dirty_log
55
+ @since = date
56
+ return self
57
+ end
58
+
59
+ def until(date)
60
+ dirty_log
61
+ @until = date
62
+ return self
63
+ end
64
+
65
+ def between(sha1, sha2 = nil)
66
+ dirty_log
67
+ @between = [sha1, sha2]
68
+ return self
69
+ end
70
+
71
+ def to_s
72
+ self.map { |c| c.to_s }.join("\n")
73
+ end
74
+
75
+
76
+ # forces git log to run
77
+
78
+ def size
79
+ check_log
80
+ @commits.size rescue nil
81
+ end
82
+
83
+ def each(&block)
84
+ check_log
85
+ @commits.each(&block)
86
+ end
87
+
88
+ def first
89
+ check_log
90
+ @commits.first rescue nil
91
+ end
92
+
93
+ def last
94
+ check_log
95
+ @commits.last rescue nil
96
+ end
97
+
98
+ def [](index)
99
+ check_log
100
+ @commits[index] rescue nil
101
+ end
102
+
103
+
104
+ private
105
+
106
+ def dirty_log
107
+ @dirty_flag = true
108
+ end
109
+
110
+ def check_log
111
+ if @dirty_flag
112
+ run_log
113
+ @dirty_flag = false
114
+ end
115
+ end
116
+
117
+ # actually run the 'git log' command
118
+ def run_log
119
+ log = @base.lib.full_log_commits(:count => @count, :object => @object,
120
+ :path_limiter => @path, :since => @since,
121
+ :author => @author, :grep => @grep, :skip => @skip,
122
+ :until => @until, :between => @between)
123
+ @commits = log.map { |c| Git::Object::Commit.new(@base, c['sha'], c) }
124
+ end
125
+
126
+ end
127
+
128
+ end
@@ -0,0 +1,282 @@
1
+ module Git
2
+
3
+ class GitTagNameDoesNotExist< StandardError
4
+ end
5
+
6
+ # represents a git object
7
+ class Object
8
+
9
+ class AbstractObject
10
+ attr_accessor :objectish, :type, :mode
11
+
12
+ attr_writer :size
13
+
14
+ def initialize(base, objectish)
15
+ @base = base
16
+ @objectish = objectish.to_s
17
+ @contents = nil
18
+ @trees = nil
19
+ @size = nil
20
+ @sha = nil
21
+ end
22
+
23
+ def sha
24
+ @sha ||= @base.lib.revparse(@objectish)
25
+ end
26
+
27
+ def size
28
+ @size ||= @base.lib.object_size(@objectish)
29
+ end
30
+
31
+ # Get the object's contents.
32
+ # If no block is given, the contents are cached in memory and returned as a string.
33
+ # If a block is given, it yields an IO object (via IO::popen) which could be used to
34
+ # read a large file in chunks.
35
+ #
36
+ # Use this for large files so that they are not held in memory.
37
+ def contents(&block)
38
+ if block_given?
39
+ @base.lib.object_contents(@objectish, &block)
40
+ else
41
+ @contents ||= @base.lib.object_contents(@objectish)
42
+ end
43
+ end
44
+
45
+ def contents_array
46
+ self.contents.split("\n")
47
+ end
48
+
49
+ def to_s
50
+ @objectish
51
+ end
52
+
53
+ def grep(string, path_limiter = nil, opts = {})
54
+ opts = {:object => sha, :path_limiter => path_limiter}.merge(opts)
55
+ @base.lib.grep(string, opts)
56
+ end
57
+
58
+ def diff(objectish)
59
+ Git::Diff.new(@base, @objectish, objectish)
60
+ end
61
+
62
+ def log(count = 30)
63
+ Git::Log.new(@base, count).object(@objectish)
64
+ end
65
+
66
+ # creates an archive of this object (tree)
67
+ def archive(file = nil, opts = {})
68
+ @base.lib.archive(@objectish, file, opts)
69
+ end
70
+
71
+ def tree?; false; end
72
+
73
+ def blob?; false; end
74
+
75
+ def commit?; false; end
76
+
77
+ def tag?; false; end
78
+
79
+ end
80
+
81
+
82
+ class Blob < AbstractObject
83
+
84
+ def initialize(base, sha, mode = nil)
85
+ super(base, sha)
86
+ @mode = mode
87
+ end
88
+
89
+ def blob?
90
+ true
91
+ end
92
+
93
+ end
94
+
95
+ class Tree < AbstractObject
96
+
97
+ def initialize(base, sha, mode = nil)
98
+ super(base, sha)
99
+ @mode = mode
100
+ @trees = nil
101
+ @blobs = nil
102
+ end
103
+
104
+ def children
105
+ blobs.merge(subtrees)
106
+ end
107
+
108
+ def blobs
109
+ @blobs ||= check_tree[:blobs]
110
+ end
111
+ alias_method :files, :blobs
112
+
113
+ def trees
114
+ @trees ||= check_tree[:trees]
115
+ end
116
+ alias_method :subtrees, :trees
117
+ alias_method :subdirectories, :trees
118
+
119
+ def full_tree
120
+ @base.lib.full_tree(@objectish)
121
+ end
122
+
123
+ def depth
124
+ @base.lib.tree_depth(@objectish)
125
+ end
126
+
127
+ def tree?
128
+ true
129
+ end
130
+
131
+ private
132
+
133
+ # actually run the git command
134
+ def check_tree
135
+ @trees = {}
136
+ @blobs = {}
137
+
138
+ data = @base.lib.ls_tree(@objectish)
139
+
140
+ data['tree'].each do |key, tree|
141
+ @trees[key] = Git::Object::Tree.new(@base, tree[:sha], tree[:mode])
142
+ end
143
+
144
+ data['blob'].each do |key, blob|
145
+ @blobs[key] = Git::Object::Blob.new(@base, blob[:sha], blob[:mode])
146
+ end
147
+
148
+ {
149
+ :trees => @trees,
150
+ :blobs => @blobs
151
+ }
152
+ end
153
+
154
+ end
155
+
156
+ class Commit < AbstractObject
157
+
158
+ def initialize(base, sha, init = nil)
159
+ super(base, sha)
160
+ @tree = nil
161
+ @parents = nil
162
+ @author = nil
163
+ @committer = nil
164
+ @message = nil
165
+ if init
166
+ set_commit(init)
167
+ end
168
+ end
169
+
170
+ def message
171
+ check_commit
172
+ @message
173
+ end
174
+
175
+ def name
176
+ @base.lib.namerev(sha)
177
+ end
178
+
179
+ def gtree
180
+ check_commit
181
+ Tree.new(@base, @tree)
182
+ end
183
+
184
+ def parent
185
+ parents.first
186
+ end
187
+
188
+ # array of all parent commits
189
+ def parents
190
+ check_commit
191
+ @parents
192
+ end
193
+
194
+ # git author
195
+ def author
196
+ check_commit
197
+ @author
198
+ end
199
+
200
+ def author_date
201
+ author.date
202
+ end
203
+
204
+ # git author
205
+ def committer
206
+ check_commit
207
+ @committer
208
+ end
209
+
210
+ def committer_date
211
+ committer.date
212
+ end
213
+ alias_method :date, :committer_date
214
+
215
+ def diff_parent
216
+ diff(parent)
217
+ end
218
+
219
+ def set_commit(data)
220
+ if data['sha']
221
+ @sha = data['sha']
222
+ end
223
+ @committer = Git::Author.new(data['committer'])
224
+ @author = Git::Author.new(data['author'])
225
+ @tree = Git::Object::Tree.new(@base, data['tree'])
226
+ @parents = data['parent'].map{ |sha| Git::Object::Commit.new(@base, sha) }
227
+ @message = data['message'].chomp
228
+ end
229
+
230
+ def commit?
231
+ true
232
+ end
233
+
234
+ private
235
+
236
+ # see if this object has been initialized and do so if not
237
+ def check_commit
238
+ unless @tree
239
+ data = @base.lib.commit_data(@objectish)
240
+ set_commit(data)
241
+ end
242
+ end
243
+
244
+ end
245
+
246
+ class Tag < AbstractObject
247
+ attr_accessor :name
248
+
249
+ def initialize(base, sha, name)
250
+ super(base, sha)
251
+ @name = name
252
+ end
253
+
254
+ def tag?
255
+ true
256
+ end
257
+
258
+ end
259
+
260
+ # if we're calling this, we don't know what type it is yet
261
+ # so this is our little factory method
262
+ def self.new(base, objectish, type = nil, is_tag = false)
263
+ if is_tag
264
+ sha = base.lib.tag_sha(objectish)
265
+ if sha == ''
266
+ raise Git::GitTagNameDoesNotExist.new(objectish)
267
+ end
268
+ return Git::Object::Tag.new(base, sha, objectish)
269
+ end
270
+
271
+ type ||= base.lib.object_type(objectish)
272
+ klass =
273
+ case type
274
+ when /blob/ then Blob
275
+ when /commit/ then Commit
276
+ when /tree/ then Tree
277
+ end
278
+ klass.new(base, objectish)
279
+ end
280
+
281
+ end
282
+ end
@@ -0,0 +1,31 @@
1
+ module Git
2
+
3
+ class Path
4
+
5
+ attr_accessor :path
6
+
7
+ def initialize(path, check_path=true)
8
+ path = File.expand_path(path)
9
+
10
+ if check_path && !File.exist?(path)
11
+ raise ArgumentError, 'path does not exist', [path]
12
+ end
13
+
14
+ @path = path
15
+ end
16
+
17
+ def readable?
18
+ File.readable?(@path)
19
+ end
20
+
21
+ def writable?
22
+ File.writable?(@path)
23
+ end
24
+
25
+ def to_s
26
+ @path
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,36 @@
1
+ module Git
2
+ class Remote < Path
3
+
4
+ attr_accessor :name, :url, :fetch_opts
5
+
6
+ def initialize(base, name)
7
+ @base = base
8
+ config = @base.lib.config_remote(name)
9
+ @name = name
10
+ @url = config['url']
11
+ @fetch_opts = config['fetch']
12
+ end
13
+
14
+ def fetch(opts={})
15
+ @base.fetch(@name, opts)
16
+ end
17
+
18
+ # merge this remote locally
19
+ def merge(branch = 'master')
20
+ @base.merge("#{@name}/#{branch}")
21
+ end
22
+
23
+ def branch(branch = 'master')
24
+ Git::Branch.new(@base, "#{@name}/#{branch}")
25
+ end
26
+
27
+ def remove
28
+ @base.lib.remote_remove(@name)
29
+ end
30
+
31
+ def to_s
32
+ @name
33
+ end
34
+
35
+ end
36
+ end