Class: Git::Lib

Inherits:
Object
  • Object
show all
Defined in:
lib/git/lib.rb

Instance Method Summary collapse

Constructor Details

#initialize(base = nil) ⇒ Lib

Returns a new instance of Lib.



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/git/lib.rb', line 13

def initialize(base = nil)
  if base.is_a?(Git::Base)
    @git_dir = base.repo.path
    @git_index_file = base.index.path   
    @git_work_dir = base.dir.path
  elsif base.is_a?(Hash)
    @git_dir = base[:repository]
    @git_index_file = base[:index] 
    @git_work_dir = base[:working_directory]
  end
end

Instance Method Details

#add(path = '.') ⇒ Object



215
216
217
218
# File 'lib/git/lib.rb', line 215

def add(path = '.')
  path = path.join(' ') if path.is_a?(Array)
  command('add', path)
end

#branch_currentObject



96
97
98
# File 'lib/git/lib.rb', line 96

def branch_current
  branches_all.select { |b| b[1] }.first[0] rescue nil
end

#branch_delete(branch) ⇒ Object



248
249
250
# File 'lib/git/lib.rb', line 248

def branch_delete(branch)
  command('branch', ['-d', branch])
end

#branch_new(branch) ⇒ Object



244
245
246
# File 'lib/git/lib.rb', line 244

def branch_new(branch)
  command('branch', branch)
end

#branches_allObject



86
87
88
89
90
91
92
93
94
# File 'lib/git/lib.rb', line 86

def branches_all
  arr = []
  command_lines('branch', '-a').each do |b| 
    current = false
    current = true if b[0, 2] == '* '
    arr << [b.gsub('* ', '').strip, current]
  end
  arr
end

#checkout(branch, opts = {}) ⇒ Object



252
253
254
255
256
257
258
# File 'lib/git/lib.rb', line 252

def checkout(branch, opts = {})
  arr_opts = []
  arr_opts << '-f' if opts[:force]
  arr_opts << branch.to_s
  
  command('checkout', arr_opts)
end

#clone(repository, name, opts = {}) ⇒ Object

tries to clone the given repo

returns :repository (if bare)

{:working_directory} otherwise

accepts options:

:remote - name of remote (rather than 'origin')
:bare   - no working directory

TODO - make this work with SSH password or auth_key



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/git/lib.rb', line 40

def clone(repository, name, opts = {})
  @path = opts[:path] || '.'
  opts[:path] ? clone_dir = File.join(@path, name) : clone_dir = name
  
  arr_opts = []
  arr_opts << "--bare" if opts[:bare]
  arr_opts << "-o #{opts[:remote]}" if opts[:remote]
  arr_opts << repository
  arr_opts << clone_dir
  
  command('clone', arr_opts)
  
  opts[:bare] ? {:repository => clone_dir} : {:working_directory => clone_dir}
end

#commit(message, opts = {}) ⇒ Object



230
231
232
233
234
# File 'lib/git/lib.rb', line 230

def commit(message, opts = {})
  arr_opts = ["-m '#{message}'"]
  arr_opts << '-a' if opts[:add_all]
  command('commit', arr_opts)
end

#config_get(name) ⇒ Object



196
197
198
# File 'lib/git/lib.rb', line 196

def config_get(name)
  command('config', ['--get', name])
end

#config_listObject



200
201
202
203
204
205
206
207
# File 'lib/git/lib.rb', line 200

def config_list
  hsh = {}
  command_lines('config', ['--list']).each do |line|
    (key, value) = line.split('=')
    hsh[key] = value
  end
  hsh
end

#config_remote(name) ⇒ Object



187
188
189
190
191
192
193
194
# File 'lib/git/lib.rb', line 187

def config_remote(name)
  hsh = {}
  command_lines('config', ['--get-regexp', "remote.#{name}"]).each do |line|
    (key, value) = line.split
    hsh[key.gsub("remote.#{name}.", '')] = value
  end
  hsh
end

#config_set(name, value) ⇒ Object

WRITE COMMANDS ##



211
212
213
# File 'lib/git/lib.rb', line 211

def config_set(name, value)
  command('config', [name, "'#{value}'"])
