class ChefCLI::Policyfile::ComparisonBase::Git

def git_cmd

def git_cmd
  @git_cmd ||= Mixlib::ShellOut.new(git_cmd_string)
end

def git_cmd_string

def git_cmd_string
  # Git is a little picky about how we specify the paths, but it looks
  # like we don't need to worry about the relative path to the root of
  # the repo if we give git a leading dot:
  #
  #    git show 6644e6cb2ade90b8aff2ebb44728958fbc939ebf:zero.rb
  #    fatal: Path 'etc/zero.rb' exists, but not 'zero.rb'.
  #    Did you mean '6644e6cb2ade90b8aff2ebb44728958fbc939ebf:etc/zero.rb' aka '6644e6cb2ade90b8aff2ebb44728958fbc939ebf:./zero.rb'?
  #    git show 6644e6cb2ade90b8aff2ebb44728958fbc939ebf:./zero.rb
  #    (works)
  "git show #{ref}:./#{policyfile_lock_relpath}"
end

def initialize(ref, policyfile_lock_relpath)

def initialize(ref, policyfile_lock_relpath)
  @ref = ref
  @policyfile_lock_relpath = policyfile_lock_relpath
end

def lock

def lock
  git_cmd.run_command
  git_cmd.error!
  FFI_Yajl::Parser.parse(git_cmd.stdout)
rescue Mixlib::ShellOut::ShellCommandFailed
  raise GitError, "Git command `#{git_cmd_string}` failed with message: #{git_cmd.stderr.chomp}"
rescue FFI_Yajl::ParseError => e
  raise MalformedLockfile, "Invalid JSON in lockfile at git ref '#{ref}' at path '#{policyfile_lock_relpath}':\n  #{e.message}"
end

def name

def name
  "git:#{ref}"
end