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_url, directory, 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.
-
.repository_default_branch(repository, options = {}) ⇒ String
Returns the name of the default branch of the given repository.
- .root_of_worktree(working_dir)
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(*args, **options)
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 = nil, branch = nil)
pulls the given branch from the given remote into the current branch.
-
#push(remote = nil, branch = nil, options = {}) ⇒ Void
Push changes to a remote repository.
- #read_tree(treeish, opts = {})
-
#remotes
returns an array of Git:Remote objects.
-
#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.
-
#rm(path = '.', opts = {})
(also: #remove)
removes file(s) from the git repository.
- #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.
112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/git/base.rb', line 112 def initialize( = {}) if working_dir = [:working_directory] [:repository] ||= File.join(working_dir, '.git') [:index] ||= File.join([:repository], 'index') end @logger = ([:log] || Logger.new(nil)) @logger.info("Starting Git") @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.
16 17 18 19 |
# File 'lib/git/base.rb', line 16 def self.(git_dir, = {}) normalize_paths(, default_repository: git_dir, bare: true) self.new() end |
.clone(repository_url, directory, options = {}) ⇒ Git::Base
Clone a repository into an empty or newly created directory
22 23 24 25 26 |
# File 'lib/git/base.rb', line 22 def self.clone(repository_url, directory, = {}) = Git::Lib.new(nil, [:log]).clone(repository_url, directory, ) normalize_paths(, bare: [:bare] || [:mirror]) new() end |
.config ⇒ Git::Config
Returns (and initialize if needed) a Git::Config instance
36 37 38 |
# File 'lib/git/base.rb', line 36 def self.config @@config ||= Config.new end |
.init(directory = '.', options = {}) ⇒ Git::Base
Create an empty Git repository or reinitialize an existing Git repository
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/git/base.rb', line 41 def self.init(directory = '.', = {}) normalize_paths(, default_working_directory: directory, default_repository: directory, bare: [:bare]) = { :bare => [:bare], :initial_branch => [:initial_branch] } directory = [:bare] ? [:repository] : [:working_directory] FileUtils.mkdir_p(directory) unless File.exist?(directory) # 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
).
80 81 82 83 84 85 86 87 88 |
# File 'lib/git/base.rb', line 80 def self.open(working_dir, = {}) raise ArgumentError, "'#{working_dir}' is not a directory" unless Dir.exist?(working_dir) working_dir = root_of_worktree(working_dir) unless [:repository] normalize_paths(, default_working_directory: working_dir) self.new() end |
.repository_default_branch(repository, options = {}) ⇒ String
Returns the name of the default branch of the given repository
29 30 31 |
# File 'lib/git/base.rb', line 29 def self.repository_default_branch(repository, = {}) Git::Lib.new(nil, [:log]).repository_default_branch(repository) end |
.root_of_worktree(working_dir)
67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/git/base.rb', line 67 def self.root_of_worktree(working_dir) result = working_dir status = nil git_cmd = "#{Git::Base.config.binary_path} -c core.quotePath=true -c color.ui=false rev-parse --show-toplevel 2>&1" result, status = Open3.capture2(git_cmd, chdir: File.(working_dir)) result = result.chomp raise ArgumentError, "'#{working_dir}' is not in a git working tree" unless status.success? result end |
Instance Method Details
#add(paths = '.', **options)
updates the repository index using the working directory content
options: :all => true
276 277 278 |
# File 'lib/git/base.rb', line 276 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 =>
437 438 439 440 441 |
# File 'lib/git/base.rb', line 437 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)
484 485 486 487 |
# File 'lib/git/base.rb', line 484 def add_tag(name, *) self.lib.tag(name, *) self.tag(name) end |
#apply(file)
508 509 510 511 512 |
# File 'lib/git/base.rb', line 508 def apply(file) if File.exist?(file) self.lib.apply(file) end end |
#apply_mail(file)
514 515 516 |
# File 'lib/git/base.rb', line 514 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
495 496 497 |
# File 'lib/git/base.rb', line 495 def archive(treeish, file = nil, opts = {}) self.object(treeish).archive(file, opts) end |
#cat_file(objectish)
613 614 615 |
# File 'lib/git/base.rb', line 613 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
134 135 136 137 138 |
# File 'lib/git/base.rb', line 134 def chdir # :yields: the Git::Path Dir.chdir(dir.path) do yield dir.path end end |
#checkout(*args, **options)
checks out a branch as the new git working directory
359 360 361 |
# File 'lib/git/base.rb', line 359 def checkout(*args, **) self.lib.checkout(*args, **) end |
#checkout_file(version, file)
checks out an old version of a file
364 365 366 |
# File 'lib/git/base.rb', line 364 def checkout_file(version, file) self.lib.checkout_file(version,file) end |
#checkout_index(opts = {})
552 553 554 |
# File 'lib/git/base.rb', line 552 def checkout_index(opts = {}) self.lib.checkout_index(opts) end |
#clean(opts = {})
cleans the working directory
options: :force :d :ff
305 306 307 |
# File 'lib/git/base.rb', line 305 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
346 347 348 |
# File 'lib/git/base.rb', line 346 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.
353 354 355 356 |
# File 'lib/git/base.rb', line 353 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
145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/git/base.rb', line 145 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
618 619 620 |
# File 'lib/git/base.rb', line 618 def current_branch self.lib.branch_current end |
#delete_tag(name)
deletes a tag
490 491 492 |
# File 'lib/git/base.rb', line 490 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
324 325 326 |
# File 'lib/git/base.rb', line 324 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?
161 162 163 |
# File 'lib/git/base.rb', line 161 def dir @working_directory end |
#each_conflict(&block)
iterates over the files which are unmerged
408 409 410 |
# File 'lib/git/base.rb', line 408 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
370 371 372 373 374 375 376 |
# File 'lib/git/base.rb', line 370 def fetch(remote = 'origin', opts = {}) if remote.is_a?(Hash) opts = remote remote = nil end self.lib.fetch(remote, opts) end |
#gc
504 505 506 |
# File 'lib/git/base.rb', line 504 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
253 254 255 |
# File 'lib/git/base.rb', line 253 def grep(string, path_limiter = nil, opts = {}) self.object('HEAD').grep(string, path_limiter, opts) end |
#index
returns reference to the git index file
166 167 168 |
# File 'lib/git/base.rb', line 166 def index @index end |
#is_branch?(branch) ⇒ Boolean
returns +true+ if the branch exists
210 211 212 213 |
# File 'lib/git/base.rb', line 210 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
198 199 200 201 |
# File 'lib/git/base.rb', line 198 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
204 205 206 207 |
# File 'lib/git/base.rb', line 204 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
218 219 220 |
# File 'lib/git/base.rb', line 218 def lib @lib ||= Git::Lib.new(self, @logger) end |
#ls_files(location = nil)
574 575 576 |
# File 'lib/git/base.rb', line 574 def ls_files(location=nil) self.lib.ls_files(location) end |
#ls_tree(objectish)
609 610 611 |
# File 'lib/git/base.rb', line 609 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
403 404 405 |
# File 'lib/git/base.rb', line 403 def merge(branch, = 'merge', opts = {}) self.lib.merge(branch, , opts) end |
#pull(remote = nil, branch = nil)
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
418 419 420 |
# File 'lib/git/base.rb', line 418 def pull(remote = nil, branch = nil) self.lib.pull(remote, branch) end |
#push(remote = nil, branch = nil, options = {}) ⇒ Void
Push changes to a remote repository
396 397 398 |
# File 'lib/git/base.rb', line 396 def push(*args, **) self.lib.push(*args, **) end |
#read_tree(treeish, opts = {})
556 557 558 |
# File 'lib/git/base.rb', line 556 def read_tree(treeish, opts = {}) self.lib.read_tree(treeish, opts) end |
#remotes
returns an array of Git:Remote objects
423 424 425 |
# File 'lib/git/base.rb', line 423 def remotes self.lib.remotes.map { |r| Git::Remote.new(self, r) } end |
#remove_remote(name)
removes a remote from this repository
@git.remove_remote('scott_git')
457 458 459 |
# File 'lib/git/base.rb', line 457 def remove_remote(name) self.lib.remote_remove(name) end |
#repack
repacks the repository
500 501 502 |
# File 'lib/git/base.rb', line 500 def repack self.lib.repack end |
#repo
returns reference to the git repository directory @git.dir.path
172 173 174 |
# File 'lib/git/base.rb', line 172 def repo @repository end |
#repo_size
returns the repository size in bytes
177 178 179 180 181 182 183 184 185 |
# File 'lib/git/base.rb', line 177 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
288 289 290 |
# File 'lib/git/base.rb', line 288 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'
293 294 295 296 |
# File 'lib/git/base.rb', line 293 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
334 335 336 |
# File 'lib/git/base.rb', line 334 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
605 606 607 |
# File 'lib/git/base.rb', line 605 def revparse(objectish) self.lib.revparse(objectish) end |
#rm(path = '.', opts = {}) Also known as: remove
removes file(s) from the git repository
281 282 283 |
# File 'lib/git/base.rb', line 281 def rm(path = '.', opts = {}) self.lib.rm(path, opts) end |
#set_index(index_file, check = true)
187 188 189 190 |
# File 'lib/git/base.rb', line 187 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')
448 449 450 451 452 |
# File 'lib/git/base.rb', line 448 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)
192 193 194 195 |
# File 'lib/git/base.rb', line 192 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
523 524 525 |
# File 'lib/git/base.rb', line 523 def show(objectish=nil, path=nil) self.lib.show(objectish, path) end |
#tags
returns an array of all Git::Tag objects for this repository
462 463 464 |
# File 'lib/git/base.rb', line 462 def self.lib..map { |r| tag(r) } end |
#update_ref(branch, commit)
569 570 571 |
# File 'lib/git/base.rb', line 569 def update_ref(branch, commit) branch(branch).update_ref(commit) end |
#with_index(new_index)
LOWER LEVEL INDEX OPERATIONS ##
529 530 531 532 533 534 535 |
# File 'lib/git/base.rb', line 529 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)
537 538 539 540 541 542 543 544 545 546 547 548 549 550 |
# File 'lib/git/base.rb', line 537 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)
589 590 591 592 593 594 595 596 |
# File 'lib/git/base.rb', line 589 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
578 579 580 581 582 583 584 585 586 587 |
# File 'lib/git/base.rb', line 578 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 = {})
564 565 566 567 |
# File 'lib/git/base.rb', line 564 def write_and_commit_tree(opts = {}) tree = write_tree commit_tree(tree, opts) end |
#write_tree
560 561 562 |
# File 'lib/git/base.rb', line 560 def write_tree self.lib.write_tree end |