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.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/workflows/ci.yaml +25 -0
  4. data/.gitignore +8 -0
  5. data/.rubocop.yml +1 -0
  6. data/.rubocop_todo.yml +111 -0
  7. data/.whitesource +3 -0
  8. data/CHANGELOG.md +66 -0
  9. data/Gemfile +9 -0
  10. data/MIT-LICENSE +23 -0
  11. data/README.md +374 -0
  12. data/Rakefile +58 -0
  13. data/_docker/Dockerfile.ubi8 +8 -0
  14. data/_docker/Dockerfile.ubi9 +8 -0
  15. data/lib/rpm/c/header.rb +36 -0
  16. data/lib/rpm/c/rpmcallback.rb +27 -0
  17. data/lib/rpm/c/rpmcli.rb +6 -0
  18. data/lib/rpm/c/rpmdb.rb +20 -0
  19. data/lib/rpm/c/rpmds.rb +43 -0
  20. data/lib/rpm/c/rpmfi.rb +31 -0
  21. data/lib/rpm/c/rpmio.rb +17 -0
  22. data/lib/rpm/c/rpmlib.rb +12 -0
  23. data/lib/rpm/c/rpmlog.rb +23 -0
  24. data/lib/rpm/c/rpmmacro.rb +33 -0
  25. data/lib/rpm/c/rpmprob.rb +53 -0
  26. data/lib/rpm/c/rpmps.rb +11 -0
  27. data/lib/rpm/c/rpmtag.rb +304 -0
  28. data/lib/rpm/c/rpmtd.rb +34 -0
  29. data/lib/rpm/c/rpmts.rb +69 -0
  30. data/lib/rpm/c/rpmtypes.rb +28 -0
  31. data/lib/rpm/c.rb +49 -0
  32. data/lib/rpm/compat.rb +40 -0
  33. data/lib/rpm/db.rb +117 -0
  34. data/lib/rpm/dependency.rb +120 -0
  35. data/lib/rpm/file.rb +134 -0
  36. data/lib/rpm/gem_version.rb +7 -0
  37. data/lib/rpm/match_iterator.rb +66 -0
  38. data/lib/rpm/package.rb +332 -0
  39. data/lib/rpm/problem.rb +65 -0
  40. data/lib/rpm/transaction.rb +268 -0
  41. data/lib/rpm/utils.rb +7 -0
  42. data/lib/rpm/version.rb +146 -0
  43. data/lib/rpm.rb +88 -0
  44. data/lib/rpm2.rb +1 -0
  45. data/rpm2.gemspec +29 -0
  46. data/test/data/a.spec +49 -0
  47. data/test/data/simple-1.0-0.i586.rpm +0 -0
  48. data/test/data/simple.spec +38 -0
  49. data/test/data/simple_with_deps-1.0-0.i586.rpm +0 -0
  50. data/test/data/simple_with_deps.spec +41 -0
  51. data/test/helper.rb +7 -0
  52. data/test/test_dependency.rb +28 -0
  53. data/test/test_file.rb +36 -0
  54. data/test/test_lib.rb +33 -0
  55. data/test/test_package.rb +76 -0
  56. data/test/test_problem.rb +18 -0
  57. data/test/test_rpm.rb +33 -0
  58. data/test/test_transaction.rb +156 -0
  59. data/test/test_version.rb +64 -0
  60. metadata +133 -0
@@ -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
@@ -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,7 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
2
+ require 'minitest/autorun'
3
+ require 'rpm'
4
+
5
+ def fixture(name)
6
+ File.expand_path(File.join(File.dirname(__FILE__), 'data', name))
7
+ end
@@ -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