class R10K::Git::ShellGit::WorkingRepository

Manage a non-bare Git repository

Attributes

path[R]

@attribute [r] path

@return [Pathname]

Public Class Methods

new(basedir, dirname) click to toggle source
# File lib/r10k/git/shellgit/working_repository.rb, line 17
def initialize(basedir, dirname)
  @path = Pathname.new(File.join(basedir, dirname))
end

Public Instance Methods

alternates() click to toggle source
# File lib/r10k/git/shellgit/working_repository.rb, line 80
def alternates
  R10K::Git::Alternates.new(git_dir)
end
checkout(ref, opts = {}) click to toggle source

Check out the given Git ref

@param ref [String] The git reference to check out @param opts [Hash] Optional hash of additional options.

# File lib/r10k/git/shellgit/working_repository.rb, line 51
def checkout(ref, opts = {})
  argv = ['checkout', ref]

  # :force defaults to true
  if !opts.has_key?(:force) || opts[:force]
    argv << '--force'
  end

  git argv, :path => @path.to_s
end
clone(remote, opts = {}) click to toggle source

Clone this git repository

@param remote [String] The Git remote to clone @param opts [Hash]

@options opts [String] :ref The git ref to check out on clone @options opts [String] :reference A Git repository to use as an alternate object database

@return [void]

# File lib/r10k/git/shellgit/working_repository.rb, line 30
def clone(remote, opts = {})
  argv = ['clone', remote, @path.to_s]
  if opts[:reference]
    argv += ['--reference', opts[:reference]]
  end

  proxy = R10K::Git.get_proxy_for_remote(remote)

  R10K::Git.with_proxy(proxy) do
    git argv
  end

  if opts[:ref]
    checkout(opts[:ref])
  end
end
dirty?(exclude_spec=true) click to toggle source

does the working tree have local modifications to tracked files?

# File lib/r10k/git/shellgit/working_repository.rb, line 93
def dirty?(exclude_spec=true)
  result = git(['diff-index', '--exit-code', '--name-only', 'HEAD'], :path => @path.to_s, :raise_on_fail => false)

  if result.exit_code != 0
    dirty_files = result.stdout.split("\n")
    dirty_files.delete_if { |f| f.start_with?('spec/') } if exclude_spec

    dirty_files.each do |file|
      logger.debug(_("Found local modifications in %{file_path}" % {file_path: File.join(@path, file)}))

      # Do this in a block so that the extra subprocess only gets invoked when needed.
      logger.debug1 { git(['diff-index', '-p', 'HEAD', '--', file], :path => @path.to_s, :raise_on_fail => false).stdout }
    end

    return dirty_files.size > 0
  else
    return false
  end
end
exist?() click to toggle source
# File lib/r10k/git/shellgit/working_repository.rb, line 71
def exist?
  @path.exist?
end
fetch(remote_name='origin') click to toggle source
# File lib/r10k/git/shellgit/working_repository.rb, line 62
def fetch(remote_name='origin')
  remote = remotes[remote_name]
  proxy = R10K::Git.get_proxy_for_remote(remote)

  R10K::Git.with_proxy(proxy) do
    git ['fetch', remote_name, '--prune'], :path => @path.to_s
  end
end
git_dir() click to toggle source

@return [Pathname] The path to the Git directory inside of this repository

# File lib/r10k/git/shellgit/working_repository.rb, line 13
def git_dir
  @path + '.git'
end
head() click to toggle source

@return [String] The currently checked out ref

# File lib/r10k/git/shellgit/working_repository.rb, line 76
def head
  resolve('HEAD')
end
origin() click to toggle source

@return [String] The origin remote URL

# File lib/r10k/git/shellgit/working_repository.rb, line 85
def origin
  result = git(['config', '--get', 'remote.origin.url'], :path => @path.to_s, :raise_on_fail => false)
  if result.success?
    result.stdout
  end
end