end

#diff_filesObject

compares the index and the working directory



153
154
155
156
157
158
159
160
161
162
# File 'lib/git/lib.rb', line 153

def diff_files
  hsh = {}
  command_lines('diff-files').each do |line|
    (info, file) = line.split("\t")
    (mode_src, mode_dest, sha_src, sha_dest, type) = info.split
    hsh[file] = {:path => file, :mode_file => mode_src.to_s[1, 7], :mode_index => mode_dest, 
                  :sha_file => sha_src, :sha_index => sha_dest, :type => type}
  end
  hsh
end

#diff_full(obj1 = 'HEAD', obj2 = nil, opts = {}) ⇒ Object



123
124
125
126
127
128
129
130
# File 'lib/git/lib.rb', line 123

def diff_full(obj1 = 'HEAD', obj2 = nil, opts = {})
  diff_opts = ['-p']
  diff_opts << obj1
  diff_opts << obj2 if obj2.is_a?(String)
  diff_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
  
  command('diff', diff_opts)
end

#diff_index(treeish) ⇒ Object

compares the index and the repository



165
166
167
168
169
170
171
172
173
174
# File 'lib/git/lib.rb', line 165

def diff_index(treeish)
  hsh = {}
  command_lines('diff-index', treeish).each do |line|
    (info, file) = line.split("\t")
    (mode_src, mode_dest, sha_src, sha_dest, type) = info.split
    hsh[file] = {:path => file, :mode_repo => mode_src.to_s[1, 7], :mode_index => mode_dest, 
                  :sha_repo => sha_src, :sha_index => sha_dest, :type => type}
  end
  hsh
end

#diff_stats(obj1 = 'HEAD', obj2 = nil, opts = {}) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/git/lib.rb', line 132

def diff_stats(obj1 = 'HEAD', obj2 = nil, opts = {})
  diff_opts = ['--numstat']
  diff_opts << obj1
  diff_opts << obj2 if obj2.is_a?(String)
  diff_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
  
  hsh = {:total => {:insertions => 0, :deletions => 0, :lines => 0, :files => 0}, :files => {}}
  
  command_lines('diff', diff_opts).each do |file|
    (insertions, deletions, filename) = file.split("\t")
    hsh[:total][:insertions] += insertions.to_i
    hsh[:total][:deletions] += deletions.to_i
    hsh[:total][:lines] = (hsh[:total][:deletions] + hsh[:total][:insertions])
    hsh[:total][:files] += 1
    hsh[:files][filename] = {:insertions => insertions.to_i, :deletions => deletions.to_i}
  end
        
  hsh
end

#fetch(remote) ⇒ Object



295
296
297
# File 'lib/git/lib.rb', line 295

def fetch(remote)
  command('fetch', remote.to_s)
end

#grep(string, opts = {}) ⇒ Object

returns hash

tree-ish

[[line_no, match], [line_no, match2]]

tree-ish

[[line_no, match], [line_no, match2]]



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/git/lib.rb', line 104

def grep(string, opts = {})
  opts[:object] = 'HEAD' if !opts[:object]

  grep_opts = ['-n']
  grep_opts << '-i' if opts[:ignore_case]
  grep_opts << '-v' if opts[:invert_match]
  grep_opts << "-e '#{string}'"
  grep_opts << opts[:object] if opts[:object].is_a?(String)
  grep_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
  hsh = {}
  command_lines('grep', grep_opts).each do |line|
    if m = /(.*)\:(\d+)\:(.*)/.match(line)        
      hsh[m[1]] ||= []
      hsh[m[1]] << [m[2].to_i, m[3]] 
    end
  end
  hsh
end

#initObject



25
26
27
# File 'lib/git/lib.rb', line 25

def init
  command('init')
end

#log_commits(opts = {}) ⇒ Object



59
60
61
62
63
64
65
66
67
68
# File 'lib/git/lib.rb', line 59

