enhancerepo 0.4.1 → 0.5.0
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 +7 -0
- data/README.md +27 -0
- data/bin/enhancerepo +2 -3
- data/lib/enhance_repo.rb +8 -13
- data/lib/enhance_repo/array_arg.rb +85 -0
- data/lib/enhance_repo/cli.rb +23 -78
- data/lib/enhance_repo/config_opts.rb +207 -13
- data/lib/enhance_repo/logger.rb +14 -10
- data/lib/enhance_repo/other.rb +11 -12
- data/lib/enhance_repo/package_id.rb +21 -12
- data/lib/enhance_repo/pattern.rb +50 -0
- data/lib/enhance_repo/product_id.rb +3 -1
- data/lib/enhance_repo/rpm_md.rb +3 -1
- data/lib/enhance_repo/rpm_md/data.rb +6 -7
- data/lib/enhance_repo/rpm_md/delta_info.rb +58 -67
- data/lib/enhance_repo/rpm_md/extra_primary_data.rb +4 -4
- data/lib/enhance_repo/rpm_md/file_lists.rb +12 -13
- data/lib/enhance_repo/rpm_md/index.rb +32 -27
- data/lib/enhance_repo/rpm_md/other.rb +7 -8
- data/lib/enhance_repo/rpm_md/pattern_writer.rb +131 -0
- data/lib/enhance_repo/rpm_md/patterns.rb +158 -0
- data/lib/enhance_repo/rpm_md/primary.rb +32 -33
- data/lib/enhance_repo/rpm_md/products.rb +19 -24
- data/lib/enhance_repo/rpm_md/repo.rb +33 -36
- data/lib/enhance_repo/rpm_md/resource.rb +6 -6
- data/lib/enhance_repo/rpm_md/suse_data.rb +41 -50
- data/lib/enhance_repo/rpm_md/suse_info.rb +12 -15
- data/lib/enhance_repo/rpm_md/update.rb +65 -36
- data/lib/enhance_repo/rpm_md/update_info.rb +38 -42
- data/lib/enhance_repo/rpm_md/update_smart_fields.rb +24 -24
- data/lib/enhance_repo/susetags/pattern_reader.rb +142 -0
- data/lib/enhance_repo/version.rb +5 -0
- data/lib/enhance_repo/xml_comparer.rb +28 -24
- metadata +190 -221
- data/CHANGELOG.rdoc +0 -18
- data/Manifest.txt +0 -85
- data/README +0 -10
- data/README.rdoc +0 -15
- data/Rakefile +0 -48
- data/TODO.rdoc +0 -4
- data/lib/tempdir.rb +0 -62
- data/lib/tempdir/tempfile.rb +0 -21
- data/test/all_tests.rb +0 -27
- data/test/data/packages/a-1.0.spec +0 -19
- data/test/data/packages/a-2.0.spec +0 -24
- data/test/data/repodata/update-test-11.1/filelists.xml.gz +0 -0
- data/test/data/repodata/update-test-11.1/other.xml.gz +0 -0
- data/test/data/repodata/update-test-11.1/primary.xml.gz +0 -0
- data/test/data/repodata/update-test-11.1/repomd.xml +0 -21
- data/test/data/repomd.xml +0 -21
- data/test/data/rpms/repo-1/a-1.0-0.x86_64.rpm +0 -0
- data/test/data/rpms/repo-1/a-1.0_2.0-0_0.x86_64.delta.rpm +0 -0
- data/test/data/rpms/repo-1/a-2.0-0.x86_64.rpm +0 -0
- data/test/data/rpms/repo-1/repodata/deltainfo.xml.gz +0 -0
- data/test/data/rpms/repo-1/repodata/deltainfo.xml.gz.gz +0 -0
- data/test/data/rpms/repo-1/repodata/filelists.xml.gz +0 -0
- data/test/data/rpms/repo-1/repodata/other.xml.gz +0 -0
- data/test/data/rpms/repo-1/repodata/primary.xml.gz +0 -0
- data/test/data/rpms/repo-1/repodata/repomd.xml +0 -45
- data/test/data/rpms/repo-1/repodata/susedata.xml.gz +0 -0
- data/test/data/rpms/repo-1/repodata/updateinfo.xml.gz +0 -0
- data/test/data/rpms/repo-1/repoparts/update-a-1.xml +0 -22
- data/test/data/rpms/repo-with-product/a-1.0-0.x86_64.rpm +0 -0
- data/test/data/rpms/repo-with-product/openSUSE-release-11.2-1.6.i586.rpm +0 -0
- data/test/data/rpms/repo-with-product/openSUSE-release-dvd-11.2-1.6.i586.rpm +0 -0
- data/test/data/rpms/repo-with-product/repodata/filelists.xml.gz +0 -0
- data/test/data/rpms/repo-with-product/repodata/other.xml.gz +0 -0
- data/test/data/rpms/repo-with-product/repodata/primary.xml.gz +0 -0
- data/test/data/rpms/repo-with-product/repodata/products.xml.gz +0 -0
- data/test/data/rpms/repo-with-product/repodata/repomd.xml +0 -27
- data/test/data/rpms/update-test-11.1/update-test-affects-package-manager.rpm +0 -0
- data/test/data/rpms/update-test-11.1/update-test-interactive.rpm +0 -0
- data/test/data/rpms/update-test-11.1/update-test-optional.rpm +0 -0
- data/test/data/rpms/update-test-11.1/update-test-reboot-needed.rpm +0 -0
- data/test/data/rpms/update-test-11.1/update-test-security.rpm +0 -0
- data/test/data/rpms/update-test-11.1/update-test-trival.rpm +0 -0
- data/test/data/rpms/update-test-factory/update-test-affects-package-manager-0-9999.1.2.noarch.rpm +0 -0
- data/test/data/rpms/update-test-factory/update-test-interactive-0-9999.1.2.noarch.rpm +0 -0
- data/test/data/rpms/update-test-factory/update-test-optional-0-9999.1.2.noarch.rpm +0 -0
- data/test/data/rpms/update-test-factory/update-test-reboot-needed-0-9999.1.2.noarch.rpm +0 -0
- data/test/data/rpms/update-test-factory/update-test-relogin-suggested-0-9999.1.2.noarch.rpm +0 -0
- data/test/data/rpms/update-test-factory/update-test-security-0-9999.1.2.noarch.rpm +0 -0
- data/test/deltainfo_test.rb +0 -50
- data/test/extensions_test.rb +0 -31
- data/test/index_test.rb +0 -51
- data/test/primary_test.rb +0 -51
- data/test/products_test.rb +0 -51
- data/test/repo_test.rb +0 -72
- data/test/repomdindex_test.rb +0 -58
- data/test/rpmmd_test.rb +0 -60
- data/test/susedata_test.rb +0 -53
- data/test/tempdir_test.rb +0 -62
- data/test/test_helper.rb +0 -53
- data/test/update_test.rb +0 -80
- data/test/updateinfo_test.rb +0 -59
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: '0286c73b863193259c5ff0c0bd832637144d4e11'
|
|
4
|
+
data.tar.gz: 00b9f1514ec31b3cf26b6b7d78bbe86e195c6008
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 5a804dab6d6265dff84730925a4e89e6958bf1a5e8766c9a4bcfe4471c866e462f252e117913a76b329f219a12b1aa409177c5428630435e6639428617ce39d3
|
|
7
|
+
data.tar.gz: a98bbf20cddc4426a94c6d7fcca65b1cd8c00e8b5d41bcdc4a9af99f438c45e4dc8b6e4e524e48edcaa861ee7eedeb4b64bb7080c3ba31759cb030f541c02ba9
|
data/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
# enhancerepo
|
|
3
|
+
|
|
4
|
+

