Class: Git::Base

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Base

Returns a new instance of Base.



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/git/base.rb', line 54

def initialize(options = {})
  if working_dir = options[:working_directory]
    options[:repository] ||= File.join(working_dir, '.git')
    options[:index] ||= File.join(working_dir, '.git', 'index')
  end
  if options[:log]
    @logger = options[:log]
    @logger.info("Starting Git")
  else
    @logger = nil
  end
 
  @working_directory = options[:working_directory] ? Git::WorkingDirectory.new(options[:working_directory]) : nil
  @repository = options[:repository] ? Git::Repository.new(options[:repository]) : nil 
  @index = options[:index] ? Git::Index.new(options[:index], false) : nil
end

Class Method Details

.bare(git_dir, opts = {}) ⇒ Object

opens a bare Git Repository - no working directory options



6
7
8
# File 'lib/git/base.rb', line 6

def self.bare(git_dir, opts = {})
  self.new({:repository => git_dir}.merge(opts))
end

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

clones a git repository locally

repository - http://repo.or.cz/w/sinatra.git
name - sinatra

options:

:repository

 :bare
or 
 :working_directory
 :index_file


49
50
51
52
# File 'lib/git/base.rb', line 49

def self.clone(repository, name, opts = {})
  # run git-clone 
  self.new(Git::Lib.new.clone(repository, name, opts))
end

.init(working_dir, opts = {}) ⇒ Object

initializes a git repository

options:

:repository
:index_file


22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/git/base.rb', line 22

def self.init(working_dir, opts = {})
  opts = {
    :working_directory => working_dir,
    :repository => File.join(working_dir, '.git')
  }.merge(opts)
  
  FileUtils.mkdir_p(opts[:working_directory]) if opts[:working_directory] && !File.directory?(opts[:working_directory])
  
  # run git_init there
  Git::Lib.new(opts).init
   
  self.new(opts)
end

.open(working_dir, opts = {}) ⇒ Object

opens a new Git Project from a working directory you can specify non-standard git_dir and index file in the options



12
13
14
# File 'lib/git/base.rb', line 12

def self.open(working_dir, opts={})
  self.new({:working_directory => working_dir}.merge(opts))
end

Instance Method Details

#add(path = '.') ⇒ Object

adds files from the working directory to the git repository



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

def add(path = '.')
  self.lib.add(path)
end

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

adds a new remote to this repository url can be a git url or a Git::Base object if it’s a local reference

@git.add_remote('scotts_git', 'git://repo.or.cz/rubygit.git')
@git.fetch('scotts_git')
@git.merge('scotts_git/master')


340
341
342
343
344
# File 'lib/git/base.rb', line 340

def add_remote(name, url, opts = {})
  url = url.repo.path if url.is_a?(Git::Base)
  self.lib.remote_add(name, url, opts)
  Git::Remote.new(self, name)
end

#add_tag(tag_name) ⇒ Object

creates a new git tag (Git::Tag)



357
358
359
360
# File 'lib/git/base.rb', line 357

def add_tag(tag_name)
  self.lib.tag(tag_name)
  tag(tag_name)
end

#apply(file) ⇒ Object



376
377
378
379
380
# File 'lib/git/base.rb', line 376

def apply(file)
  if File.exists?(file)
    self.lib.apply(file)
  end
end

#apply_mail(file) ⇒ Object



382
383
384
# File 'lib/git/base.rb', line 382

def apply_mail(file)
  self.lib.apply_mail(file) if File.exists?(file)
end

#archive(treeish, file = nil, opts = {}) ⇒ Object

creates an archive file of the given tree-ish



363
364
365
# File 'lib/git/base.rb', line 363

def archive(treeish, file = nil, opts = {})
  self.object(treeish).archive(file, opts)
end

#branch(branch_name = 'master') ⇒ Object

returns a Git::Branch object for branch_name



184
185
186
# File 'lib/git/base.rb', line 184

def branch(branch_name = 'master')
  Git::Branch.new(self, branch_name)
end

#branchesObject

returns a Git::Branches object of all the Git::Branch objects for this repo



179
180
181
# File 'lib/git/base.rb', line 179

def branches
  Git::Branches.new(self)
end

#cat_file(objectish) ⇒ Object



467
468
469
# File 'lib/git/base.rb', line 467

def cat_file(objectish)
  self.lib.object_contents(objectish)
end

#chdirObject

