rpm 0.0.2 → 0.0.3

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 (44) hide show
  1. data/.travis.yml +10 -0
  2. data/ChangeLog +5 -0
  3. data/README.rdoc +11 -1
  4. data/lib/rpm/{ffi → c}/header.rb +1 -1
  5. data/lib/rpm/c/rpmcallback.rb +28 -0
  6. data/lib/rpm/c/rpmcli.rb +7 -0
  7. data/lib/rpm/{ffi → c}/rpmdb.rb +1 -1
  8. data/lib/rpm/{ffi → c}/rpmds.rb +1 -6
  9. data/lib/rpm/{ffi → c}/rpmfi.rb +1 -1
  10. data/lib/rpm/c/rpmio.rb +21 -0
  11. data/lib/rpm/{ffi → c}/rpmlib.rb +1 -1
  12. data/lib/rpm/{ffi → c}/rpmlog.rb +3 -1
  13. data/lib/rpm/{ffi → c}/rpmmacro.rb +1 -10
  14. data/lib/rpm/{ffi → c}/rpmprob.rb +17 -3
  15. data/lib/rpm/{ffi → c}/rpmps.rb +1 -1
  16. data/lib/rpm/{ffi → c}/rpmtag.rb +12 -4
  17. data/lib/rpm/{ffi → c}/rpmtd.rb +1 -1
  18. data/lib/rpm/{ffi → c}/rpmts.rb +6 -2
  19. data/lib/rpm/{ffi → c}/rpmtypes.rb +3 -1
  20. data/lib/rpm/c.rb +47 -0
  21. data/lib/rpm/db.rb +5 -5
  22. data/lib/rpm/dependency.rb +10 -10
  23. data/lib/rpm/gem_version.rb +1 -1
  24. data/lib/rpm/match_iterator.rb +5 -5
  25. data/lib/rpm/package.rb +55 -55
  26. data/lib/rpm/problem.rb +71 -0
  27. data/lib/rpm/transaction.rb +186 -35
  28. data/lib/rpm/version.rb +3 -4
  29. data/lib/rpm.rb +16 -24
  30. data/rpm.gemspec +1 -1
  31. data/test/data/simple-1.0-0.i586.rpm +0 -0
  32. data/test/data/simple.spec +0 -4
  33. data/test/data/simple_with_deps-1.0-0.i586.rpm +0 -0
  34. data/test/data/simple_with_deps.spec +41 -0
  35. data/test/helper.rb +1 -1
  36. data/test/test_dependency.rb +1 -1
  37. data/test/test_lib.rb +13 -13
  38. data/test/test_package.rb +24 -3
  39. data/test/test_problem.rb +20 -0
  40. data/test/test_transaction.rb +115 -14
  41. data/test/test_version.rb +2 -0
  42. metadata +80 -69
  43. data/lib/rpm/ffi/rpmcallback.rb +0 -26
  44. data/lib/rpm/ffi.rb +0 -44
data/lib/rpm/version.rb CHANGED
@@ -98,20 +98,19 @@ module RPM
98
98
  #
99
99
  def <=>(other)
100
100
  RPM::Utils.check_type(other, RPM::Version)
101
- ret = RPM::FFI.rpmvercmp(to_vre_epoch_zero, other.to_vre_epoch_zero)
101
+ ret = RPM::C.rpmvercmp(to_vre_epoch_zero, other.to_vre_epoch_zero)
102
102
  end
103
103
 
104
104
  # @param [Version] other Version to compare against
105
105
  # @return [Boolean] true if the version is newer than +other+
106
106
  def newer?(other)
107
- (self <=> other) > 0
107
+ self > other
108
108
  end
109
109
 
110
-
111
110
  # @param [Version] other Version to compare against
112
111
  # @return [Boolean] true if the version is older than +other+
113
112
  def older?(other)
114
- ! newer?(other)
113
+ self < other
115
114
  end
116
115
 
117
116
  # String representation in the form "v-r"
data/lib/rpm.rb CHANGED
@@ -1,7 +1,8 @@
1
1
 
