rpm 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ before_install:
3
+ - sudo apt-get install rpm
4
+ - sudo apt-get install -y -q fakeroot fakechroot
5
+ - sudo apt-get install -y -q locales
6
+ - sudo locale-gen es_ES.utf8
7
+ rvm:
8
+ - 1.9.3
9
+ script: fakechroot rake
10
+
data/ChangeLog ADDED
@@ -0,0 +1,5 @@
1
+
2
+ 2012-02-23 Duncan Mac-Vicar P. <dmacvicar@suse.de>
3
+
4
+ * RPM::FFI module is now RPM::C
5
+ * implement Trasaction#commit, Trasaction#install, Trasaction#upgrade,
data/README.rdoc CHANGED
@@ -34,6 +34,16 @@ This is an alpha release! There is still work to be done
34
34
  end
35
35
  end
36
36
 
37
+ == Install a package
38
+
39
+ require 'rpm'
40
+ pkg = RPM::Package.open('foo.rpm')
41
+
42
+ RPM.transaction(rootdir) do |t|
43
+ t.install(pkg, 'foo.rpm')
44
+ t.commit
45
+ end
46
+
37
47
  = Introduction
38
48
 
39
49
  This library is a replacement for the ruby-rpm gem, originally
@@ -65,7 +75,7 @@ from 1130 lines of code to 320.
65
75
 
66
76
  The gem is divided in two modules:
67
77
 
68
- * RPM::FFI:: which contains the 1:1 mapping to the librpm API
78
+ * RPM::C:: which contains the 1:1 mapping to the librpm API
69
79
  Not all functions are attached, only the ones we actually use.
70
80
  * RPM:: contains the actual higher level API
71
81
 
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  typedef :pointer, :header
7
7
 
@@ -0,0 +1,28 @@
1
+
2
+ module RPM
3
+ module C
4
+
5
+ CallbackType = enum(:rpmCallbackType, [
6
+ :unknown, 0,
7
+ :inst_progress, (1 << 0),
8
+ :inst_start, (1 << 1),
9
+ :inst_open_file, (1 << 2),
10
+ :inst_close_file, (1 << 3),
11
+ :trans_progress, (1 << 4),
12
+ :trans_start, (1 << 5),
13
+ :trans_stop, (1 << 6),
14
+ :uninst_progress, (1 << 7),
15
+ :uninst_start, (1 << 8),
16
+ :uninst_stop, (1 << 9),
17
+ :repackage_progress, (1 << 10),
18
+ :repackage_start, (1 << 11),
19
+ :repackage_stop, (1 << 12),
20
+ :unpack_error, (1 << 13),
21
+ :cpio_error, (1 << 14),
22
+ :script_error, (1 << 15) ])
23
+
24
+ typedef :pointer, :rpmCallbackData
25
+ callback :rpmCallbackFunction, [:pointer, :rpmCallbackType, :rpm_loff_t, :rpm_loff_t, :fnpyKey, :rpmCallbackData], :pointer
26
+
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+
2
+ module RPM
3
+ module C
4
+
5
+ attach_function 'rpmShowProgress', [:pointer, :rpmCallbackType, :rpm_loff_t, :rpm_loff_t, :fnpyKey, :pointer], :pointer
6
+ end
7
+ end
@@ -1,6 +1,6 @@
1
1
  module RPM
2
2
 
3
- module FFI
3
+ module C
4
4
 
5
5
  typedef :pointer, :rpmdb
6
6
  typedef :pointer, :rpmdbMatchIterator
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  typedef :pointer, :rpmds
7
7
 
@@ -21,11 +21,6 @@ module RPM
21
21
  :script_preun, (1 << 11),
22
22
  :script_postun, (1 << 12),
23
23
  :script_verify, (1 << 13),
24
- :script_pre, (1 << 9),
25
- :script_post, (1 << 10),
26
- :script_preun, (1 << 11),
27
- :script_postun, (1 << 12),
28
- :script_verify, (1 << 13),
29
24
  :find_requires, (1 << 14),
30
25
  :find_provides, (1 << 15),
