p-mongo-git 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/git/log.rb ADDED
@@ -0,0 +1,135 @@
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
+ @cherry = nil
22
+ end
23
+
24
+ def object(objectish)
25
+ dirty_log
26
+ @object = objectish
27
+ return self
28
+ end
29
+
30
+ def author(regex)
31
+ dirty_log
32
+ @author = regex
33
+ return self
34
+ end
35
+
36
+ def grep(regex)
37
+ dirty_log
38
+ @grep = regex
39
+ return self
40
+ end
41
+
42
+ def path(path)
43
+ dirty_log
44
+ @path = path
45
+ return self
46
+ end
47
+
48
+ def skip(num)
49
+ dirty_log
50
+ @skip = num
51
+ return self
52
+ end
53
+
54
+ def since(date)
55
+ dirty_log
56
+ @since = date
57
+ return self
58
+ end
59
+
60
+ def until(date)
61
+ dirty_log
62
+ @until = date
63
+ return self
64
+ end
65
+
66
+ def between(sha1, sha2 = nil)
67
+ dirty_log
68
+ @between = [sha1, sha2]
69
+ return self
70
+ end
71
+
72
+ def cherry
73
+ dirty_log
74
+ @cherry = true
75
+ return self
76
+ end
77
+
78
+ def to_s
79
+ self.map { |c| c.to_s }.join("\n")
80
+ end
81
+
82
+
83
+ # forces git log to run
84
+
85
+ def size
86
+ check_log
87
+ @commits.size rescue nil
88
+ end
89
+
90
+ def each(&block)
91
+ check_log
92
+ @commits.each(&block)
93
+ end
94
+
95
+ def first
96
+ check_log
97
+ @commits.first rescue nil
98
+ end
99
+
100
+ def last
101
+ check_log
102
+ @commits.last rescue nil
103
+ end
104
+
105
+ def [](index)
106
+ check_log
107
+ @commits[index] rescue nil
108
+ end
109
+
110
+
111
+ private
112
+
113
+ def dirty_log
114
+ @dirty_flag = true
115
+ end
116
+
117
+ def check_log
118
+ if @dirty_flag
119
+ run_log
120
+ @dirty_flag = false
121
+ end
122
+ end
123
+
124
+ # actually run the 'git log' command
125
+ def run_log
126
+ log = @base.lib.full_log_commits(:count => @count, :object => @object,
127
+ :path_limiter => @path, :since => @since,
128
+ :author => @author, :grep => @grep, :skip => @skip,
129
+ :until => @until, :between => @between, :cherry => @cherry)
130
+ @commits = log.map { |c| Git::Object::Commit.new(@base, c['sha'], c) }
131
+ end
132
+
133
+ end
134
+
135
+ end
data/lib/git/object.rb ADDED
@@ -0,0 +1,312 @@
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
+ @sha ||= data['sha']
221
+ @committer = Git::Author.new(data['committer'])
222
+ @author = Git::Author.new(data['author'])
223
+ @tree = Git::Object::Tree.new(@base, data['tree'])
224
+ @parents = data['parent'].map{ |sha| Git::Object::Commit.new(@base, sha) }
225
+ @message = data['message'].chomp
226
+ end
227
+
228
+ def commit?
229
+ true
230
+ end
231
+
232
+ private
233
+
234
+ # see if this object has been initialized and do so if not
235
+ def check_commit
236
+ return if @tree
237
+
238
+ data = @base.lib.commit_data(@objectish)
239
+ set_commit(data)
240
+ end
241
+
242
+ end
243
+
244
+ class Tag < AbstractObject
245
+ attr_accessor :name
246
+
247
+ def initialize(base, sha, name)
248
+ super(base, sha)
249
+ @name = name
250
+ @annotated = nil
251
+ @loaded = false
252
+ end
253
+
254
+ def annotated?
255
+ @annotated ||= (@base.lib.object_type(self.name) == 'tag')
256
+ end
257
+
258
+ def message
259
+ check_tag()
260
+ return @message
261
+ end
262
+
263
+ def tag?
264
+ true
265
+ end
266
+
267
+ def tagger
268
+ check_tag()
269
+ return @tagger
270
+ end
271
+
272
+ private
273
+
274
+ def check_tag
275
+ return if @loaded
276
+
277
+ if !self.annotated?
278
+ @message = @tagger = nil
279
+ else
280
+ tdata = @base.lib.tag_data(@name)
281
+ @message = tdata['message'].chomp
282
+ @tagger = Git::Author.new(tdata['tagger'])
283
+ end
284
+
285
+ @loaded = true
286
+ end
287
+
288
+ end
289
+
290
+ # if we're calling this, we don't know what type it is yet
291
+ # so this is our little factory method
292
+ def self.new(base, objectish, type = nil, is_tag = false)
293
+ if is_tag
294
+ sha = base.lib.tag_sha(objectish)
295
+ if sha == ''
296
+ raise Git::GitTagNameDoesNotExist.new(objectish)
297
+ end
298
+ return Git::Object::Tag.new(base, sha, objectish)
299
+ end
300
+
301
+ type ||= base.lib.object_type(objectish)
302
+ klass =
303
+ case type
304
+ when /blob/ then Blob
305
+ when /commit/ then Commit
306
+ when /tree/ then Tree
307
+ end
308
+ klass.new(base, objectish)
309
+ end
310
+
311
+ end
312
+ end
data/lib/git/path.rb ADDED
@@ -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