def log_commits(opts = {})
  arr_opts = ['--pretty=oneline']
  arr_opts << "-#{opts[:count]}" if opts[:count]
  arr_opts << "--since=\"#{opts[:since]}\"" if opts[:since].is_a? String
  arr_opts << "#{opts[:between][0]}..#{opts[:between][1].to_s}" if (opts[:between] && opts[:between].size == 2)
  arr_opts << opts[:object] if opts[:object].is_a? String
  arr_opts << '-- ' + opts[:path_limiter] if opts[:path_limiter].is_a? String
  
  command_lines('log', arr_opts).map { |l| l.split.first }
end

#ls_filesObject



176
177
178
179
180
181
182
183
184
# File 'lib/git/lib.rb', line 176

def ls_files
  hsh = {}
  command_lines('ls-files', '--stage').each do |line|
    (info, file) = line.split("\t")
    (mode, sha, stage) = info.split
    hsh[file] = {:path => file, :mode_index => mode, :sha_index => sha, :stage => stage}
  end
  hsh
end

#merge(branch, message = nil) ⇒ Object



260
261
262
263
264
265
# File 'lib/git/lib.rb', line 260

def merge(branch, message = nil)      
  arr_opts = []
  arr_opts << ["-m '#{message}'"] if message
  arr_opts << branch.to_a.join(' ')
  command('merge', arr_opts)
end

#object_contents(sha) ⇒ Object



82
83
84
# File 'lib/git/lib.rb', line 82

def object_contents(sha)
  command('cat-file', ['-p', sha])
end

#object_size(sha) ⇒ Object



78
79
80
# File 'lib/git/lib.rb', line 78

def object_size(sha)
  command('cat-file', ['-s', sha]).to_i
end

#object_type(sha) ⇒ Object



74
75
76
# File 'lib/git/lib.rb', line 74

def object_type(sha)
  command('cat-file', ['-t', sha])
end

#push(remote, branch = 'master') ⇒ Object



299
300
301
# File 'lib/git/lib.rb', line 299

def push(remote, branch = 'master')
  command('push', [remote.to_s, branch.to_s])
end

#remote_add(name, url, opts = {}) ⇒ Object



267
268
269
270
271
272
273
274
# File 'lib/git/lib.rb', line 267

def remote_add(name, url, opts = {})
  arr_opts = ['add']
  arr_opts << '-f' if opts[:with_fetch]
  arr_opts << name
  arr_opts << url
  
  command('remote', arr_opts)
end

#remote_remove(name) ⇒ Object

this is documented as such, but seems broken for some reason i’ll try to get around it some other way later



278
279
280
# File 'lib/git/lib.rb', line 278

def remote_remove(name)
  command('remote', ['rm', name])
end

#remotesObject



282
283
284
# File 'lib/git/lib.rb', line 282

def remotes
  command_lines('remote')
end

#remove(path = '.', opts = {}) ⇒ Object



220
221
222
223
224
225
226
227
228
# File 'lib/git/lib.rb', line 220

def remove(path = '.', opts = {})
  path = path.join(' ') if path.is_a?(Array)

  arr_opts = ['-f']  # overrides the up-to-date check by default
  arr_opts << ['-r'] if opts[:recursive]
  arr_opts << path

  command('rm', arr_opts)
end

#repackObject



307
308
309
# File 'lib/git/lib.rb', line 307

def repack
  command('repack', ['-a', '-d'])
end

#reset(commit, opts = {}) ⇒ Object



236
237
238
239
240
241
# File 'lib/git/lib.rb', line 236

def reset(commit, opts = {})
  arr_opts = []
  arr_opts << '--hard' if opts[:hard]
  arr_opts << commit.to_s if commit
  command('reset', arr_opts)
end

#revparse(string) ⇒ Object



70
71
72
# File 'lib/git/lib.rb', line 70

def revparse(string)
  command('rev-parse', string)
end

#tag(tag) ⇒ Object



290
291
292
# File 'lib/git/lib.rb', line 290

def tag(tag)
  command('tag', tag)
end

#tag_sha(tag_name) ⇒ Object



303
304
305
# File 'lib/git/lib.rb', line 303

def tag_sha(tag_name)
  command('show-ref',  ['--tags', '-s', tag_name])
end

#tagsObject



286
287
288
# File 'lib/git/lib.rb', line 286

def tags
  command_lines('tag')
end