rpm2 0.1.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/.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
|