Class: Git::Base
- Inherits:
-
Object
- Object
- Git::Base
- Includes:
- Factory
- Defined in:
- lib/git/base.rb,
lib/git/base/factory.rb
Overview
Defined Under Namespace
Modules: Factory
Class Method Summary collapse
-
.bare(git_dir, options = {}) ⇒ Git::Base
Open a bare repository.
-
.clone(repository, name, options = {}) ⇒ Git::Base
Clone a repository into an empty or newly created directory.
-
.config ⇒ Git::Config
Returns (and initialize if needed) a Git::Config instance.
-
.init(directory, options = {}) ⇒ Git::Base
Create an empty Git repository or reinitialize an existing Git repository.
-
.open(working_dir, options = {}) ⇒ Git::Base
Open a an existing Git working directory.
Instance Method Summary collapse
-
#add(paths = '.', **options)
updates the repository index using the working directory content.
-
#add_remote(name, url, opts = {})
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, *options)
Creates a new git tag (Git::Tag).
- #apply(file)
- #apply_mail(file)
-
#archive(treeish, file = nil, opts = {})
creates an archive file of the given tree-ish.
- #cat_file(objectish)
-
#chdir
changes current working directory for a block to the git working directory.
-
#checkout(branch = 'master', opts = {})
checks out a branch as the new git working directory.
-
#checkout_file(version, file)
checks out an old version of a file.
- #checkout_index(opts = {})
-
#clean(opts = {})
cleans the working directory.
-
#commit(message, opts = {})
commits all pending changes in the index file to the git repository.
-
#commit_all(message, opts = {})
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, options = {})
g.config('user.name', 'Scott Chacon') # sets value g.config('user.email', '[email protected]') # sets value g.config('user.email', '[email protected]', file: 'path/to/custom/config) # sets value in file g.config('user.name') # returns 'Scott Chacon' g.config # returns whole config hash.
-
#current_branch
returns the name of the branch the working directory is currently on.
-
#delete_tag(name)
deletes a tag.
-
#describe(committish = nil, opts = {})
returns the most recent tag that is reachable from a commit.
-
#dir
returns a reference to the working directory @git.dir.path @git.dir.writeable?.
-
#each_conflict(&block)
iterates over the files which are unmerged.
-
#fetch(remote = 'origin', opts = {})
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
-
#grep(string, path_limiter = nil, opts = {}) ⇒ Hash<String, Array>
Run a grep for 'string' on the HEAD of the git repository.
-
#index
returns reference to the git index file.
-
#initialize(options = {}) ⇒ Git::Base
constructor
Create an object that executes Git commands in the context of a working copy or a bare repository.
-
#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
this is a convenience method for accessing the class that wraps all the actual 'git' forked system calls.
- #ls_files(location = nil)
- #ls_tree(objectish)
-
#merge(branch, message = 'merge', opts = {})
merges one or more branches into the current working branch.
-
#pull(remote = 'origin', branch = 'master')
pulls the given branch from the given remote into the current branch.
-
#push(remote = 'origin', branch = 'master', opts = {})
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 = {})
-
#remotes
returns an array of Git:Remote objects.
-
#remove(path = '.', opts = {})
removes file(s) from the git repository.
-
#remove_remote(name)
removes a remote from this repository.
-
#repack
repacks the repository.
-
#repo
returns reference to the git repository directory @git.dir.path.
-
#repo_size
returns the repository size in bytes.
-
#reset(commitish = nil, opts = {})
resets the working directory to the provided commitish.
-
#reset_hard(commitish = nil, opts = {})
resets the working directory to the commitish with '--hard'.
-
#revert(commitish = nil, opts = {})
reverts the working directory to the provided commitish.
-
#revparse(objectish)
runs git rev-parse to convert the objectish to a full sha.
- #set_index(index_file, check = true)
-
#set_remote_url(name, url)
sets the url for a remote url can be a git url or a Git::Base object if it's a local reference.
- #set_working(work_dir, check = true)
-
#show(objectish = nil, path = nil) ⇒ String
Shows objects.
-
#tags
returns an array of all Git::Tag objects for this repository.
- #update_ref(branch, commit)
-
#with_index(new_index)
LOWER LEVEL INDEX OPERATIONS ##.
- #with_temp_index(&blk)
- #with_temp_working(&blk)
-
#with_working(work_dir)
:yields: the Git::WorkingDirectory.
- #write_and_commit_tree(opts = {})
- #write_tree
Methods included from Factory
#branch, #branches, #commit_tree, #diff, #gblob, #gcommit, #gtree, #log, #merge_base, #object, #remote, #status, #tag, #worktree, #worktrees
Constructor Details
#initialize(options = {}) ⇒ Git::Base
Create an object that executes Git commands in the context of a working copy or a bare repository.
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/git/base.rb', line 106 def initialize( = {}) if working_dir = [:working_directory] [:repository] ||= File.join(working_dir, '.git') [:index] ||= File.join([:repository], '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, options = {}) ⇒ Git::Base
Open a bare repository
Opens a bare repository located in the git_dir
directory.
Since there is no working copy, you can not checkout or commit
but you can do most read operations.
14 15 16 |
# File 'lib/git/base.rb', line 14 def self.(git_dir, = {}) self.new({:repository => git_dir}.merge()) end |
.clone(repository, name, options = {}) ⇒ Git::Base
Clone a repository into an empty or newly created directory
19 20 21 |
# File 'lib/git/base.rb', line 19 def self.clone(repository, name, = {}) self.new(Git::Lib.new(nil, [:log]).clone(repository, name, )) end |
.config ⇒ Git::Config
Returns (and initialize if needed) a Git::Config instance
26 27 28 |
# File 'lib/git/base.rb', line 26 def self.config return @@config ||= Config.new end |
.init(directory, options = {}) ⇒ Git::Base
Create an empty Git repository or reinitialize an existing Git repository
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/git/base.rb', line 31 def self.init(directory, = {}) [:working_directory] ||= directory [:repository] ||= File.join([:working_directory], '.git') FileUtils.mkdir_p([:working_directory]) if [:working_directory] && !File.directory?([:working_directory]) = { :bare => [:bare] } .delete(:working_directory) if [: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 [:working_directory] && File.file?(File.join([:working_directory], '.git')) git_file = File.open('.git').read[8..-1].strip [:repository] = git_file [:index] = git_file + '/index' end # TODO: this dance seems awkward: this creates a Git::Lib so we can call # init so we can create a new Git::Base which in turn (ultimately) # creates another/different Git::Lib. # # TODO: maybe refactor so this Git::Bare.init does this: # self.new(opts).init(init_opts) and move all/some of this code into # Git::Bare#init. This way the init method can be called on any # repository you have a Git::Base instance for. This would not # change the existing interface (other than adding to it). # Git::Lib.new().init() self.new() end |
.open(working_dir, options = {}) ⇒ Git::Base
Open a an existing Git working directory
Git.open will most likely be the most common way to create a git reference, referring to an existing working directory.
If not provided in the options, the library will assume
the repository and index are in the default places (.git/
, .git/index
).
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/git/base.rb', line 66 def self.open(working_dir, ={}) # TODO: move this to Git.open? [:working_directory] ||= working_dir [:repository] ||= File.join([:working_directory], '.git') # 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 [:working_directory] && File.file?(File.join([:working_directory], '.git')) git_file = File.open('.git').read[8..-1].strip [:repository] = git_file [:index] = git_file + '/index' end self.new() end |
Instance Method Details
#add(paths = '.', **options)
updates the repository index using the working directory content
options: :all => true
265 266 267 |
# File 'lib/git/base.rb', line 265 def add(paths = '.', **) self.lib.add(paths, ) end |
#add_remote(name, url, opts = {})
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 =>
409 410 411 412 413 |
# File 'lib/git/base.rb', line 409 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, *options)
Creates a new git tag (Git::Tag)
456 457 458 459 |
# File 'lib/git/base.rb', line 456 def add_tag(name, *) self.lib.tag(name, *) self.tag(name) end |
#apply(file)
480 481 482 483 484 |
# File 'lib/git/base.rb', line 480 def apply(file) if File.exist?(file) self.lib.apply(file) end end |
#apply_mail(file)
486 487 488 |
# File 'lib/git/base.rb', line 486 def apply_mail(file) self.lib.apply_mail(file) if File.exist?(file) end |
#archive(treeish, file = nil, opts = {})
creates an archive file of the given tree-ish
467 468 469 |
# File 'lib/git/base.rb', line 467 def archive(treeish, file = nil, opts = {}) self.object(treeish).archive(file, opts) end |
#cat_file(objectish)
586 587 588 |
# File 'lib/git/base.rb', line 586 def cat_file(objectish) self.lib.object_contents(objectish) end |
#chdir
changes current working directory for a block to the git working directory
example @git.chdir do # write files @git.add @git.commit('message') end
132 133 134 135 136 |
# File 'lib/git/base.rb', line 132 def chdir # :yields: the Git::Path Dir.chdir(dir.path) do yield dir.path end end |
#checkout(branch = 'master', opts = {})
checks out a branch as the new git working directory
345 346 347 |
# File 'lib/git/base.rb', line 345 def checkout(branch = 'master', opts = {}) self.lib.checkout(branch, opts) end |
#checkout_file(version, file)
checks out an old version of a file
350 351 352 |
# File 'lib/git/base.rb', line 350 def checkout_file(version, file) self.lib.checkout_file(version,file) end |
#checkout_index(opts = {})
524 525 526 |
# File 'lib/git/base.rb', line 524 def checkout_index(opts = {}) self.lib.checkout_index(opts) end |
#clean(opts = {})
cleans the working directory
options: :force :d
291 292 293 |
# File 'lib/git/base.rb', line 291 def clean(opts = {}) self.lib.clean(opts) end |
#commit(message, opts = {})
commits all pending changes in the index file to the git repository
options: :all :allow_empty :amend :author
332 333 334 |
# File 'lib/git/base.rb', line 332 def commit(, opts = {}) self.lib.commit(, opts) end |
#commit_all(message, opts = {})
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.
339 340 341 342 |
# File 'lib/git/base.rb', line 339 def commit_all(, opts = {}) opts = {:add_all => true}.merge(opts) self.lib.commit(, opts) end |
#config(name = nil, value = nil, options = {})
g.config('user.name', 'Scott Chacon') # sets value g.config('user.email', '[email protected]') # sets value g.config('user.email', '[email protected]', file: 'path/to/custom/config) # sets value in file g.config('user.name') # returns 'Scott Chacon' g.config # returns whole config hash
143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/git/base.rb', line 143 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
returns the name of the branch the working directory is currently on
591 592 593 |
# File 'lib/git/base.rb', line 591 def current_branch self.lib.branch_current end |
#delete_tag(name)
deletes a tag
462 463 464 |
# File 'lib/git/base.rb', line 462 def delete_tag(name) self.lib.tag(name, {:d => true}) end |
#describe(committish = nil, opts = {})
returns the most recent tag that is reachable from a commit
options: :all :tags :contains :debug :exact_match :dirty :abbrev :candidates :long :always :match
310 311 312 |
# File 'lib/git/base.rb', line 310 def describe(committish=nil, opts={}) self.lib.describe(committish, opts) end |
#dir
returns a reference to the working directory @git.dir.path @git.dir.writeable?
159 160 161 |
# File 'lib/git/base.rb', line 159 def dir @working_directory end |
#each_conflict(&block)
iterates over the files which are unmerged
380 381 382 |
# File 'lib/git/base.rb', line 380 def each_conflict(&block) # :yields: file, your_version, their_version self.lib.conflicts(&block) end |
#fetch(remote = 'origin', opts = {})
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
356 357 358 |
# File 'lib/git/base.rb', line 356 def fetch(remote = 'origin', opts={}) self.lib.fetch(remote, opts) end |
#gc
476 477 478 |
# File 'lib/git/base.rb', line 476 def gc self.lib.gc end |
#grep(string, path_limiter = nil, opts = {}) ⇒ Hash<String, Array>
Run a grep for 'string' on the HEAD of the git repository
242 243 244 |
# File 'lib/git/base.rb', line 242 def grep(string, path_limiter = nil, opts = {}) self.object('HEAD').grep(string, path_limiter, opts) end |
#index
returns reference to the git index file
164 165 166 |
# File 'lib/git/base.rb', line 164 def index @index end |
#is_branch?(branch) ⇒ Boolean
returns +true+ if the branch exists
208 209 210 211 |
# File 'lib/git/base.rb', line 208 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
196 197 198 199 |
# File 'lib/git/base.rb', line 196 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
202 203 204 205 |
# File 'lib/git/base.rb', line 202 def is_remote_branch?(branch) branch_names = self.branches.remote.map {|b| b.name} branch_names.include?(branch) end |
#lib
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
216 217 218 |
# File 'lib/git/base.rb', line 216 def lib @lib ||= Git::Lib.new(self, @logger) end |
#ls_files(location = nil)
546 547 548 |
# File 'lib/git/base.rb', line 546 def ls_files(location=nil) self.lib.ls_files(location) end |
#ls_tree(objectish)
582 583 584 |
# File 'lib/git/base.rb', line 582 def ls_tree(objectish) self.lib.ls_tree(objectish) end |
#merge(branch, message = 'merge', opts = {})
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
375 376 377 |
# File 'lib/git/base.rb', line 375 def merge(branch, = 'merge', opts = {}) self.lib.merge(branch, , opts) end |
#pull(remote = 'origin', branch = 'master')
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
390 391 392 |
# File 'lib/git/base.rb', line 390 def pull(remote='origin', branch='master') self.lib.pull(remote, branch) end |
#push(remote = 'origin', branch = 'master', opts = {})
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')
365 366 367 368 369 370 |
# File 'lib/git/base.rb', line 365 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 = {})
528 529 530 |
# File 'lib/git/base.rb', line 528 def read_tree(treeish, opts = {}) self.lib.read_tree(treeish, opts) end |
#remotes
returns an array of Git:Remote objects
395 396 397 |
# File 'lib/git/base.rb', line 395 def remotes self.lib.remotes.map { |r| Git::Remote.new(self, r) } end |
#remove(path = '.', opts = {})
removes file(s) from the git repository
270 271 272 |
# File 'lib/git/base.rb', line 270 def remove(path = '.', opts = {}) self.lib.remove(path, opts) end |
#remove_remote(name)
removes a remote from this repository
@git.remove_remote('scott_git')
429 430 431 |
# File 'lib/git/base.rb', line 429 def remove_remote(name) self.lib.remote_remove(name) end |
#repack
repacks the repository
472 473 474 |
# File 'lib/git/base.rb', line 472 def repack self.lib.repack end |
#repo
returns reference to the git repository directory @git.dir.path
170 171 172 |
# File 'lib/git/base.rb', line 170 def repo @repository end |
#repo_size
returns the repository size in bytes
175 176 177 178 179 180 181 182 183 |
# File 'lib/git/base.rb', line 175 def repo_size Dir.glob(File.join(repo.path, '**', '*'), File::FNM_DOTMATCH).reject do |f| f.include?('..') end.map do |f| File.(f) end.uniq.map do |f| File.stat(f).size.to_i end.reduce(:+) end |
#reset(commitish = nil, opts = {})
resets the working directory to the provided commitish
275 276 277 |
# File 'lib/git/base.rb', line 275 def reset(commitish = nil, opts = {}) self.lib.reset(commitish, opts) end |
#reset_hard(commitish = nil, opts = {})
resets the working directory to the commitish with '--hard'
280 281 282 283 |
# File 'lib/git/base.rb', line 280 def reset_hard(commitish = nil, opts = {}) opts = {:hard => true}.merge(opts) self.lib.reset(commitish, opts) end |
#revert(commitish = nil, opts = {})
reverts the working directory to the provided commitish. Accepts a range, such as comittish..HEAD
options: :no_edit
320 321 322 |
# File 'lib/git/base.rb', line 320 def revert(commitish = nil, opts = {}) self.lib.revert(commitish, opts) end |
#revparse(objectish)
runs git rev-parse to convert the objectish to a full sha
578 579 580 |
# File 'lib/git/base.rb', line 578 def revparse(objectish) self.lib.revparse(objectish) end |
#set_index(index_file, check = true)
185 186 187 188 |
# File 'lib/git/base.rb', line 185 def set_index(index_file, check = true) @lib = nil @index = Git::Index.new(index_file.to_s, check) end |
#set_remote_url(name, url)
sets the url for a remote url can be a git url or a Git::Base object if it's a local reference
@git.set_remote_url('scotts_git', 'git://repo.or.cz/rubygit.git')
420 421 422 423 424 |
# File 'lib/git/base.rb', line 420 def set_remote_url(name, url) url = url.repo.path if url.is_a?(Git::Base) self.lib.remote_set_url(name, url) Git::Remote.new(self, name) end |
#set_working(work_dir, check = true)
190 191 192 193 |
# File 'lib/git/base.rb', line 190 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
495 496 497 |
# File 'lib/git/base.rb', line 495 def show(objectish=nil, path=nil) self.lib.show(objectish, path) end |
#tags
returns an array of all Git::Tag objects for this repository
434 435 436 |
# File 'lib/git/base.rb', line 434 def self.lib..map { |r| tag(r) } end |
#update_ref(branch, commit)
541 542 543 |
# File 'lib/git/base.rb', line 541 def update_ref(branch, commit) branch(branch).update_ref(commit) end |
#with_index(new_index)
LOWER LEVEL INDEX OPERATIONS ##
501 502 503 504 505 506 507 |
# File 'lib/git/base.rb', line 501 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)
509 510 511 512 513 514 515 516 517 518 519 520 521 522 |
# File 'lib/git/base.rb', line 509 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)
561 562 563 564 565 566 567 568 |
# File 'lib/git/base.rb', line 561 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)
:yields: the Git::WorkingDirectory
550 551 552 553 554 555 556 557 558 559 |
# File 'lib/git/base.rb', line 550 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 = {})
536 537 538 539 |
# File 'lib/git/base.rb', line 536 def write_and_commit_tree(opts = {}) tree = write_tree commit_tree(tree, opts) end |
#write_tree
532 533 534 |
# File 'lib/git/base.rb', line 532 def write_tree self.lib.write_tree end |