rpm2 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,69 @@
1
+ module RPM
2
+ module C
3
+ TransFlags = enum(:rpmtransFlags_e, [
4
+ :none, 0,
5
+ :test, (1 << 0),
6
+ :build_probs, (1 << 1),
7
+ :noscripts, (1 << 2),
8
+ :justdb, (1 << 3),
9
+ :notriggers, (1 << 4),
10
+ :nodocs, (1 << 5),
11
+ :allfiles, (1 << 6),
12
+ # bit 7 unused
13
+ :nocontexts, (1 << 8),
14
+ # bits 9-15 unused
15
+ :notriggerprein, (1 << 16),
16
+ :nopre, (1 << 17),
17
+ :nopost, (1 << 18),
18
+ :notriggerin, (1 << 19),
19
+ :notriggerun, (1 << 20),
20
+ :nopreun, (1 << 21),
21
+ :nopostun, (1 << 22),
22
+ :notriggerpostun, (11 << 23),
23
+ # bits 24-25 unused
24
+ :nocollections, (1 << 26),
25
+ :nomd5, (1 << 27),
26
+ :nofiledigest, (1 << 27),
27
+ # bits 28-29 unused
28
+ :noconfigs, (1 << 30),
29
+ :deploops, (1 << 31)
30
+ ])
31
+
32
+ typedef :pointer, :rpmts
33
+ typedef :pointer, :rpmps
34
+ typedef :rpmFlags, :rpmtransFlags
35
+
36
+ attach_function 'rpmtsCheck', [:rpmts], :int
37
+ attach_function 'rpmtsOrder', [:rpmts], :int
38
+ attach_function 'rpmtsRun', %i[rpmts rpmps int], :int
39
+ attach_function 'rpmtsLink', [:rpmts], :rpmts
40
+ attach_function 'rpmtsCloseDB', [:rpmts], :int
41
+ attach_function 'rpmtsOpenDB', %i[rpmts int], :int
42
+ attach_function 'rpmtsInitDB', %i[rpmts int], :int
43
+ attach_function 'rpmtsGetDBMode', [:rpmts], :int
44
+ attach_function 'rpmtsSetDBMode', %i[rpmts int], :int
45
+ attach_function 'rpmtsRebuildDB', [:rpmts], :int
46
+ attach_function 'rpmtsVerifyDB', [:rpmts], :int
47
+ attach_function 'rpmtsInitIterator', %i[rpmts rpmDbiTagVal pointer int], :rpmdbMatchIterator
48
+ # ...
49
+ attach_function 'rpmtsProblems', [:rpmts], :rpmps
50
+ # ...
51
+ attach_function 'rpmtsClean', [:rpmts], :void
52
+ # more...
53
+ attach_function 'rpmtsFree', [:rpmts], :pointer
54
+ # ..
55
+ attach_function 'rpmtsSetNotifyCallback', %i[rpmts rpmCallbackFunction rpmCallbackData], :int
56
+ # ...
57
+ attach_function 'rpmtsRootDir', [:rpmts], :string
58
+ attach_function 'rpmtsSetRootDir', %i[rpmts string], :int
59
+ # ...
60
+ attach_function 'rpmtsGetRdb', [:rpmts], :rpmdb
61
+ # ..
62
+ attach_function 'rpmtsFlags', [:rpmts], :rpmtransFlags
63
+ attach_function 'rpmtsSetFlags', %i[rpmts rpmtransFlags], :rpmtransFlags
64
+ # ...
65
+ attach_function 'rpmtsCreate', [], :rpmts
66
+ attach_function 'rpmtsAddInstallElement', %i[rpmts header fnpyKey int rpmRelocation], :int
67
+ attach_function 'rpmtsAddEraseElement', %i[rpmts header int], :int
68
+ end
69
+ end
@@ -0,0 +1,28 @@
1
+
2
+ module RPM
3
+ module C
4
+ Rc = enum(
5
+ :ok, 0,
6
+ :notfound, 1,
7
+ :fail, 2,
8
+ :nottrusted, 3,
9
+ :nokey, 4
10
+ )
11
+
12
+ typedef :int32, :rpm_tag_t
13
+ typedef :uint32, :rpm_tagtype_t
14
+ typedef :uint32, :rpm_count_t
15
+ typedef :rpm_tag_t, :rpmTagVal
16
+ typedef :rpm_tag_t, :rpmDbiTagVal
17
+
18
+ typedef :uint32, :rpmFlags
19
+ typedef :uint32, :rpm_off_t
20
+ typedef :uint64, :rpm_loff_t
21
+
22
+ typedef :pointer, :FD_t
23
+ typedef :pointer, :fnpyKey
24
+ typedef :pointer, :rpmCallbackData
25
+
26
+ typedef :uint64, :rpm_loff_t
27
+ end
28
+ end
data/lib/rpm/c.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'ffi'
2
+
3
+ module RPM
4
+ module C
5
+ extend ::FFI::Library
6
+
7
+ begin
8
+ ffi_lib ['rpm',
9
+ 'librpm.so.9',
10
+ 'librpm.so.8', # Tumbleweed
11
+ 'librpm.so.7', # fedora 23
12
+ 'librpm.so.3', 'librpm.so.2', 'librpm.so.1']
13
+ rescue LoadError => e
14
+ raise(
15
+ "Can't find rpm libs on your system: #{e.message}"
16
+ )
17
+ end
18
+ end
19
+ end
20
+
21
+ require 'rpm/c/rpmtypes'
22
+ require 'rpm/c/rpmcallback'
23
+ require 'rpm/c/rpmtag'
24
+ require 'rpm/c/rpmlib'
25
+
26
+ module RPM
27
+ module C
28
+
29
+ def self.rpm_version_code
30
+ ver = ::RPM::C.RPMVERSION.split('.', 3)
31
+ return (ver[0].to_i<<16) + (ver[1].to_i<<8) + (ver[2].to_i<<0)
32
+ end
33
+
34
+ end
35
+ end
36
+
37
+ require 'rpm/c/rpmlog'
38
+ require 'rpm/c/rpmmacro'
39
+ require 'rpm/c/rpmio'
40
+ require 'rpm/c/header'
41
+ require 'rpm/c/rpmprob'
42
+ require 'rpm/c/rpmps'
43
+ require 'rpm/c/rpmfi'
44
+ require 'rpm/c/rpmdb'
45
+ require 'rpm/c/rpmcallback'
46
+ require 'rpm/c/rpmcli'
47
+ require 'rpm/c/rpmts'
48
+ require 'rpm/c/rpmds'
49
+ require 'rpm/c/rpmtd'
data/lib/rpm/compat.rb ADDED
@@ -0,0 +1,40 @@
1
+
2
+ module RPM
3
+ # compatibility
4
+ TAG.to_h.each do |k, v|
5
+ const_set "TAG_#{k.to_s.upcase}", v.to_i
6
+ end
7
+
8
+ LOG.to_h.each do |k, v|
9
+ const_set "LOG_#{k.to_s.upcase}", v.to_i
10
+ end
11
+
12
+ SENSE.to_h.each do |k, v|
13
+ const_set "SENSE_#{k.to_s.upcase}", v.to_i
14
+ end
15
+
16
+ # RPMFILE_*
17
+ FILE.to_h.each do |k, v|
18
+ const_set "FILE_#{k.to_s.upcase}", v.to_i
19
+ end
20
+
21
+ # RPMFILE_STATE_*
22
+ FILE_STATE.to_h.each do |k, v|
23
+ const_set "FILE_STATE_#{k.to_s.upcase}", v.to_i
24
+ end
25
+
26
+ # RPMTRANS_FLAG_*
27
+ TRANS_FLAG.to_h.each do |k, v|
28
+ const_set "TRANS_FLAG_#{k.to_s.upcase}", v.to_i
29
+ end
30
+
31
+ # RPMPROB_FILTER_*
32
+ PROB_FILTER.to_h.each do |k, v|
33
+ const_set "PROB_FILTER_#{k.to_s.upcase}", v.to_i
34
+ end
35
+
36
+ # RPMPROB_FILTER_*
37
+ MIRE.to_h.each do |k, v|
38
+ const_set "MIRE_#{k.to_s.upcase}", v.to_i
39
+ end
40
+ end
data/lib/rpm/db.rb ADDED
@@ -0,0 +1,117 @@
1
+ require 'fcntl'
2
+
3
+ module RPM
4
+ class DB
5
+ include Enumerable
6
+
7
+ # @visibility private
8
+ # @param ts [Transaction] transaction object
9
+ def initialize(ts, opts = {})
10
+ opts[:writable] ||= false
11
+
12
+ @ts = ts
13
+ RPM::C.rpmtsOpenDB(@ts.ptr, opts[:writable] ? Fcntl::O_RDWR | Fcntl::O_CREAT : Fcntl::O_RDONLY)
14
+ end
15
+
16
+ # @return [RPM::MatchIterator] Creates an iterator for +tag+ and +val+
17
+ def init_iterator(tag, val)
18
+ @ts.init_iterator(tag, val)
19
+ end
20
+
21
+ #
22
+ # @yield [Package] Called for each match
23
+ # @param [Number] key RPM tag key
24
+ # @param [String] val Value to match
25
+ # @example
26
+ # RPM.transaction do |t|
27
+ # t.each_match(RPM::TAG_ARCH, "x86_64") do |pkg|
28
+ # puts pkg.name
29
+ # end
30
+ # end
31
+ #
32
+ def each_match(key, val, &block)
33
+ @ts.each_match(key, val, &block)
34
+ end
35
+
36
+ #
37
+ # @yield [Package] Called for each package in the database
38
+ # @example
39
+ # db.each do |pkg|
40
+ # puts pkg.name
41
+ # end
42
+ #
43
+ def each(&block)
44
+ @ts.each(&block)
45
+ end
46
+
47
+ # @visibility private
48
+ def ptr
49
+ RPM::C.rpmtsGetRdb(@ts.ptr)
50
+ end
51
+
52
+ def close
53
+ RPM::C.rpmtsCloseDB(@ts.ptr)
54
+ end
55
+
56
+ def closed?
57
+ ptr.null?
58
+ end
59
+
60
+ #
61
+ # The package database is opened, but transactional processing
62
+ # (@see RPM::DB#transaction) cannot be done for when +writable+ is false.
63
+ # When +writable+ is +false+ then the generated object gets freezed.
64
+ # @param [Boolean] writable Whether the database is writable. Default is +false+.
65
+ # @param [String] root Root path for the database, default is empty.
66
+ # @return [RPM::DB]
67
+ #
68
+ # @example
69
+ # db = RPM::DB.open
70
+ # db.each do |pkg|
71
+ # puts pkg.name
72
+ # end
73
+ #
74
+ def self.open(_writable = false, root = '/', &block)
75
+ open_for_transaction(Transaction.new(root: root), writable: false, &block)
76
+ end
77
+
78
+ # @visibility private
79
+ def self.open_for_transaction(ts, opts = {})
80
+ db = new(ts, opts)
81
+ return db unless block_given?
82
+
83
+ begin
84
+ yield db
85
+ ensure
86
+ db.close unless db.closed?
87
+ end
88
+ end
89
+
90
+ # @deprecated Not possible to get home value in
91
+ # newer RPM versions
92
+ def home
93
+ raise NotImplementedError
94
+ end
95
+
96
+ # @return [String] The root path of the database
97
+ def root
98
+ RPM::C.rpmtsRootDir(@ts.ptr)
99
+ end
100
+
101
+ # @deprecated Use RPM::Transaction#each
102
+ def self.each
103
+ DB.open do |db|
104
+ it = MatchIterator.from_ptr(RPM::C.rpmdbInitIterator(db.ptr, 0, nil, 0))
105
+ if block_given?
106
+ it.each do |pkg|
107
+ yield pkg
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ # @return number of instances of +name+ in the
114
+ # database
115
+ def count_packages(name); end
116
+ end
117
+ end
@@ -0,0 +1,120 @@
1
+
2
+ module RPM
3
+ class Dependency
4
+ # @return [String] dependency name
5
+ attr_accessor :name
6
+ # @return [String] dependency version
7
+ attr_accessor :version
8
+ # @return [String] dependency flags
9
+ attr_accessor :flags
10
+ # @return [Package] package this dependency belongs to
11
+ attr_accessor :owner
12
+
13
+ attr_accessor :nametag
14
+ attr_accessor :versiontag
15
+ attr_accessor :flagstag
16
+
17
+ def initialize(name, version, flags, owner)
18
+ RPM::Utils.check_type(version, RPM::Version)
19
+
20
+ @name = name
21
+ @version = version
22
+ @flags = flags
23
+ @owner = owner
24
+ end
25
+
26
+ # @param [Package, Dependency, Version] other
27
+ # @return [Boolean] true if +other+ satisfies this dependency
28
+ def satisfy?(other)
29
+ case other
30
+ when RPM::Package then
31
+ other.provides.each do |prov|
32
+ return true if satisfy?(prov)
33
+ end
34
+ false
35
+ when RPM::Dependency then
36
+ RPM::C.rpmdsCompare(
37
+ RPM::C.rpmdsSingle(:providename, other.name,
38
+ other.version.to_vre, other.flags),
39
+ RPM::C.rpmdsSingle(:providename, name,
40
+ version.to_vre, flags)
41
+ ) != 0
42
+ when RPM::Version then
43
+ RPM::C.rpmdsCompare(
44
+ RPM::C.rpmdsSingle(:providename, name,
45
+ other.to_vre, other.to_vre.empty? ? 0 : :equal),
46
+ RPM::C.rpmdsSingle(:providename, name,
47
+ version.to_vre, flags)
48
+ ) != 0
49
+ else
50
+ raise(TypeError, "#{other} is not a Version or Dependency")
51
+ end
52
+ end
53
+
54
+ # @return [Boolean] true if '<' or '=<' are used to compare the version
55
+ def lt?
56
+ flags & RPM::SENSE[:less]
57
+ end
58
+
59
+ # @return [Boolean] true if '>' or '>=' are used to compare the version
60
+ def gt?
61
+ flags & RPM::SENSE[:greater]
62
+ end
63
+
64
+ # @return [Boolean] true if '=', '=<' or '>=' are used to compare the version
65
+ def eq?
66
+ flags & RPM::SENSE[:equal]
67
+ end
68
+
69
+ # @return [Boolean] true if '=<' is used to compare the version
70
+ def le?
71
+ (flags & RPM::SENSE[:less]) && (flags & RPM::SENSE[:equal])
72
+ end
73
+
74
+ # @return [Boolean] true if '>=' is used to compare the version
75
+ def ge?
76
+ (flags & RPM::SENSE[:greater]) && (flags & RPM::SENSE[:equal])
77
+ end
78
+
79
+ # @return [Boolean] true if this is a pre-requires
80
+ def pre?
81
+ flags & RPM::SENSE[:prereq]
82
+ end
83
+ end
84
+
85
+ class Provide < Dependency
86
+ def initialize(name, version, flags, owner)
87
+ super(name, version, flags, owner)
88
+ @nametag = RPM::TAG[:providename]
89
+ @versiontag = RPM::TAG[:provideversion]
90
+ @flagstag = RPM::TAG[:provideflags]
91
+ end
92
+ end
93
+
94
+ class Require < Dependency
95
+ def initialize(name, version, flags, owner)
96
+ super(name, version, flags, owner)
97
+ @nametag = RPM::TAG[:requirename]
98
+ @versiontag = RPM::TAG[:requireversion]
99
+ @flagstag = RPM::TAG[:requireflags]
100
+ end
101
+ end
102
+
103
+ class Conflict < Dependency
104
+ def initialize(name, version, flags, owner)
105
+ super(name, version, flags, owner)
106
+ @nametag = RPM::TAG[:conflictname]
107
+ @versiontag = RPM::TAG[:conflictversion]
108
+ @flagstag = RPM::TAG[:conflictflags]
109
+ end
110
+ end
111
+
112
+ class Obsolete < Dependency
113
+ def initialize(name, version, flags, owner)
114
+ super(name, version, flags, owner)
115
+ @nametag = RPM::TAG[:obsoletename]
116
+ @versiontag = RPM::TAG[:obsoleteversion]
117
+ @flagstag = RPM::TAG[:obsoleteflags]
118
+ end
119
+ end
120
+ end
data/lib/rpm/file.rb ADDED
@@ -0,0 +1,134 @@
1
+ # coding: utf-8
2
+
3
+ module RPM
4
+ class File
5
+ # @return [String] file path
6
+ attr_accessor :path
7
+ # @return [String] md5sum as string
8
+ attr_accessor :md5sum
9
+ # @return [String] Path to the destination if the file is a symbolic link
10
+ # @note
11
+ # This path is sometimes relative. To convert an absolute path from relative path:
12
+ # File.expand_path (file.link_to, File.dirname (file.path))
13
+ attr_accessor :link_to
14
+ # @return [Number] File size
15
+ attr_accessor :size
16
+ # @return [Time] File modification time.
17
+ attr_accessor :mtime
18
+ # @return [String] File owner. Nil may be returned.
19
+ attr_accessor :owner
20
+ # @return [String] Group that owns the file. Nil may be returned.
21
+ attr_accessor :group
22
+ # @return [Number] Device type of the file
23
+ attr_accessor :mode
24
+
25
+ attr_accessor :attr
26
+ attr_accessor :state
27
+ attr_accessor :rdev
28
+
29
+ # @return [Boolean] True if the file is a symbolic link
30
+ def symlink?
31
+ !@link_to.nil?
32
+ end
33
+
34
+ # @return [Boolean] True if the file is marked as a configuration file
35
+ def config?
36
+ !(@attr & RPM::C::FileAttrs[:config]).zero?
37
+ end
38
+
39
+ # @return [Boolean] True if the file is marked as documentation
40
+ def doc?
41
+ !(@attr & RPM::C::FileAttrs[:doc]).zero?
42
+ end
43
+
44
+ # @return [Boolean] True if the file is marked as do not use
45
+ # @deprecated RPMFILE_DONOTUSE was removed in recent versions of RPM.
46
+ def donotuse?
47
+ msg = 'RPMFILE_DONOTUSE was removed in recent versions of RPM.'
48
+ warn "#{Kernel.caller.first} #{msg}"
49
+ raise NotImplementedError
50
+ end
51
+
52
+ # @return [Boolean] True if the file is marked that can be missing on disk
53
+ #
54
+ # This modifier is used for files or links that are created during the %post scripts
55
+ # but will need to be removed if the package is removed
56
+ def is_missingok?
57
+ !(@attr & RPM::C::FileAttrs[:missingok]).zero?
58
+ end
59
+
60
+ # @return [Boolean] True if the file is marked as configuration not to be replaced
61
+ #
62
+ # This flag is used to protect local modifications.
63
+ # If used, the file will not overwrite an existing file that has been modified.
64
+ # If the file has not been modified on disk, the rpm command will overwrite the file. But,
65
+ # if the file has been modified on disk, the rpm command will copy the new file with an extra
66
+ # file-name extension of .rpmnew.
67
+ def is_noreplace?
68
+ !(@attr & RPM::C::FileAttrs[:noreplace]).zero?
69
+ end
70
+
71
+ # @return [Boolean] True if the file is marked as a spec file
72
+ def is_specfile?
73
+ !(@attr & RPM::C::FileAttrs[:specfile]).zero?
74
+ end
75
+
76
+ # @return [Boolean] True if the file is marked as ghost
77
+ #
78
+ # This flag indicates the file should not be included in the package.
79
+ # It can be used to name the needed attributes for a file that the program, when installed,
80
+ # will create.
81
+ # For example, you may want to ensure that a program’s log file has certain attributes.
82
+ def ghost?
83
+ !(@attr & RPM::C::FileAttrs[:ghost]).zero?
84
+ end
85
+
86
+ # @return [Boolean] True if the file is a license
87
+ def license?
88
+ !(@attr & RPM::C::FileAttrs[:license]).zero?
89
+ end
90
+
91
+ # @return [Boolean] True if the file is a README
92
+ def readme?
93
+ !(@attr & RPM::C::FileAttrs[:readme]).zero?
94
+ end
95
+
96
+ # @raise NotImplementedError
97
+ # @deprecated RPMFILE_EXCLUDE was removed in recent versions of RPM.
98
+ def exclude?
99
+ msg = 'RPMFILE_EXCLUDE was removed in recent versions of RPM.'
100
+ warn "#{Kernel.caller.first} #{msg}"
101
+ raise NotImplementedError
102
+ end
103
+
104
+ # @return [Boolean] True if the file is replaced during installation
105
+ def replaced?
106
+ !(@attr & RPM::C::FileState[:replaced]).zero?
107
+ end
108
+
109
+ # @return [Boolean] True if the file is not installed
110
+ def notinstalled?
111
+ !(@attr & RPM::C::FileState[:notinstalled]).zero?
112
+ end
113
+
114
+ # @return [Boolean] True if the file is shared over the network
115
+ def netshared?
116
+ !(@attr & RPM::C::FileState[:netshared]).zero?
117
+ end
118
+
119
+ def initialize(path, md5sum, link_to, size, mtime, owner, group, rdev, mode, attr, state)
120
+ @path = path
121
+ @md5sum = md5sum
122
+ # If link_to is "" save it as nil
123
+ @link_to = (link_to && link_to.empty? ? nil : link_to)
124
+ @size = size
125
+ @mtime = mtime
126
+ @owner = owner
127
+ @group = group
128
+ @rdev = rdev
129
+ @mode = mode
130
+ @attr = attr
131
+ @state = state
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,7 @@
1
+
2
+ # The reason this file is gem_version.rb and not version.rb
3
+ # is because it conflicts with the version.rb class
4
+ module RPM
5
+ PKG_NAME = 'ruby-rpm'.freeze
6
+ GEM_VERSION = '0.1.0'.freeze
7
+ end
@@ -0,0 +1,66 @@
1
+
2
+ module RPM
3
+ class MatchIterator
4
+ include Enumerable
5
+
6
+ # @visibility private
7
+ def self.release(ptr)
8
+ RPM::C.rpmdbFreeIterator(ptr)
9
+ end
10
+
11
+ # Creates a managed MatchIterator from a raw pointer
12
+ # @visibility private
13
+ def self.from_ptr(ptr)
14
+ new(::FFI::AutoPointer.new(ptr, MatchIterator.method(:release)))
15
+ end
16
+
17
+ def initialize(ptr)
18
+ @ptr = ptr
19
+ end
20
+
21
+ def each
22
+ while (pkg = next_iterator)
23
+ yield pkg
24
+ end
25
+ end
26
+
27
+ def next_iterator
28
+ pkg_ptr = RPM::C.rpmdbNextIterator(@ptr)
29
+ return RPM::Package.new(pkg_ptr) unless pkg_ptr.null?
30
+ nil
31
+ end
32
+
33
+ # @ return header join key for current position of rpm
34
+ # database iterator
35
+ def offset
36
+ RPM::C.rpmdbGetIteratorOffset(@ptr)
37
+ end
38
+
39
+ def set_iterator_re(tag, mode, string)
40
+ ret = RPM::C.rpmdbSetIteratorRE(@ptr, tag, mode, string)
41
+ raise "Error when setting regular expression '#{string}'" if ret != 0
42
+ self
43
+ end
44
+
45
+ alias regexp set_iterator_re
46
+
47
+ def set_iterator_version(version)
48
+ unless version.is_a?(RPM::Version)
49
+ raise TypeError, 'illegal argument type'
50
+ end
51
+
52
+ set_iterator_re(:version, :default, version.v)
53
+ set_iterator_re(:release, :default, version.r) if version.r
54
+ self
55
+ end
56
+
57
+ alias version set_iterator_version
58
+
59
+ def get_iterator_count
60
+ RPM::C.rpmdbGetIteratorCount(@ptr)
61
+ end
62
+
63
+ alias count get_iterator_count
64
+ alias length get_iterator_count
65
+ end
66
+ end