31
26
  #
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  FileAttrs = enum(:rpmfileAttrs, [
7
7
  :none, 0,
@@ -0,0 +1,21 @@
1
+ module RPM
2
+ module C
3
+
4
+ typedef :pointer, :FD_t
5
+ # RPMIO
6
+ attach_function 'Fstrerror', [:FD_t], :string
7
+ # ...
8
+ attach_function 'Fclose', [:FD_t], :int
9
+ # ...
10
+ attach_function 'Fopen', [:string, :string], :FD_t
11
+ # ...
12
+ attach_function 'Ferror', [:FD_t], :int
13
+
14
+ attach_function 'fdDup', [:int], :FD_t
15
+
16
+ attach_function 'Fstrerror', [:FD_t], :string
17
+
18
+ attach_function 'fdLink', [:pointer], :FD_t
19
+
20
+ end
21
+ end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  attach_variable :RPMVERSION, :RPMVERSION, :string
7
7
  attach_variable :RPMEVR, :rpmEVR, :string
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  # rpmlog
7
7
  RPMLOG_PRIMASK = 0x07
@@ -19,6 +19,8 @@ module RPM
19
19
 
20
20
  attach_function 'rpmlogSetMask', [:int], :int
21
21
  # TODO: defines to set verbosity
22
+ # ...
23
+ attach_function 'rpmlogMessage', [], :string
22
24
 
23
25
  end
24
26
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  attach_variable :MACROFILES, :macrofiles, :string
7
7
  # ...
@@ -24,15 +24,6 @@ module RPM
24
24
  # ...
25
25
  attach_function 'rpmInitMacros', [:pointer, :string], :void
26
26
  # ...
27
-
28
- # RPMIO
29
- attach_function 'Fstrerror', [:pointer], :string
30
- # ...
31
- attach_function 'Fclose', [:pointer], :int
32
- # ...
33
- attach_function 'Fopen', [:string, :string], :pointer
34
- # ...
35
- attach_function 'Ferror', [:pointer], :int
36
27
  end
37
28
 
38
29
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  typedef :pointer, :rpmProblem
7
7
 
@@ -35,8 +35,22 @@ module RPM
35
35
  :obsoletes
36
36
  ])
37
37
 
38
+ attach_function 'rpmProblemCreate', [:rpmProblemType, :string, :fnpyKey, :string, :string, :uint64], :rpmProblem
39
+ attach_function 'rpmProblemFree', [:rpmProblem], :rpmProblem
40
+ attach_function 'rpmProblemLink', [:rpmProblem], :rpmProblem
38
41
  attach_function 'rpmProblemGetType', [:rpmProblem], :rpmProblemType
39
42
  attach_function 'rpmProblemGetKey', [:rpmProblem], :fnpyKey
40
- attach_function 'rpmProblemString', [:rpmProblem], :pointer
43
+ attach_function 'rpmProblemGetStr', [:rpmProblem], :string
44
+ attach_function 'rpmProblemString', [:rpmProblem], :string
45
+
46
+ begin
47
+ attach_function 'rpmProblemCompare', [:rpmProblem, :rpmProblem], :int
48
+ rescue ::FFI::NotFoundError
49
+ # TODO: Implement this for librpm 4.8.
50
+ def self.rpmProblemCompare(a, b)
51
+ raise NotImplementedError, "rpmProblemCompare is not present in librpm 4.8 and below"
52
+ end
41
53
  end
42
- end
54
+
55
+ end
56
+ end
@@ -1,6 +1,6 @@
1
1
  module RPM
2
2
 
3
- module FFI
3
+ module C
4
4
 
5
5
  typedef :pointer, :rpmps
6
6
  typedef :pointer, :rpmpsi
@@ -1,6 +1,6 @@
1
1
  module RPM
2
2
 
3
- module FFI
3
+ module C
4
4
 
