Class: Librarian::Puppet::Source::Forge::Repo

Inherits:
Repo
  • Object
show all
Includes:
Util
Defined in:
lib/librarian/puppet/source/forge/repo.rb

Direct Known Subclasses

RepoV1, RepoV3

Instance Attribute Summary

Attributes inherited from Repo

#name, #source

Instance Method Summary collapse

Methods included from Util

#clean_uri, #cp_r, #debug, #info, #module_name, #normalize_name, #rsync?, #warn

Methods inherited from Repo

#cache_path, #environment, #initialize, #vendored?, #vendored_path, #version_unpacked_cache_path

Constructor Details

This class inherits a constructor from Librarian::Puppet::Source::Repo

Instance Method Details

#cache_version_unpacked!(version) ⇒ Object



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
99
100
101
102
103
104
105
106
# File 'lib/librarian/puppet/source/forge/repo.rb', line 70

def cache_version_unpacked!(version)
  path = version_unpacked_cache_path(version)
  return if path.directory?

  path.mkpath

  target = vendored?(name, version) ? vendored_path(name, version).to_s : name

  module_repository = source.uri.to_s

  command = %W[puppet module install --version #{version} --target-dir]
  command.push(path.to_s, '--module_repository', module_repository, '--modulepath', path.to_s,
               '--module_working_dir', path.to_s, '--ignore-dependencies', target)
  debug do
    "Executing puppet module install for #{name} #{version}: #{command.join(' ').gsub(module_repository,
                                                                                      source.to_s)}"
  end

  begin
    Librarian::Posix.run!(command)
  rescue Posix::CommandFailure => e
    # Rollback the directory if the puppet module had an error
    begin
      path.unlink
    rescue StandardError => u
      debug("Unable to rollback path #{path}: #{u}")
    end
    tar = Dir[File.join(path.to_s, '**/*.tar.gz')]
    msg = ''
    if e.message =~ /Unexpected EOF in archive/ and !tar.empty?
      file = tar.first
      msg = " (looks like an incomplete download of #{file})"
    end
    raise Error,
          "Error executing puppet module install#{msg}. Check that this command succeeds:\n#{command.join(' ')}\nError:\n#{e.message}"
  end
end

#dependencies(version) ⇒ Object

return map with dependencies in the form => version,… version: Librarian::Manifest::Version



34
35
36
# File 'lib/librarian/puppet/source/forge/repo.rb', line 34

def dependencies(version)
  # implement in subclasses
end

#get_versionsObject

fetch list of versions ordered for newer to older



28
29
30
# File 'lib/librarian/puppet/source/forge/repo.rb', line 28

def get_versions
  # implement in subclasses
end

#install_version!(version, install_path) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/librarian/puppet/source/forge/repo.rb', line 50

def install_version!(version, install_path)
  if environment.local? && !vendored?(name, version)
    raise Error, "Could not find a local copy of #{name} at #{version}."
  end

  vendor_cache(name, version) if environment.vendor? && !vendored?(name, version)

  cache_version_unpacked! version

  install_path.rmtree if install_path.exist? && rsync? != true

  unpacked_path = version_unpacked_cache_path(version).join(module_name(name))

  unless unpacked_path.exist?
    raise Error, "#{unpacked_path} does not exist, something went wrong. Try removing it manually"
  end

  cp_r(unpacked_path, install_path)
end

#manifestsObject



44
45
46
47
48
# File 'lib/librarian/puppet/source/forge/repo.rb', line 44

def manifests
  versions.map do |version|
    Manifest.new(source, name, version)
  end
end

#url(name, version) ⇒ Object

return the url for a specific version tarball version: Librarian::Manifest::Version



40
41
42
# File 'lib/librarian/puppet/source/forge/repo.rb', line 40

def url(name, version)
  # implement in subclasses
end

#vendor_cache(name, version) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
# File 'lib/librarian/puppet/source/forge/repo.rb', line 108

def vendor_cache(name, version)
  url = url(name, version)
  path = vendored_path(name, version).to_s
  debug { "Downloading #{url} into #{path}" }
  environment.vendor!
  File.open(path, 'wb') do |f|
    URI.open(url, 'rb') do |input|
      f.write(input.read)
    end
  end
end

#versionsObject



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/librarian/puppet/source/forge/repo.rb', line 15

def versions
  return @versions if @versions

  @versions = get_versions
  if @versions.empty?
    info { "No versions found for module #{name}" }
  else
    debug { "  Module #{name} found versions: #{@versions.join(', ')}" }
  end
  @versions
end