Module: PDK::Util::Git

Defined in:
lib/pdk/util/git.rb

Class Method Summary collapse

Class Method Details

.bare_repo?(maybe_repo) ⇒ Boolean

Returns:

  • (Boolean)


69
70
71
72
73
74
# File 'lib/pdk/util/git.rb', line 69

def self.bare_repo?(maybe_repo)
  env = { 'GIT_DIR' => maybe_repo }
  rev_parse = git_with_env(env, 'rev-parse', '--is-bare-repository')

  rev_parse[:exit_code].zero? && rev_parse[:stdout].strip == 'true'
end

.describe(path, ref = nil) ⇒ Object



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

def self.describe(path, ref = nil)
  args = ['--git-dir', path, 'describe', '--all', '--long', '--always', ref].compact
  result = git(*args)
  raise PDK::Util::GitError, args, result unless result[:exit_code].zero?
  result[:stdout].strip
end

.git(*args) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/pdk/util/git.rb', line 47

def self.git(*args)
  require 'pdk/cli/exec'

  PDK::CLI::Exec.ensure_bin_present!(git_bin, 'git')

  PDK::CLI::Exec.execute(git_bin, *args)
end

.git_binObject



38
39
40
41
42
43
44
45
# File 'lib/pdk/util/git.rb', line 38

def self.git_bin
  require 'pdk/cli/exec'

  git_bin = Gem.win_platform? ? 'git.exe' : 'git'
  vendored_bin_path = File.join(git_bindir, git_bin)

  PDK::CLI::Exec.try_vendored_bin(vendored_bin_path, git_bin)
end

.git_bindirObject



20
21
22
# File 'lib/pdk/util/git.rb', line 20

def self.git_bindir
  @git_dir ||= File.join('private', 'git', Gem.win_platform? ? 'cmd' : 'bin')
end

.git_pathsObject



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/pdk/util/git.rb', line 24

def self.git_paths
  @paths ||= begin
    paths = [File.join(PDK::Util.pdk_package_basedir, git_bindir)]

    if Gem.win_platform?
      paths << File.join(PDK::Util.pdk_package_basedir, 'private', 'git', 'mingw64', 'bin')
      paths << File.join(PDK::Util.pdk_package_basedir, 'private', 'git', 'mingw64', 'libexec', 'git-core')
      paths << File.join(PDK::Util.pdk_package_basedir, 'private', 'git', 'usr', 'bin')
    end

    paths
  end
end

.git_with_env(env, *args) ⇒ Object



55
56
57
58
59
60
61
# File 'lib/pdk/util/git.rb', line 55

def self.git_with_env(env, *args)
  require 'pdk/cli/exec'

  PDK::CLI::Exec.ensure_bin_present!(git_bin, 'git')

  PDK::CLI::Exec.execute_with_env(env, git_bin, *args)
end

.ls_remote(repo, ref) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/pdk/util/git.rb', line 96

def self.ls_remote(repo, ref)
  if File.directory?(repo)
    repo = 'file://' + repo
  end

  output = git('ls-remote', '--refs', repo, ref)

  unless output[:exit_code].zero?
    PDK.logger.error output[:stdout]
    PDK.logger.error output[:stderr]
    raise PDK::CLI::ExitWithError, _('Unable to access the template repository "%{repository}"') % {
      repository: repo,
    }
  end

  matching_refs = output[:stdout].split("\n").map { |r| r.split("\t") }
  matching_ref = matching_refs.find { |_sha, remote_ref| remote_ref == "refs/tags/#{ref}" || remote_ref == "refs/remotes/origin/#{ref}" || remote_ref == "refs/heads/#{ref}" }
  raise PDK::CLI::ExitWithError, _('Unable to find a branch or tag named "%{ref}" in %{repo}') % { ref: ref, repo: repo } if matching_ref.nil?
  matching_ref.first
end

.remote_repo?(maybe_repo) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/pdk/util/git.rb', line 76

def self.remote_repo?(maybe_repo)
  git('ls-remote', '--exit-code', maybe_repo)[:exit_code].zero?
end

.repo?(maybe_repo) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
66
67
# File 'lib/pdk/util/git.rb', line 63

def self.repo?(maybe_repo)
  return bare_repo?(maybe_repo) if File.directory?(maybe_repo)

  remote_repo?(maybe_repo)
end

.work_dir_clean?(repo) ⇒ Boolean

Returns:

  • (Boolean)

Raises:



89
90
91
92
93
94
# File 'lib/pdk/util/git.rb', line 89

def self.work_dir_clean?(repo)
  raise PDK::CLI::ExitWithError, _('Unable to locate git work dir "%{workdir}"') % { workdir: repo } unless File.directory?(repo)
  raise PDK::CLI::ExitWithError, _('Unable to locate git dir "%{gitdir}"') % { gitdir: repo } unless File.directory?(File.join(repo, '.git'))

  git('--work-tree', repo, '--git-dir', File.join(repo, '.git'), 'status', '--untracked-files=no', '--porcelain', repo)[:stdout].empty?
end

.work_tree?(path) ⇒ Boolean

Returns:

  • (Boolean)


80
81
82
83
84
85
86
87
# File 'lib/pdk/util/git.rb', line 80

def self.work_tree?(path)
  return false unless File.directory?(path)

  Dir.chdir(path) do
    rev_parse = git('rev-parse', '--is-inside-work-tree')
    rev_parse[:exit_code].zero? && rev_parse[:stdout].strip == 'true'
  end
end