2
- require 'rpm/ffi'
2
+ require 'rpm/c'
3
3
  require 'rpm/package'
4
4
  require 'rpm/db'
5
+ require 'rpm/problem'
5
6
  require 'rpm/transaction'
6
7
  require 'rpm/match_iterator'
7
8
  require 'rpm/version'
@@ -10,23 +11,15 @@ require 'rpm/utils'
10
11
 
11
12
  module RPM
12
13
 
13
- module LibC
14
- extend ::FFI::Library
15
- ffi_lib ::FFI::Library::LIBC
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
16
22
 
17
- # call #attach_function to attach to malloc, free, memcpy, bcopy, etc.
18
- attach_function :malloc, [:size_t], :pointer
19
- end
20
-
21
- TAG = RPM::FFI::Tag
22
- LOG = RPM::FFI::Log
23
- SENSE = RPM::FFI::Sense
24
- FILE = RPM::FFI::FileAttrs
25
- FILE_STATE = RPM::FFI::FileState
26
- TRANS_FLAG = RPM::FFI::TransFlags
27
- PROB_FILTER = RPM::FFI::ProbFilter
28
- MIRE = RPM::FFI::RegexpMode
29
-
30
23
  # Creates a new transaction and pass it
31
24
  # to the given block
32
25
  #
@@ -43,14 +36,13 @@ module RPM
43
36
  yield ts
44
37
  end
45
38
 
46
-
47
39
  # @param [String] name Name of the macro
48
40
  # @return [String] value of macro +name+
49
41
  def self.[](name)
50
42
  val = String.new
51
43
  buffer = ::FFI::MemoryPointer.new(:pointer, 1024)
52
44
  buffer.write_string("%{#{name}}")
53
- ret = RPM::FFI.expandMacros(nil, nil, buffer, 1024)
45
+ ret = RPM::C.expandMacros(nil, nil, buffer, 1024)
54
46
  buffer.read_string
55
47
  end
56
48
 
@@ -59,16 +51,16 @@ module RPM
59
51
  # @param [String] value Value of the macro or +nil+ to delete it
60
52
  def self.[]=(name, value)
61
53
  if value.nil?
62
- RPM::FFI.delMacro(nil, name.to_s)
54
+ RPM::C.delMacro(nil, name.to_s)
63
55
  else
64
- RPM::FFI.addMacro(nil, name.to_s, nil, value.to_s, RPM::FFI::RMIL_DEFAULT)
56
+ RPM::C.addMacro(nil, name.to_s, "", value.to_s, RPM::C::RMIL_DEFAULT)
65
57
  end
66
58
  end
67
59
 
68
60
  end
69
-
70
- RPM::FFI.rpmReadConfigFiles(nil, nil)
71
- RPM::FFI.rpmInitMacros(nil, RPM::FFI.MACROFILES)
61
+
62
+ RPM::C.rpmReadConfigFiles(nil, nil)
63
+ RPM::C.rpmInitMacros(nil, RPM::C.MACROFILES)
72
64
 
73
65
  # TODO
74
66
  # set verbosity
data/rpm.gemspec CHANGED
@@ -19,6 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  # specify any dependencies here; for example:
22
- # s.add_development_dependency "rspec"
22
+ s.add_development_dependency "rake"
23
23
  s.add_runtime_dependency "ffi"
24
24
  end
Binary file
@@ -26,10 +26,6 @@ echo "Hola" > %{buildroot}%{_datadir}/%{name}/README.es
26
26
  %clean
27
27
  %{?buildroot:%__rm -rf "%{buildroot}"}
28
28
 
29
- %post
30
-
31
- %postun
32
-
33
29
  %files
34
30
  %defattr(-,root,root)
35
31
  %{_datadir}/%{name}/README
@@ -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 CHANGED
@@ -3,5 +3,5 @@ require 'test/unit'
3
3
  require 'rpm'
4
4
 
5
5
  def fixture(name)