5
5
  Tag = enum(:rpmTag, [
6
6
  :not_found, -1,
@@ -70,7 +70,7 @@ module RPM
70
70
  :exclude, 1041,
71
71
  :exclusive, 1042,
72
72
  :icon, 1043,
73
- :source, 1044,
73
+ :sourcerpm, 1044,
74
74
  :fileverifyflags, 1045,
75
75
  :archivesize, 1046,
76
76
  :providename, 1047,
@@ -90,7 +90,7 @@ module RPM
90
90
  :exclusivearch, 1061,
91
91
  :exclusiveos, 1062,
92
92
  :autoreqprov, 1063,
93
- :version, 1064,
93
+ :rpmversion, 1064,
94
94
  :triggerscripts, 1065,
95
95
  :triggername, 1066,
96
96
  :triggerversion, 1067,
@@ -293,7 +293,15 @@ module RPM
293
293
  )
294
294
  typedef :rpmFlags, :rpmTagReturnType
295
295
 
296
- attach_function 'rpmTagGetReturnType', [:rpmTagVal], :rpmTagReturnType
296
+ begin
297
+ attach_function 'rpmTagGetReturnType', [:rpmTagVal], :rpmTagReturnType
298
+ rescue ::FFI::NotFoundError
299
+ attach_function 'rpmTagGetType', [:rpmTagVal], :rpmTagType
300
+
301
+ def self.rpmTagGetReturnType(tag)
302
+ TagReturnType[rpmTagGetType(tag) & TagReturnType[:mask_return_type]]
303
+ end
304
+ end
297
305
 
298
306
  end
299
307
  end
@@ -1,6 +1,6 @@
1
1
  module RPM
2
2
 
3
- module FFI
3
+ module C
4
4
 
5
5
  typedef :pointer, :rpmtd
6
6
 
@@ -1,6 +1,6 @@
1
1
  module RPM
2
2
 
3
- module FFI
3
+ module C
4
4
 
5
5
  TransFlags = enum(:rpmtransFlags_e, [
6
6
  :none, 0,
@@ -49,6 +49,8 @@ module RPM
49
49
  attach_function 'rpmtsInitIterator', [:rpmts, :rpmDbiTagVal, :pointer, :int], :rpmdbMatchIterator
50
50
  # ...
51
51
  attach_function 'rpmtsProblems', [:rpmts], :rpmps
52
+ # ...
53
+ attach_function 'rpmtsClean', [:rpmts], :void
52
54
  # more...
53
55
  attach_function 'rpmtsFree', [:rpmts], :pointer
54
56
  #..
@@ -62,9 +64,11 @@ module RPM
62
64
  attach_function 'rpmtsFlags', [:rpmts], :rpmtransFlags
63
65
  attach_function 'rpmtsSetFlags', [:rpmts, :rpmtransFlags], :rpmtransFlags
64
66
  #...
67
+ attach_function 'rpmtsSetNotifyCallback', [:rpmts, :rpmCallbackFunction, :rpmCallbackData], :int
68
+ #...
65
69
  attach_function 'rpmtsCreate', [], :rpmts
66
70
  attach_function 'rpmtsAddInstallElement', [:rpmts, :header, :fnpyKey, :int, :rpmRelocation], :int
67
- # ...
71
+ attach_function 'rpmtsAddEraseElement', [:rpmts, :header, :int], :int
68
72
 
69
73
  end
70
74
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module RPM
3
3
 
4
- module FFI
4
+ module C
5
5
 
6
6
  Rc = enum(
7
7
  :ok, 0,
@@ -18,6 +18,8 @@ module RPM
18
18
  typedef :rpm_tag_t, :rpmDbiTagVal
19
19
 
20
20
  typedef :uint32, :rpmFlags
21
+ typedef :uint32, :rpm_off_t
22
+ typedef :uint64, :rpm_loff_t
21
23
 
22
24
  typedef :pointer, :FD_t
23
25
  typedef :pointer, :fnpyKey
data/lib/rpm/c.rb ADDED
@@ -0,0 +1,47 @@
1
+ require 'rubygems'
2
+ require 'ffi'
3
+
4
+ module RPM
5
+ module C
6
+
7
+ extend ::FFI::Library
8
+
9
+ begin
10
+ ffi_lib ['rpm', 'librpm.so.2', 'librpm.so.1']
11
+ rescue LoadError => e
12
+ raise(
13
+ "Can't find rpm libs on your system: #{e.message}"
14
+ )
15
+ end
16
+
17
+ end
18
+ end
19
+
20
+ require 'rpm/c/rpmtypes'
21
+ require 'rpm/c/rpmcallback'
22
+ require 'rpm/c/rpmtag'
23
+ require 'rpm/c/rpmlib'
24
+ require 'rpm/c/rpmlog'
25
+ require 'rpm/c/rpmmacro'
26
+ require 'rpm/c/rpmio'
27
+ require 'rpm/c/header'
28
+ require 'rpm/c/rpmprob'
29
+ require 'rpm/c/rpmps'
30
+ require 'rpm/c/rpmfi'
31
+ require 'rpm/c/rpmdb'
32
+ require 'rpm/c/rpmcallback'
33
+ require 'rpm/c/rpmcli'
34
+ require 'rpm/c/rpmts'
35
+ require 'rpm/c/rpmds'
36
+ require 'rpm/c/rpmtd'
37
+
38
+ module RPM
39
+ module C
40
+
41
+ def self.rpm_version_code
42
+ ver = ::RPM::C.RPMVERSION.split('.', 3)
43
+ return (ver[0].to_i<<16) + (ver[1].to_i<<8) + (ver[2].to_i<<0)
44
+ end
45
+
46
+ end
47
+ end
data/lib/rpm/db.rb CHANGED
@@ -12,7 +12,7 @@ module RPM
12
12
  opts[:writable] ||= false
13
13
 
14
14
  @ts = ts
15
- RPM::FFI.rpmtsOpenDB(@ts.ptr, opts[:writable] ? Fcntl::O_RDWR | Fcntl::O_CREAT : Fcntl::O_RDONLY )
15
+ RPM::C.rpmtsOpenDB(@ts.ptr, opts[:writable] ? Fcntl::O_RDWR | Fcntl::O_CREAT : Fcntl::O_RDONLY )
16
16
  end
17
17
 
18
18
  # @return [RPM::MatchIterator] Creates an iterator for +tag+ and +val+
@@ -48,11 +48,11 @@ module RPM
48
48
 
49
49
  # @visibility private
50
50
  def ptr
51
- RPM::FFI.rpmtsGetRdb(@ts.ptr)
51
+ RPM::C.rpmtsGetRdb(@ts.ptr)
52
52
  end
53
53
 
54
54
  def close
55
- RPM::FFI.rpmtsCloseDB(@ts.ptr)
55
+ RPM::C.rpmtsCloseDB(@ts.ptr)
56
56
  end
57
57
 
58
58
  def closed?
@@ -98,13 +98,13 @@ module RPM
98
98
 
99
99
  # @return [String] The root path of the database
100
100
  def root
101
- RPM::FFI.rpmtsRootDir(@ts.ptr)
101
+ RPM::C.rpmtsRootDir(@ts.ptr)
102
102
  end
103
103
 
104
104
  # @deprecated Use RPM::Transaction#each
105
105
  def self.each
106
106
  DB.open do |db|
107
- it = MatchIterator.from_ptr(RPM::FFI.rpmdbInitIterator(db.ptr, 0, nil, 0))
107
+ it = MatchIterator.from_ptr(RPM::C.rpmdbInitIterator(db.ptr, 0, nil, 0))
108
108
  if block_given?
109
109
  it.each do |pkg|
110
110
  yield pkg
@@ -37,16 +37,16 @@ module RPM
37
37
  end
38
38
  return false
39
39
  when RPM::Dependency then
40
- RPM::FFI.rpmdsCompare(
41
- RPM::FFI.rpmdsSingle(:providename, other.name,
40
+ RPM::C.rpmdsCompare(
41
+ RPM::C.rpmdsSingle(:providename, other.name,
42
42
  other.version.to_vre, other.flags),
43
- RPM::FFI.rpmdsSingle(:providename, name,
43
+ RPM::C.rpmdsSingle(:providename, name,
44
44
  version.to_vre, flags)) != 0
45
45
  when RPM::Version then
46
- RPM::FFI.rpmdsCompare(
47
- RPM::FFI.rpmdsSingle(:providename, name,
46
+ RPM::C.rpmdsCompare(
47
+ RPM::C.rpmdsSingle(:providename, name,
48
48
  other.to_vre, other.to_vre.empty? ? 0 : :equal),
49
- RPM::FFI.rpmdsSingle(:providename, name,
49
+ RPM::C.rpmdsSingle(:providename, name,
50
50
  version.to_vre, flags)) != 0
51
51
  else
52
52
  raise(TypeError, "#{other} is not a Version or Dependency")
@@ -118,13 +118,13 @@ module RPM
118
118
 
119
119
  end
120
120
 
121
- class Conflict < Dependency
121
+ class Obsolete < Dependency
122
122
 
123
123
  def initialize(name, version, flags, owner)
124
124
  super(name, version, flags, owner)
125
- @nametag = RPM::TAG[:conflictname]
126
- @versiontag = RPM::TAG[:conflictversion]
127
- @flagstag = RPM::TAG[:conflictflags]
125
+ @nametag = RPM::TAG[:obsoletename]
126
+ @versiontag = RPM::TAG[:obsoleteversion]
127
+ @flagstag = RPM::TAG[:obsoleteflags]
128
128
  end
129
129
 
130
130
  end