Class: Git::Base
- Inherits:
-
Object
- Object
- Git::Base
- Includes:
- Factory
- Defined in:
- lib/git/base.rb,
lib/git/base/factory.rb
Defined Under Namespace
Modules: Factory
Class Method Summary collapse
-
.bare(git_dir, opts = {}) ⇒ Object
opens a bare Git Repository - no working directory options.
-
.clone(repository, name, opts = {}) ⇒ Object
clones a git repository locally.
-
.config ⇒ Git::Config
Returns (and initialize if needed) a Git::Config instance.
-
.init(working_dir, opts = {}) ⇒ Object
initializes a git repository.
-
.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.
Instance Method Summary collapse
-
#add(*args) ⇒ Object
updates the repository index using the working directory content.
-
#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.
-
#add_tag(name, *opts) ⇒ Object
Creates a new git tag (Git::Tag) Usage: repo.add_tag(‘tag_name’, object_reference) repo.add_tag(‘tag_name’, object_reference, => ‘here’) repo.add_tag(‘tag_name’, => ‘here’).
- #apply(file) ⇒ Object
- #apply_mail(file) ⇒ Object
-
#archive(treeish, file = nil, opts = {}) ⇒ Object
creates an archive file of the given tree-ish.
- #cat_file(objectish) ⇒ Object
-
#chdir ⇒ Object
changes current working directory for a block to the git working directory.
-
#checkout(branch = 'master', opts = {}) ⇒ Object
checks out a branch as the new git working directory.
-
#checkout_file(version, file) ⇒ Object
checks out an old version of a file.
- #checkout_index(opts = {}) ⇒ Object
-
#clean(opts = {}) ⇒ Object
cleans the working directory.
-
#commit(message, opts = {}) ⇒ Object
commits all pending changes in the index file to the git repository.
-
#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.
-
#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.
-
#current_branch ⇒ Object
returns the name of the branch the working directory is currently on.
-
#delete_tag(name) ⇒ Object
deletes a tag.
-
#describe(committish = nil, opts = {}) ⇒ Object
returns the most recent tag that is reachable from a commit.
-
#dir ⇒ Object
returns a reference to the working directory @git.dir.path @git.dir.writeable?.
-
#each_conflict(&block) ⇒ Object
iterates over the files which are unmerged.
-
#fetch(remote = 'origin', opts = {}) ⇒ 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.
- #gc ⇒ Object
-
#grep(string, path_limiter = nil, opts = {}) ⇒ Object
will run a grep for ‘string’ on the HEAD of the git repository.
-
#index ⇒ Object
returns reference to the git index file.
-
#initialize(options = {}) ⇒ Base
constructor
A new instance of Base.
-
#is_branch?(branch) ⇒ Boolean
returns
true
if the branch exists. -
#is_local_branch?(branch) ⇒ Boolean
returns
true
if the branch exists locally. -
#is_remote_branch?(branch) ⇒ Boolean
returns
true
if the branch exists remotely. -
#lib ⇒ Object
this is a convenience method for accessing the class that wraps all the actual ‘git’ forked system calls.
- #ls_files(location = nil) ⇒ Object
- #ls_tree(objectish) ⇒ Object
-
#merge(branch, message = 'merge') ⇒ Object
merges one or more branches into the current working branch.
-
#pull(remote = 'origin', branch = 'master') ⇒ Object
pulls the given branch from the given remote into the current branch.
-
#push(remote = 'origin', branch = 'master', opts = {}) ⇒ 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:.
- #read_tree(treeish, opts = {}) ⇒ Object
-
#remotes ⇒ Object
returns an array of Git:Remote objects.
-
#remove(path = '.', opts = {}) ⇒ Object
removes file(s) from the git repository.
-
#remove_remote(name) ⇒ Object
removes a remote from this repository.
-
#repack ⇒ Object
repacks the repository.
-
#repo ⇒ Object
returns reference to the git repository directory @git.dir.path.
-
#repo_size ⇒ Object
returns the repository size in bytes.
-
#reset(commitish = nil, opts = {}) ⇒ Object
resets the working directory to the provided commitish.
-
#reset_hard(commitish = nil, opts = {}) ⇒ Object
resets the working directory to the commitish with ‘–hard’.
-
#revert(commitish = nil, opts = {}) ⇒ Object
reverts the working directory to the provided commitish.
-
#revparse(objectish) ⇒ Object
runs git rev-parse to convert the objectish to a full sha.
- #set_index(index_file, check = true) ⇒ Object
- #set_working(work_dir, check = true) ⇒ Object
-
#show(objectish = nil, path = nil) ⇒ String
Shows objects.
-
#tags ⇒ Object
returns an array of all Git::Tag objects for this repository.
- #update_ref(branch, commit) ⇒ Object
-
#with_index(new_index) ⇒ Object
LOWER LEVEL INDEX OPERATIONS ##.
- #with_temp_index(&blk) ⇒ Object
- #with_temp_working(&blk) ⇒ Object
-
#with_working(work_dir) ⇒ Object
:yields: the Git::WorkingDirectory.
- #write_and_commit_tree(opts = {}) ⇒ Object
- #write_tree ⇒ Object
Methods included from Factory
#branch, #branches, #commit_tree, #diff, #gblob, #gcommit, #gtree, #log, #object, #remote, #status, #tag
Constructor Details
#initialize(options = {}) ⇒ Base
Returns a new instance of Base.
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/git/base.rb', line 78 def initialize( = {}) if working_dir = [:working_directory] [:repository] ||= File.join(working_dir, '.git') [:index] ||= File.join(working_dir, '.git', 'index') end if [:log] @logger = [:log] @logger.info("Starting Git") else @logger = nil end @working_directory = [:working_directory] ? Git::WorkingDirectory.new([:working_directory]) : nil @repository = [:repository] ? Git::Repository.new([:repository]) : nil @index = [:index] ? Git::Index.new([:index], false) : nil end |
Class Method Details
.bare(git_dir, opts = {}) ⇒ Object
opens a bare Git Repository - no working directory options
10 11 12 |
# File 'lib/git/base.rb', line 10 def self.(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
27 28 29 30 |
# File 'lib/git/base.rb', line 27 def self.clone(repository, name, opts = {}) # run git-clone self.new(Git::Lib.new.clone(repository, name, opts)) end |
.config ⇒ Git::Config
Returns (and initialize if needed) a Git::Config instance
35 36 37 |
# File 'lib/git/base.rb', line 35 def self.config return @@config ||= Config.new end |
.init(working_dir, opts = {}) ⇒ Object
initializes a git repository
options:
:bare
:index
:repository
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/git/base.rb', line 46 def self.init(working_dir, opts = {}) opts[:working_directory] ||= working_dir opts[:repository] ||= File.join(opts[:working_directory], '.git') FileUtils.mkdir_p(opts[:working_directory]) if opts[:working_directory] && !File.directory?(opts[:working_directory]) init_opts = { :bare => opts[:bare] } opts.delete(:working_directory) if opts[:bare] # Submodules have a .git *file* not a .git folder. # This file's contents point to the location of # where the git refs are held (In the parent repo) if File.file?('.git') git_file = File.open('.git').read[8..-1].strip opts[:repository] = git_file opts[:index] = git_file + '/index' end Git::Lib.new(opts).init(init_opts) 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
74 75 76 |
# File 'lib/git/base.rb', line 74 def self.open(working_dir, opts={}) self.new({:working_directory => working_dir}.merge(opts)) end |
Instance Method Details
#add(*args) ⇒ Object
updates the repository index using the working directory content
@git.add('path/to/file')
@git.add(['path/to/file1','path/to/file2'])
@git.add(:all => true)
options:
:all => true
221 222 223 224 225 226 227 |
# File 'lib/git/base.rb', line 221 def add(*args) if args[0].instance_of?(String) || args[0].instance_of?(Array) self.lib.add(args[0],args[1]||{}) else self.lib.add('.', args[0]||{}) end 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')
Options:
:fetch => true
:track => <branch_name>
369 370 371 372 373 |
# File 'lib/git/base.rb', line 369 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(name, *opts) ⇒ Object
Creates a new git tag (Git::Tag) Usage:
repo.add_tag('tag_name', object_reference)
repo.add_tag('tag_name', object_reference, {:options => 'here'})
repo.add_tag('tag_name', {:options => 'here'})
Options:
:a | :annotate -> true
:d -> true
:f -> true
:m | :message -> String
:s -> true
400 401 402 403 |
# File 'lib/git/base.rb', line 400 def add_tag(name, *opts) self.lib.tag(name, *opts) self.tag(name) end |
#apply(file) ⇒ Object
424 425 426 427 428 |
# File 'lib/git/base.rb', line 424 def apply(file) if File.exist?(file) self.lib.apply(file) end end |
#apply_mail(file) ⇒ Object
430 431 432 |
# File 'lib/git/base.rb', line 430 def apply_mail(file) self.lib.apply_mail(file) if File.exist?(file) end |
#archive(treeish, file = nil, opts = {}) ⇒ Object
creates an archive file of the given tree-ish
411 412 413 |
# File 'lib/git/base.rb', line 411 def archive(treeish, file = nil, opts = {}) self.object(treeish).archive(file, opts) end |
#cat_file(objectish) ⇒ Object
529 530 531 |
# File 'lib/git/base.rb', line 529 def cat_file(objectish) self.lib.object_contents(objectish) end |
#chdir ⇒ Object
changes current working directory for a block to the git working directory
example
@git.chdir do
# write files
@git.add
@git.commit('message')
end
104 105 106 107 108 |
# File 'lib/git/base.rb', line 104 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
305 306 307 |
# File 'lib/git/base.rb', line 305 def checkout(branch = 'master', opts = {}) self.lib.checkout(branch, opts) end |
#checkout_file(version, file) ⇒ Object
checks out an old version of a file
310 311 312 |
# File 'lib/git/base.rb', line 310 def checkout_file(version, file) self.lib.checkout_file(version,file) end |
#checkout_index(opts = {}) ⇒ Object
468 469 470 |
# File 'lib/git/base.rb', line 468 def checkout_index(opts = {}) self.lib.checkout_index(opts) end |
#clean(opts = {}) ⇒ Object
cleans the working directory
options:
:force
:d
251 252 253 |
# File 'lib/git/base.rb', line 251 def clean(opts = {}) self.lib.clean(opts) end |
#commit(message, opts = {}) ⇒ Object
commits all pending changes in the index file to the git repository
options:
:all
:allow_empty
:amend
:author
292 293 294 |
# File 'lib/git/base.rb', line 292 def commit(, opts = {}) self.lib.commit(, 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.
299 300 301 302 |
# File 'lib/git/base.rb', line 299 def commit_all(, opts = {}) opts = {:add_all => true}.merge(opts) self.lib.commit(, 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
114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/git/base.rb', line 114 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_branch ⇒ Object
returns the name of the branch the working directory is currently on
534 535 536 |
# File 'lib/git/base.rb', line 534 def current_branch self.lib.branch_current end |
#delete_tag(name) ⇒ Object
deletes a tag
406 407 408 |
# File 'lib/git/base.rb', line 406 def delete_tag(name) self.lib.tag(name, {:d => true}) end |
#describe(committish = nil, opts = {}) ⇒ Object
returns the most recent tag that is reachable from a commit
options:
:all
:tags
:contains
:debug
:exact_match
:dirty
:abbrev
:candidates
:long
:always
:match
270 271 272 |
# File 'lib/git/base.rb', line 270 def describe(committish=nil, opts={}) self.lib.describe(committish, opts) end |
#dir ⇒ Object
returns a reference to the working directory
@git.dir.path
@git.dir.writeable?
130 131 132 |
# File 'lib/git/base.rb', line 130 def dir @working_directory end |
#each_conflict(&block) ⇒ Object
iterates over the files which are unmerged
340 341 342 |
# File 'lib/git/base.rb', line 340 def each_conflict(&block) # :yields: file, your_version, their_version self.lib.conflicts(&block) end |
#fetch(remote = 'origin', opts = {}) ⇒ 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
316 317 318 |
# File 'lib/git/base.rb', line 316 def fetch(remote = 'origin', opts={}) self.lib.fetch(remote, opts) end |
#gc ⇒ Object
420 421 422 |
# File 'lib/git/base.rb', line 420 def gc self.lib.gc 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
206 207 208 |
# File 'lib/git/base.rb', line 206 def grep(string, path_limiter = nil, opts = {}) self.object('HEAD').grep(string, path_limiter, opts) end |
#index ⇒ Object
returns reference to the git index file
135 136 137 |
# File 'lib/git/base.rb', line 135 def index @index end |
#is_branch?(branch) ⇒ Boolean
returns true
if the branch exists
175 176 177 178 |
# File 'lib/git/base.rb', line 175 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
163 164 165 166 |
# File 'lib/git/base.rb', line 163 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
169 170 171 172 |
# File 'lib/git/base.rb', line 169 def is_remote_branch?(branch) branch_names = self.branches.remote.map {|b| b.name} branch_names.include?(branch) end |
#lib ⇒ Object
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
183 184 185 |
# File 'lib/git/base.rb', line 183 def lib @lib ||= Git::Lib.new(self, @logger) end |
#ls_files(location = nil) ⇒ Object
490 491 492 |
# File 'lib/git/base.rb', line 490 def ls_files(location=nil) self.lib.ls_files(location) end |
#ls_tree(objectish) ⇒ Object
525 526 527 |
# File 'lib/git/base.rb', line 525 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
335 336 337 |
# File 'lib/git/base.rb', line 335 def merge(branch, = 'merge') self.lib.merge(branch, ) end |
#pull(remote = 'origin', branch = 'master') ⇒ Object
pulls the given branch from the given remote into the current branch
@git.pull # pulls from origin/master
@git.pull('upstream') # pulls from upstream/master
@git.pull('upstream', 'develope') # pulls from upstream/develop
350 351 352 |
# File 'lib/git/base.rb', line 350 def pull(remote='origin', branch='master') self.lib.pull(remote, branch) end |
#push(remote = 'origin', branch = 'master', opts = {}) ⇒ 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')
325 326 327 328 329 330 |
# File 'lib/git/base.rb', line 325 def push(remote = 'origin', branch = 'master', opts = {}) # Small hack to keep backwards compatibility with the 'push(remote, branch, tags)' method signature. opts = {:tags => opts} if [true, false].include?(opts) self.lib.push(remote, branch, opts) end |
#read_tree(treeish, opts = {}) ⇒ Object
472 473 474 |
# File 'lib/git/base.rb', line 472 def read_tree(treeish, opts = {}) self.lib.read_tree(treeish, opts) end |
#remotes ⇒ Object
returns an array of Git:Remote objects
355 356 357 |
# File 'lib/git/base.rb', line 355 def remotes self.lib.remotes.map { |r| Git::Remote.new(self, r) } end |
#remove(path = '.', opts = {}) ⇒ Object
removes file(s) from the git repository
230 231 232 |
# File 'lib/git/base.rb', line 230 def remove(path = '.', opts = {}) self.lib.remove(path, opts) end |
#remove_remote(name) ⇒ Object
removes a remote from this repository
@git.remove_remote(‘scott_git’)
378 379 380 |
# File 'lib/git/base.rb', line 378 def remove_remote(name) self.lib.remote_remove(name) end |
#repack ⇒ Object
repacks the repository
416 417 418 |
# File 'lib/git/base.rb', line 416 def repack self.lib.repack end |
#repo ⇒ Object
returns reference to the git repository directory
@git.dir.path
141 142 143 |
# File 'lib/git/base.rb', line 141 def repo @repository end |
#repo_size ⇒ Object
returns the repository size in bytes
146 147 148 149 150 |
# File 'lib/git/base.rb', line 146 def repo_size Dir.chdir(repo.path) do return `du -s`.chomp.split.first.to_i end end |
#reset(commitish = nil, opts = {}) ⇒ Object
resets the working directory to the provided commitish
235 236 237 |
# File 'lib/git/base.rb', line 235 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’
240 241 242 243 |
# File 'lib/git/base.rb', line 240 def reset_hard(commitish = nil, opts = {}) opts = {:hard => true}.merge(opts) self.lib.reset(commitish, opts) end |
#revert(commitish = nil, opts = {}) ⇒ Object
reverts the working directory to the provided commitish. Accepts a range, such as comittish..HEAD
options:
:no_edit
280 281 282 |
# File 'lib/git/base.rb', line 280 def revert(commitish = nil, opts = {}) self.lib.revert(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')
521 522 523 |
# File 'lib/git/base.rb', line 521 def revparse(objectish) self.lib.revparse(objectish) end |
#set_index(index_file, check = true) ⇒ Object
152 153 154 155 |
# File 'lib/git/base.rb', line 152 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
157 158 159 160 |
# File 'lib/git/base.rb', line 157 def set_working(work_dir, check = true) @lib = nil @working_directory = Git::WorkingDirectory.new(work_dir.to_s, check) end |
#show(objectish = nil, path = nil) ⇒ String
Shows objects
439 440 441 |
# File 'lib/git/base.rb', line 439 def show(objectish=nil, path=nil) self.lib.show(objectish, path) end |
#tags ⇒ Object
returns an array of all Git::Tag objects for this repository
383 384 385 |
# File 'lib/git/base.rb', line 383 def self.lib..map { |r| tag(r) } end |
#update_ref(branch, commit) ⇒ Object
485 486 487 |
# File 'lib/git/base.rb', line 485 def update_ref(branch, commit) branch(branch).update_ref(commit) end |
#with_index(new_index) ⇒ Object
LOWER LEVEL INDEX OPERATIONS ##
445 446 447 448 449 450 451 |
# File 'lib/git/base.rb', line 445 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
453 454 455 456 457 458 459 460 461 462 463 464 465 466 |
# File 'lib/git/base.rb', line 453 def with_temp_index &blk # Workaround for JRUBY, since they handle the TempFile path different. # MUST be improved to be safer and OS independent. if RUBY_PLATFORM == 'java' temp_path = "/tmp/temp-index-#{(0...15).map{ ('a'..'z').to_a[rand(26)] }.join}" else tempfile = Tempfile.new('temp-index') temp_path = tempfile.path tempfile.close tempfile.unlink end with_index(temp_path, &blk) end |
#with_temp_working(&blk) ⇒ Object
505 506 507 508 509 510 511 512 |
# File 'lib/git/base.rb', line 505 def with_temp_working &blk tempfile = Tempfile.new("temp-workdir") temp_dir = tempfile.path tempfile.close tempfile.unlink Dir.mkdir(temp_dir, 0700) with_working(temp_dir, &blk) end |
#with_working(work_dir) ⇒ Object
:yields: the Git::WorkingDirectory
494 495 496 497 498 499 500 501 502 503 |
# File 'lib/git/base.rb', line 494 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
480 481 482 483 |
# File 'lib/git/base.rb', line 480 def write_and_commit_tree(opts = {}) tree = write_tree commit_tree(tree, opts) end |
#write_tree ⇒ Object
476 477 478 |
# File 'lib/git/base.rb', line 476 def write_tree self.lib.write_tree end |