6
- File.join(File.dirname(__FILE__), 'data', name)
6
+ File.expand_path(File.join(File.dirname(__FILE__), 'data', name))
7
7
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'helper')
1
+ require_relative('helper')
2
2
  require 'rpm/compat'
3
3
 
4
4
  class RPM_Dependency_Tests < Test::Unit::TestCase
data/test/test_lib.rb CHANGED
@@ -3,34 +3,34 @@ require File.join(File.dirname(__FILE__), 'helper')
3
3
  class RPM_Lib_Tests < Test::Unit::TestCase
4
4
 
5
5
  def test_lib_lib
6
- assert_kind_of String, RPM::FFI.RPMVERSION
6
+ assert_kind_of String, RPM::C.RPMVERSION
7
7
  # "x.y.z"
8
- assert(RPM::FFI.RPMVERSION.size >= 5)
9
- assert_kind_of Fixnum, RPM::FFI.rpm_version_code
8
+ assert(RPM::C.RPMVERSION.size >= 5)
9
+ assert_kind_of Fixnum, RPM::C.rpm_version_code
10
10
  # >= 4.0.0
11
- assert(RPM::FFI.rpm_version_code >= ((4 << 16) + (0 << 8) + (0 << 0)))
11
+ assert(RPM::C.rpm_version_code >= ((4 << 16) + (0 << 8) + (0 << 0)))
12
12
  end
13
13
 
14
14
  def test_lib_header
15
- ptr = RPM::FFI.headerNew
16
- RPM::FFI.headerFree(ptr)
15
+ ptr = RPM::C.headerNew
16
+ RPM::C.headerFree(ptr)
17
17
  end
18
18
 
19
19
  def test_lib_ts
20
- ts = RPM::FFI.rpmtsCreate
21
- RPM::FFI.rpmtsSetRootDir(ts, "/")
22
- it = RPM::FFI.rpmtsInitIterator(ts, 0, nil, 0)
20
+ ts = RPM::C.rpmtsCreate
21
+ RPM::C.rpmtsSetRootDir(ts, "/")
22
+ it = RPM::C.rpmtsInitIterator(ts, 0, nil, 0)
23
23
  hdrs = []
24
- while (not (hdr = RPM::FFI.rpmdbNextIterator(it)).null?)
24
+ while (not (hdr = RPM::C.rpmdbNextIterator(it)).null?)
25
25
  hdrs << hdr
26
- assert_kind_of String, RPM::FFI.headerGetAsString(hdr, :name)
26
+ assert_kind_of String, RPM::C.headerGetAsString(hdr, :name)
27
27
  end
28
- RPM::FFI.rpmdbFreeIterator(it)
28
+ RPM::C.rpmdbFreeIterator(it)
29
29
 
30
30
  end
31
31
 
32
32
  def test_lib_macros
33
- assert_kind_of String, RPM::FFI.MACROFILES
33
+ assert_kind_of String, RPM::C.MACROFILES
34
34
  end
35
35
 
36
36
  end
data/test/test_package.rb CHANGED
@@ -18,7 +18,7 @@ class RPM_Header_Tests < Test::Unit::TestCase
18
18
 
19
19
  assert_equal "simple-1.0-0-i586", pkg.to_s
20
20
 
21
- assert_equal '6895248ed5a081f73d035174329169c7', pkg.signature
21
+ assert_equal '3b5f9d468c877166532c662e29f43bc3', pkg.signature
22
22
 
23
23
  assert_kind_of RPM::Package, pkg
24
24
  assert_equal 'simple', pkg[:name]
@@ -45,11 +45,13 @@ class RPM_Header_Tests < Test::Unit::TestCase
45
45
  assert pkg.provides.map(&:name).include?("simple(x86-32)")
46
46
  assert pkg.provides.map(&:name).include?("simple")
47
47
 
48
- assert pkg.requires.map(&:name).include?("/bin/sh")
49
-
50
48
  assert pkg.files.map(&:path).include?("/usr/share/simple/README")
51
49
  assert pkg.files.map(&:path).include?("/usr/share/simple/README.es")
52
50
 
