librarian-puppet 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +26 -11
- data/lib/librarian/puppet/cli.rb +2 -0
- data/lib/librarian/puppet/environment.rb +3 -0
- data/lib/librarian/puppet/extension.rb +16 -2
- data/lib/librarian/puppet/lockfile/parser.rb +5 -3
- data/lib/librarian/puppet/source/forge/repo.rb +1 -1
- data/lib/librarian/puppet/source/forge/repo_v1.rb +12 -1
- data/lib/librarian/puppet/source/forge/repo_v3.rb +2 -2
- data/lib/librarian/puppet/source/forge.rb +3 -2
- data/lib/librarian/puppet/source/githubtarball/repo.rb +12 -6
- data/lib/librarian/puppet/source/githubtarball.rb +1 -1
- data/lib/librarian/puppet/source/local.rb +3 -3
- data/lib/librarian/puppet/source/repo.rb +1 -1
- data/lib/librarian/puppet/templates/Puppetfile +4 -4
- data/lib/librarian/puppet/util.rb +5 -0
- data/lib/librarian/puppet/version.rb +1 -1
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65da3b51c58c415edbe7148801d7eccd40232fb1
|
4
|
+
data.tar.gz: fa243fef1a099850e0620c79f814561822735b6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 719f6605dc5ceb95ea7917683f2cf833a96ab39d0b1ba6ebd61b96c597d718dd56306497d0bc5bb973dfd6fcf706a59fdf26d70fb361efe5d6236405e277bdb4
|
7
|
+
data.tar.gz: ff64b0efd0c19766d77f27799a900dbc2e5920e15541d3f8d640b6d2d4cc32a1406a3aa21b6be29f4d013a69cc69ba4b8f0ac5a804f2f5798670b729eb7aa07d
|
data/README.md
CHANGED
@@ -28,6 +28,13 @@ It is based on [Librarian](https://github.com/applicationsonline/librarian), a
|
|
28
28
|
framework for writing bundlers, which are tools that resolve, fetch, install,
|
29
29
|
and isolate a project's dependencies.
|
30
30
|
|
31
|
+
## Versions
|
32
|
+
|
33
|
+
Librarian-puppet >= 1.1.0 requires Ruby 1.9 and uses the Puppet Forge API v3.
|
34
|
+
Versions < 1.1.0 works on Ruby 1.8.
|
35
|
+
|
36
|
+
See the [Changelog](Changelog.md) for more details.
|
37
|
+
|
31
38
|
## The Puppetfile
|
32
39
|
|
33
40
|
Every Puppet repository that uses Librarian-puppet will have a file named
|
@@ -47,16 +54,16 @@ This Puppetfile will download all the dependencies listed in your Modulefile fro
|
|
47
54
|
|
48
55
|
forge "https://forge.puppetlabs.com"
|
49
56
|
|
50
|
-
mod
|
51
|
-
mod
|
57
|
+
mod 'puppetlabs-razor'
|
58
|
+
mod 'puppetlabs-ntp', "0.0.3"
|
52
59
|
|
53
|
-
mod
|
60
|
+
mod 'puppetlabs-apt',
|
54
61
|
:git => "git://github.com/puppetlabs/puppetlabs-apt.git"
|
55
62
|
|
56
|
-
mod
|
63
|
+
mod 'puppetlabs-stdlib',
|
57
64
|
:git => "git://github.com/puppetlabs/puppetlabs-stdlib.git"
|
58
65
|
|
59
|
-
mod 'puppetlabs
|
66
|
+
mod 'puppetlabs-apache', '0.6.0',
|
60
67
|
:github_tarball => 'puppetlabs/puppetlabs-apache'
|
61
68
|
|
62
69
|
|
@@ -73,29 +80,29 @@ This declares that we want to use the official Puppet Labs Forge as our default
|
|
73
80
|
source when pulling down modules. If you run your own local forge, you may
|
74
81
|
want to change this.
|
75
82
|
|
76
|
-
mod
|
83
|
+
mod 'puppetlabs-razor'
|
77
84
|
|
78
85
|
Pull in the latest version of the Puppet Labs Razor module from the default
|
79
86
|
source.
|
80
87
|
|
81
|
-
mod
|
88
|
+
mod 'puppetlabs-ntp', "0.0.3"
|
82
89
|
|
83
90
|
Pull in version 0.0.3 of the Puppet Labs NTP module from the default source.
|
84
91
|
|
85
|
-
mod
|
92
|
+
mod 'puppetlabs-apt',
|
86
93
|
:git => "git://github.com/puppetlabs/puppetlabs-apt.git"
|
87
94
|
|
88
95
|
Our puppet infrastructure repository depends on the `apt` module from the
|
89
96
|
Puppet Labs GitHub repos and checks out the `master` branch.
|
90
97
|
|
91
|
-
mod
|
98
|
+
mod 'puppetlabs-apt',
|
92
99
|
:git => "git://github.com/puppetlabs/puppetlabs-apt.git",
|
93
100
|
:ref => '0.0.3'
|
94
101
|
|
95
102
|
Our puppet infrastructure repository depends on the `apt` module from the
|
96
103
|
Puppet Labs GitHub repos and checks out a tag of `0.0.3`.
|
97
104
|
|
98
|
-
mod
|
105
|
+
mod 'puppetlabs-apt',
|
99
106
|
:git => "git://github.com/puppetlabs/puppetlabs-apt.git",
|
100
107
|
:ref => 'feature/master/dans_refactor'
|
101
108
|
|
@@ -117,7 +124,7 @@ with many modules in it. If we need a module from such a repository, we can
|
|
117
124
|
use the `:path =>` option here to help Librarian-puppet drill down and find the
|
118
125
|
module subdirectory.
|
119
126
|
|
120
|
-
mod
|
127
|
+
mod 'puppetlabs-apt',
|
121
128
|
:git => "git://github.com/fake/puppet-modules.git",
|
122
129
|
:path => "modules/apt"
|
123
130
|
|
@@ -154,6 +161,14 @@ source specified. This command writes the complete resolution into
|
|
154
161
|
`Puppetfile.lock` and then copies all of the fetched modules into your
|
155
162
|
`modules/` directory, overwriting whatever was there before.
|
156
163
|
|
164
|
+
Librarian-puppet support both v1 and v3 of the Puppet Forge API.
|
165
|
+
Specify a specific API version when installing modules:
|
166
|
+
|
167
|
+
$ librarian-puppet install --use-v1-api # this is default
|
168
|
+
$ librarian-puppet install --no-use-v1-api # use the v3 API
|
169
|
+
|
170
|
+
Please note that this does not apply for the official Puppet Forge where v3 is used by default.
|
171
|
+
|
157
172
|
Get an overview of your `Puppetfile.lock` with:
|
158
173
|
|
159
174
|
$ librarian-puppet show
|
data/lib/librarian/puppet/cli.rb
CHANGED
@@ -44,6 +44,7 @@ module Librarian
|
|
44
44
|
option "path", :type => :string
|
45
45
|
option "destructive", :type => :boolean, :default => false
|
46
46
|
option "local", :type => :boolean, :default => false
|
47
|
+
option "use-v1-api", :type => :boolean, :default => true
|
47
48
|
def install
|
48
49
|
|
49
50
|
unless File.exist?('Puppetfile')
|
@@ -64,6 +65,7 @@ module Librarian
|
|
64
65
|
environment.config_db.local["path"] = options["path"]
|
65
66
|
end
|
66
67
|
|
68
|
+
environment.config_db.local['use-v1-api'] = options['use-v1-api'] ? '1' : nil
|
67
69
|
environment.config_db.local['mode'] = options['local'] ? 'local' : nil
|
68
70
|
|
69
71
|
resolve!
|
@@ -8,6 +8,19 @@ module Librarian
|
|
8
8
|
end
|
9
9
|
|
10
10
|
class Dependency
|
11
|
+
include Librarian::Puppet::Util
|
12
|
+
|
13
|
+
def initialize(name, requirement, source)
|
14
|
+
assert_name_valid! name
|
15
|
+
|
16
|
+
# let's settle on provider-module syntax instead of provider/module
|
17
|
+
self.name = normalize_name(name)
|
18
|
+
self.requirement = Requirement.new(requirement)
|
19
|
+
self.source = source
|
20
|
+
|
21
|
+
@manifests = nil
|
22
|
+
end
|
23
|
+
|
11
24
|
class Requirement
|
12
25
|
def initialize(*args)
|
13
26
|
args = initialize_normalize_args(args)
|
@@ -84,6 +97,8 @@ module Librarian
|
|
84
97
|
end
|
85
98
|
|
86
99
|
class ManifestSet
|
100
|
+
include Librarian::Puppet::Util
|
101
|
+
|
87
102
|
private
|
88
103
|
|
89
104
|
# Check if module doesn't exist and fail fast
|
@@ -93,7 +108,7 @@ module Librarian
|
|
93
108
|
|
94
109
|
deps = Set.new
|
95
110
|
until names.empty?
|
96
|
-
name = names.shift
|
111
|
+
name = normalize_name(names.shift)
|
97
112
|
next if deps.include?(name)
|
98
113
|
|
99
114
|
deps << name
|
@@ -105,7 +120,6 @@ module Librarian
|
|
105
120
|
end
|
106
121
|
|
107
122
|
class Manifest
|
108
|
-
|
109
123
|
class PreReleaseVersion
|
110
124
|
|
111
125
|
# Compares pre-release component ids using Semver 2.0.0 spec
|
@@ -5,6 +5,7 @@ require 'librarian/manifest_set'
|
|
5
5
|
module Librarian
|
6
6
|
class Lockfile
|
7
7
|
class Parser
|
8
|
+
include Librarian::Puppet::Util
|
8
9
|
|
9
10
|
def parse(string)
|
10
11
|
string = string.dup
|
@@ -26,8 +27,8 @@ module Librarian
|
|
26
27
|
manifests = {}
|
27
28
|
while lines.first =~ /^ {4}([\w\-\/]+) \((.*)\)$/ # This change allows forward slash
|
28
29
|
lines.shift
|
29
|
-
name = $1
|
30
|
-
manifests[name] = {:version =>
|
30
|
+
name, version = normalize_name($1), $2
|
31
|
+
manifests[name] = {:version => version, :dependencies => {}}
|
31
32
|
while lines.first =~ /^ {6}([\w\-\/]+) \((.*)\)$/
|
32
33
|
lines.shift
|
33
34
|
manifests[name][:dependencies][$1] = $2.split(/,\s*/)
|
@@ -42,9 +43,10 @@ module Librarian
|
|
42
43
|
dependencies = []
|
43
44
|
while lines.first =~ /^ {2}([\w\-\/]+)(?: \((.*)\))?$/ # This change allows forward slash
|
44
45
|
lines.shift
|
45
|
-
name, requirement = $1, $2.split(/,\s*/)
|
46
|
+
name, requirement = normalize_name($1), $2.split(/,\s*/)
|
46
47
|
dependencies << Dependency.new(name, requirement, manifests_index[name].source)
|
47
48
|
end
|
49
|
+
|
48
50
|
Resolution.new(dependencies, manifests)
|
49
51
|
end
|
50
52
|
|
@@ -59,7 +59,7 @@ module Librarian
|
|
59
59
|
install_path.rmtree
|
60
60
|
end
|
61
61
|
|
62
|
-
unpacked_path = version_unpacked_cache_path(version).join(name.split('
|
62
|
+
unpacked_path = version_unpacked_cache_path(version).join(name.split('-').last)
|
63
63
|
|
64
64
|
unless unpacked_path.exist?
|
65
65
|
raise Error, "#{unpacked_path} does not exist, something went wrong. Try removing it manually"
|
@@ -34,11 +34,15 @@ module Librarian
|
|
34
34
|
private
|
35
35
|
|
36
36
|
# Issue #223 dependencies may be duplicated
|
37
|
+
# and convert organization/modulename to organization-modulename
|
37
38
|
def clear_duplicated_dependencies(data)
|
38
39
|
return nil if data.nil?
|
39
40
|
data.each do |m,versions|
|
40
41
|
versions.each do |v|
|
41
42
|
if v["dependencies"] and !v["dependencies"].empty?
|
43
|
+
# convert organization/modulename to organization-modulename
|
44
|
+
v["dependencies"].each {|d| d[0] = normalize_name(d[0])}
|
45
|
+
|
42
46
|
dependency_names = v["dependencies"].map {|d| d[0]}
|
43
47
|
duplicated = dependency_names.select{ |e| dependency_names.count(e) > 1 }
|
44
48
|
unless duplicated.empty?
|
@@ -53,6 +57,13 @@ module Librarian
|
|
53
57
|
end
|
54
58
|
end
|
55
59
|
end
|
60
|
+
# convert organization/modulename to organization-modulename
|
61
|
+
data.keys.each do |m|
|
62
|
+
if m =~ %r{.*/.*}
|
63
|
+
data[normalize_name(m)] = data[m]
|
64
|
+
data.delete(m)
|
65
|
+
end
|
66
|
+
end
|
56
67
|
data
|
57
68
|
end
|
58
69
|
|
@@ -79,7 +90,7 @@ module Librarian
|
|
79
90
|
def api_call(module_name, version=nil)
|
80
91
|
url = source.uri.clone
|
81
92
|
url.path += "#{'/' if url.path.empty? or url.path[-1] != '/'}api/v1/releases.json"
|
82
|
-
url.query = "module=#{module_name}"
|
93
|
+
url.query = "module=#{module_name.sub('-','/')}" # v1 API expects "organization/module"
|
83
94
|
url.query += "&version=#{version}" unless version.nil?
|
84
95
|
debug { "Querying Forge API for module #{name}#{" and version #{version}" unless version.nil?}: #{url}" }
|
85
96
|
|
@@ -25,7 +25,7 @@ module Librarian
|
|
25
25
|
else
|
26
26
|
# should never get here as we use one repo object for each module (to be changed in the future)
|
27
27
|
debug { "Looking up url for #{name}@#{version}" }
|
28
|
-
release = PuppetForge::Release.find("#{name
|
28
|
+
release = PuppetForge::Release.find("#{name}-#{version}")
|
29
29
|
end
|
30
30
|
"#{source}#{release.file_uri}"
|
31
31
|
end
|
@@ -33,7 +33,7 @@ module Librarian
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def get_module
|
36
|
-
@module ||= PuppetForge::Module.find(name
|
36
|
+
@module ||= PuppetForge::Module.find(name)
|
37
37
|
raise(Error, "Unable to find module '#{name}' on #{source}") unless @module
|
38
38
|
@module
|
39
39
|
end
|
@@ -121,7 +121,7 @@ module Librarian
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def install_path(name)
|
124
|
-
environment.install_path.join(name.split('
|
124
|
+
environment.install_path.join(name.split('-').last)
|
125
125
|
end
|
126
126
|
|
127
127
|
def fetch_version(name, version_uri)
|
@@ -148,9 +148,10 @@ module Librarian
|
|
148
148
|
|
149
149
|
def repo(name)
|
150
150
|
@repo ||= {}
|
151
|
+
|
151
152
|
unless @repo[name]
|
152
153
|
# if we are using the official Forge then use API v3, otherwise stick to v1 for now
|
153
|
-
if uri.hostname =~ /\.puppetlabs\.com$/
|
154
|
+
if uri.hostname =~ /\.puppetlabs\.com$/ || !environment.use_v1_api
|
154
155
|
@repo[name] = RepoV3.new(self, name)
|
155
156
|
else
|
156
157
|
@repo[name] = RepoV1.new(self, name)
|
@@ -40,11 +40,11 @@ module Librarian
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def install_version!(version, install_path)
|
43
|
-
if environment.local? && !vendored?(
|
43
|
+
if environment.local? && !vendored?(vendored_name, version)
|
44
44
|
raise Error, "Could not find a local copy of #{source.uri} at #{version}."
|
45
45
|
end
|
46
46
|
|
47
|
-
vendor_cache(source.uri.to_s, version) unless vendored?(
|
47
|
+
vendor_cache(source.uri.to_s, version) unless vendored?(vendored_name, version)
|
48
48
|
|
49
49
|
cache_version_unpacked! version
|
50
50
|
|
@@ -62,19 +62,19 @@ module Librarian
|
|
62
62
|
|
63
63
|
path.mkpath
|
64
64
|
|
65
|
-
target = vendored?(
|
65
|
+
target = vendored?(vendored_name, version) ? vendored_path(vendored_name, version) : name
|
66
66
|
|
67
67
|
Librarian::Posix.run!(%W{tar xzf #{target} -C #{path}})
|
68
68
|
end
|
69
69
|
|
70
70
|
def vendor_cache(name, version)
|
71
|
-
clean_up_old_cached_versions(name)
|
71
|
+
clean_up_old_cached_versions(vendored_name(name))
|
72
72
|
|
73
73
|
url = "https://api.github.com/repos/#{name}/tarball/#{version}"
|
74
74
|
add_api_token_to_url(url)
|
75
75
|
|
76
76
|
environment.vendor!
|
77
|
-
File.open(vendored_path(name, version).to_s, 'wb') do |f|
|
77
|
+
File.open(vendored_path(vendored_name(name), version).to_s, 'wb') do |f|
|
78
78
|
begin
|
79
79
|
debug { "Downloading <#{url}> to <#{f.path}>" }
|
80
80
|
open(url,
|
@@ -90,7 +90,7 @@ module Librarian
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def clean_up_old_cached_versions(name)
|
93
|
-
Dir["#{environment.vendor_cache}/#{name
|
93
|
+
Dir["#{environment.vendor_cache}/#{name}*.tar.gz"].each do |old_version|
|
94
94
|
FileUtils.rm old_version
|
95
95
|
end
|
96
96
|
end
|
@@ -106,6 +106,8 @@ module Librarian
|
|
106
106
|
def add_api_token_to_url url
|
107
107
|
if token_key_nil?
|
108
108
|
debug { "#{TOKEN_KEY} environment value is empty or missing" }
|
109
|
+
elsif url.include? "?"
|
110
|
+
url << "&access_token=#{ENV[TOKEN_KEY]}"
|
109
111
|
else
|
110
112
|
url << "?access_token=#{ENV[TOKEN_KEY]}"
|
111
113
|
end
|
@@ -159,6 +161,10 @@ module Librarian
|
|
159
161
|
options[:headers].each { |k, v| request.add_field k, v }
|
160
162
|
http.request(request)
|
161
163
|
end
|
164
|
+
|
165
|
+
def vendored_name(name = source.uri.to_s)
|
166
|
+
name.sub('/','-')
|
167
|
+
end
|
162
168
|
end
|
163
169
|
end
|
164
170
|
end
|
@@ -26,11 +26,11 @@ module Librarian
|
|
26
26
|
found_path = found_path(name)
|
27
27
|
raise Error, "Path for #{name} doesn't contain a puppet module" if found_path.nil?
|
28
28
|
|
29
|
-
unless name.include? '/'
|
30
|
-
warn { "Invalid module name '#{name}', you should qualify it with 'ORGANIZATION
|
29
|
+
unless name.include? '/' or name.include? '-'
|
30
|
+
warn { "Invalid module name '#{name}', you should qualify it with 'ORGANIZATION-#{name}' for resolution to work correctly" }
|
31
31
|
end
|
32
32
|
|
33
|
-
install_path = environment.install_path.join(name.split('
|
33
|
+
install_path = environment.install_path.join(name.split('-').last)
|
34
34
|
if install_path.exist?
|
35
35
|
debug { "Deleting #{relative_path_to(install_path)}" }
|
36
36
|
install_path.rmtree
|
@@ -7,16 +7,16 @@ forge "https://forgeapi.puppetlabs.com"
|
|
7
7
|
modulefile
|
8
8
|
|
9
9
|
# A module from the Puppet Forge
|
10
|
-
# mod 'puppetlabs
|
10
|
+
# mod 'puppetlabs-stdlib'
|
11
11
|
|
12
12
|
# A module from git
|
13
|
-
# mod 'puppetlabs
|
13
|
+
# mod 'puppetlabs-ntp',
|
14
14
|
# :git => 'git://github.com/puppetlabs/puppetlabs-ntp.git'
|
15
15
|
|
16
16
|
# A module from a git branch/tag
|
17
|
-
# mod 'puppetlabs
|
17
|
+
# mod 'puppetlabs-apt',
|
18
18
|
# :git => 'https://github.com/puppetlabs/puppetlabs-apt.git',
|
19
19
|
# :ref => '1.4.x'
|
20
20
|
|
21
21
|
# A module from Github pre-packaged tarball
|
22
|
-
# mod 'puppetlabs
|
22
|
+
# mod 'puppetlabs-apache', '0.6.0', :github_tarball => 'puppetlabs/puppetlabs-apache'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: librarian-puppet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Sharpe
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: librarian
|
@@ -39,20 +39,6 @@ dependencies:
|
|
39
39
|
- - '>='
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: json
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - '>='
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: '0'
|
49
|
-
type: :runtime
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - '>='
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: '0'
|
56
42
|
- !ruby/object:Gem::Dependency
|
57
43
|
name: rake
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -200,7 +186,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
186
|
requirements:
|
201
187
|
- - '>='
|
202
188
|
- !ruby/object:Gem::Version
|
203
|
-
version:
|
189
|
+
version: 1.9.0
|
204
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
191
|
requirements:
|
206
192
|
- - '>='
|