Class: Berkshelf::GitLocation

Inherits:
BaseLocation show all
Defined in:
lib/berkshelf/locations/git.rb

Direct Known Subclasses

GithubLocation

Defined Under Namespace

Classes: GitCommandError, GitError, GitNotInstalled

Instance Attribute Summary collapse

Attributes inherited from BaseLocation

#dependency, #options

Instance Method Summary collapse

Methods inherited from BaseLocation

#validate_cached!

Constructor Details

#initialize(dependency, options = {}) ⇒ GitLocation

Returns a new instance of GitLocation.



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/berkshelf/locations/git.rb', line 36

def initialize(dependency, options = {})
  super

  @uri      = options[:git]
  @branch   = options[:branch]
  @tag      = options[:tag]
  @ref      = options[:ref]
  @revision = options[:revision]
  @rel      = options[:rel]

  # The revision to parse
  @rev_parse = options[:ref] || options[:branch] || options[:tag] || 'master'
end

Instance Attribute Details

#branchObject (readonly)

Returns the value of attribute branch.



30
31
32
# File 'lib/berkshelf/locations/git.rb', line 30

def branch
  @branch
end

#refObject (readonly)

Returns the value of attribute ref.



32
33
34
# File 'lib/berkshelf/locations/git.rb', line 32

def ref
  @ref
end

#relObject (readonly)

Returns the value of attribute rel.



34
35
36
# File 'lib/berkshelf/locations/git.rb', line 34

def rel
  @rel
end

#revisionObject (readonly)

Returns the value of attribute revision.



33
34
35
# File 'lib/berkshelf/locations/git.rb', line 33

def revision
  @revision
end

#tagObject (readonly)

Returns the value of attribute tag.



31
32
33
# File 'lib/berkshelf/locations/git.rb', line 31

def tag
  @tag
end

#uriObject (readonly)

Returns the value of attribute uri.



29
30
31
# File 'lib/berkshelf/locations/git.rb', line 29

def uri
  @uri
end

Instance Method Details

#==(other) ⇒ Object



109
110
111
112
113
114
115
116
# File 'lib/berkshelf/locations/git.rb', line 109

def ==(other)
  other.is_a?(GitLocation) &&
  other.uri == uri &&
  other.branch == branch &&
  other.tag == tag &&
  other.shortref == shortref &&
  other.rel == rel
end

#cached_cookbookObject



101
102
103
104
105
106
107
# File 'lib/berkshelf/locations/git.rb', line 101

def cached_cookbook
  if installed?
    @cached_cookbook ||= CachedCookbook.from_path(install_path)
  else
    nil
  end
end

#installObject

Install this git cookbook into the cookbook store. This method leverages a cached git copy and a scratch directory to prevent bad cookbooks from making their way into the cookbook store.



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/berkshelf/locations/git.rb', line 60

def install
  scratch_path = Pathname.new(Dir.mktmpdir)

  if cached?
    Dir.chdir(cache_path) do
      git %|fetch --force --tags #{uri} "refs/heads/*:refs/heads/*"|
    end
  else
    git %|clone #{uri} "#{cache_path}" --bare --no-hardlinks|
  end

  Dir.chdir(cache_path) do
    @revision ||= git %|rev-parse #{@rev_parse}|
  end

  # Clone into a scratch directory for validations
  git %|clone --no-checkout "#{cache_path}" "#{scratch_path}"|

  # Make sure the scratch directory is up-to-date and account for rel paths
  Dir.chdir(scratch_path) do
    git %|fetch --force --tags "#{cache_path}"|
    git %|reset --hard #{@revision}|

    if rel
      git %|filter-branch --subdirectory-filter "#{rel}" --force|
    end
  end

  # Validate the scratched path is a valid cookbook
  validate_cached!(scratch_path)

  # If we got this far, we should copy
  FileUtils.rm_rf(install_path) if install_path.exist?
  FileUtils.cp_r(scratch_path, install_path)
  install_path.chmod(0777 & ~File.umask)
ensure
  # Ensure the scratch directory is cleaned up
  FileUtils.rm_rf(scratch_path)
end

#installed?Boolean

Returns:

  • (Boolean)

See Also:

  • BaseLoation#installed?


51
52
53
# File 'lib/berkshelf/locations/git.rb', line 51

def installed?
  revision && install_path.exist?
end

#to_lockObject



128
129
130
131
132
133
134
135
136
# File 'lib/berkshelf/locations/git.rb', line 128

def to_lock
  out =  "    git: #{uri}\n"
  out << "    revision: #{revision}\n"
  out << "    ref: #{shortref}\n"  if shortref
  out << "    branch: #{branch}\n" if branch
  out << "    tag: #{tag}\n"       if tag
  out << "    rel: #{rel}\n"       if rel
  out
end

#to_sObject



118
119
120
121
122
123
124
125
126
# File 'lib/berkshelf/locations/git.rb', line 118

def to_s
  info = tag || branch || shortref || @rev_parse

  if rel
    "#{uri} (at #{info}/#{rel})"
  else
    "#{uri} (at #{info})"
  end
end