51
+ assert pkg.conflicts.empty?
52
+ assert pkg.requires.map(&:name).include?('rpmlib(PayloadIsLzma)')
53
+ assert pkg.obsoletes.empty?
54
+
53
55
  file = pkg.files.select {|x| x.path == "/usr/share/simple/README" }.first
54
56
  assert_nil file.link_to
55
57
  assert !file.symlink?
@@ -57,4 +59,23 @@ class RPM_Header_Tests < Test::Unit::TestCase
57
59
  assert_equal ["- Fix something", "- Fix something else"], pkg.changelog.map(&:text)
58
60
  end
59
61
 
62
+ def test_dependencies
63
+ pkg = RPM::Package.open(fixture('simple_with_deps-1.0-0.i586.rpm'))
64
+ assert_equal 'simple_with_deps', pkg.name
65
+
66
+ assert pkg.provides.map(&:name).include?('simple_with_deps(x86-32)')
67
+ assert pkg.provides.map(&:name).include?('simple_with_deps')
68
+
69
+ assert pkg.requires.map(&:name).include?("a")
70
+ b = pkg.requires.find {|x| x.name == 'b'}
71
+ assert_not_nil b
72
+ assert_equal '1.0', b.version.to_s
73
+
74
+ assert pkg.conflicts.map(&:name).include?('c')
75
+ assert pkg.conflicts.map(&:name).include?('d')
76
+
77
+ assert pkg.obsoletes.map(&:name).include?('f')
78
+
79
+ end
80
+
60
81
  end
@@ -0,0 +1,20 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPM_Header_Tests < Test::Unit::TestCase
4
+
5
+ def test_create
6
+ problem = RPM::Problem.create(:requires, "foo-1.0-0", "foo.rpm", "bar-1.0-0", "Hello", 1)
7
+ assert_equal "foo.rpm", problem.key
8
+ assert_equal :requires, problem.type
9
+ assert_equal "Hello", problem.str
10
+ assert_equal "Hello is needed by (installed) bar-1.0-0", problem.to_s
11
+
12
+ # Create a RPM::Problem from an existing pointer
13
+ problem2 = RPM::Problem.new(problem.ptr)
14
+ assert_equal problem.key, problem2.key
15
+ assert_equal problem.type, problem2.type
16
+ assert_equal problem.str, problem2.str
17
+ assert_equal problem.to_s, problem2.to_s
18
+
19
+ end
20
+ end
@@ -1,8 +1,11 @@
1
- require File.join(File.dirname(__FILE__), 'helper')
1
+ require_relative('helper')
2
2
  require 'tmpdir'
3
+ require 'pathname'
3
4
 
4
5
  class RPM_Transaction_Tests < Test::Unit::TestCase
5
6
 
7
+ PACKAGE_FILENAME = 'simple-1.0-0.i586.rpm'
8
+
6
9
  def test_flags
7
10
  RPM.transaction do |t|
8
11
  assert_equal RPM::TRANS_FLAG_NONE, t.flags
@@ -21,7 +24,7 @@ class RPM_Transaction_Tests < Test::Unit::TestCase
21
24
  RPM.transaction do |t|
22
25
  it = t.init_iterator(nil, nil)
23
26
  it.regexp(:name, :glob, '*audio*')
24
- it.each do |pkg|
27
+ it.each do |pkg|
25
28
  assert pkg.name.include?("audio"), "'#{pkg.name}' contains 'audio'"
26
29
  end
27
30
  end
@@ -32,30 +35,128 @@ class RPM_Transaction_Tests < Test::Unit::TestCase
32
35
  RPM.transaction do |t|
33
36
  it = t.init_iterator(nil, nil)
34
37
  it.version(RPM::Version.new('2.1'))
35
- it.each do |pkg|
36
- puts pkg
38
+ it.each do |sig|
39
+ # FIXME check that this worked
37
40
  end
38
41
  end
39
- end
40
-
41
- def test_install
42
-
43
- filename = 'simple-1.0-0.i586.rpm'
44
- pkg = RPM::Package.open(fixture(filename))
42
+ end
45
43
 