changes current working directory for a block to the git working directory

example

@git.chdir do 
  # write files
  @git.add
  @git.commit('message')
end


110
111
112
113
114
# File 'lib/git/base.rb', line 110

def chdir # :yields: the Git::Path
  Dir.chdir(dir.path) do
    yield dir.path
  end
end

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

checks out a branch as the new git working directory



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

def checkout(branch = 'master', opts = {})
  self.lib.checkout(branch, opts)
end

#checkout_file(version, file) ⇒ Object

checks out an old version of a file



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

def checkout_file(version, file)
  self.lib.checkout_file(version,file)
end

#checkout_index(opts = {}) ⇒ Object



403
404
405
# File 'lib/git/base.rb', line 403

def checkout_index(opts = {})
  self.lib.checkout_index(opts)
end

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

commits all pending changes in the index file to the git repository

options:

:add_all
:allow_empty
:author


273
274
275
# File 'lib/git/base.rb', line 273

def commit(message, opts = {})
  self.lib.commit(message, opts)
end

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

commits all pending changes in the index file to the git repository, but automatically adds all modified files without having to explicitly calling @git.add() on them.



280
281
282
283
# File 'lib/git/base.rb', line 280

def commit_all(message, opts = {})
  opts = {:add_all => true}.merge(opts)
  self.lib.commit(message, opts)
end

#commit_tree(tree = nil, opts = {}) ⇒ Object



415
416
417
# File 'lib/git/base.rb', line 415

def commit_tree(tree = nil, opts = {})
  Git::Object::Commit.new(self, self.lib.commit_tree(tree, opts))
end

#config(name = nil, value = nil) ⇒ Object

g.config(‘user.name’, ‘Scott Chacon’) # sets value g.config(‘user.email’, ‘[email protected]’) # sets value g.config(‘user.name’) # returns ‘Scott Chacon’ g.config # returns whole config hash



129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/git/base.rb', line 129

def config(name = nil, value = nil)
  if(name && value)
    # set value
    lib.config_set(name, value)
  elsif (name)
    # return value
    lib.config_get(name)
  else
    # return hash
    lib.config_list
  end
end

#current_branchObject

returns the name of the branch the working directory is currently on



472
473
474
# File 'lib/git/base.rb', line 472

def current_branch
  self.lib.branch_current
end

#diff(objectish = 'HEAD', obj2 = nil) ⇒ Object

returns a Git::Diff object



242
243
244
# File 'lib/git/base.rb', line 242

def diff(objectish = 'HEAD', obj2 = nil)
  Git::Diff.new(self, objectish, obj2)
end

#dirObject

returns a reference to the working directory

@git.dir.path
@git.dir.writeable?


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

def dir
  @working_directory
end

#each_conflict(&block) ⇒ Object

iterates over the files which are unmerged



318
319
320
# File 'lib/git/base.rb', line 318

def each_conflict(&block) # :yields: file, your_version, their_version
  self.lib.conflicts(&block)
end

#fetch(remote = 'origin') ⇒ Object

fetches changes from a remote branch - this does not modify the working directory, it just gets the changes from the remote if there are any



297
298
299
# File 'lib/git/base.rb', line 297

def fetch(remote = 'origin')
  self.lib.fetch(remote)
end

#gblob(objectish) ⇒ Object



164
165
166
# File 'lib/git/base.rb', line 164

def gblob(objectish)
  Git::Object.new(self, objectish, 'blob')
end

#gcObject



372
373
374
# File 'lib/git/base.rb', line 372

def gc
  self.lib.gc
end

#gcommit(objectish) ⇒ Object



160
161
162
# File 'lib/git/base.rb', line 160

def gcommit(objectish)
  Git::Object.new(self, objectish, 'commit')
end

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

will run a grep for ‘string’ on the HEAD of the git repository

to be more surgical in your grep, you can call grep() off a specific git object. for example:

@git.object("v2.3").grep('TODO')

in any case, it returns a hash of arrays of the type:

hsh[tree-ish] = [[line_no, match], [line_no, match2]]
hsh[tree-ish] = [[line_no, match], [line_no, match2]]

so you might use it like this:

@git.grep("TODO").each do |sha, arr|
  puts "in blob #{sha}:"
  arr.each do |match|
    puts "\t line #{match[0]}: '#{match[1]}'"
  end
end


237
238
239
# File 'lib/git/base.rb', line 237

