puppet-forge-server 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/lib/puppet_forge_server.rb +2 -3
- data/lib/puppet_forge_server/api/v1/modules.rb +22 -35
- data/lib/puppet_forge_server/api/v1/releases.rb +2 -2
- data/lib/puppet_forge_server/api/v3/modules.rb +5 -6
- data/lib/puppet_forge_server/api/v3/releases.rb +1 -1
- data/lib/puppet_forge_server/backends/directory.rb +1 -1
- data/lib/puppet_forge_server/http/http_client.rb +4 -1
- data/lib/puppet_forge_server/patches/gem.rb +21 -0
- data/lib/puppet_forge_server/server.rb +6 -7
- data/lib/puppet_forge_server/utils/archiver.rb +6 -4
- data/lib/puppet_forge_server/utils/option_parser.rb +15 -15
- data/lib/puppet_forge_server/version.rb +1 -1
- data/puppet-forge-server.gemspec +1 -0
- metadata +17 -4
- data/lib/puppet_forge_server/patches.rb +0 -72
- data/lib/puppet_forge_server/utils/url.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f47167acd969b4e7d7725a351d02c9a4d6e5608
|
4
|
+
data.tar.gz: fe6cb62aec95aa35517235e90f965ac267b72790
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb7deb4e4e51e3a1c0942de9e5455740b70587bccee7720d011ad61a75f5d87072357434bcca429a747fbab6f4b243aa9abe74f33b394d3fd38198f3d20ed3e3
|
7
|
+
data.tar.gz: 2ca911fd043d05967a887815d8121b76c0d2960f82d7922ef562fa3b1c476a94d36bdb8a4cfe3c01946e8888dbefe036ceff2bfa49e3359f125c7128dbd00049
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Puppet Forge Server
|
2
2
|
|
3
|
-
Private Puppet Forge Server supporting local files and both v1 and v3 API proxies.
|
3
|
+
Private Puppet Forge Server supporting local files and both v1 and v3 API proxies.
|
4
4
|
|
5
5
|
[![Build Status](https://api.travis-ci.org/unibet/puppet-forge-server.svg)](https://travis-ci.org/unibet/puppet-forge-server)
|
6
6
|
[![Gem Version](https://badge.fury.io/rb/puppet-forge-server.svg)](http://badge.fury.io/rb/puppet-forge-server)
|
@@ -216,5 +216,4 @@ Puppet module *metadata* json representation is used as a main business *model*.
|
|
216
216
|
|
217
217
|
## Reference
|
218
218
|
|
219
|
-
* [Puppet Library](https://github.com/drrb/puppet-library)
|
220
219
|
* [Puppet Anvil](https://github.com/jhaals/puppet-anvil)
|
data/lib/puppet_forge_server.rb
CHANGED
@@ -14,8 +14,8 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
require 'puppet_forge_server/patches'
|
18
17
|
require 'puppet_forge_server/version'
|
18
|
+
require 'puppet_forge_server/patches/gem.rb'
|
19
19
|
|
20
20
|
module PuppetForgeServer
|
21
21
|
autoload :Server, 'puppet_forge_server/server'
|
@@ -57,7 +57,6 @@ module PuppetForgeServer
|
|
57
57
|
module Utils
|
58
58
|
autoload :Archiver, 'puppet_forge_server/utils/archiver'
|
59
59
|
autoload :OptionParser, 'puppet_forge_server/utils/option_parser'
|
60
|
-
autoload :Url, 'puppet_forge_server/utils/url'
|
61
60
|
autoload :Buffer, 'puppet_forge_server/utils/buffer'
|
62
61
|
autoload :Http, 'puppet_forge_server/utils/http'
|
63
62
|
end
|
@@ -65,4 +64,4 @@ module PuppetForgeServer
|
|
65
64
|
module Http
|
66
65
|
autoload :HttpClient, 'puppet_forge_server/http/http_client'
|
67
66
|
end
|
68
|
-
end
|
67
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright
|
4
|
-
# Copyright 2014 North Development AB
|
3
|
+
# Copyright 2015 North Development AB
|
5
4
|
#
|
6
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
6
|
# you may not use this file except in compliance with the License.
|
@@ -19,49 +18,37 @@ module PuppetForgeServer::Api::V1
|
|
19
18
|
module Modules
|
20
19
|
|
21
20
|
def get_modules(metadata)
|
22
|
-
modules =
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
modules = {}
|
22
|
+
metadata.each do |element|
|
23
|
+
if modules[element[:metadata].name]
|
24
|
+
if max_version(modules[element[:metadata].name][:version], element[:metadata].version) == element[:metadata].version
|
25
|
+
modules[element[:metadata].name][:desc] = element[:metadata].description
|
26
|
+
modules[element[:metadata].name][:version] = element[:metadata].version
|
27
|
+
modules[element[:metadata].name][:project_url] = element[:metadata].project_page
|
28
|
+
end
|
29
|
+
modules[element[:metadata].name][:releases] = (modules[element[:metadata].name][:releases] + releases_version(element[:metadata])).uniq.sort_by { |r| Gem::Version.new(r[:version]) }.reverse
|
30
|
+
modules[element[:metadata].name][:tag_list] = (modules[element[:metadata].name][:tag_list] + element[:tags]).uniq.compact
|
31
|
+
else
|
32
|
+
name = element[:metadata].name.sub(/^[^-]+-/, '')
|
33
|
+
modules[element[:metadata].name] = {
|
26
34
|
:author => element[:metadata].author,
|
27
|
-
:full_name =>
|
35
|
+
:full_name => element[:metadata].name.sub('-', '/'),
|
28
36
|
:name => name,
|
29
37
|
:desc => element[:metadata].description,
|
30
38
|
:version => element[:metadata].version,
|
31
39
|
:project_url => element[:metadata].project_page,
|
32
|
-
:releases =>
|
33
|
-
:tag_list => [element[:metadata].author, name]
|
34
|
-
|
40
|
+
:releases => releases_version(element[:metadata]),
|
41
|
+
:tag_list => element[:tags] ? element[:tags] : [element[:metadata].author, name],
|
42
|
+
}
|
43
|
+
end
|
35
44
|
end
|
36
45
|
|
37
|
-
|
46
|
+
modules.values
|
38
47
|
end
|
39
48
|
|
40
49
|
private
|
41
|
-
def
|
42
|
-
|
43
|
-
result[:full_name]
|
44
|
-
end
|
45
|
-
|
46
|
-
grouped_modules.values.map do |value|
|
47
|
-
merge_values(value)
|
48
|
-
end.flatten.uniq
|
49
|
-
end
|
50
|
-
|
51
|
-
def merge_values(value)
|
52
|
-
highest_version, tags, releases = value.inject([nil, [], []]) do |(highest_version, tags, releases), result|
|
53
|
-
[
|
54
|
-
max_version(highest_version, result[:version]),
|
55
|
-
tags + (result[:tag_list] || []),
|
56
|
-
releases + (result[:releases] || [])
|
57
|
-
]
|
58
|
-
end
|
59
|
-
|
60
|
-
value.first.tap do |result|
|
61
|
-
result[:version] = highest_version
|
62
|
-
result[:tag_list] = tags.uniq
|
63
|
-
result[:releases] = releases.uniq.version_sort_by { |r| r[:version] }.reverse
|
64
|
-
end
|
50
|
+
def releases_version(metadata)
|
51
|
+
[{:version => metadata.version}]
|
65
52
|
end
|
66
53
|
|
67
54
|
def max_version(left, right)
|
@@ -21,9 +21,9 @@ module PuppetForgeServer::Api::V1
|
|
21
21
|
{
|
22
22
|
:file => "/api/v1/files#{element[:path]}",
|
23
23
|
:version => element[:metadata].version,
|
24
|
-
:dependencies => element[:metadata].dependencies.map {|dep| [dep.name, dep.version_requirement]}
|
24
|
+
:dependencies => element[:metadata].dependencies.map {|dep| [dep.name, dep.version_requirement]}.compact
|
25
25
|
}
|
26
|
-
end.
|
26
|
+
end.uniq{|r| r[:version]}.sort_by {|r| Gem::Version.new(r[:version])}
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -23,22 +23,21 @@ module PuppetForgeServer::Api::V3
|
|
23
23
|
metadata.each do |element|
|
24
24
|
if modules[element[:metadata].name]
|
25
25
|
if max_version(modules[element[:metadata].name][:current_release][:version], element[:metadata].version) == element[:metadata].version
|
26
|
+
# Saving curret release tags for merging with new max version current release
|
26
27
|
tags = modules[element[:metadata].name][:current_release][:tags]
|
27
28
|
modules[element[:metadata].name][:current_release] = get_releases([element]).first
|
28
|
-
modules[element[:metadata].name][:current_release][:tags] = (modules[element[:metadata].name][:current_release][:tags] + tags).uniq
|
29
|
+
modules[element[:metadata].name][:current_release][:tags] = (modules[element[:metadata].name][:current_release][:tags] + tags).uniq.compact
|
29
30
|
end
|
30
|
-
modules[element[:metadata].name][:releases] = (modules[element[:metadata].name][:releases] + releases_version(element[:metadata])).
|
31
|
+
modules[element[:metadata].name][:releases] = (modules[element[:metadata].name][:releases] + releases_version(element[:metadata])).uniq.sort_by { |r| Gem::Version.new(r[:version]) }.reverse
|
31
32
|
else
|
32
|
-
name = element[:metadata].name.sub(/^[^-]+-/, '')
|
33
|
-
author = element[:metadata].name.split('-')[0]
|
34
33
|
modules[element[:metadata].name] = {
|
35
34
|
:uri => "/v3/modules/#{element[:metadata].name}",
|
36
|
-
:name => name,
|
35
|
+
:name => element[:metadata].name.sub(/^[^-]+-/, ''),
|
37
36
|
:homepage_url => element[:metadata].project_page,
|
38
37
|
:issues_url => element[:metadata].issues_url,
|
39
38
|
:releases => releases_version(element[:metadata]),
|
40
39
|
:current_release => get_releases([element]).first,
|
41
|
-
:owner => {:username => author, :uri => "/v3/users/#{author}"}
|
40
|
+
:owner => {:username => element[:metadata].author, :uri => "/v3/users/#{element[:metadata].author}"}
|
42
41
|
}
|
43
42
|
end
|
44
43
|
end
|
@@ -54,7 +54,7 @@ module PuppetForgeServer::Backends
|
|
54
54
|
|
55
55
|
private
|
56
56
|
def read_metadata(archive_path)
|
57
|
-
metadata_file =
|
57
|
+
metadata_file = read_from_archive(archive_path, %r[[^/]+/metadata\.json$])
|
58
58
|
JSON.parse(metadata_file)
|
59
59
|
rescue => error
|
60
60
|
warn "Error reading from module archive #{archive_path}: #{error}"
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
require 'open-uri'
|
18
18
|
require 'open_uri_redirections'
|
19
|
+
require 'timeout'
|
19
20
|
|
20
21
|
module PuppetForgeServer::Http
|
21
22
|
class HttpClient
|
@@ -29,7 +30,9 @@ module PuppetForgeServer::Http
|
|
29
30
|
|
30
31
|
private
|
31
32
|
def open_uri(url)
|
32
|
-
|
33
|
+
::Timeout.timeout(10) do
|
34
|
+
open(url, 'User-Agent' => "Puppet-Forge-Server/#{PuppetForgeServer::VERSION}", :allow_redirections => :safe)
|
35
|
+
end
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2015 North Development AB
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
class Gem::Version
|
18
|
+
def initialize version
|
19
|
+
@version = self.class.correct?(version) ? version.to_s.strip.gsub('-', '.pre.') : '0'
|
20
|
+
end
|
21
|
+
end
|
@@ -92,21 +92,20 @@ module PuppetForgeServer
|
|
92
92
|
|
93
93
|
private
|
94
94
|
def backends(options)
|
95
|
-
|
95
|
+
# Add directory backend for serving cached modules in case proxy flips over
|
96
|
+
backends = options[:backend]['Proxy'] && ! options[:backend]['Proxy'].empty? ? [PuppetForgeServer::Backends.const_get('Directory').new(options[:cache_basedir])] : []
|
97
|
+
backends << options[:backend].map do |type, typed_backends|
|
96
98
|
typed_backends.map do |url|
|
97
99
|
case type
|
98
100
|
when 'Proxy'
|
99
101
|
@log.info "Detecting API version for #{url}..."
|
100
|
-
[
|
101
|
-
PuppetForgeServer::Backends.const_get("#{type}V#{get_api_version(url)}").new(url.chomp('/'), options[:cache_basedir]),
|
102
|
-
# Add directory backend for serving cached modules in case proxy flips over
|
103
|
-
PuppetForgeServer::Backends.const_get('Directory').new(options[:cache_basedir])
|
104
|
-
]
|
102
|
+
PuppetForgeServer::Backends.const_get("#{type}V#{get_api_version(url)}").new(url.chomp('/'), options[:cache_basedir])
|
105
103
|
else
|
106
104
|
PuppetForgeServer::Backends.const_get(type).new(url)
|
107
105
|
end
|
108
106
|
end
|
109
|
-
end
|
107
|
+
end
|
108
|
+
backends.flatten.sort_by { |backend| backend.PRIORITY }
|
110
109
|
end
|
111
110
|
end
|
112
111
|
end
|
@@ -19,11 +19,13 @@ require 'zlib'
|
|
19
19
|
|
20
20
|
module PuppetForgeServer::Utils
|
21
21
|
module Archiver
|
22
|
-
def
|
23
|
-
tar = Gem::Package::TarReader.new(Zlib::GzipReader.open(
|
22
|
+
def read_from_archive(archive, name_regex)
|
23
|
+
tar = Gem::Package::TarReader.new(Zlib::GzipReader.open(archive))
|
24
24
|
tar.rewind
|
25
|
-
|
26
|
-
|
25
|
+
tar.each do |obj|
|
26
|
+
return obj.read if obj.full_name =~ name_regex
|
27
|
+
end
|
28
|
+
raise "Given name #{name_regex} not found in #{archive}"
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright
|
4
|
-
# Copyright 2014 North Development AB
|
3
|
+
# Copyright 2015 North Development AB
|
5
4
|
#
|
6
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
6
|
# you may not use this file except in compliance with the License.
|
@@ -17,10 +16,10 @@
|
|
17
16
|
|
18
17
|
require 'optparse'
|
19
18
|
require 'tmpdir'
|
19
|
+
require 'uri'
|
20
20
|
|
21
21
|
module PuppetForgeServer::Utils
|
22
22
|
module OptionParser
|
23
|
-
include PuppetForgeServer::Utils::Url
|
24
23
|
|
25
24
|
@@DEFAULT_DAEMONIZE = false
|
26
25
|
@@DEFAULT_PORT = 8080
|
@@ -28,42 +27,43 @@ module PuppetForgeServer::Utils
|
|
28
27
|
@@DEFAULT_CACHE_DIR = File.join(Dir.tmpdir.to_s, 'puppet-forge-server', 'cache')
|
29
28
|
@@DEFAULT_LOG_DIR = File.join(Dir.tmpdir.to_s, 'puppet-forge-server', 'log')
|
30
29
|
@@DEFAULT_WEBUI_ROOT = File.expand_path('../app', File.dirname(__FILE__))
|
30
|
+
@@DEFAULT_HOST = '0.0.0.0'
|
31
31
|
|
32
32
|
def parse_options(args)
|
33
|
-
options = {:daemonize => @@DEFAULT_DAEMONIZE, :cache_basedir => @@DEFAULT_CACHE_DIR, :port => @@DEFAULT_PORT, :webui_root => @@DEFAULT_WEBUI_ROOT}
|
33
|
+
options = {:daemonize => @@DEFAULT_DAEMONIZE, :cache_basedir => @@DEFAULT_CACHE_DIR, :port => @@DEFAULT_PORT, :webui_root => @@DEFAULT_WEBUI_ROOT, :host => @@DEFAULT_HOST}
|
34
34
|
option_parser = ::OptionParser.new do |opts|
|
35
35
|
opts.banner = "Usage: #{File.basename $0} [options]"
|
36
36
|
opts.version = PuppetForgeServer::VERSION
|
37
37
|
|
38
|
-
opts.on('-p',
|
38
|
+
opts.on('-p', '--port PORT', "Port number to bind to (default: #{@@DEFAULT_PORT})") do |port|
|
39
39
|
options[:port] = port
|
40
40
|
end
|
41
41
|
|
42
|
-
opts.on('-b', '--bind
|
43
|
-
options[:
|
42
|
+
opts.on('-b', '--bind HOST', "Host name or IP address to bind to (default: #{@@DEFAULT_HOST})") do |host|
|
43
|
+
options[:host] = host
|
44
44
|
end
|
45
45
|
|
46
|
-
opts.on('-D', '--daemonize', "Run
|
46
|
+
opts.on('-D', '--daemonize', "Run server in the background (default: #{@@DEFAULT_DAEMONIZE})") do
|
47
47
|
options[:daemonize] = true
|
48
48
|
end
|
49
49
|
|
50
|
-
opts.on('--pidfile FILE',
|
50
|
+
opts.on('--pidfile FILE', "Pid file location (default: #{@@DEFAULT_PID_FILE})") do |pidfile|
|
51
51
|
options[:pidfile] = pidfile
|
52
52
|
end
|
53
53
|
|
54
54
|
options[:backend] = {'Directory' => [], 'Proxy' => [], 'Source' => []}
|
55
|
-
opts.on('-m', '--module-dir DIR', 'Directory containing packaged modules (
|
55
|
+
opts.on('-m', '--module-dir DIR', 'Directory containing packaged modules (recursively searched)') do |module_dir|
|
56
56
|
options[:backend]['Directory'] << module_dir
|
57
57
|
end
|
58
|
-
opts.on('-x', '--proxy URL', 'Remote forge
|
59
|
-
options[:backend]['Proxy'] <<
|
58
|
+
opts.on('-x', '--proxy URL', 'Remote forge URL') do |url|
|
59
|
+
options[:backend]['Proxy'] << url
|
60
60
|
end
|
61
61
|
|
62
|
-
opts.on('--cache-basedir DIR', "
|
62
|
+
opts.on('--cache-basedir DIR', "Proxy module cache base directory (default: #{@@DEFAULT_CACHE_DIR})") do |cache_basedir|
|
63
63
|
options[:cache_basedir] = cache_basedir
|
64
64
|
end
|
65
65
|
|
66
|
-
opts.on('--log-dir DIR', "
|
66
|
+
opts.on('--log-dir DIR', "Log directory (default: #{@@DEFAULT_LOG_DIR})") do |log_dir|
|
67
67
|
options[:log_dir] = log_dir
|
68
68
|
end
|
69
69
|
|
@@ -96,4 +96,4 @@ module PuppetForgeServer::Utils
|
|
96
96
|
return options
|
97
97
|
end
|
98
98
|
end
|
99
|
-
end
|
99
|
+
end
|
data/puppet-forge-server.gemspec
CHANGED
@@ -42,6 +42,7 @@ Gem::Specification.new do |spec|
|
|
42
42
|
spec.add_dependency 'open4', '~> 1.3'
|
43
43
|
spec.add_dependency 'open_uri_redirections', '~> 0.1'
|
44
44
|
spec.add_dependency 'haml', '~> 4.0'
|
45
|
+
spec.add_dependency 'deep_merge', '~> 1.0'
|
45
46
|
|
46
47
|
spec.add_development_dependency 'rake', '~> 10.3'
|
47
48
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-forge-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilja Bobkevic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '4.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: deep_merge
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rake
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,13 +218,12 @@ files:
|
|
204
218
|
- lib/puppet_forge_server/models/builder.rb
|
205
219
|
- lib/puppet_forge_server/models/dependency.rb
|
206
220
|
- lib/puppet_forge_server/models/metadata.rb
|
207
|
-
- lib/puppet_forge_server/patches.rb
|
221
|
+
- lib/puppet_forge_server/patches/gem.rb
|
208
222
|
- lib/puppet_forge_server/server.rb
|
209
223
|
- lib/puppet_forge_server/utils/archiver.rb
|
210
224
|
- lib/puppet_forge_server/utils/buffer.rb
|
211
225
|
- lib/puppet_forge_server/utils/http.rb
|
212
226
|
- lib/puppet_forge_server/utils/option_parser.rb
|
213
|
-
- lib/puppet_forge_server/utils/url.rb
|
214
227
|
- lib/puppet_forge_server/version.rb
|
215
228
|
- puppet-forge-server.gemspec
|
216
229
|
- spec/spec_helper.rb
|
@@ -1,72 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
#
|
3
|
-
# Copyright 2014 drrb
|
4
|
-
# Copyright 2014 North Development AB
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
|
18
|
-
require 'rubygems/package'
|
19
|
-
|
20
|
-
module Gem
|
21
|
-
def Version.new(version)
|
22
|
-
super(version.to_s.gsub('-', '.pre.'))
|
23
|
-
rescue ArgumentError
|
24
|
-
if version =~ /^\d+(\.\d+)*/
|
25
|
-
super(version[/^\d+(\.\d+)*/])
|
26
|
-
else
|
27
|
-
super('0')
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class Hash
|
33
|
-
def deep_merge(other)
|
34
|
-
merge(other) do |key, old_val, new_val|
|
35
|
-
if old_val.instance_of? Array
|
36
|
-
old_val + new_val
|
37
|
-
else
|
38
|
-
new_val
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def deep_merge!(other)
|
44
|
-
replace(deep_merge(other))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class Array
|
49
|
-
def deep_merge
|
50
|
-
inject({}) do |merged, map|
|
51
|
-
merged.deep_merge(map)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def version_sort_by
|
56
|
-
sort_by do |element|
|
57
|
-
Gem::Version.new(yield(element))
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# Used by PuppetForgeServer::Utils::Archiver
|
63
|
-
class Gem::Package::TarReader
|
64
|
-
# Old versions of RubyGems don't include Enumerable in here
|
65
|
-
def find
|
66
|
-
each do |entry|
|
67
|
-
if yield(entry)
|
68
|
-
return entry
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
#
|
3
|
-
# Copyright 2014 drrb
|
4
|
-
# Copyright 2014 North Development AB
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
|
18
|
-
require 'uri'
|
19
|
-
|
20
|
-
module PuppetForgeServer::Utils
|
21
|
-
module Url
|
22
|
-
def normalize_url(uri_string)
|
23
|
-
begin
|
24
|
-
url = URI.parse(uri_string)
|
25
|
-
rescue URI::InvalidURIError => e
|
26
|
-
raise PuppetForgeServer::Errors::Expected, "Invalid URL '#{uri_string}': #{e.message}"
|
27
|
-
end
|
28
|
-
if url.scheme
|
29
|
-
raise PuppetForgeServer::Errors::Expected, "Invalid URL '#{uri_string}': unsupported protocol '#{url.scheme}'" unless url.scheme =~ /^https?$/
|
30
|
-
else
|
31
|
-
uri_string = "http://#{uri_string}"
|
32
|
-
end
|
33
|
-
uri_string.sub /\/$/, ''
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|