rpm2 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/CODEOWNERS +1 -0
- data/.github/workflows/ci.yaml +25 -0
- data/.gitignore +8 -0
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +111 -0
- data/.whitesource +3 -0
- data/CHANGELOG.md +66 -0
- data/Gemfile +9 -0
- data/MIT-LICENSE +23 -0
- data/README.md +374 -0
- data/Rakefile +58 -0
- data/_docker/Dockerfile.ubi8 +8 -0
- data/_docker/Dockerfile.ubi9 +8 -0
- data/lib/rpm/c/header.rb +36 -0
- data/lib/rpm/c/rpmcallback.rb +27 -0
- data/lib/rpm/c/rpmcli.rb +6 -0
- data/lib/rpm/c/rpmdb.rb +20 -0
- data/lib/rpm/c/rpmds.rb +43 -0
- data/lib/rpm/c/rpmfi.rb +31 -0
- data/lib/rpm/c/rpmio.rb +17 -0
- data/lib/rpm/c/rpmlib.rb +12 -0
- data/lib/rpm/c/rpmlog.rb +23 -0
- data/lib/rpm/c/rpmmacro.rb +33 -0
- data/lib/rpm/c/rpmprob.rb +53 -0
- data/lib/rpm/c/rpmps.rb +11 -0
- data/lib/rpm/c/rpmtag.rb +304 -0
- data/lib/rpm/c/rpmtd.rb +34 -0
- data/lib/rpm/c/rpmts.rb +69 -0
- data/lib/rpm/c/rpmtypes.rb +28 -0
- data/lib/rpm/c.rb +49 -0
- data/lib/rpm/compat.rb +40 -0
- data/lib/rpm/db.rb +117 -0
- data/lib/rpm/dependency.rb +120 -0
- data/lib/rpm/file.rb +134 -0
- data/lib/rpm/gem_version.rb +7 -0
- data/lib/rpm/match_iterator.rb +66 -0
- data/lib/rpm/package.rb +332 -0
- data/lib/rpm/problem.rb +65 -0
- data/lib/rpm/transaction.rb +268 -0
- data/lib/rpm/utils.rb +7 -0
- data/lib/rpm/version.rb +146 -0
- data/lib/rpm.rb +88 -0
- data/lib/rpm2.rb +1 -0
- data/rpm2.gemspec +29 -0
- data/test/data/a.spec +49 -0
- data/test/data/simple-1.0-0.i586.rpm +0 -0
- data/test/data/simple.spec +38 -0
- data/test/data/simple_with_deps-1.0-0.i586.rpm +0 -0
- data/test/data/simple_with_deps.spec +41 -0
- data/test/helper.rb +7 -0
- data/test/test_dependency.rb +28 -0
- data/test/test_file.rb +36 -0
- data/test/test_lib.rb +33 -0
- data/test/test_package.rb +76 -0
- data/test/test_problem.rb +18 -0
- data/test/test_rpm.rb +33 -0
- data/test/test_transaction.rb +156 -0
- data/test/test_version.rb +64 -0
- metadata +133 -0
data/lib/rpm/version.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
|
2
|
+
module RPM
|
3
|
+
class Version
|
4
|
+
include Comparable
|
5
|
+
|
6
|
+
# Parses a "epoch:version-release" string
|
7
|
+
# @return [Array] tuple [epoch, version, release]
|
8
|
+
def self.parse_evr(evr)
|
9
|
+
raise ArgumentError, "version can't be nil" if evr.nil?
|
10
|
+
version = evr
|
11
|
+
epoch = nil
|
12
|
+
release = nil
|
13
|
+
|
14
|
+
idx = version.rindex('-')
|
15
|
+
if idx
|
16
|
+
release = version[idx + 1..-1]
|
17
|
+
version = version[0..idx - 1]
|
18
|
+
end
|
19
|
+
|
20
|
+
idx = version.index(/\D/)
|
21
|
+
if idx && version[idx] == ':'
|
22
|
+
epoch = version[0..idx - 1]
|
23
|
+
version = version[idx + 1..-1]
|
24
|
+
end
|
25
|
+
[epoch ? epoch.to_i : nil, version, release]
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# @overload new(vr, e = nil)
|
30
|
+
# Creates a version object from a string representation
|
31
|
+
# @param [String] vr version and release in the form "v-r"
|
32
|
+
# @param [Number] e epoch
|
33
|
+
# @return [Version]
|
34
|
+
# @overload new(v, r, e = nil)
|
35
|
+
# Creates a version object from a string representation
|
36
|
+
# @param [String] v version
|
37
|
+
# @param [String] r release
|
38
|
+
# @param [Number] e epoch
|
39
|
+
# @return [Version]
|
40
|
+
# @example
|
41
|
+
# RPM:: Version.new "1.0.0-3"
|
42
|
+
# RPM:: Version.new "1.04"
|
43
|
+
# RPM:: Version.new "1.0.0-3k", 1
|
44
|
+
# RPM:: Version.new "2.0.3", "5k"
|
45
|
+
#
|
46
|
+
def initialize(*argv)
|
47
|
+
case argv.size
|
48
|
+
when 0
|
49
|
+
raise(ArgumentError('wrong number of arguments (0 for 1..3)'))
|
50
|
+
when 1
|
51
|
+
RPM::Utils.check_type(argv[0], String)
|
52
|
+
@e, @v, @r = RPM::Version.parse_evr(argv[0])
|
53
|
+
when 2
|
54
|
+
# (vr, e)
|
55
|
+
RPM::Utils.check_type(argv[0], String)
|
56
|
+
@e, @v, @r = RPM::Version.parse_evr(argv[0])
|
57
|
+
raise(TypeError, 'illegal argument value') unless e.nil?
|
58
|
+
@e = argv[1].to_i
|
59
|
+
when 3
|
60
|
+
RPM::Utils.check_type(argv[0], String)
|
61
|
+
RPM::Utils.check_type(argv[1], String)
|
62
|
+
@v = argv[0]
|
63
|
+
@r = argv[1]
|
64
|
+
@e = argv[2].to_i
|
65
|
+
else
|
66
|
+
raise(ArgumentError("too many arguments (#{args.size} for 1..3)"))
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [String] the version component
|
71
|
+
attr_reader :v
|
72
|
+
|
73
|
+
# @return [String] the release component
|
74
|
+
# or +nil+
|
75
|
+
attr_reader :r
|
76
|
+
|
77
|
+
# @return [String] the epoch component
|
78
|
+
# or +nil+
|
79
|
+
attr_reader :e
|
80
|
+
|
81
|
+
# Comparison between versions
|
82
|
+
# @param [Version] other
|
83
|
+
# @return [Number] -1 if +other+ is greater than, 0 if +other+ is equal to,
|
84
|
+
# and +1 if other is less than version.
|
85
|
+
#
|
86
|
+
# @example
|
87
|
+
# v1 = RPM::Version.new("3.0-0",1)
|
88
|
+
# v2 = RPM::Version.new("3.1-0",1)
|
89
|
+
# v1 <=> v2
|
90
|
+
# => -1
|
91
|
+
#
|
92
|
+
def <=>(other)
|
93
|
+
RPM::Utils.check_type(other, RPM::Version)
|
94
|
+
RPM::C.rpmvercmp(to_vre_epoch_zero, other.to_vre_epoch_zero)
|
95
|
+
end
|
96
|
+
|
97
|
+
# @param [Version] other Version to compare against
|
98
|
+
# @return [Boolean] true if the version is newer than +other+
|
99
|
+
def newer?(other)
|
100
|
+
self > other
|
101
|
+
end
|
102
|
+
|
103
|
+
# @param [Version] other Version to compare against
|
104
|
+
# @return [Boolean] true if the version is older than +other+
|
105
|
+
def older?(other)
|
106
|
+
self < other
|
107
|
+
end
|
108
|
+
|
109
|
+
# String representation in the form "v-r"
|
110
|
+
# @return [String]
|
111
|
+
# @note The epoch is not included
|
112
|
+
def to_vr
|
113
|
+
@r.nil? ? @v.to_s : "#{@v}-#{@r}"
|
114
|
+
end
|
115
|
+
|
116
|
+
# String representation in the form "e:v-r"
|
117
|
+
# @return [String]
|
118
|
+
# @note The epoch is included if present
|
119
|
+
def to_vre(_opts = {})
|
120
|
+
vr = to_vr
|
121
|
+
@e.nil? ? vr : "#{@e}:#{vr}"
|
122
|
+
end
|
123
|
+
|
124
|
+
# Alias for +to_vr+
|
125
|
+
# @see Version#to_vr
|
126
|
+
def to_s
|
127
|
+
to_vr
|
128
|
+
end
|
129
|
+
|
130
|
+
# Hash based on the version content
|
131
|
+
# @return [String]
|
132
|
+
def hash
|
133
|
+
h = @e.nil? ? 0 : @e
|
134
|
+
h = (h << 1) ^ @r.hash
|
135
|
+
h = (h << 1) ^ @v.hash
|
136
|
+
end
|
137
|
+
|
138
|
+
# String representation in the form "e:v-r"
|
139
|
+
# @return [String]
|
140
|
+
# @note The epoch is included always. As 0 if not present
|
141
|
+
def to_vre_epoch_zero
|
142
|
+
vr = to_vr
|
143
|
+
@e.nil? ? "0:#{vr}" : "#{@e}:#{vr}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
data/lib/rpm.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
|
2
|
+
require 'rpm/c'
|
3
|
+
require 'rpm/package'
|
4
|
+
require 'rpm/file'
|
5
|
+
require 'rpm/db'
|
6
|
+
require 'rpm/problem'
|
7
|
+
require 'rpm/transaction'
|
8
|
+
require 'rpm/match_iterator'
|
9
|
+
require 'rpm/version'
|
10
|
+
require 'rpm/dependency'
|
11
|
+
require 'rpm/utils'
|
12
|
+
|
13
|
+
module RPM
|
14
|
+
TAG = RPM::C::Tag
|
15
|
+
LOG = RPM::C::Log
|
16
|
+
SENSE = RPM::C::Sense
|
17
|
+
FILE = RPM::C::FileAttrs
|
18
|
+
FILE_STATE = RPM::C::FileState
|
19
|
+
TRANS_FLAG = RPM::C::TransFlags
|
20
|
+
PROB_FILTER = RPM::C::ProbFilter
|
21
|
+
MIRE = RPM::C::RegexpMode
|
22
|
+
|
23
|
+
# Creates a new transaction and pass it
|
24
|
+
# to the given block
|
25
|
+
#
|
26
|
+
# @param [String] root dir, default '/'
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# RPM.transaction do |ts|
|
30
|
+
# ...
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
def self.transaction(root = '/')
|
34
|
+
ts = Transaction.new
|
35
|
+
ts.root_dir = root
|
36
|
+
yield ts
|
37
|
+
ensure
|
38
|
+
ts.ptr.free
|
39
|
+
end
|
40
|
+
|
41
|
+
# @param [String] name Name of the macro
|
42
|
+
# @return [String] value of macro +name+
|
43
|
+
def self.[](name)
|
44
|
+
if C::rpm_version_code >= ((4 << 16) + (14 << 8) + (0 << 0))
|
45
|
+
obuf = ::FFI::MemoryPointer.new(:pointer, 1)
|
46
|
+
sbuf = FFI::MemoryPointer.from_string("%{#{name}}")
|
47
|
+
ret = RPM::C.rpmExpandMacros(nil, sbuf, obuf, 0)
|
48
|
+
raise if ret < 0
|
49
|
+
|
50
|
+
val = obuf.read_pointer
|
51
|
+
val.nil? ? nil : val.read_string
|
52
|
+
else
|
53
|
+
buffer = ::FFI::MemoryPointer.new(:pointer, 1024)
|
54
|
+
buffer.write_string("%{#{name}}")
|
55
|
+
ret = RPM::C.expandMacros(nil, nil, buffer, 1024)
|
56
|
+
raise if ret < 0
|
57
|
+
|
58
|
+
buffer.read_string
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Setup a macro
|
63
|
+
# @param [String] name Name of the macro
|
64
|
+
# @param [String] value Value of the macro or +nil+ to delete it
|
65
|
+
def self.[]=(name, value)
|
66
|
+
if value.nil?
|
67
|
+
if C::rpm_version_code >= ((4 << 16) + (14 << 8) + (0 << 0))
|
68
|
+
RPM::C.rpmPopMacro(nil, name.to_s)
|
69
|
+
else
|
70
|
+
RPM::C.delMacro(nil, name.to_s)
|
71
|
+
end
|
72
|
+
else
|
73
|
+
if C::rpm_version_code >= ((4 << 16) + (14 << 8) + (0 << 0))
|
74
|
+
RPM::C.rpmPushMacro(nil, name.to_s, '', value.to_s, RPM::C::RMIL_DEFAULT)
|
75
|
+
else
|
76
|
+
RPM::C.addMacro(nil, name.to_s, '', value.to_s, RPM::C::RMIL_DEFAULT)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
RPM::C.rpmReadConfigFiles(nil, nil)
|
83
|
+
RPM::C.rpmInitMacros(nil, RPM::C.MACROFILES)
|
84
|
+
|
85
|
+
# TODO
|
86
|
+
# set verbosity
|
87
|
+
|
88
|
+
require 'rpm/compat'
|
data/lib/rpm2.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative "./rpm"
|
data/rpm2.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require_relative 'lib/rpm/gem_version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'rpm2'
|
7
|
+
s.version = RPM::GEM_VERSION
|
8
|
+
s.authors = ['Duncan Mac-Vicar P.', 'ManageIQ Authors']
|
9
|
+
s.email = ['dmacvicar@suse.de']
|
10
|
+
s.homepage = 'https://github.com/ManageIQ/ruby-rpm-ffi2'
|
11
|
+
s.licenses = ['MIT']
|
12
|
+
s.summary = 'Ruby bindings for rpm (package manager)'
|
13
|
+
s.description = 'Ruby bindings for rpm. Almost a drop-in replacement for ruby-rpm. Uses FFI.'
|
14
|
+
|
15
|
+
s.metadata['allowed_push_host'] = 'https://rubygems.org'
|
16
|
+
s.metadata['rubygems_mfa_required'] = 'true'
|
17
|
+
s.metadata['homepage_uri'] = s.homepage
|
18
|
+
s.metadata['source_code_uri'] = s.homepage
|
19
|
+
s.metadata['changelog_uri'] = "#{s.homepage}/blob/master/CHANGELOG.md"
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
24
|
+
s.require_paths = ['lib']
|
25
|
+
|
26
|
+
# specify any dependencies here; for example:
|
27
|
+
s.add_development_dependency 'rake'
|
28
|
+
s.add_runtime_dependency 'ffi'
|
29
|
+
end
|
data/test/data/a.spec
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
Name: a
|
2
|
+
Version: 1.0
|
3
|
+
Release: 0
|
4
|
+
License: GPLv2
|
5
|
+
Summary: Minimal package example
|
6
|
+
Url: http://www.a.com
|
7
|
+
Group: Development
|
8
|
+
Source: a-1.0.tar.gz
|
9
|
+
BuildRequires: c d
|
10
|
+
Provides: something
|
11
|
+
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
12
|
+
|
13
|
+
%description
|
14
|
+
Description
|
15
|
+
|
16
|
+
%package devel
|
17
|
+
Summary: Development part
|
18
|
+
%description devel
|
19
|
+
Development headers
|
20
|
+
|
21
|
+
%prep
|
22
|
+
%setup -q
|
23
|
+
|
24
|
+
%build
|
25
|
+
%configure
|
26
|
+
make %{?_smp_mflags}
|
27
|
+
|
28
|
+
%install
|
29
|
+
%make_install
|
30
|
+
|
31
|
+
%clean
|
32
|
+
%{?buildroot:%__rm -rf "%{buildroot}"}
|
33
|
+
|
34
|
+
%post
|
35
|
+
|
36
|
+
%postun
|
37
|
+
|
38
|
+
%files
|
39
|
+
%defattr(-,root,root)
|
40
|
+
%doc ChangeLog README COPYING
|
41
|
+
%{_datadir}/a/README
|
42
|
+
|
43
|
+
%files devel
|
44
|
+
%{_includedir}/a.h
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
%changelog
|
49
|
+
|
Binary file
|
@@ -0,0 +1,38 @@
|
|
1
|
+
Name: simple
|
2
|
+
Version: 1.0
|
3
|
+
Release: 0
|
4
|
+
License: GPL
|
5
|
+
Summary: Simple dummy package
|
6
|
+
Summary(es): Paquete simple de muestra
|
7
|
+
Url: http://www.dummmy.com
|
8
|
+
Group: Development
|
9
|
+
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
10
|
+
|
11
|
+
%description
|
12
|
+
Dummy package
|
13
|
+
|
14
|
+
%description -l es
|
15
|
+
Paquete de muestra
|
16
|
+
|
17
|
+
%prep
|
18
|
+
|
19
|
+
%build
|
20
|
+
mkdir -p %{buildroot}%{_datadir}/%{name}
|
21
|
+
echo "Hello" > %{buildroot}%{_datadir}/%{name}/README
|
22
|
+
echo "Hola" > %{buildroot}%{_datadir}/%{name}/README.es
|
23
|
+
|
24
|
+
%install
|
25
|
+
|
26
|
+
%clean
|
27
|
+
%{?buildroot:%__rm -rf "%{buildroot}"}
|
28
|
+
|
29
|
+
%files
|
30
|
+
%defattr(-,root,root)
|
31
|
+
%{_datadir}/%{name}/README
|
32
|
+
%{_datadir}/%{name}/README.es
|
33
|
+
|
34
|
+
%changelog
|
35
|
+
* Wed Nov 06 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
36
|
+
- Fix something
|
37
|
+
* Tue Nov 05 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
38
|
+
- Fix something else
|
Binary file
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Name: simple_with_deps
|
2
|
+
Version: 1.0
|
3
|
+
Release: 0
|
4
|
+
License: GPL
|
5
|
+
Summary: Simple dummy package
|
6
|
+
Url: http://www.dummmy.com
|
7
|
+
Group: Development
|
8
|
+
Requires: a
|
9
|
+
Requires: b > 1.0
|
10
|
+
Conflicts: c d
|
11
|
+
Obsoletes: f
|
12
|
+
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
13
|
+
|
14
|
+
%description
|
15
|
+
Dummy package
|
16
|
+
|
17
|
+
%description -l es
|
18
|
+
Paquete de muestra
|
19
|
+
|
20
|
+
%prep
|
21
|
+
|
22
|
+
%build
|
23
|
+
mkdir -p %{buildroot}%{_datadir}/%{name}
|
24
|
+
echo "Hello" > %{buildroot}%{_datadir}/%{name}/README
|
25
|
+
echo "Hola" > %{buildroot}%{_datadir}/%{name}/README.es
|
26
|
+
|
27
|
+
%install
|
28
|
+
|
29
|
+
%clean
|
30
|
+
%{?buildroot:%__rm -rf "%{buildroot}"}
|
31
|
+
|
32
|
+
%files
|
33
|
+
%defattr(-,root,root)
|
34
|
+
%{_datadir}/%{name}/README
|
35
|
+
%{_datadir}/%{name}/README.es
|
36
|
+
|
37
|
+
%changelog
|
38
|
+
* Wed Nov 06 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
39
|
+
- Fix something
|
40
|
+
* Tue Nov 05 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
41
|
+
- Fix something else
|
data/test/helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative('helper')
|
2
|
+
require 'rpm/compat'
|
3
|
+
|
4
|
+
class RPMDependencyTests < Minitest::Test
|
5
|
+
EQ = RPM::SENSE_EQUAL
|
6
|
+
LT = RPM::SENSE_LESS
|
7
|
+
GT = RPM::SENSE_GREATER
|
8
|
+
|
9
|
+
def test_satisfy
|
10
|
+
prv = provides('foo', '2', '1', 0, EQ)
|
11
|
+
req = requires('foo', '1', '1', 0, EQ | GT)
|
12
|
+
assert(req.satisfy?(prv))
|
13
|
+
assert(prv.satisfy?(req))
|
14
|
+
|
15
|
+
# Different names don't overlap
|
16
|
+
prv = provides('foo', '2', '1', 0, EQ)
|
17
|
+
req = requires('bar', '1', '1', 0, EQ | GT)
|
18
|
+
assert(!req.satisfy?(prv))
|
19
|
+
end
|
20
|
+
|
21
|
+
def provides(name, v, r, e, sense)
|
22
|
+
RPM::Provide.new(name, RPM::Version.new(v, r, e), sense, nil)
|
23
|
+
end
|
24
|
+
|
25
|
+
def requires(name, v, r, e, sense)
|
26
|
+
RPM::Require.new(name, RPM::Version.new(v, r, e), sense, nil)
|
27
|
+
end
|
28
|
+
end
|
data/test/test_file.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class RPMFileTests < Minitest::Test
|
4
|
+
def test_link_to
|
5
|
+
f = RPM::File.new('path', 'md5sum', nil, 42, 1,
|
6
|
+
'owner', 'group', 43, 0o777, 44, 45)
|
7
|
+
assert_nil(f.link_to)
|
8
|
+
f = RPM::File.new('path', 'md5sum', 'link_to', 42, 1,
|
9
|
+
'owner', 'group', 43, 0o777, 44, 45)
|
10
|
+
assert_equal('link_to', f.link_to)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_flags
|
14
|
+
f = RPM::File.new('path', 'md5sum', nil, 42, 1,
|
15
|
+
'owner', 'group', 43, 0o777, 44, 45)
|
16
|
+
f.config?
|
17
|
+
f.doc?
|
18
|
+
f.is_missingok?
|
19
|
+
f.is_noreplace?
|
20
|
+
f.is_specfile?
|
21
|
+
f.ghost?
|
22
|
+
f.license?
|
23
|
+
f.readme?
|
24
|
+
f.replaced?
|
25
|
+
f.notinstalled?
|
26
|
+
f.netshared?
|
27
|
+
|
28
|
+
assert_raises NotImplementedError do
|
29
|
+
f.exclude?
|
30
|
+
end
|
31
|
+
|
32
|
+
assert_raises NotImplementedError do
|
33
|
+
f.donotuse?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/test/test_lib.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class RPMLibTests < Minitest::Test
|
4
|
+
def test_lib_lib
|
5
|
+
assert_kind_of String, RPM::C.RPMVERSION
|
6
|
+
# "x.y.z"
|
7
|
+
assert(RPM::C.RPMVERSION.size >= 5)
|
8
|
+
assert_kind_of Integer, RPM::C.rpm_version_code
|
9
|
+
# >= 4.0.0
|
10
|
+
assert(RPM::C.rpm_version_code >= ((4 << 16) + (0 << 8) + (0 << 0)))
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_lib_header
|
14
|
+
ptr = RPM::C.headerNew
|
15
|
+
RPM::C.headerFree(ptr)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_lib_ts
|
19
|
+
ts = RPM::C.rpmtsCreate
|
20
|
+
RPM::C.rpmtsSetRootDir(ts, '/')
|
21
|
+
it = RPM::C.rpmtsInitIterator(ts, 0, nil, 0)
|
22
|
+
hdrs = []
|
23
|
+
until (hdr = RPM::C.rpmdbNextIterator(it)).null?
|
24
|
+
hdrs << hdr
|
25
|
+
assert_kind_of String, RPM::C.headerGetAsString(hdr, :name)
|
26
|
+
end
|
27
|
+
RPM::C.rpmdbFreeIterator(it)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_lib_macros
|
31
|
+
assert_kind_of String, RPM::C.MACROFILES
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class RPMPackageTests < Minitest::Test
|
4
|
+
def test_create
|
5
|
+
pkg = RPM::Package.create('foo', RPM::Version.new('1.0'))
|
6
|
+
assert_equal 'foo', pkg.name
|
7
|
+
assert_equal '(none)', pkg.signature
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_open
|
11
|
+
pkg = RPM::Package.open(fixture('simple-1.0-0.i586.rpm'))
|
12
|
+
|
13
|
+
req = RPM::Require.new('simple', RPM::Version.new('1.0', '0'), RPM::SENSE_GREATER | RPM::SENSE_EQUAL, nil)
|
14
|
+
assert req.satisfy?(pkg)
|
15
|
+
|
16
|
+
assert_equal 'simple-1.0-0-i586', pkg.to_s
|
17
|
+
|
18
|
+
assert_equal '3b5f9d468c877166532c662e29f43bc3', pkg.signature
|
19
|
+
|
20
|
+
assert_kind_of RPM::Package, pkg
|
21
|
+
assert_equal 'simple', pkg[:name]
|
22
|
+
assert_equal 'i586', pkg[:arch]
|
23
|
+
assert_kind_of RPM::Version, pkg.version
|
24
|
+
assert_equal '1.0-0', pkg.version.to_s
|
25
|
+
|
26
|
+
backup_lang = ENV['LC_ALL']
|
27
|
+
|
28
|
+
ENV['LC_ALL'] = 'C'
|
29
|
+
assert_equal 'Simple dummy package', pkg[:summary]
|
30
|
+
assert_equal 'Dummy package', pkg[:description]
|
31
|
+
|
32
|
+
ENV['LC_ALL'] = 'es_ES.UTF-8'
|
33
|
+
assert_equal 'Paquete simple de muestra', pkg[:summary]
|
34
|
+
assert_equal 'Paquete de muestra', pkg[:description]
|
35
|
+
|
36
|
+
ENV['LC_ALL'] = backup_lang
|
37
|
+
|
38
|
+
# Arrays
|
39
|
+
assert_equal %w[root root], pkg[:fileusername]
|
40
|
+
assert_equal [6, 5], pkg[:filesizes]
|
41
|
+
|
42
|
+
assert pkg.provides.map(&:name).include?('simple(x86-32)')
|
43
|
+
assert pkg.provides.map(&:name).include?('simple')
|
44
|
+
|
45
|
+
assert pkg.files.map(&:path).include?('/usr/share/simple/README')
|
46
|
+
assert pkg.files.map(&:path).include?('/usr/share/simple/README.es')
|
47
|
+
|
48
|
+
assert pkg.conflicts.empty?
|
49
|
+
assert pkg.requires.map(&:name).include?('rpmlib(PayloadIsLzma)')
|
50
|
+
assert pkg.obsoletes.empty?
|
51
|
+
|
52
|
+
file = pkg.files.select { |x| x.path == '/usr/share/simple/README' }.first
|
53
|
+
assert_nil file.link_to
|
54
|
+
assert !file.symlink?
|
55
|
+
|
56
|
+
assert_equal ['- Fix something', '- Fix something else'], pkg.changelog.map(&:text)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_dependencies
|
60
|
+
pkg = RPM::Package.open(fixture('simple_with_deps-1.0-0.i586.rpm'))
|
61
|
+
assert_equal 'simple_with_deps', pkg.name
|
62
|
+
|
63
|
+
assert pkg.provides.map(&:name).include?('simple_with_deps(x86-32)')
|
64
|
+
assert pkg.provides.map(&:name).include?('simple_with_deps')
|
65
|
+
|
66
|
+
assert pkg.requires.map(&:name).include?('a')
|
67
|
+
b = pkg.requires.find { |x| x.name == 'b' }
|
68
|
+
assert b
|
69
|
+
assert_equal '1.0', b.version.to_s
|
70
|
+
|
71
|
+
assert pkg.conflicts.map(&:name).include?('c')
|
72
|
+
assert pkg.conflicts.map(&:name).include?('d')
|
73
|
+
|
74
|
+
assert pkg.obsoletes.map(&:name).include?('f')
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class RPMProblemTests < Minitest::Test
|
4
|
+
def test_create
|
5
|
+
problem = RPM::Problem.create(:requires, 'foo-1.0-0', 'foo.rpm', 'bar-1.0-0', 'Hello', 1)
|
6
|
+
assert_equal 'foo.rpm', problem.key
|
7
|
+
assert_equal :requires, problem.type
|
8
|
+
assert_equal 'Hello', problem.str
|
9
|
+
assert_equal 'Hello is needed by (installed) bar-1.0-0', problem.to_s
|
10
|
+
|
11
|
+
# Create a RPM::Problem from an existing pointer
|
12
|
+
problem2 = RPM::Problem.new(problem.ptr)
|
13
|
+
assert_equal problem.key, problem2.key
|
14
|
+
assert_equal problem.type, problem2.type
|
15
|
+
assert_equal problem.str, problem2.str
|
16
|
+
assert_equal problem.to_s, problem2.to_s
|
17
|
+
end
|
18
|
+
end
|
data/test/test_rpm.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class RPMRPMTests < Minitest::Test
|
4
|
+
def test_enum
|
5
|
+
assert RPM::TAG[:not_found]
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_compat
|
9
|
+
# puts RPM::LOG_ALERT
|
10
|
+
# assert_raise(NameError) { RPM::LOG_ALERT }
|
11
|
+
|
12
|
+
# require 'rpm/compat'
|
13
|
+
assert_equal RPM::LOG_ALERT, RPM::LOG[:alert]
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_iterator
|
17
|
+
RPM.transaction do |t|
|
18
|
+
assert_kind_of RPM::Transaction, t
|
19
|
+
# t.each do |pkg|
|
20
|
+
# puts pkg[:name]
|
21
|
+
# end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_macro_read
|
26
|
+
assert_equal '/usr', RPM['_usr']
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_macro_write
|
30
|
+
RPM['hoge'] = 'hoge'
|
31
|
+
assert_equal(RPM['hoge'], 'hoge')
|
32
|
+
end
|
33
|
+
end # class RPM_RPM_Tests < Test::Unit::TestCase
|