def grep(string, path_limiter = nil, opts = {})
  self.object('HEAD').grep(string, path_limiter, opts)
end

#gtree(objectish) ⇒ Object



156
157
158
# File 'lib/git/base.rb', line 156

def gtree(objectish)
  Git::Object.new(self, objectish, 'tree')
end

#indexObject

returns reference to the git index file



86
87
88
# File 'lib/git/base.rb', line 86

def index
  @index
end

#is_branch?(branch) ⇒ Boolean

returns true if the branch exists

Returns:

  • (Boolean)


201
202
203
204
# File 'lib/git/base.rb', line 201

def is_branch?(branch)
  branch_names = self.branches.map {|b| b.name}
  branch_names.include?(branch)
end

#is_local_branch?(branch) ⇒ Boolean

returns true if the branch exists locally

Returns:

  • (Boolean)


189
190
191
192
# File 'lib/git/base.rb', line 189

def is_local_branch?(branch)
  branch_names = self.branches.local.map {|b| b.name}
  branch_names.include?(branch)
end

#is_remote_branch?(branch) ⇒ Boolean

returns true if the branch exists remotely

Returns:

  • (Boolean)


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

def is_remote_branch?(branch)
  branch_names = self.branches.local.map {|b| b.name}
  branch_names.include?(branch)
end

#libObject

this is a convenience method for accessing the class that wraps all the actual ‘git’ forked system calls. At some point I hope to replace the Git::Lib class with one that uses native methods or libgit C bindings



214
215
216
# File 'lib/git/base.rb', line 214

def lib
  @lib ||= Git::Lib.new(self, @logger)
end

#log(count = 30) ⇒ Object

returns a Git::Log object with count commits



169
170
171
# File 'lib/git/base.rb', line 169

def log(count = 30)
  Git::Log.new(self, count)
end

#ls_files(location = nil) ⇒ Object



429
430
431
# File 'lib/git/base.rb', line 429

def ls_files(location=nil)
  self.lib.ls_files(location)
end

#ls_tree(objectish) ⇒ Object



463
464
465
# File 'lib/git/base.rb', line 463

def ls_tree(objectish)
  self.lib.ls_tree(objectish)
end

#merge(branch, message = 'merge') ⇒ Object

merges one or more branches into the current working branch

you can specify more than one branch to merge by passing an array of branches



313
314
315
# File 'lib/git/base.rb', line 313

def merge(branch, message = 'merge')
  self.lib.merge(branch, message)
end

#object(objectish) ⇒ Object

returns a Git::Object of the appropriate type you can also call @git.gtree(‘tree’), but that’s just for readability. If you call @git.gtree(‘HEAD’) it will still return a Git::Object::Commit object.

on the objectish and determine the type of the object and return an appropriate object for that type



152
153
154
# File 'lib/git/base.rb', line 152

def object(objectish)
  Git::Object.new(self, objectish)
end

#pull(remote = 'origin', branch = 'master', message = 'origin pull') ⇒ Object

fetches a branch from a remote and merges it into the current working branch



323
324
325
326
# File 'lib/git/base.rb', line 323

def pull(remote = 'origin', branch = 'master', message = 'origin pull')
  fetch(remote)
  merge(branch, message)
end

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

pushes changes to a remote repository - easiest if this is a cloned repository, otherwise you may have to run something like this first to setup the push parameters:

@git.config('remote.remote-name.push', 'refs/heads/master:refs/heads/master')


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

def push(remote = 'origin', branch = 'master', tags = false)
  self.lib.push(remote, branch, tags)
end

#read_tree(treeish, opts = {}) ⇒ Object



407
408
409
# File 'lib/git/base.rb', line 407

def read_tree(treeish, opts = {})
  self.lib.read_tree(treeish, opts)
end

#remote(remote_name = 'origin') ⇒ Object

returns a Git::Remote object



207
208
209
# File 'lib/git/base.rb', line 207

def remote(remote_name = 'origin')
  Git::Remote.new(self, remote_name)
end

#remotesObject

returns an array of Git:Remote objects



329
330
331
# File 'lib/git/base.rb', line 329

def remotes
  self.lib.remotes.map { |r| Git::Remote.new(self, r) }
end

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

removes file(s) from the git repository



252
253
254
# File 'lib/git/base.rb', line 252

def remove(path = '.', opts = {})
  self.lib.remove(path, opts)
end

#repackObject

repacks the repository



