fpm 0.2.22 → 0.2.23

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.
@@ -0,0 +1,89 @@
1
+ require File.join(File.dirname(__FILE__), "namespace")
2
+ require File.join(File.dirname(__FILE__), "tag")
3
+
4
+ class RPMFile::Header
5
+ attr_reader :tags
6
+ attr_reader :length
7
+
8
+ attr_accessor :magic # 8-byte string magic
9
+ attr_accessor :index_count # rpmlib calls this field 'il' unhelpfully
10
+ attr_accessor :data_length # rpmlib calls this field 'dl' unhelpfully
11
+
12
+ HEADER_SIGNED_TYPE = 5
13
+ HEADER_MAGIC = "\x8e\xad\xe8\x01\x00\x00\x00\x00"
14
+
15
+ def initialize(rpm)
16
+ @rpm = rpm
17
+ @tags = []
18
+ end
19
+
20
+ def read
21
+ # TODO(sissel): update the comments here to reflect learnings about rpm
22
+ # internals
23
+ # At this point assume we've read and consumed the lead and signature.
24
+ #len = @rpm.signature.index_length + @rpm.signature
25
+ #
26
+ # header size is
27
+ # ( @rpm.signature.index_length * size of a header entry )
28
+ # + @rpm.signature.data_length
29
+ #
30
+ # header 'entries' are an
31
+ # int32 (tag id), int32 (tag type), int32 (offset), uint32 (count)
32
+ #
33
+ # See rpm's header.c, the headerLoad method function for reference.
34
+
35
+ # Header always starts with HEADER_MAGIC + index_count(2bytes) +
36
+ # data_length(2bytes)
37
+ data = @rpm.file.read(16).unpack("a8NN")
38
+ # TODO(sissel): @index_count is really a count, rename?
39
+ @magic, @index_count, @data_length = data
40
+ validate
41
+
42
+ entry_size = 16 # tag id, type, offset, count == 16 bytes
43
+ @index_size = @index_count * entry_size
44
+ tag_data = @rpm.file.read(@index_size)
45
+ data = @rpm.file.read(@data_length)
46
+
47
+ #ap :data => data
48
+
49
+ (0 ... @index_count).each do |i|
50
+ offset = i * entry_size
51
+ entry_data = tag_data[i * entry_size, entry_size]
52
+ entry = entry_data.unpack("NNNN")
53
+ entry << data
54
+ tag = ::RPMFile::Tag.new(*entry)
55
+ @tags << tag
56
+
57
+ #ap tag.tag => {
58
+ #:type => tag.type,
59
+ #:offset => tag.offset,
60
+ #:count => tag.count,
61
+ #:value => (tag.value rescue "???"),
62
+ #}
63
+ end # each index
64
+ @length = @magic.size + @index_size + @data_length
65
+ end # def read
66
+
67
+ def write
68
+ raise "not implemented yet"
69
+ # Sort tags by type (integer value)
70
+ # emit all tags in order
71
+ # then emit all data segments in same order
72
+ end # def write
73
+
74
+ def validate
75
+ # TODO(sissel): raise real exceptions
76
+ if @magic != ::RPMFile::Header::HEADER_MAGIC
77
+ raise "Header magic did not match; got #{@magic.inspect}, " \
78
+ "expected #{::RPMFile::Header::HEADER_MAGIC.inspect}"
79
+ end
80
+
81
+ #if !(0..32).include?(@index_count)
82
+ #raise "Invalid 'index_count' value #{@index_count}, expected to be in range [0..32]"
83
+ #end
84
+
85
+ #if !(0..8192).include?(@data_length)
86
+ #raise "Invalid 'data_length' value #{@data_length}, expected to be in range [0..8192]"
87
+ #end
88
+ end # def validate
89
+ end # class RPMFile::Header
@@ -0,0 +1,48 @@
1
+ require File.join(File.dirname(__FILE__), "namespace")
2
+
3
+ class RPMFile::Lead
4
+ #struct rpmlead {
5
+ attr_accessor :magic #unsigned char magic[4];
6
+ attr_accessor :major #unsigned char major;
7
+ attr_accessor :minor #unsigned char minor;
8
+ attr_accessor :type #short type;
9
+ attr_accessor :archnum #short archnum;
10
+ attr_accessor :name #char name[66];
11
+ attr_accessor :osnum #short osnum;
12
+ attr_accessor :signature_type #short signature_type;
13
+ attr_accessor :reserved #char reserved[16];
14
+ #}
15
+
16
+ attr_accessor :length
17
+
18
+ def initialize(rpm)
19
+ @rpm = rpm
20
+ end
21
+
22
+ def type
23
+ case @type
24
+ when 0
25
+ return :binary
26
+ when 1
27
+ return :source
28
+ else
29
+ raise "Unknown package 'type' value #{@type}"
30
+ end
31
+ end # def type
32
+
33
+ def read
34
+ # Use 'A' here instead of 'a' to trim nulls.
35
+ @length = 96
36
+ data = @rpm.file.read(@length).unpack("A4CCnnA66nnA16")
37
+ @magic, @major, @minor, @type, @archnum, @name, \
38
+ @osnum, @signature_type, @reserved = data
39
+
40
+ return nil
41
+ end # def read
42
+
43
+ def write(file)
44
+ data = [ @magic, @major, @minor, @type, @archnum, @name, \
45
+ @osnum, @signature_type, @reserved ].pack("a4CCnna66nna16")
46
+ file.write(data)
47
+ end # def write
48
+ end # class RPMFile::Lead
@@ -0,0 +1 @@
1
+ class RPMFile; end
@@ -0,0 +1,81 @@
1
+ require "ap"
2
+ require File.join(File.dirname(__FILE__), "namespace")
3
+ require File.join(File.dirname(__FILE__), "header")
4
+ require File.join(File.dirname(__FILE__), "lead")
5
+ require File.join(File.dirname(__FILE__), "tag")
6
+
7
+ # Much of the code here is derived from knowledge gained by reading the rpm
8
+ # source code, but mostly it started making more sense after reading this site:
9
+ # http://www.rpm.org/max-rpm/s1-rpm-file-format-rpm-file-format.html
10
+
11
+ class RPMFile
12
+ attr_reader :file
13
+
14
+ def initialize(file)
15
+ if file.is_a?(String)
16
+ file = File.new(file, "r")
17
+ end
18
+ @file = file
19
+
20
+ # Make sure we're at the beginning of the file.
21
+ @file.seek(0, IO::SEEK_SET)
22
+ end # def initialize
23
+
24
+ public
25
+ def lead
26
+ if @lead.nil?
27
+ @lead = ::RPMFile::Lead.new(self)
28
+ @lead.read
29
+ end
30
+ return @lead
31
+ end # def lead
32
+
33
+ public
34
+ def signature
35
+ lead # Make sure we've parsed the lead...
36
+
37
+ # If signature_type is not 5 (HEADER_SIGNED_TYPE), no signature.
38
+ if @lead.signature_type != Header::HEADER_SIGNED_TYPE
39
+ @signature = false
40
+ return
41
+ end
42
+
43
+ if @signature.nil?
44
+ @signature = ::RPMFile::Header.new(self)
45
+ @signature.read
46
+ end
47
+
48
+ return @signature
49
+ end # def signature
50
+
51
+ public
52
+ def header
53
+ signature
54
+
55
+ # Skip 4 bytes of nulls
56
+ # Why? I have no idea yet.
57
+ if @file.read(4) != "\0\0\0\0"
58
+ raise "Expected 4 nulls."
59
+ end
60
+
61
+ if @header.nil?
62
+ @header = ::RPMFile::Header.new(self)
63
+ @header.read
64
+ end
65
+ return @header
66
+ end
67
+
68
+ # Returns a file descriptor. On first invocation, it seeks to the start of the payload
69
+ public
70
+ def payload
71
+ header
72
+ if @payload.nil?
73
+ @payload = @file.clone
74
+ # TODO(sissel): Why +20? I have no idea. Needs more digging. Clearly I'm missing a part
75
+ # of the file here.
76
+ @payload.seek(@lead.length + @signature.length + @header.length + 20, IO::SEEK_SET)
77
+ end
78
+
79
+ return @payload
80
+ end # def payload
81
+ end # class RPMFile
@@ -0,0 +1,304 @@
1
+ require File.join(File.dirname(__FILE__), "namespace")
2
+
3
+ class RPMFile::Tag
4
+ attr_accessor :tag
5
+ attr_accessor :type
6
+ attr_accessor :offset
7
+ attr_accessor :count
8
+ attr_accessor :value
9
+
10
+ # This data can be found mostly in rpmtag.h
11
+ TAG = {
12
+ 61 => :headerimage,
13
+ 62 => :headersignatures,
14
+ 63 => :headerimmutable,
15
+ 64 => :headerregions,
16
+ 100 => :headeri18ntable,
17
+ 256 => :sig_base,
18
+
19
+ 257 => :sigsize,
20
+ 258 => :siglemd5_1,
21
+ 259 => :sigpgp,
22
+ 260 => :siglemd5_2,
23
+ 261 => :sigmd5,
24
+ 262 => :siggpg,
25
+ 263 => :sigpgp5,
26
+ 264 => :badsha1_1,
27
+ 265 => :badsha1_2,
28
+ 266 => :pubkeys,
29
+ 267 => :dsaheader,
30
+ 268 => :rsaheader,
31
+ 269 => :sha1header,
32
+ 270 => :longsigsize,
33
+ 271 => :longarchivesize,
34
+
35
+ 1000 => :name,
36
+ 1001 => :version,
37
+ 1002 => :release,
38
+ 1003 => :epoch,
39
+ 1004 => :summary,
40
+ 1005 => :description,
41
+ 1006 => :buildtime,
42
+ 1007 => :buildhost,
43
+ 1008 => :installtime,
44
+ 1009 => :size,
45
+ 1010 => :distribution,
46
+ 1011 => :vendor,
47
+ 1012 => :gif,
48
+ 1013 => :xpm,
49
+ 1014 => :license,
50
+ 1015 => :packager,
51
+ 1016 => :group,
52
+ 1017 => :changelog,
53
+ 1018 => :source,
54
+ 1019 => :patch,
55
+ 1020 => :url,
56
+ 1021 => :os,
57
+ 1022 => :arch,
58
+ 1023 => :prein,
59
+ 1024 => :postin,
60
+ 1025 => :preun,
61
+ 1026 => :postun,
62
+ 1027 => :oldfilenames,
63
+ 1028 => :filesizes,
64
+ 1029 => :filestates,
65
+ 1030 => :filemodes,
66
+ 1031 => :fileuids,
67
+ 1032 => :filegids,
68
+ 1033 => :filerdevs,
69
+ 1034 => :filemtimes,
70
+ 1035 => :filedigests,
71
+ 1036 => :filelinktos,
72
+ 1037 => :fileflags,
73
+ 1038 => :root,
74
+ 1039 => :fileusername,
75
+ 1040 => :filegroupname,
76
+ 1041 => :exclude,
77
+ 1042 => :exclusive,
78
+ 1043 => :icon,
79
+ 1044 => :sourcerpm,
80
+ 1045 => :fileverifyflags,
81
+ 1046 => :archivesize,
82
+ 1047 => :providename,
83
+ 1048 => :requireflags,
84
+ 1049 => :requirename,
85
+ 1050 => :requireversion,
86
+ 1051 => :nosource,
87
+ 1052 => :nopatch,
88
+ 1053 => :conflictflags,
89
+ 1054 => :conflictname,
90
+ 1055 => :conflictversion,
91
+ 1056 => :defaultprefix,
92
+ 1057 => :buildroot,
93
+ 1058 => :installprefix,
94
+ 1059 => :excludearch,
95
+ 1060 => :excludeos,
96
+ 1061 => :exclusivearch,
97
+ 1062 => :exclusiveos,
98
+ 1063 => :autoreqprov,
99
+ 1064 => :rpmversion,
100
+ 1065 => :triggerscripts,
101
+ 1066 => :triggername,
102
+ 1067 => :triggerversion,
103
+ 1068 => :triggerflags,
104
+ 1069 => :triggerindex,
105
+ 1079 => :verifyscript,
106
+ 1080 => :changelogtime,
107
+ 1081 => :changelogname,
108
+ 1082 => :changelogtext,
109
+ 1083 => :brokenmd5,
110
+ 1084 => :prereq,
111
+ 1085 => :preinprog,
112
+ 1086 => :postinprog,
113
+ 1087 => :preunprog,
114
+ 1088 => :postunprog,
115
+ 1089 => :buildarchs,
116
+ 1090 => :obsoletename,
117
+ 1091 => :verifyscriptprog,
118
+ 1092 => :triggerscriptprog,
119
+ 1093 => :docdir,
120
+ 1094 => :cookie,
121
+ 1095 => :filedevices,
122
+ 1096 => :fileinodes,
123
+ 1097 => :filelangs,
124
+ 1098 => :prefixes,
125
+ 1099 => :instprefixes,
126
+ 1100 => :triggerin,
127
+ 1101 => :triggerun,
128
+ 1102 => :triggerpostun,
129
+ 1103 => :autoreq,
130
+ 1104 => :autoprov,
131
+ 1105 => :capability,
132
+ 1106 => :sourcepackage,
133
+ 1107 => :oldorigfilenames,
134
+ 1108 => :buildprereq,
135
+ 1109 => :buildrequires,
136
+ 1110 => :buildconflicts,
137
+ 1111 => :buildmacros,
138
+ 1112 => :provideflags,
139
+ 1113 => :provideversion,
140
+ 1114 => :obsoleteflags,
141
+ 1115 => :obsoleteversion,
142
+ 1116 => :dirindexes,
143
+ 1117 => :basenames,
144
+ 1118 => :dirnames,
145
+ 1119 => :origdirindexes,
146
+ 1120 => :origbasenames,
147
+ 1121 => :origdirnames,
148
+ 1122 => :optflags,
149
+ 1123 => :disturl,
150
+ 1124 => :payloadformat,
151
+ 1125 => :payloadcompressor,
152
+ 1126 => :payloadflags,
153
+ 1127 => :installcolor,
154
+ 1128 => :installtid,
155
+ 1129 => :removetid,
156
+ 1130 => :sha1rhn,
157
+ 1131 => :rhnplatform,
158
+ 1132 => :platform,
159
+ 1133 => :patchesname,
160
+ 1134 => :patchesflags,
161
+ 1135 => :patchesversion,
162
+ 1136 => :cachectime,
163
+ 1137 => :cachepkgpath,
164
+ 1138 => :cachepkgsize,
165
+ 1139 => :cachepkgmtime,
166
+ 1140 => :filecolors,
167
+ 1141 => :fileclass,
168
+ 1142 => :classdict,
169
+ 1143 => :filedependsx,
170
+ 1144 => :filedependsn,
171
+ 1145 => :dependsdict,
172
+ 1146 => :sourcepkgid,
173
+ 1147 => :filecontexts,
174
+ 1148 => :fscontexts,
175
+ 1149 => :recontexts,
176
+ 1150 => :policies,
177
+ 1151 => :pretrans,
178
+ 1152 => :posttrans,
179
+ 1153 => :pretransprog,
180
+ 1154 => :posttransprog,
181
+ 1155 => :disttag,
182
+ 1156 => :suggestsname,
183
+ 1157 => :suggestsversion,
184
+ 1158 => :suggestsflags,
185
+ 1159 => :enhancesname,
186
+ 1160 => :enhancesversion,
187
+ 1161 => :enhancesflags,
188
+ 1162 => :priority,
189
+ 1163 => :cvsid,
190
+ 1164 => :blinkpkgid,
191
+ 1165 => :blinkhdrid,
192
+ 1166 => :blinknevra,
193
+ 1167 => :flinkpkgid,
194
+ 1168 => :flinkhdrid,
195
+ 1169 => :flinknevra,
196
+ 1170 => :packageorigin,
197
+ 1171 => :triggerprein,
198
+ 1172 => :buildsuggests,
199
+ 1173 => :buildenhances,
200
+ 1174 => :scriptstates,
201
+ 1175 => :scriptmetrics,
202
+ 1176 => :buildcpuclock,
203
+ 1177 => :filedigestalgos,
204
+ 1178 => :variants,
205
+ 1179 => :xmajor,
206
+ 1180 => :xminor,
207
+ 1181 => :repotag,
208
+ 1182 => :keywords,
209
+ 1183 => :buildplatforms,
210
+ 1184 => :packagecolor,
211
+ 1185 => :packageprefcolor,
212
+ 1186 => :xattrsdict,
213
+ 1187 => :filexattrsx,
214
+ 1188 => :depattrsdict,
215
+ 1189 => :conflictattrsx,
216
+ 1190 => :obsoleteattrsx,
217
+ 1191 => :provideattrsx,
218
+ 1192 => :requireattrsx,
219
+ 1193 => :buildprovides,
220
+ 1194 => :buildobsoletes,
221
+ 1195 => :dbinstance,
222
+ 1196 => :nvra,
223
+ 5000 => :filenames,
224
+ 5001 => :fileprovide,
225
+ 5002 => :filerequire,
226
+ 5003 => :fsnames,
227
+ 5004 => :fssizes,
228
+ 5005 => :triggerconds,
229
+ 5006 => :triggertype,
230
+ 5007 => :origfilenames,
231
+ 5008 => :longfilesizes,
232
+ 5009 => :longsize,
233
+ 5010 => :filecaps,
234
+ 5011 => :filedigestalgo,
235
+ 5012 => :bugurl,
236
+ 5013 => :evr,
237
+ 5014 => :nvr,
238
+ 5015 => :nevr,
239
+ 5016 => :nevra,
240
+ 5017 => :headercolor,
241
+ 5018 => :verbose,
242
+ 5019 => :epochnum,
243
+ }
244
+
245
+ # See 'rpmTagType' enum in rpmtag.h
246
+ TYPE = {
247
+ 0 => :null,
248
+ 1 => :char,
249
+ 2 => :int8,
250
+ 3 => :int16,
251
+ 4 => :int32,
252
+ 5 => :int64,
253
+ 6 => :string,
254
+ 7 => :binary,
255
+ 8 => :string_array,
256
+ 9 => :i18nstring,
257
+ }
258
+
259
+ def initialize(tag_id, type, offset, count, data)
260
+ @tag = tag_id
261
+ @type = type
262
+ @offset = offset
263
+ @count = count
264
+
265
+ @data = data
266
+ end # def initialize
267
+
268
+ def tag
269
+ TAG[@tag] or @tag
270
+ end # def tag
271
+
272
+ def tag_as_int
273
+ @tag
274
+ end
275
+
276
+ def type
277
+ TYPE[@type] or @type
278
+ end # def type
279
+
280
+ def value
281
+ if !@value
282
+ # TODO(sissel): Handle @count of string_array, int32, etc?
283
+ case type
284
+ when :string
285
+ # string at offset up to first null
286
+ @value = @data[@offset .. -1][/^[^\0]+/]
287
+ when :i18nstring
288
+ # string at offset up to first null
289
+ @value = @data[@offset .. -1][/^[^\0]+/]
290
+ when :string_array
291
+ @value = @data[@offset .. -1].split("\0")[0 ... @count]
292
+ when :binary
293
+ @value = @data[@offset, @count]
294
+ when :int32
295
+ @value = @data[@offset, 4 * count].unpack("N" * count)
296
+ when :int16
297
+ @value = @data[@offset, 2 * count].unpack("n" * count)
298
+ end # case type
299
+ end # if !@value
300
+
301
+ return @value
302
+ end # def value
303
+ end # class RPMFile::Tag
304
+
@@ -9,9 +9,10 @@ Maintainer: <%= maintainer or "<unknown>" %>
9
9
  if dep =~ /\(/
10
10
  # nothing
11
11
  else
12
+ # If the dependency is simply a name, turn it into 'name (>= 0)'
12
13
  da = dep.split(/ +/)
13
14
  if da.size == 1
14
- da += [">", "0"]
15
+ da += [">=", "0"]
15
16
  end
16
17
  dep = "#{da[0]} (#{da[1]} #{da[2]})"
17
18
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fpm
3
3
  version: !ruby/object:Gem::Version
4
- hash: 59
5
- prerelease: false
4
+ hash: 57
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 22
10
- version: 0.2.22
9
+ - 23
10
+ version: 0.2.23
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jordan Sissel
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-12 00:00:00 -07:00
18
+ date: 2011-05-16 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -42,17 +42,22 @@ extensions: []
42
42
  extra_rdoc_files: []
43
43
 
44
44
  files:
45
+ - lib/rpm/tag.rb
46
+ - lib/rpm/namespace.rb
47
+ - lib/rpm/lead.rb
48
+ - lib/rpm/header.rb
49
+ - lib/rpm/rpmfile.rb
45
50
  - lib/fpm/builder.rb
51
+ - lib/fpm/namespace.rb
46
52
  - lib/fpm/source.rb
47
53
  - lib/fpm/rubyfixes.rb
48
- - lib/fpm/target/deb.rb
49
- - lib/fpm/target/rpm.rb
50
- - lib/fpm/package.rb
51
- - lib/fpm/namespace.rb
54
+ - lib/fpm/source/npm.rb
52
55
  - lib/fpm/source/dir.rb
53
56
  - lib/fpm/source/rpm.rb
54
- - lib/fpm/source/npm.rb
55
57
  - lib/fpm/source/gem.rb
58
+ - lib/fpm/target/deb.rb
59
+ - lib/fpm/target/rpm.rb
60
+ - lib/fpm/package.rb
56
61
  - lib/fpm.rb
57
62
  - bin/fpm
58
63
  - bin/fpm-npm
@@ -89,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
94
  requirements: []
90
95
 
91
96
  rubyforge_project:
92
- rubygems_version: 1.3.7
97
+ rubygems_version: 1.6.0
93
98
  signing_key:
94
99
  specification_version: 3
95
100
  summary: fpm - package building and mangling