|
|
5
|
+

|
|
6
|
+
[](https://travis-ci.org/openSUSE/enhancerepo)
|
|
7
|
+
|
|
8
|
+
* http://en.opensuse.org/Enhancerepo
|
|
9
|
+
|
|
10
|
+
## Introduction
|
|
11
|
+
|
|
12
|
+
Reference implementation for future rpmmd extensions.
|
|
13
|
+
|
|
14
|
+
requires ruby-rpm.
|
|
15
|
+
|
|
16
|
+
## TODO
|
|
17
|
+
|
|
18
|
+
- [ ] give some love to rpm-ffi to supress warnings
|
|
19
|
+
- [ ] cleanup rubocop issues (see .rubocop_todo.yml)
|
|
20
|
+
- [ ] re-do rpm package
|
|
21
|
+
- [ ] get rid of ActiveSupport
|
|
22
|
+
- [ ] refactor CLI (may be subcommands)
|
|
23
|
+
|
|
24
|
+
## Authors
|
|
25
|
+
|
|
26
|
+
* Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
|
27
|
+
|
data/bin/enhancerepo
CHANGED
data/lib/enhance_repo.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
|
|
1
3
|
#--
|
|
2
|
-
#
|
|
4
|
+
#
|
|
3
5
|
# enhancerepo is a rpm-md repository metadata tool.
|
|
4
6
|
# Copyright (C) 2008, 2009 Novell Inc.
|
|
5
7
|
# Author: Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
|
@@ -22,15 +24,8 @@
|
|
|
22
24
|
#
|
|
23
25
|
#++
|
|
24
26
|
#
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
require File.join(lib, 'enhance_repo', 'logger.rb')
|
|
32
|
-
require File.join(lib, 'enhance_repo', 'config_opts.rb')
|
|
33
|
-
require File.join(lib, 'enhance_repo', 'rpm_md.rb')
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
27
|
+
require 'enhance_repo/version'
|
|
28
|
+
require 'enhance_repo/logger'
|
|
29
|
+
require 'enhance_repo/config_opts'
|
|
30
|
+
require 'enhance_repo/rpm_md'
|
|
31
|
+
require 'enhance_repo/array_arg'
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
|
|
3
|
+
#--
|
|
4
|
+
#
|
|
5
|
+
# enhancerepo is a rpm-md repository metadata tool.
|
|
6
|
+
# Copyright (C) 2008, 2009 Novell Inc.
|
|
7
|
+
# Author: Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
|
8
|
+
#
|
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
#
|
|
14
|
+
# This program is distributed in the hope that it will be useful,
|
|
15
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
+
# GNU General Public License for more details.
|
|
18
|
+
#
|
|
19
|
+
# You should have received a copy of the GNU General Public License
|
|
20
|
+
# along with this program; if not, write to the Free Software
|
|
21
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
22
|
+
# MA 02110-1301, USA. A copy of the GNU General Public License is
|
|
23
|
+
# also available at http://www.gnu.org/copyleft/gpl.html.
|
|
24
|
+
#
|
|
25
|
+
#++
|
|
26
|
+
#
|
|
27
|
+
module EnhanceRepo
|
|
28
|
+
# Helper class to turn an array like:
|
|
29
|
+
# ['a', 'b', '/foo/file.txt', 'd'] into an
|
|
30
|
+
# array containing the content of file.txt
|
|
31
|
+
# (each line) merged into the place of the
|
|
32
|
+
# file name
|
|
33
|
+
#
|
|
34
|
+
class ArrayArg
|
|
35
|
+
include Enumerable
|
|
36
|
+
|
|
37
|
+
# initialize the wrapper with an array
|
|
38
|
+
def initialize(array)
|
|
39
|
+
@array = array
|
|
40
|
+
@array ||= []
|
|
41
|
+
@expanded_cache = nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# yields one element per line in
|
|
45
|
+
# the file
|
|
46
|
+
def expand_file(file)
|
|
47
|
+
ret = []
|
|
48
|
+
File.open(file) do |f|
|
|
49
|
+
f.each_line do |line|
|
|
50
|
+
stripped_line = line.strip
|
|
51
|
+
ret << stripped_line unless stripped_line.empty?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
ret
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# expand the wrapped array with fles
|
|
58
|
+
def expanded
|
|
59
|
+
return @expanded_cache if @expanded_cache
|
|
60
|
+
ret = []
|
|
61
|
+
@array.each do |element|
|
|
62
|
+
if File.exist?(element) && !File.directory?(element)
|
|
63
|
+
EnhanceRepo.logger.info "Expanding the content of file '#{element}'..."
|
|
64
|
+
ret += expand_file(element)
|
|
65
|
+
else
|
|
66
|
+
ret << element
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
@expanded_cache = ret
|
|
70
|
+
ret
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# delegate other methods to the expanded array
|
|
74
|
+
def method_missing(method, *args)
|
|
75
|
+
each.to_a.send(method, *args)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# see Enumerable
|
|
79
|
+
def each
|
|
80
|
+
return enum_for(:each) unless block_given?
|
|
81
|
+
expanded.each { |x| yield x }
|
|
82
|
+
self
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
data/lib/enhance_repo/cli.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
|
|
1
3
|
#--
|
|
2
|
-
#
|
|
4
|
+
#
|
|
3
5
|
# enhancerepo is a rpm-md repository metadata tool.
|
|
4
6
|
# Copyright (C) 2008, 2009 Novell Inc.
|
|
5
7
|
# Author: Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
|
@@ -22,76 +24,14 @@
|
|
|
22
24
|
#
|
|
23
25
|
#++
|
|
24
26
|
#
|
|
25
|
-
require 'rubygems'
|
|
26
|
-
require 'trollop'
|
|
27
|
-
require 'enhance_repo'
|
|
28
27
|
require 'pathname'
|
|
29
28
|
require 'benchmark'
|
|
30
29
|
require 'fileutils'
|
|
30
|
+
require 'enhance_repo'
|
|
31
31
|
|
|
32
|
-
EnhanceRepo
|
|
33
|
-
|
|
34
|
-
opts = Trollop::options do
|
|
35
|
-
version "enhancerepo #{EnhanceRepo::VERSION}"
|
|
36
|
-
banner <<-EOS
|
|
37
|
-
enhancerepo is a rpm-md metadata tool
|
|
38
|
-
|
|
39
|
-
Usage:
|
|
40
|
-
enhancerepo [options] DIR
|
|
41
|
-
|
|
42
|
-
DIR: The repo base directory ( where repodata/ directory is located )
|
|
43
|
-
EOS
|
|
44
|
-
opt :help, 'Show help'
|
|
45
|
-
opt :outputdir, 'Generate metadata to a different directory', :short => :o
|
|
46
|
-
opt :index, "Reindex the metadata and regenerates repomd.xml, even if nothing was changed using enhancerepo. Use this if you did manual changes to the metadata", :short => :x
|
|
47
|
-
opt :benchmark, 'Show benchmark statistics at the end'
|
|
48
|
-
|
|
49
|
-
opt :primary, 'Add data from rpm files and generate primary.xml (EXPERIMENTAL)', :short => :p
|
|
50
|
-
opt :sign, 'Generates signature for the repository using key keyid', :short => :s, :type => :string
|
|
51
|
-
opt :updates, 'Add updates from *.updates files and generate updateinfo.xml', :short => :u
|
|
52
|
-
opt :generate_update, 'Generates an update from the given package list comparing package\'s last version changes', :type => :strings
|
|
53
|
-
opt :updates_base_dir, 'Looks for package also in <dir> Useful if you keep old packages in a different repos and updates in this one.', :type => :string
|
|
54
|
-
opt :split_updates, 'Splits current updateinfo.xml into update parts files in repoparts/'
|
|
55
|
-
opt :indent, 'Generate indented xml. Default: no', :short => :i
|
|
56
|
-
|
|
57
|
-
opt :expire, 'Set repository expiration hint (Can be used to detect dead mirrors)', :type => :date, :short => :e
|
|
58
|
-
opt :repo_product, 'Adds product compatibility information', :type => :strings
|
|
59
|
-
opt :repo_keyword, 'Tags repository with keyword', :type => :strings
|
|
60
|
-
|
|
61
|
-
# === SUSE specific package data (susedata.xml)
|
|
62
|
-
|
|
63
|
-
opt :eulas, 'Reads packagename.eula files and add the information to susedata.xml', :short => :l
|
|
64
|
-
opt :keywords, 'Reads packagename.keywords files and add keyword metadata to susedata.xml', :short => :k
|
|
65
|
-
opt :disk_usage, 'Reads rpm packages, generates disk usage information on susedata.xml', :short => :d
|
|
66
|
-
|
|
67
|
-
# Note: your .eula or .keywords file will be added to
|
|
68
|
-
# a package if it matches its name. If you want to add
|
|
69
|
-
# the attributes to a specific package, name the file
|
|
70
|
-
# name-version, name-version-release or
|
|
71
|
-
# name-version-release.arch
|
|
72
|
-
|
|
73
|
-
# === Package deltas support
|
|
74
|
-
opt :'create-deltas',
|
|
75
|
-
'Create [num] deltas for different versions of a package. If there is foo-1.rpm, foo-2.rpm, foo-3.rpm, foo-4.rpm num=1 will create a delta to go from version 3 to 4, while num=2 will create one from 2 to 4 too. This does not index the deltas. Use --deltas for that.', :default => 1
|
|
76
|
-
opt :deltas, 'Reads all *.delta.rpm files and add the information to deltainfo.xml. This indexes existing deltas, but won\'t create them. See --create-deltas for deltas creation.'
|
|
77
|
-
|
|
78
|
-
# === Product information support
|
|
79
|
-
|
|
80
|
-
opt :products, 'Reads release packages and generating product information in products.xml based on the information contained in the .prod files included in the packages.'
|
|
81
|
-
|
|
82
|
-
# other
|
|
83
|
-
opt :debug, 'Show debug information'
|
|
84
|
-
end
|
|
32
|
+
EnhanceRepo.enable_logger
|
|
85
33
|
|
|
86
|
-
config = EnhanceRepo::ConfigOpts.
|
|
87
|
-
dir = ARGV.shift
|
|
88
|
-
config.dir = Pathname.new(dir) if not dir.nil?
|
|
89
|
-
|
|
90
|
-
# Check if dir is given
|
|
91
|
-
if config.dir.nil?
|
|
92
|
-
EnhanceRepo.logger.fatal "Missing dir argument (try --help)"
|
|
93
|
-
exit 0
|
|
94
|
-
end
|
|
34
|
+
config = EnhanceRepo::ConfigOpts.instance.parse_args!
|
|
95
35
|
|
|
96
36
|
repomd = EnhanceRepo::RpmMd::Repo.new(config)
|
|
97
37
|
|
|
@@ -109,42 +49,47 @@ time = Benchmark.measure do
|
|
|
109
49
|
repomd.suseinfo.products.merge(config.repoproducts)
|
|
110
50
|
repomd.suseinfo.keywords.merge(config.repokeywords)
|
|
111
51
|
|
|
112
|
-
repomd.susedata.add_eulas if config.eulas
|
|
52
|
+
repomd.susedata.add_eulas if config.eulas
|
|
113
53
|
repomd.susedata.add_keywords if config.keywords
|
|
114
54
|
repomd.susedata.add_disk_usage if config.diskusage
|
|
115
55
|
|
|
116
|
-
|
|
117
|
-
repomd.updateinfo.generate_update(config.generate_update, File.join(config.outputdir, 'repoparts')
|
|
56
|
+
unless config.generate_update.nil?
|
|
57
|
+
repomd.updateinfo.generate_update(config.generate_update, File.join(config.outputdir, 'repoparts'))
|
|
118
58
|
end
|
|
119
59
|
|
|
120
|
-
repomd.updateinfo.read_repoparts if config.updates
|
|
121
|
-
repomd.updateinfo.split_updates(File.join(config.outputdir, 'repoparts')) if config.split_updates
|
|
60
|
+
repomd.updateinfo.read_repoparts if config.updates
|
|
61
|
+
repomd.updateinfo.split_updates(File.join(config.outputdir, 'repoparts')) if config.split_updates
|
|
62
|
+
|
|
63
|
+
repomd.patterns.split_patterns(File.join(config.outputdir, 'repoparts')) if config.split_patterns
|
|
64
|
+
unless config.generate_patterns.nil?
|
|
65
|
+
repomd.patterns.generate_patterns(config.generate_patterns, File.join(config.outputdir, 'repoparts'))
|
|
66
|
+
end
|
|
67
|
+
repomd.patterns.read_repoparts if config.patterns || !config.generate_patterns.nil?
|
|
122
68
|
|
|
123
|
-
repomd.deltainfo.create_deltas(:
|
|
69
|
+
repomd.deltainfo.create_deltas(outputdir: config.outputdir, n: config.create_deltas) if config.create_deltas
|
|
124
70
|
repomd.deltainfo.add_deltas if config.deltas
|
|
125
71
|
|
|
126
72
|
repomd.products.read_packages if config.products
|
|
127
73
|
|
|
128
74
|
# add expiration date
|
|
129
|
-
repomd.suseinfo.expire = config.expire
|
|
75
|
+
repomd.suseinfo.expire = config.expire unless config.expire.nil?
|
|
130
76
|
|
|
131
77
|
# index if requested
|
|
132
78
|
repomd.index if config.index
|
|
133
|
-
|
|
79
|
+
|
|
134
80
|
# write the repository out
|
|
135
81
|
repomd.write
|
|
136
82
|
|
|
137
83
|
# perform signature of the repository
|
|
138
|
-
repomd.sign(config.signkey)
|
|
84
|
+
repomd.sign(config.signkey) unless config.signkey.nil?
|
|
139
85
|
rescue Exception => excp
|
|
140
86
|
EnhanceRepo.logger.fatal excp.message
|
|
141
|
-
if EnhanceRepo
|
|
87
|
+
if EnhanceRepo.enable_debug
|
|
142
88
|
EnhanceRepo.logger.fatal excp.class
|
|
143
89
|
EnhanceRepo.logger.fatal(excp.backtrace.join("\n"))
|
|
144
90
|
else
|
|
145
|
-
EnhanceRepo.logger.info
|
|
91
|
+
EnhanceRepo.logger.info 'Pass --debug for more information...'
|
|
146
92
|
end
|
|
147
93
|
end
|
|
148
|
-
|
|
149
94
|
end
|
|
150
95
|
EnhanceRepo.logger.info(time) if config.benchmark
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
|
|
1
3
|
#--
|
|
2
|
-
#
|
|
4
|
+
#
|
|
3
5
|
# enhancerepo is a rpm-md repository metadata tool.
|
|
4
6
|
# Copyright (C) 2008, 2009 Novell Inc.
|
|
5
7
|
# Author: Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
|
@@ -22,16 +24,130 @@
|
|
|
22
24
|
#
|
|
23
25
|
#++
|
|
24
26
|
#
|
|
27
|
+
require 'digest'
|
|
25
28
|
require 'set'
|
|
29
|
+
require 'trollop'
|
|
30
|
+
require 'enhance_repo/array_arg'
|
|
31
|
+
require 'singleton'
|
|
26
32
|
|
|
27
33
|
module EnhanceRepo
|
|
28
|
-
|
|
29
34
|
# Configuration class to hold the options
|
|
30
35
|
# passed from the command line to the
|
|
31
36
|
# components doing the work
|
|
32
37
|
#
|
|
33
38
|
|
|
34
39
|
class ConfigOpts
|
|
40
|
+
include Singleton
|
|
41
|
+
include Logger
|
|
42
|
+
|
|
43
|
+
def read_command_line
|
|
44
|
+
opts = Trollop.options do
|
|
45
|
+
version "enhancerepo #{EnhanceRepo::VERSION}"
|
|
46
|
+
banner <<-EOS
|
|
47
|
+
enhancerepo is a rpm-md metadata tool
|
|
48
|
+
|
|
49
|
+
Usage:
|
|
50
|
+
enhancerepo [options] DIR
|
|
51
|
+
|
|
52
|
+
DIR: The repo base directory ( where repodata/ directory is located )
|
|
53
|
+
|
|
54
|
+
EOS
|
|
55
|
+
opt :help, 'Show help'
|
|
56
|
+
opt :outputdir, 'Generate metadata to a different directory',
|
|
57
|
+
short: :o, type: :string
|
|
58
|
+
opt :index, "Reindex the metadata and regenerates repomd.xml, '\
|
|
59
|
+
'even if nothing was changed using enhancerepo.'\
|
|
60
|
+
' Use this if you did manual changes to the metadata",
|
|
61
|
+
short: :x
|
|
62
|
+
opt :benchmark, 'Show benchmark statistics at the end'
|
|
63
|
+
|
|
64
|
+
opt :primary, 'Add data from rpm files and generate primary.xml (EXPERIMENTAL)',
|
|
65
|
+
short: :p
|
|
66
|
+
opt :sign, 'Generates signature for the repository using key keyid',
|
|
67
|
+
short: :s, type: :string
|
|
68
|
+
opt :updates, 'Add updates from *.updates files and generate updateinfo.xml',
|
|
69
|
+
short: :u
|
|
70
|
+
opt :generate_update, 'Generates an update from the given package list'\
|
|
71
|
+
' comparing package\'s last version changes',
|
|
72
|
+
type: :strings
|
|
73
|
+
opt :updates_base_dir, 'Looks for package also in <dir> Useful if you'\
|
|
74
|
+
' keep old packages in a different repos and updates in this one.',
|
|
75
|
+
type: :string
|
|
76
|
+
opt :split_updates, 'Splits current updateinfo.xml into update parts'\
|
|
77
|
+
' files in repoparts/'
|
|
78
|
+
opt :indent, 'Generate indented xml. Default: no',
|
|
79
|
+
short: :i
|
|
80
|
+
|
|
81
|
+
opt :expire, 'Set repository expiration hint (Can be used to detect dead mirrors)',
|
|
82
|
+
type: :date, short: :e
|
|
83
|
+
opt :repo_product, 'Adds product compatibility information',
|
|
84
|
+
type: :strings
|
|
85
|
+
opt :repo_keyword, 'Tags repository with keyword',
|
|
86
|
+
type: :strings
|
|
87
|
+
|
|
88
|
+
opt :digest_type, 'Algorithm used to compute the digests. Default SHA1',
|
|
89
|
+
type: :string
|
|
90
|
+
|
|
91
|
+
# === SUSE specific package data (susedata.xml)
|
|
92
|
+
|
|
93
|
+
opt :eulas,
|
|
94
|
+
'Reads packagename.eula files and add the information to susedata.xml',
|
|
95
|
+
short: :l
|
|
96
|
+
opt :keywords,
|
|
97
|
+
'Reads packagename.keywords files and add keyword metadata to susedata.xml',
|
|
98
|
+
short: :k
|
|
99
|
+
opt :disk_usage,
|
|
100
|
+
'Reads rpm packages, generates disk usage information on susedata.xml',
|
|
101
|
+
short: :d
|
|
102
|
+
|
|
103
|
+
# Note: your .eula or .keywords file will be added to
|
|
104
|
+
# a package if it matches its name. If you want to add
|
|
105
|
+
# the attributes to a specific package, name the file
|
|
106
|
+
# name-version, name-version-release or
|
|
107
|
+
# name-version-release.arch
|
|
108
|
+
|
|
109
|
+
# === Package deltas support
|
|
110
|
+
opt :'create-deltas',
|
|
111
|
+
'Create [num] deltas for different versions of a package.'\
|
|
112
|
+
' If there is foo-1.rpm, foo-2.rpm, foo-3.rpm, '\
|
|
113
|
+
'foo-4.rpm num=1 will create a delta to go from'\
|
|
114
|
+
' version 3 to 4, while num=2 will create one from'\
|
|
115
|
+
' 2 to 4 too. This does not index the deltas.'\
|
|
116
|
+
' Use --deltas for that.',
|
|
117
|
+
default: 1
|
|
118
|
+
opt :deltas,
|
|
119
|
+
'Reads all *.delta.rpm files and add the information'\
|
|
120
|
+
' to deltainfo.xml. This indexes existing deltas, but'\
|
|
121
|
+
' won\'t create them. See --create-deltas for deltas'\
|
|
122
|
+
'creation.'
|
|
123
|
+
|
|
124
|
+
# === Product information support
|
|
125
|
+
|
|
126
|
+
opt :products,
|
|
127
|
+
'Reads release packages and generating product'\
|
|
128
|
+
' information in products.xml based on the information'\
|
|
129
|
+
' contained in the .prod files included in the packages.'
|
|
130
|
+
|
|
131
|
+
# === Pattern information support
|
|
132
|
+
|
|
133
|
+
opt :patterns,
|
|
134
|
+
'Add patterns from pattern-*.xml files and generate'\
|
|
135
|
+
' patterns.xml',
|
|
136
|
+
short: :P
|
|
137
|
+
opt :generate_patterns,
|
|
138
|
+
'Generate patterns.xml from the old style'\
|
|
139
|
+
' pattern given as parameter to this option',
|
|
140
|
+
type: :strings
|
|
141
|
+
opt :split_patterns,
|
|
142
|
+
'Splits current patterns.xml into pattern'\
|
|
143
|
+
' parts files in repoparts/'
|
|
144
|
+
|
|
145
|
+
# other
|
|
146
|
+
opt :debug, 'Show debug information'
|
|
147
|
+
end
|
|
148
|
+
opts
|
|
149
|
+
end
|
|
150
|
+
|
|
35
151
|
attr_accessor :index
|
|
36
152
|
attr_accessor :indent
|
|
37
153
|
attr_accessor :repoproducts
|
|
@@ -59,40 +175,118 @@ module EnhanceRepo
|
|
|
59
175
|
attr_accessor :products
|
|
60
176
|
|
|
61
177
|
attr_accessor :benchmark
|
|
62
|
-
|
|
178
|
+
|
|
179
|
+
attr_accessor :patterns
|
|
180
|
+
attr_accessor :generate_patterns
|
|
181
|
+
attr_accessor :split_patterns
|
|
182
|
+
attr_accessor :digest_name, :digest_class
|
|
183
|
+
|
|
63
184
|
def outputdir
|
|
64
185
|
return @dir if @outputdir.nil?
|
|
65
|
-
|
|
186
|
+
@outputdir
|
|
187
|
+
end
|
|
66
188
|
|
|
189
|
+
def initialize
|
|
190
|
+
@digest_name, @digest_class = allocate_digest(nil)
|
|
67
191
|
end
|
|
68
|
-
|
|
69
|
-
def
|
|
192
|
+
|
|
193
|
+
def parse_args!
|
|
70
194
|
@repoproducts = Set.new
|
|
71
195
|
@repokeywords = Set.new
|
|
196
|
+
opts = read_command_line
|
|
72
197
|
read_opts(opts)
|
|
198
|
+
|
|
199
|
+
unless @dir
|
|
200
|
+
@dir = ARGV.shift
|
|
201
|
+
Trollop.die 'Need to specify target directory.' unless @dir
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
if !File.exist?(@dir) || !File.directory?(@dir)
|
|
205
|
+
Trollop.die "'#{@dir}' is not a valid directory."
|
|
206
|
+
end
|
|
207
|
+
if !File.directory?(File.join(@dir, 'repodata')) && !(opts[:primary] || opts[:help])
|
|
208
|
+
Trollop.die "'#{@dir}' is not a valid repository directory"
|
|
209
|
+
end
|
|
210
|
+
# dump
|
|
211
|
+
self
|
|
73
212
|
end
|
|
74
|
-
|
|
213
|
+
|
|
75
214
|
def read_opts(opts)
|
|
76
215
|
@index = opts[:index]
|
|
77
216
|
@expire = opts[:expire]
|
|
78
217
|
@primary = opts[:primary]
|
|
79
|
-
@repoproducts = @repoproducts.merge([*opts[:repo_products]])
|
|
80
|
-
@repokeywords = @repokeywords.merge([*opts[:repo_keywords]])
|
|
218
|
+
@repoproducts = @repoproducts.merge([*ArrayArg.new(opts[:repo_products])]) if opts[:repo_products]
|
|
219
|
+
@repokeywords = @repokeywords.merge([*ArrayArg.new(opts[:repo_keywords])]) if opts[:repo_keywords]
|
|
81
220
|
@signkey = opts[:sign]
|
|
82
221
|
@updates = opts[:updates]
|
|
83
222
|
@split_updates = opts[:split_updates]
|
|
84
|
-
@generate_update = opts[:generate_update]
|
|
223
|
+
@generate_update = ArrayArg.new(opts[:generate_update]) if opts[:generate_update]
|
|
85
224
|
@eulas = opts[:eulas]
|
|
86
225
|
@keywords = opts[:keywords]
|
|
87
226
|
@diskusage = opts[:disk_usage]
|
|
88
227
|
@deltas = opts[:deltas]
|
|
89
228
|
@create_deltas = opts[:create_deltas]
|
|
90
229
|
@products = opts[:products]
|
|
91
|
-
@benchmark = opts[:benchmark]
|
|
230
|
+
@benchmark = opts[:benchmark]
|
|
231
|
+
@patterns = opts[:patterns]
|
|
232
|
+
@split_patterns = opts[:split_patterns]
|
|
233
|
+
@generate_patterns = Array.new(opts[:generate_patterns]) if opts[:generate_patterns]
|
|
92
234
|
@updatesbasedir = Pathname.new(opts[:updates_base_dir]) if opts[:updates_base_dir]
|
|
93
235
|
@outputdir = Pathname.new(opts[:outputdir]) if opts[:outputdir]
|
|
94
|
-
@
|
|
236
|
+
@digest_name, @digest_class = allocate_digest(opts[:digest_type])
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def dump
|
|
240
|
+
logger = EnhanceRepo.logger
|
|
241
|
+
|
|
242
|
+
logger.info "index #{@index}"
|
|
243
|
+
logger.info "expire #{@expire}"
|
|
244
|
+
logger.info "primary #{@primary}"
|
|
245
|
+
logger.info "repoproducts #{@repoproducts}"
|
|
246
|
+
logger.info "repokeywords #{@repokeywords}"
|
|
247
|
+
logger.info "signkey #{@signkey}"
|
|
248
|
+
logger.info "updates #{@updates}"
|
|
249
|
+
logger.info "split_updates #{@split_updates}"
|
|
250
|
+
logger.info "generate_update #{@generate_update}"
|
|
251
|
+
logger.info "eulas #{@eulas}"
|
|
252
|
+
logger.info "keywords #{@keywords}"
|
|
253
|
+
logger.info "diskusage #{@diskusage}"
|
|
254
|
+
logger.info "deltas #{@deltas}"
|
|
255
|
+
logger.info "create_deltas #{@create_deltas}"
|
|
256
|
+
logger.info "products #{@products}"
|
|
257
|
+
logger.info "benchmark #{@benchmark}"
|
|
258
|
+
logger.info "patterns #{@patterns}"
|
|
259
|
+
logger.info "split_patterns #{@split_patterns}"
|
|
260
|
+
unless @generate_patterns.nil?
|
|
261
|
+
@generate_patterns.each do |p|
|
|
262
|
+
logger.info "generate_patterns #{p}"
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
logger.info "updatesbasedir #{@updatesbasedir}"
|
|
266
|
+
logger.info "outputdir #{@outputdir}"
|
|
267
|
+
logger.info "dir #{@dir}"
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
private
|
|
271
|
+
|
|
272
|
+
def allocate_digest(digest_name)
|
|
273
|
+
return ['sha', Digest::SHA1] unless digest_name
|
|
274
|
+
|
|
275
|
+
valid_names = %w[sha sha1 sha2 sha256 md5]
|
|
276
|
+
unless valid_names.include?(digest_name.downcase)
|
|
277
|
+
warn "Invalid digest type #{digest_name}"
|
|
278
|
+
warn "Accepted types: #{valid_names.join(', ')}"
|
|
279
|
+
exit 1
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
case digest_name.downcase
|
|
283
|
+
when /^(sha2|sha256)$/
|
|
284
|
+
['sha256', Digest::SHA2]
|
|
285
|
+
when /^(sha|sha1)$/
|
|
286
|
+
['sha', Digest::SHA1]
|
|
287
|
+
when 'md5'
|
|
288
|
+
['md5', Digest::MD5]
|
|
289
|
+
end
|
|
95
290
|
end
|
|
96
|
-
|
|
97
291
|
end
|
|
98
292
|
end
|