368
369
370
# File 'lib/git/base.rb', line 368

def repack
  self.lib.repack
end

#repoObject

returns reference to the git repository directory

@git.dir.path


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

def repo
  @repository
end

#repo_sizeObject

returns the repository size in bytes



117
118
119
120
121
122
123
# File 'lib/git/base.rb', line 117

def repo_size
  size = 0
  Dir.chdir(repo.path) do
    (size, dot) = `du -s`.chomp.split
  end
  size.to_i
end

#reset(commitish = nil, opts = {}) ⇒ Object

resets the working directory to the provided commitish



257
258
259
# File 'lib/git/base.rb', line 257

def reset(commitish = nil, opts = {})
  self.lib.reset(commitish, opts)
end

#reset_hard(commitish = nil, opts = {}) ⇒ Object

resets the working directory to the commitish with ‘–hard’



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

def reset_hard(commitish = nil, opts = {})
  opts = {:hard => true}.merge(opts)
  self.lib.reset(commitish, opts)
end

#revparse(objectish) ⇒ Object

runs git rev-parse to convert the objectish to a full sha

@git.revparse("HEAD^^")
@git.revparse('v2.4^{tree}')
@git.revparse('v2.4:/doc/index.html')


459
460
461
# File 'lib/git/base.rb', line 459

def revparse(objectish)
  self.lib.revparse(objectish)
end

#set_index(index_file, check = true) ⇒ Object



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

def set_index(index_file, check = true)
  @lib = nil
  @index = Git::Index.new(index_file.to_s, check)
end

#set_working(work_dir, check = true) ⇒ Object



91
92
93
94
# File 'lib/git/base.rb', line 91

def set_working(work_dir, check = true)
  @lib = nil
  @working_directory = Git::WorkingDirectory.new(work_dir.to_s, check)
end

#statusObject

returns a Git::Status object



174
175
176
# File 'lib/git/base.rb', line 174

def status
  Git::Status.new(self)
end

#tag(tag_name) ⇒ Object

returns a Git::Tag object



352
353
354
# File 'lib/git/base.rb', line 352

def tag(tag_name)
  Git::Object.new(self, tag_name, 'tag', true)
end

#tagsObject

returns an array of all Git::Tag objects for this repository



347
348
349
# File 'lib/git/base.rb', line 347

def tags
  self.lib.tags.map { |r| tag(r) }
end

#update_ref(branch, commit) ⇒ Object



424
425
426
# File 'lib/git/base.rb', line 424

def update_ref(branch, commit)
  branch(branch).update_ref(commit)
end

#with_index(new_index) ⇒ Object

LOWER LEVEL INDEX OPERATIONS ##



388
389
390
391
392
393
394
# File 'lib/git/base.rb', line 388

def with_index(new_index) # :yields: new_index
  old_index = @index
  set_index(new_index, false)
  return_value = yield @index
  set_index(old_index)
  return_value
end

#with_temp_index(&blk) ⇒ Object



396
397
398
399
400
401
# File 'lib/git/base.rb', line 396

def with_temp_index &blk
  tempfile = Tempfile.new('temp-index')
  temp_path = tempfile.path
  tempfile.unlink
  with_index(temp_path, &blk)
end

#with_temp_working(&blk) ⇒ Object



444
445
446
447
448
449
450
# File 'lib/git/base.rb', line 444

def with_temp_working &blk
  tempfile = Tempfile.new("temp-workdir")
  temp_dir = tempfile.path
  tempfile.unlink
  Dir.mkdir(temp_dir, 0700)
  with_working(temp_dir, &blk)
end

#with_working(work_dir) ⇒ Object

:yields: the Git::WorkingDirectory



433
434
435
436
437
438
439
440
441
442
# File 'lib/git/base.rb', line 433

def with_working(work_dir) # :yields: the Git::WorkingDirectory
  return_value = false
  old_working = @working_directory
  set_working(work_dir) 
  Dir.chdir work_dir do
    return_value = yield @working_directory
  end
  set_working(old_working)
  return_value
end

#write_and_commit_tree(opts = {}) ⇒ Object



419
420
421
422
# File 'lib/git/base.rb', line 419

def write_and_commit_tree(opts = {})
  tree = write_tree
  commit_tree(tree, opts)
end

#write_treeObject



411
412
413
# File 'lib/git/base.rb', line 411

def write_tree
  self.lib.write_tree
end