p-mongo-git 1.8.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/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