reaper-man 0.1.8 → 0.1.16
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/CHANGELOG.md +13 -0
- data/README.md +1 -1
- data/lib/reaper-man.rb +10 -10
- data/lib/reaper-man/command.rb +4 -6
- data/lib/reaper-man/command/package.rb +3 -5
- data/lib/reaper-man/command/package/add.rb +1 -5
- data/lib/reaper-man/command/package/remove.rb +1 -5
- data/lib/reaper-man/command/repository.rb +2 -4
- data/lib/reaper-man/command/repository/generate.rb +3 -7
- data/lib/reaper-man/command/sign.rb +4 -6
- data/lib/reaper-man/error.rb +2 -3
- data/lib/reaper-man/generator.rb +15 -18
- data/lib/reaper-man/generator/apt.rb +23 -24
- data/lib/reaper-man/generator/rubygems.rb +13 -12
- data/lib/reaper-man/generator/yum.rb +92 -95
- data/lib/reaper-man/package_list.rb +17 -18
- data/lib/reaper-man/package_list/deb.rb +32 -34
- data/lib/reaper-man/package_list/gem.rb +46 -21
- data/lib/reaper-man/package_list/rpm.rb +43 -44
- data/lib/reaper-man/signer.rb +15 -18
- data/lib/reaper-man/signer/deb.rb +6 -7
- data/lib/reaper-man/signer/rpm.rb +6 -7
- data/lib/reaper-man/signer/rubygems.rb +1 -3
- data/lib/reaper-man/utils.rb +6 -10
- data/lib/reaper-man/utils/process.rb +19 -19
- data/lib/reaper-man/version.rb +1 -1
- data/reaper-man.gemspec +4 -1
- metadata +50 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bbf13ad88d42d664d1a59174b7472b3516974f4fbca42741509128d8d118660
|
4
|
+
data.tar.gz: 8ad4195b8ae031277e3e8a8f67324360d2ddb941ef04ed21acd1a13a193495b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94e65fc9f9f4067498ba42c64d0db8bb56f1a4958cd0a322a2940efebf259f2a4486550a954c723294594ac8002ce23874f0bb21f10c47713eeaf4dbd8dad794
|
7
|
+
data.tar.gz: 4843d2d153f323c5c5f72cba8c22fe9bf06b92b6befec7fb2f8d51f3bb2c23af1372281761bb4db9f3a65b4b4408c864b7c779c9bd97ad77a8568eac68913744
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
# v0.1.16
|
2
|
+
* [enhancement] Update Ruby version constraints
|
3
|
+
|
4
|
+
# v0.1.14
|
5
|
+
* [fix] Ignore undefined dependencies during repo generation
|
6
|
+
|
7
|
+
# v0.1.12
|
8
|
+
* [fix] Only map dependencies when dependencies are defined
|
9
|
+
|
10
|
+
# v0.1.10
|
11
|
+
* [fix] extract rubygem specification data via proper API
|
12
|
+
* [enhancement] clean rubygems package data to remove empty values
|
13
|
+
|
1
14
|
# v0.1.8
|
2
15
|
* [fix] only set specification value when value is set
|
3
16
|
|
data/README.md
CHANGED
@@ -44,7 +44,7 @@ or remove a specific version
|
|
44
44
|
### Create a repository
|
45
45
|
|
46
46
|
```
|
47
|
-
> reaper-man repo
|
47
|
+
> reaper-man repo generate --packages-file registry.json --package-system apt --output-directory /tmp/test-repo
|
48
48
|
```
|
49
49
|
|
50
50
|
This can also be used to update an existing repository structure.
|
data/lib/reaper-man.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
require
|
1
|
+
require "multi_json"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
|
-
autoload :Cli,
|
5
|
-
autoload :Command,
|
6
|
-
autoload :Config,
|
7
|
-
autoload :Error,
|
8
|
-
autoload :Generator,
|
9
|
-
autoload :PackageList,
|
10
|
-
autoload :Signer,
|
11
|
-
autoload :Version,
|
12
|
-
autoload :Utils,
|
4
|
+
autoload :Cli, "reaper-man/cli"
|
5
|
+
autoload :Command, "reaper-man/command"
|
6
|
+
autoload :Config, "reaper-man/config"
|
7
|
+
autoload :Error, "reaper-man/error"
|
8
|
+
autoload :Generator, "reaper-man/generator"
|
9
|
+
autoload :PackageList, "reaper-man/package_list"
|
10
|
+
autoload :Signer, "reaper-man/signer"
|
11
|
+
autoload :Version, "reaper-man/version"
|
12
|
+
autoload :Utils, "reaper-man/utils"
|
13
13
|
end
|
data/lib/reaper-man/command.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Command < Bogo::Cli::Command
|
5
|
-
|
6
|
-
autoload :
|
7
|
-
autoload :
|
8
|
-
autoload :Sign, 'reaper-man/command/sign'
|
9
|
-
|
5
|
+
autoload :Repository, "reaper-man/command/repository"
|
6
|
+
autoload :Package, "reaper-man/command/package"
|
7
|
+
autoload :Sign, "reaper-man/command/sign"
|
10
8
|
end
|
11
9
|
end
|
@@ -1,12 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Command
|
5
5
|
class Package < Command
|
6
|
-
|
7
|
-
autoload :
|
8
|
-
autoload :Remove, 'reaper-man/command/package/remove'
|
9
|
-
|
6
|
+
autoload :Add, "reaper-man/command/package/add"
|
7
|
+
autoload :Remove, "reaper-man/command/package/remove"
|
10
8
|
end
|
11
9
|
end
|
12
10
|
end
|
@@ -1,11 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Command
|
5
5
|
class Package
|
6
|
-
|
7
6
|
class Add < Package
|
8
|
-
|
9
7
|
def execute!
|
10
8
|
arguments.each do |path|
|
11
9
|
run_action "Adding package to repository manifest: #{path}" do
|
@@ -16,9 +14,7 @@ module ReaperMan
|
|
16
14
|
end
|
17
15
|
end
|
18
16
|
end
|
19
|
-
|
20
17
|
end
|
21
|
-
|
22
18
|
end
|
23
19
|
end
|
24
20
|
end
|
@@ -1,11 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Command
|
5
5
|
class Package
|
6
|
-
|
7
6
|
class Remove < Package
|
8
|
-
|
9
7
|
def execute!
|
10
8
|
arguments.each do |pkg|
|
11
9
|
run_action "Remove package from repository manifest: #{pkg}" do
|
@@ -16,9 +14,7 @@ module ReaperMan
|
|
16
14
|
end
|
17
15
|
end
|
18
16
|
end
|
19
|
-
|
20
17
|
end
|
21
|
-
|
22
18
|
end
|
23
19
|
end
|
24
20
|
end
|
@@ -1,11 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Command
|
5
5
|
class Repository < Command
|
6
|
-
|
7
|
-
autoload :Generate, 'reaper-man/command/repository/generate'
|
8
|
-
|
6
|
+
autoload :Generate, "reaper-man/command/repository/generate"
|
9
7
|
end
|
10
8
|
end
|
11
9
|
end
|
@@ -1,29 +1,25 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Command
|
5
5
|
class Repository
|
6
|
-
|
7
6
|
class Generate < Repository
|
8
|
-
|
9
7
|
def execute!
|
10
|
-
run_action
|
8
|
+
run_action "Generating repository" do
|
11
9
|
ReaperMan::Generator.new(
|
12
10
|
config.merge(
|
13
11
|
Smash.new(
|
14
12
|
:package_config => MultiJson.load(
|
15
13
|
File.read(config[:packages_file])
|
16
14
|
).to_smash,
|
17
|
-
:signer => config[:sign] ? Signer.new(config) : nil
|
15
|
+
:signer => config[:sign] ? Signer.new(config) : nil,
|
18
16
|
)
|
19
17
|
)
|
20
18
|
).generate!
|
21
19
|
nil
|
22
20
|
end
|
23
21
|
end
|
24
|
-
|
25
22
|
end
|
26
|
-
|
27
23
|
end
|
28
24
|
end
|
29
25
|
end
|
@@ -1,23 +1,22 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Command
|
5
5
|
class Sign < Command
|
6
|
-
|
7
6
|
def execute!
|
8
7
|
files = arguments.map do |item|
|
9
|
-
if
|
8
|
+
if File.file?(item)
|
10
9
|
item
|
11
10
|
else
|
12
11
|
File.directory?(item)
|
13
|
-
i_files = Dir.glob(File.join(item,
|
12
|
+
i_files = Dir.glob(File.join(item, "**", "*"))
|
14
13
|
i_files.delete_if do |path|
|
15
14
|
!File.file?(path)
|
16
15
|
end
|
17
16
|
i_files
|
18
17
|
end
|
19
18
|
end.flatten.compact.uniq
|
20
|
-
run_action
|
19
|
+
run_action "Signing file(s)" do
|
21
20
|
signer = Signer.new(config)
|
22
21
|
signer.package(*files)
|
23
22
|
nil
|
@@ -27,7 +26,6 @@ module ReaperMan
|
|
27
26
|
ui.puts " #{ui.color(File.expand_path(path), :yellow)}"
|
28
27
|
end
|
29
28
|
end
|
30
|
-
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
data/lib/reaper-man/error.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
# Standard error for reaper errors
|
@@ -12,9 +12,8 @@ module ReaperMan
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# Define errors here
|
15
|
-
[
|
15
|
+
["UnknownCommand", "FileNotFound"].each_with_index do |klass_name, idx|
|
16
16
|
self.class_eval("class #{klass_name} < Error; CODE=#{idx + 1}; end;")
|
17
17
|
end
|
18
|
-
|
19
18
|
end
|
20
19
|
end
|
data/lib/reaper-man/generator.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "time"
|
2
|
+
require "zlib"
|
3
|
+
require "fileutils"
|
4
4
|
|
5
|
-
require
|
5
|
+
require "reaper-man"
|
6
6
|
|
7
7
|
module ReaperMan
|
8
8
|
# Repository generator
|
9
9
|
class Generator
|
10
|
-
|
11
|
-
autoload :
|
12
|
-
autoload :
|
13
|
-
autoload :Rubygems, 'reaper-man/generator/rubygems'
|
10
|
+
autoload :Apt, "reaper-man/generator/apt"
|
11
|
+
autoload :Yum, "reaper-man/generator/yum"
|
12
|
+
autoload :Rubygems, "reaper-man/generator/rubygems"
|
14
13
|
|
15
14
|
include Utils::Checksum
|
16
15
|
|
@@ -29,17 +28,17 @@ module ReaperMan
|
|
29
28
|
# @option args [String] :package_system apt/gem/etc...
|
30
29
|
# @option args [Hash] :package_config
|
31
30
|
# @option args [Signer] :signer
|
32
|
-
def initialize(args={})
|
31
|
+
def initialize(args = {})
|
33
32
|
@package_system = args[:package_system]
|
34
33
|
@package_config = args.fetch(:package_config, Smash.new)
|
35
34
|
@signer = args[:signer]
|
36
35
|
@options = args
|
37
|
-
extend self.class.const_get(package_system.to_s.split(
|
36
|
+
extend self.class.const_get(package_system.to_s.split("_").map(&:capitalize).join.to_sym)
|
38
37
|
end
|
39
38
|
|
40
39
|
# Generate new repository
|
41
40
|
def generate!
|
42
|
-
raise NoMethodError.new
|
41
|
+
raise NoMethodError.new "Not implemented"
|
43
42
|
end
|
44
43
|
|
45
44
|
# Create new file
|
@@ -51,8 +50,8 @@ module ReaperMan
|
|
51
50
|
def create_file(*name)
|
52
51
|
path = File.join(options[:output_directory], *name)
|
53
52
|
FileUtils.mkdir_p(File.dirname(path))
|
54
|
-
file = File.open(path,
|
55
|
-
if
|
53
|
+
file = File.open(path, "wb+")
|
54
|
+
if block_given?
|
56
55
|
yield file
|
57
56
|
end
|
58
57
|
file.close unless file.closed?
|
@@ -68,8 +67,8 @@ module ReaperMan
|
|
68
67
|
def for_file(*name)
|
69
68
|
path = File.join(options[:output_directory], *name)
|
70
69
|
FileUtils.mkdir_p(File.dirname(path))
|
71
|
-
if
|
72
|
-
file = File.open(path,
|
70
|
+
if block_given?
|
71
|
+
file = File.open(path, "a+")
|
73
72
|
yield file
|
74
73
|
file.close
|
75
74
|
end
|
@@ -86,13 +85,11 @@ module ReaperMan
|
|
86
85
|
base_file = File.open(for_file(path))
|
87
86
|
create_file(compressed_path) do |file|
|
88
87
|
compressor = Zlib::GzipWriter.new(file)
|
89
|
-
while
|
88
|
+
while data = base_file.read(2048)
|
90
89
|
compressor.write(data)
|
91
90
|
end
|
92
91
|
compressor.close
|
93
92
|
end
|
94
93
|
end
|
95
|
-
|
96
94
|
end
|
97
|
-
|
98
95
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Generator
|
@@ -21,8 +21,8 @@ module ReaperMan
|
|
21
21
|
arches.each do |arch_name, packages|
|
22
22
|
package_file(origin_name, dist_name, component_name, arch_name, packages)
|
23
23
|
release_headers = Smash.new
|
24
|
-
release_headers[
|
25
|
-
release_headers[
|
24
|
+
release_headers["Label"] = dist_args["label"]
|
25
|
+
release_headers["Archive"] = dist_name
|
26
26
|
sign_file_if_setup do
|
27
27
|
release_file(origin_name, dist_name, component_name, arch_name, release_headers)
|
28
28
|
end
|
@@ -30,19 +30,19 @@ module ReaperMan
|
|
30
30
|
end
|
31
31
|
release_headers = Smash[
|
32
32
|
%w(Codename Suite Label Description Version).map do |field_name|
|
33
|
-
if
|
33
|
+
if val = dist_args[field_name.downcase]
|
34
34
|
[field_name, val]
|
35
35
|
end
|
36
36
|
end.compact
|
37
37
|
]
|
38
|
-
release_headers[
|
39
|
-
signed = sign_file_if_setup(
|
38
|
+
release_headers["Components"] = dist_args[:components].keys.join(" ")
|
39
|
+
signed = sign_file_if_setup("--clearsign") do
|
40
40
|
release_file(origin_name, dist_name, release_headers)
|
41
41
|
end
|
42
|
-
if
|
42
|
+
if File.exists?("#{signed}.gpg")
|
43
43
|
FileUtils.mv(
|
44
44
|
"#{signed}.gpg",
|
45
|
-
File.join(File.dirname(signed),
|
45
|
+
File.join(File.dirname(signed), "InRelease")
|
46
46
|
)
|
47
47
|
end
|
48
48
|
sign_file_if_setup do
|
@@ -57,9 +57,9 @@ module ReaperMan
|
|
57
57
|
#
|
58
58
|
# @yield block returning file path
|
59
59
|
# @return [String] file path
|
60
|
-
def sign_file_if_setup(opts=nil)
|
60
|
+
def sign_file_if_setup(opts = nil)
|
61
61
|
path = yield
|
62
|
-
if
|
62
|
+
if signer && options[:sign]
|
63
63
|
signer.file(path, nil, opts)
|
64
64
|
end
|
65
65
|
path
|
@@ -71,12 +71,12 @@ module ReaperMan
|
|
71
71
|
# @return [String] path to compressed Packages file
|
72
72
|
def package_file(*args)
|
73
73
|
pkgs = args.pop
|
74
|
-
args.insert(1,
|
75
|
-
create_file(*args.push(
|
74
|
+
args.insert(1, "dists")
|
75
|
+
create_file(*args.push("Packages")) do |file|
|
76
76
|
pkgs.each do |pkg_name, pkgs|
|
77
77
|
pkgs.each do |pkg_version, pkg_meta|
|
78
78
|
pkg_meta.each do |field_name, field_value|
|
79
|
-
if
|
79
|
+
if field_value
|
80
80
|
file.puts "#{field_name}: #{field_value}"
|
81
81
|
end
|
82
82
|
end
|
@@ -92,35 +92,34 @@ module ReaperMan
|
|
92
92
|
# @param args [String] argument list for file path
|
93
93
|
# @return [TrueClass]
|
94
94
|
def release_file(*args)
|
95
|
-
header = args.detect{|a| a.is_a?(Hash)}
|
95
|
+
header = args.detect { |a| a.is_a?(Hash) }
|
96
96
|
header ? args.delete(header) : header = Smash.new
|
97
97
|
header.merge(Smash[%w(Origin Codename Component Architecture).zip(args)])
|
98
|
-
header[
|
99
|
-
args.insert(1,
|
100
|
-
create_file(*args.dup.push(
|
101
|
-
contents = Dir.glob(File.join(File.dirname(file.path),
|
98
|
+
header["Date"] = Time.now.utc.strftime("%a, %d %b %Y %H:%M:%S %Z")
|
99
|
+
args.insert(1, "dists")
|
100
|
+
create_file(*args.dup.push("Release")) do |file|
|
101
|
+
contents = Dir.glob(File.join(File.dirname(file.path), "**", "*"))
|
102
102
|
header_content = header.map do |key, value|
|
103
103
|
next unless value
|
104
104
|
"#{key.to_s.capitalize}: #{value}"
|
105
105
|
end.compact.join("\n")
|
106
106
|
file.puts header_content
|
107
|
-
[[
|
107
|
+
[["MD5Sum", :md5], ["SHA1", :sha1], ["SHA256", :sha256]].each do |field, digest|
|
108
108
|
file.puts "#{field}:"
|
109
109
|
contents.each do |content|
|
110
110
|
next if File.expand_path(content) == File.expand_path(file.path) || File.directory?(content)
|
111
|
-
File.open(content,
|
112
|
-
line = [
|
111
|
+
File.open(content, "r") do |content_file|
|
112
|
+
line = [" "]
|
113
113
|
line << checksum(content_file, digest)
|
114
114
|
line << content_file.size
|
115
|
-
line << content_file.path.sub(File.dirname(file.path),
|
116
|
-
file.puts line.join(
|
115
|
+
line << content_file.path.sub(File.dirname(file.path), "").sub(/^\//, "")
|
116
|
+
file.puts line.join(" ")
|
117
117
|
end
|
118
118
|
end
|
119
119
|
end
|
120
120
|
true
|
121
121
|
end
|
122
122
|
end
|
123
|
-
|
124
123
|
end
|
125
124
|
end
|
126
125
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "reaper-man"
|
2
2
|
|
3
3
|
module ReaperMan
|
4
4
|
class Generator
|
@@ -18,9 +18,9 @@ module ReaperMan
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def generate_indexing(gems)
|
21
|
-
build_spec_file(
|
22
|
-
build_spec_file(
|
23
|
-
build_spec_file(
|
21
|
+
build_spec_file("specs", gems.fetch(:release, {}))
|
22
|
+
build_spec_file("latest_specs", gems.fetch(:release, {}))
|
23
|
+
build_spec_file("prerelease", gems.fetch(:prerelease, {}))
|
24
24
|
end
|
25
25
|
|
26
26
|
def create_index(gems)
|
@@ -34,11 +34,11 @@ module ReaperMan
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def marshal_path
|
37
|
-
[
|
37
|
+
["Marshal", marshal_version].join(".")
|
38
38
|
end
|
39
39
|
|
40
40
|
def marshal_version
|
41
|
-
[Marshal::MAJOR_VERSION, Marshal::MINOR_VERSION].join(
|
41
|
+
[Marshal::MAJOR_VERSION, Marshal::MINOR_VERSION].join(".")
|
42
42
|
end
|
43
43
|
|
44
44
|
def build_spec_file(name, gems)
|
@@ -54,7 +54,7 @@ module ReaperMan
|
|
54
54
|
list.each do |version, info|
|
55
55
|
spec = Gem::Specification.new(name)
|
56
56
|
info.each do |var, value|
|
57
|
-
if
|
57
|
+
if value && spec.respond_to?("#{var}=")
|
58
58
|
begin
|
59
59
|
# Ensure we convert Smash instances
|
60
60
|
value = value.to_hash if value.is_a?(Hash)
|
@@ -66,11 +66,13 @@ module ReaperMan
|
|
66
66
|
end
|
67
67
|
spec.version = Gem::Version.new(info[:version])
|
68
68
|
spec.date = Time.parse(info[:date])
|
69
|
-
info[:dependencies]
|
70
|
-
|
69
|
+
if info[:dependencies]
|
70
|
+
info[:dependencies].each do |dep|
|
71
|
+
spec.add_dependency(*dep)
|
72
|
+
end
|
71
73
|
end
|
72
74
|
deflator = Zlib::Deflate.new
|
73
|
-
create_file(
|
75
|
+
create_file("quick", marshal_path, "#{name}-#{version}.gemspec.rz") do |file|
|
74
76
|
file.write(deflator.deflate(Marshal.dump(spec), Zlib::SYNC_FLUSH))
|
75
77
|
file.write(deflator.finish)
|
76
78
|
end
|
@@ -84,12 +86,11 @@ module ReaperMan
|
|
84
86
|
# @return [String] file path
|
85
87
|
def sign_file_if_setup
|
86
88
|
path = yield
|
87
|
-
if
|
89
|
+
if signer && options[:sign]
|
88
90
|
signer.file(path)
|
89
91
|
end
|
90
92
|
path
|
91
93
|
end
|
92
|
-
|
93
94
|
end
|
94
95
|
end
|
95
96
|
end
|