44
+ def test_basic_transaction_setters
46
45
  Dir.mktmpdir do |dir|
47
46
  RPM.transaction do |t|
48
47
  assert_equal "/", t.root_dir
49
48
  t.root_dir = dir
49
+ assert_equal dir + '/', t.root_dir
50
+ end
51
+ end
52
+
53
+ Dir.mktmpdir do |dir|
54
+ RPM.transaction(dir) do |t|
50
55
  assert_equal dir + '/', t.root_dir
51
-
56
+ end
57
+ end
58
+ end
59
+
60
+ def test_test_flag_install
61
+ filename = 'simple-1.0-0.i586.rpm'
62
+ pkg = RPM::Package.open(fixture(filename))
63
+
64
+ Dir.mktmpdir do |dir|
65
+ RPM.transaction(dir) do |t|
66
+
52
67
  t.flags = RPM::TRANS_FLAG_TEST
53
-
54
- t.install(pkg, filename)
55
- #t.commit
68
+ t.install(pkg, fixture(filename))
69
+ t.commit
70
+
71
+ assert File.exist?(File.join(dir, '/var/lib/rpm/Packages')),
72
+ "rpm db exists"
73
+
74
+ assert !File.exist?('/usr/share/simple/README'),
75
+ "package #{pkg} was not installed"
76
+ end
77
+ end
78
+ end
79
+
80
+ def test_install_and_remove
81
+ pkg = RPM::Package.open(fixture(PACKAGE_FILENAME))
82
+
83
+ Dir.mktmpdir do |dir|
84
+ RPM.transaction(dir) do |t|
85
+ begin
86
+ t.install(pkg, fixture(PACKAGE_FILENAME))
87
+ t.commit
88
+
89
+ assert File.exist?(File.join(dir, '/var/lib/rpm/Packages')),
90
+ "rpm db exists"
91
+
92
+ assert File.exist?(File.join(dir, '/usr/share/simple/README')),
93
+ "package #{pkg} should be installed"
94
+ ensure
95
+ # Force close so that RPM does not try to do it
96
+ # when the tmpdir is deleted
97
+ t.db.close
98
+ end
56
99
  end
100
+
101
+ RPM.transaction(dir) do |t|
102
+ begin
103
+
104
+ assert_raise TypeError do
105
+ t.delete(Object.new)
106
+ end
107
+
108
+ t.delete(pkg)
109
+
110
+ t.order
111
+ t.clean
112
+
113
+ t.commit
114
+
115
+ assert !File.exist?(File.join(dir, '/usr/share/simple/README')),
116
+ "package #{pkg} should not be installed"
117
+
118
+ ensure
119
+ # Force close so that RPM does not try to do it
120
+ # when the tmpdir is deleted
121
+ t.db.close
122
+ end
123
+ end
124
+
57
125
  end
126
+ end
127
+
128
+ def test_install_with_custom_callback
129
+ pkg = RPM::Package.open(fixture(PACKAGE_FILENAME))
130
+
131
+ Dir.mktmpdir do |dir|
132
+ RPM.transaction(dir) do |t|
133
+ begin
134
+ t.install(pkg, fixture(PACKAGE_FILENAME))
58
135
 
136
+ t.check do |problem|
137
+ STDERR.puts "Problem: #{problem}"
138
+ end
139
+
140
+ t.order
141
+ t.clean
142
+
143
+ t.commit do |data|
144
+ next case data.type
145
+ when :inst_open_file then
146
+ @f = File.open(data.key, 'r')
147
+ when :inst_close_file then @f.close
148
+ end
149
+ end
150
+
151
+ assert File.exist?(File.join(dir, '/usr/share/simple/README')),
152
+ "package #{pkg} should be installed"
153
+ ensure
154
+ # Force close so that RPM does not try to do it
155
+ # when the tmpdir is deleted
156
+ t.db.close
157
+ end
158
+ end
159
+ end
59
160
  end
60
161
 
61
162
  end