easyfpm 0.1.0.pre
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.
- data/LICENSE +339 -0
- data/README.md +4 -0
- data/THANKS +5 -0
- data/bin/easyfpm +16 -0
- data/bin/easyfpm-translatecl +77 -0
- data/changelog +12 -0
- data/doc/samples/easyfpm.cfg +153 -0
- data/doc/samples/install_scripts/post-delete.sh +39 -0
- data/doc/samples/install_scripts/post-install.sh +30 -0
- data/doc/samples/install_scripts/pre-delete.sh +30 -0
- data/doc/samples/install_scripts/pre-install.sh +27 -0
- data/doc/samples/mapping.conf +20 -0
- data/lib/easyfpm/commandline.rb +274 -0
- data/lib/easyfpm/configuration.rb +274 -0
- data/lib/easyfpm/exceptions.rb +18 -0
- data/lib/easyfpm/mapping.rb +50 -0
- data/lib/easyfpm/namespace.rb +4 -0
- data/lib/easyfpm/packaging.rb +406 -0
- data/lib/easyfpm/pkgchangelog.rb +195 -0
- data/lib/easyfpm/version.rb +4 -0
- data/lib/easyfpm.rb +15 -0
- metadata +143 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
###############################################################################
|
2
|
+
## Class : EASYFPM::Mapping
|
3
|
+
## Author : Erwan SEITE
|
4
|
+
## Aim : Manage EASYFPM Mapping Conf Files
|
5
|
+
## Licence : GPL v2
|
6
|
+
## Source : https://github.com/wanix/easyfpm.git
|
7
|
+
###############################################################################
|
8
|
+
require "easyfpm/exceptions"
|
9
|
+
|
10
|
+
class EASYFPM::Mapping
|
11
|
+
|
12
|
+
#Waited format:
|
13
|
+
#
|
14
|
+
# #A comment
|
15
|
+
# src-dir => newdir
|
16
|
+
# src-file => newdir/new-file
|
17
|
+
#
|
18
|
+
# New path can't start with /
|
19
|
+
|
20
|
+
@@regexpStruct={}
|
21
|
+
#Empty line definition
|
22
|
+
@@regexpStruct[:emptyline] = /^\s*$/
|
23
|
+
#Comment line definition
|
24
|
+
@@regexpStruct[:commentline] = /^\s*[#]/
|
25
|
+
#Mapping line definition
|
26
|
+
@@regexpStruct[:mappingline] = /^\s*(.+?)\s+=>\s+(.*?)\s*$/
|
27
|
+
|
28
|
+
attr_reader :hashmap
|
29
|
+
|
30
|
+
def initialize(mappingfile)
|
31
|
+
file = File.open(mappingfile, 'r')
|
32
|
+
@hashmap={}
|
33
|
+
while !file.eof?
|
34
|
+
line = file.readline
|
35
|
+
#We ignore the empty lines
|
36
|
+
next if @@regexpStruct[:emptyline].match(line)
|
37
|
+
#We ignore the comment lines
|
38
|
+
next if @@regexpStruct[:commentline].match(line)
|
39
|
+
linematch = @@regexpStruct[:mappingline].match(line)
|
40
|
+
if linematch
|
41
|
+
#We are on a mapping line
|
42
|
+
#Verifying that new path don't start with /
|
43
|
+
raise EASYFPM::InvalidConfiguration, "New path can't start with / mapping file #{mappingfile}:\n\t#{line}" if linematch[2][0] == "/"
|
44
|
+
@hashmap[linematch[1]]=linematch[2]
|
45
|
+
else
|
46
|
+
raise EASYFPM::InvalidConfiguration, "The following line is not recognized in mapping file #{mappingfile}:\n\t#{line}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end #initialize
|
50
|
+
end
|
@@ -0,0 +1,406 @@
|
|
1
|
+
###############################################################################
|
2
|
+
## Class : EASYFPM::Packaging
|
3
|
+
## Author : Erwan SEITE
|
4
|
+
## Aim : Create packages with fpm
|
5
|
+
## Licence : GPL v2
|
6
|
+
## Source : https://github.com/wanix/easyfpm.git
|
7
|
+
###############################################################################
|
8
|
+
require "easyfpm/configuration"
|
9
|
+
require "easyfpm/exceptions"
|
10
|
+
require "easyfpm/pkgchangelog"
|
11
|
+
require "fileutils"
|
12
|
+
require "tempfile"
|
13
|
+
require "tmpdir"
|
14
|
+
require "open3"
|
15
|
+
begin
|
16
|
+
require "unixconfigstyle"
|
17
|
+
require "ptools"
|
18
|
+
rescue LoadError
|
19
|
+
require "rubygems"
|
20
|
+
require "unixconfigstyle"
|
21
|
+
require "ptools"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
class EASYFPM::Packaging
|
26
|
+
|
27
|
+
attr_accessor :verbose
|
28
|
+
attr_accessor :dryrun
|
29
|
+
attr_accessor :debug
|
30
|
+
|
31
|
+
#Initialize the class
|
32
|
+
def initialize(unixconfigstyle, specificLabel=nil)
|
33
|
+
raise ArgumentError, 'the argument must be an UnixConfigStyle object' unless unixconfigstyle.is_a? UnixConfigStyle
|
34
|
+
|
35
|
+
#We need fpm in the path
|
36
|
+
raise EASYFPM::InvalidEnvironment, "the fpm script is not found in PATH, please install it or put it in your PATH" unless File.which("fpm")
|
37
|
+
|
38
|
+
@easyfpmconf = EASYFPM::Configuration.new(unixconfigstyle, specificLabel)
|
39
|
+
@label=specificLabel
|
40
|
+
@verbose = false
|
41
|
+
@dryrun = false
|
42
|
+
@debug = false
|
43
|
+
end #initialize
|
44
|
+
|
45
|
+
#return a fpmcmdline for the specific label
|
46
|
+
def generatefpmline(labelhashconf,makingConf=nil)
|
47
|
+
debug "generatefpmline","generatefpmline (#{labelhashconf.class.name},#{makingConf.class.name})"
|
48
|
+
return nil unless labelhashconf
|
49
|
+
fpmconf=""
|
50
|
+
|
51
|
+
fpmconf += " --verbose" if @verbose
|
52
|
+
fpmconf += " --debug" if @debug
|
53
|
+
|
54
|
+
packageType = labelhashconf["pkg-type"]
|
55
|
+
|
56
|
+
#Let analyse the options given
|
57
|
+
labelhashconf.each_key do |param|
|
58
|
+
case param
|
59
|
+
#The followings params have specific treatments
|
60
|
+
when "pkg-mapping", "pkg-content"
|
61
|
+
next
|
62
|
+
when "easyfpm-pkg-changelog"
|
63
|
+
#We should have generate a temporary file for this
|
64
|
+
raise EASYFPM::MissingArgument, "The easyfpm changelog has not been generated" unless makingConf.has_key? "pkg-changelog"
|
65
|
+
case packageType
|
66
|
+
when "deb","rpm"
|
67
|
+
fpmconf += " --#{packageType}-changelog '"+makingConf["pkg-changelog"]+"'"
|
68
|
+
else
|
69
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
70
|
+
end #case packageType
|
71
|
+
when "pkg-name"
|
72
|
+
fpmconf += " --name "+labelhashconf[param]
|
73
|
+
when "pkg-type"
|
74
|
+
fpmconf += " -t "+labelhashconf[param]
|
75
|
+
when "pkg-version"
|
76
|
+
fpmconf += " -v "+labelhashconf[param]
|
77
|
+
when "pkg-src-dir"
|
78
|
+
#If we have a mapping file, we have to rebuild the source later in temporary dir
|
79
|
+
fpmconf += " -s dir -C "+labelhashconf[param] unless labelhashconf.has_key? "pkg-mapping"
|
80
|
+
when "pkg-prefix"
|
81
|
+
fpmconf += " --prefix "+labelhashconf[param]
|
82
|
+
#There's a bug with pkg-output-dir and deb so easyfpm make it itself
|
83
|
+
when "pkg-output-dir"
|
84
|
+
next
|
85
|
+
# fpmconf += " -p "+labelhashconf[param]
|
86
|
+
when "pkg-description"
|
87
|
+
fpmconf += " --description '"+labelhashconf[param]+"'"
|
88
|
+
when "pkg-arch"
|
89
|
+
fpmconf += " -a "+labelhashconf[param]
|
90
|
+
when "pkg-user"
|
91
|
+
case packageType
|
92
|
+
when "deb","rpm","solaris"
|
93
|
+
fpmconf += " --#{packageType}-user "+labelhashconf[param]
|
94
|
+
else
|
95
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
96
|
+
end #case packageType
|
97
|
+
when "pkg-group"
|
98
|
+
case packageType
|
99
|
+
when "deb","rpm","solaris"
|
100
|
+
fpmconf += " --#{packageType}-group "+labelhashconf[param]
|
101
|
+
else
|
102
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
103
|
+
end #case packageType
|
104
|
+
when "template-activated"
|
105
|
+
fpmconf += " --template-scripts" if labelhashconf[param] == "yes"
|
106
|
+
when "template-value"
|
107
|
+
#We have an Array for this param
|
108
|
+
labelhashconf[param].each do |tplvalue|
|
109
|
+
fpmconf += " --template-value "+tplvalue
|
110
|
+
end #labelhashconf[param].each
|
111
|
+
when "pkg-preinst"
|
112
|
+
fpmconf += " --before-install "+labelhashconf[param]
|
113
|
+
when "pkg-postinst"
|
114
|
+
fpmconf += " --after-install "+labelhashconf[param]
|
115
|
+
when "pkg-prerm"
|
116
|
+
fpmconf += " --before-remove "+labelhashconf[param]
|
117
|
+
when "pkg-postrm"
|
118
|
+
fpmconf += " --after-remove "+labelhashconf[param]
|
119
|
+
when "pkg-iteration"
|
120
|
+
fpmconf += " --iteration "+labelhashconf[param]
|
121
|
+
fpmconf += labelhashconf["pkg-suffix"] if labelhashconf.has_key? "pkg-suffix"
|
122
|
+
when "pkg-epoch"
|
123
|
+
fpmconf += " --epoch "+labelhashconf[param]
|
124
|
+
when "pkg-vendor"
|
125
|
+
fpmconf += " --vendor '"+labelhashconf[param]+"'"
|
126
|
+
when "pkg-url"
|
127
|
+
fpmconf += " --url '"+labelhashconf[param]+"'"
|
128
|
+
when "pkg-license"
|
129
|
+
fpmconf += " --license '"+labelhashconf[param]+"'"
|
130
|
+
when "pkg-config-files"
|
131
|
+
#We have an Array for this param
|
132
|
+
labelhashconf[param].each do |pkgconfig|
|
133
|
+
fpmconf += " --config-files '"+pkgconfig+"'"
|
134
|
+
end #labelhashconf[param].each
|
135
|
+
when "pkg-depends"
|
136
|
+
#We have an Array for this param
|
137
|
+
labelhashconf[param].each do |pkgdepend|
|
138
|
+
fpmconf += " -d '"+pkgdepend+"'"
|
139
|
+
end #labelhashconf[param].each
|
140
|
+
when "pkg-suffix"
|
141
|
+
#if iteration defines, suffix is with it, else it is like an iteration
|
142
|
+
next if labelhashconf.has_key? "pkg-iteration"
|
143
|
+
fpmconf += " --iteration 1"+labelhashconf[param]
|
144
|
+
when "pkg-changelog"
|
145
|
+
case packageType
|
146
|
+
when "deb","rpm"
|
147
|
+
fpmconf += " --#{packageType}-changelog "+labelhashconf[param]
|
148
|
+
else
|
149
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
150
|
+
end #case packageType
|
151
|
+
when "pkg-force"
|
152
|
+
fpmconf += " -f" if labelhashconf[param] == "yes"
|
153
|
+
when "pkg-category"
|
154
|
+
fpmconf += " --category "+labelhashconf[param]
|
155
|
+
when "pkg-provides"
|
156
|
+
#We have an Array for this param
|
157
|
+
labelhashconf[param].each do |pkgprovide|
|
158
|
+
fpmconf += " --provides '"+pkgprovide+"'"
|
159
|
+
end #labelhashconf[param].each
|
160
|
+
when "pkg-conflicts"
|
161
|
+
#We have an Array for this param
|
162
|
+
labelhashconf[param].each do |pkgconflict|
|
163
|
+
fpmconf += " --conflicts '"+pkgconflict+"'"
|
164
|
+
end #labelhashconf[param].each
|
165
|
+
when "pkg-recommends"
|
166
|
+
#We have an Array for this param
|
167
|
+
case packageType
|
168
|
+
when "deb"
|
169
|
+
labelhashconf[param].each do |pkgrecommends|
|
170
|
+
fpmconf += " --#{packageType}-recommends '"+pkgrecommends+"'"
|
171
|
+
end #labelhashconf[param].each
|
172
|
+
else
|
173
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
174
|
+
end #case packageType
|
175
|
+
when "pkg-suggests"
|
176
|
+
#We have an Array for this param
|
177
|
+
case packageType
|
178
|
+
when "deb"
|
179
|
+
labelhashconf[param].each do |pkgsuggests|
|
180
|
+
fpmconf += " --#{packageType}-suggests '"+pkgsuggests+"'"
|
181
|
+
end #labelhashconf[param].each
|
182
|
+
else
|
183
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
184
|
+
end #case packageType
|
185
|
+
when "pkg-directories"
|
186
|
+
fpmconf += " --directories "+labelhashconf[param]
|
187
|
+
when "pkg-maintainer"
|
188
|
+
fpmconf += " --maintainer "+labelhashconf[param]
|
189
|
+
when "pkg-compression"
|
190
|
+
case packageType
|
191
|
+
when "deb","rpm"
|
192
|
+
fpmconf += " --#{packageType}-compression "+labelhashconf[param]
|
193
|
+
else
|
194
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
195
|
+
end #case packageType
|
196
|
+
when "pkg-priority"
|
197
|
+
case packageType
|
198
|
+
when "deb"
|
199
|
+
fpmconf += " --#{packageType}-priority "+labelhashconf[param]
|
200
|
+
else
|
201
|
+
warn "Warning: the package type #{packageType} doesn't use "+param
|
202
|
+
end #case packageType
|
203
|
+
when "pkg-replaces"
|
204
|
+
#We have an Array for this param
|
205
|
+
labelhashconf[param].each do |pkgreplace|
|
206
|
+
fpmconf += " --replaces '"+pkgreplace+"'"
|
207
|
+
end #labelhashconf[param].each
|
208
|
+
else
|
209
|
+
warn "Warning: parameter #{param} not taken into account in EASYFPM::Packaging.generatefpmline (should be a bug)"
|
210
|
+
end #case param
|
211
|
+
end #labelhashconf.each_key
|
212
|
+
|
213
|
+
#if we have pkg-content, we must insert it at the end of the string
|
214
|
+
fpmconf += " "+labelhashconf["pkg-content"] if labelhashconf.has_key? "pkg-content"
|
215
|
+
|
216
|
+
#If we have pkg-mapping, the temporary dir should have been created and
|
217
|
+
# the content to manage in makingConf["pkg-content"]
|
218
|
+
if labelhashconf.has_key? "pkg-mapping"
|
219
|
+
#The new source dir has been generated
|
220
|
+
fpmconf += " -s dir -C '"+makingConf["pkg-src-dir"]+"'"
|
221
|
+
#The new content is mapped
|
222
|
+
fpmconf += " "+makingConf["pkg-content"]
|
223
|
+
end
|
224
|
+
|
225
|
+
return fpmconf
|
226
|
+
end #generatefpmline
|
227
|
+
|
228
|
+
#make alls packages in the configuration
|
229
|
+
def makeAll()
|
230
|
+
debug "makeAll"
|
231
|
+
returnCode = true
|
232
|
+
if @easyfpmconf.hasLabels?
|
233
|
+
@easyfpmconf.getLabels().each do |label|
|
234
|
+
returnCode = false unless make(label)
|
235
|
+
end #@easyfpmconf.getLabels().each
|
236
|
+
else
|
237
|
+
returnCode = false unless make()
|
238
|
+
end
|
239
|
+
return returnCode
|
240
|
+
end
|
241
|
+
|
242
|
+
#Create the packages
|
243
|
+
def make(label=nil)
|
244
|
+
returnCode=true
|
245
|
+
begin
|
246
|
+
debug "make", "make(#{label})"
|
247
|
+
#Make packages for each labels in conf
|
248
|
+
|
249
|
+
if @debug
|
250
|
+
puts "*"*80
|
251
|
+
puts " EASYFPM::Packaging : configuration"
|
252
|
+
puts "*"*80
|
253
|
+
@easyfpmconf.print(label)
|
254
|
+
puts "*"*80
|
255
|
+
end
|
256
|
+
|
257
|
+
labelconf = @easyfpmconf.getLabelHashConf(label)
|
258
|
+
|
259
|
+
makingConf={}
|
260
|
+
#Do we need to generate the changelog ?
|
261
|
+
if labelconf.has_key? "easyfpm-pkg-changelog"
|
262
|
+
#Create a temp file
|
263
|
+
makingConf["file-easyfpm-pkg-changelog"]=Tempfile.new("easyfpm-pkg-changelog")
|
264
|
+
#Give it for config
|
265
|
+
makingConf["pkg-changelog"]=makingConf["file-easyfpm-pkg-changelog"].path
|
266
|
+
debug "make","Generating easyfpm changelog #{makingConf["pkg-changelog"]}"
|
267
|
+
#Create a easyfpm-changelog object from file
|
268
|
+
easyfpmcl = EASYFPM::PkgChangelog.new(labelconf["easyfpm-pkg-changelog"])
|
269
|
+
#Writing a changelog for package type in temp file
|
270
|
+
easyfpmcl.write(labelconf["pkg-type"],makingConf["pkg-changelog"])
|
271
|
+
end
|
272
|
+
|
273
|
+
#Do we have a mapping file ?
|
274
|
+
# If so we have to recreate the source directory
|
275
|
+
if labelconf.has_key? "pkg-mapping"
|
276
|
+
hashmap = EASYFPM::Mapping.new(labelconf["pkg-mapping"]).hashmap
|
277
|
+
makingConf["pkg-content"] = hashmap.values.join(" ")
|
278
|
+
makingConf["pkg-src-dir"] = Dir.mktmpdir("easyfpm-mapping")
|
279
|
+
debug "make","mapping pkg-src-dir into #{makingConf["pkg-src-dir"]}"
|
280
|
+
#We copy from pkg-src-dir to temp dir
|
281
|
+
hashmap.keys.each do |file|
|
282
|
+
#First, we create the arborescence if it doesn't exists
|
283
|
+
newArbo = File.dirname(hashmap[file])
|
284
|
+
unless newArbo == "."
|
285
|
+
debug "make","creating "+makingConf["pkg-src-dir"]+"/"+newArbo
|
286
|
+
FileUtils.mkdir_p(makingConf["pkg-src-dir"]+"/"+newArbo) unless Dir.exist?(makingConf["pkg-src-dir"]+"/"+newArbo)
|
287
|
+
end
|
288
|
+
#Then copy the source into it
|
289
|
+
debug "make", "copying #{labelconf["pkg-src-dir"]}/#{file} to "+makingConf["pkg-src-dir"]+"/"+hashmap[file]
|
290
|
+
if (@verbose or @debug)
|
291
|
+
FileUtils.cp_r(labelconf["pkg-src-dir"]+"/"+file, makingConf["pkg-src-dir"]+"/"+hashmap[file], :preserve => true, :verbose => true)
|
292
|
+
else
|
293
|
+
FileUtils.cp_r(labelconf["pkg-src-dir"]+"/"+file, makingConf["pkg-src-dir"]+"/"+hashmap[file], :preserve => true)
|
294
|
+
end
|
295
|
+
end #hashmap.keys.each
|
296
|
+
end #if labelconf.has_key? "pkg-mapping"
|
297
|
+
|
298
|
+
#Do we have a specific output dir ?
|
299
|
+
# there's a bug with fpm and this feature, so easyfpm take it itself for the moment
|
300
|
+
if labelconf.has_key? "pkg-output-dir"
|
301
|
+
#Making a new tmpdir for working in
|
302
|
+
makingConf["pkg-output-dir"] = Dir.mktmpdir("easyfpm-output-dir")
|
303
|
+
end
|
304
|
+
|
305
|
+
#We are ready to generate the fpm command
|
306
|
+
fpmCmdOptions = generatefpmline(labelconf,makingConf)
|
307
|
+
|
308
|
+
puts "fpm "+fpmCmdOptions if (@verbose or @debug or @dryrun)
|
309
|
+
|
310
|
+
unless @dryrun
|
311
|
+
if makingConf.has_key? "pkg-output-dir"
|
312
|
+
#returnCode = system "cd "+makingConf["pkg-output-dir"]+" && fpm "+fpmCmdOptions
|
313
|
+
Open3.popen2e("cd "+makingConf["pkg-output-dir"]+" && fpm "+fpmCmdOptions) do |stdin, stdout_err, wait_thr|
|
314
|
+
#fpm uses Cabin::channel for logging
|
315
|
+
while line = stdout_err.gets
|
316
|
+
#cbchannelmatch = /^\{.*:message=>"(.*?)",.+?(:level=>:(\w+),)?.*(:path=>"(.*?)")?.*\}$/.match(line)
|
317
|
+
cbchannelmatch = /^\{.*:message=>"(.*?)",.+?(:level=>:(\w+),)?.*\}$/.match(line)
|
318
|
+
cbpathmatch = /^\{.*:message=>"(.*?)",.*( :path=>"(.*?)").*\}$/.match(line)
|
319
|
+
#Outline cause we have to filter messages before output if package-output-dir
|
320
|
+
outline=nil
|
321
|
+
if cbchannelmatch
|
322
|
+
message = cbchannelmatch[1]
|
323
|
+
loglevel = cbchannelmatch[3]
|
324
|
+
path = cbpathmatch[3] if cbpathmatch
|
325
|
+
if (loglevel == "info" and (@verbose or @debug))
|
326
|
+
outline = cbchannelmatch[0]
|
327
|
+
elsif (loglevel == "debug" and @debug)
|
328
|
+
outline = cbchannelmatch[0]
|
329
|
+
elsif loglevel
|
330
|
+
#Ni info, ni debug => warning ou error ou autre ?
|
331
|
+
warn message
|
332
|
+
else
|
333
|
+
outline = message+" "+path if path
|
334
|
+
outline = message unless path
|
335
|
+
end #if loglevel
|
336
|
+
|
337
|
+
#Here we have the pkg-output-dir treatment
|
338
|
+
if message == "Created package" and path
|
339
|
+
if File.exists?(makingConf["pkg-output-dir"]+"/"+path)
|
340
|
+
puts (message+" "+makingConf["pkg-output-dir"]+"/"+path)
|
341
|
+
outline=nil
|
342
|
+
if File.exists?(labelconf["pkg-output-dir"]+"/"+path)
|
343
|
+
if labelconf.has_key?("pkg-force") and (labelconf["pkg-force"] == "yes")
|
344
|
+
#Move file
|
345
|
+
if (@verbose or @debug)
|
346
|
+
FileUtils.mv(makingConf["pkg-output-dir"]+"/"+path, labelconf["pkg-output-dir"]+"/"+path, :force => true, :verbose => true)
|
347
|
+
else
|
348
|
+
FileUtils.mv(makingConf["pkg-output-dir"]+"/"+path, labelconf["pkg-output-dir"]+"/"+path, :force => true)
|
349
|
+
end #if (@verbose or @debug)
|
350
|
+
puts "Package moved to #{labelconf["pkg-output-dir"]}/#{path}"
|
351
|
+
# We suppress
|
352
|
+
else
|
353
|
+
warn labelconf["pkg-output-dir"]+"/"+path+" already exists, use '--pkg-force yes' to force copy"
|
354
|
+
returnCode = false
|
355
|
+
end #if labelconf.has_key? "pkg-force" and labelconf["pkg-force"] == "yes"
|
356
|
+
else
|
357
|
+
#Move file
|
358
|
+
if (@verbose or @debug)
|
359
|
+
FileUtils.mv(makingConf["pkg-output-dir"]+"/"+path, labelconf["pkg-output-dir"]+"/"+path, :verbose => true)
|
360
|
+
else
|
361
|
+
FileUtils.mv(makingConf["pkg-output-dir"]+"/"+path, labelconf["pkg-output-dir"]+"/"+path)
|
362
|
+
end
|
363
|
+
puts "Package moved to #{labelconf["pkg-output-dir"]}/#{path}"
|
364
|
+
end #if File.exists?(labelconf["pkg-output-dir"]+"/"+path)
|
365
|
+
end #if File.exists?(makingConf["pkg-output-dir"]+"/"+path)
|
366
|
+
end #message == "Created package" and path
|
367
|
+
#We display the message if not filtered
|
368
|
+
puts outline unless outline.nil?
|
369
|
+
else
|
370
|
+
puts line if line
|
371
|
+
end #if cbchannelmatch
|
372
|
+
end #while line=stdout_err.gets
|
373
|
+
returnCode = false unless wait_thr.value.success?
|
374
|
+
end #Open3.popen2e
|
375
|
+
else
|
376
|
+
returnCode = system "fpm "+fpmCmdOptions
|
377
|
+
end
|
378
|
+
else
|
379
|
+
puts " dry-run mode, fpm not executed"
|
380
|
+
end
|
381
|
+
|
382
|
+
#We clean all before exiting
|
383
|
+
ensure
|
384
|
+
# tempfile for changelog if created
|
385
|
+
if makingConf.has_key? "file-easyfpm-pkg-changelog"
|
386
|
+
makingConf["file-easyfpm-pkg-changelog"].close
|
387
|
+
debug "make"," #{makingConf["pkg-changelog"]} deleted"
|
388
|
+
end
|
389
|
+
# tempdir for mapping if created
|
390
|
+
if makingConf.has_key? "pkg-src-dir"
|
391
|
+
FileUtils.remove_entry_secure(makingConf["pkg-src-dir"])
|
392
|
+
debug "make","#{makingConf["pkg-src-dir"]} deleted"
|
393
|
+
end
|
394
|
+
if makingConf.has_key? "pkg-output-dir"
|
395
|
+
FileUtils.remove_entry_secure(makingConf["pkg-output-dir"])
|
396
|
+
debug "make","#{makingConf["pkg-output-dir"]} deleted"
|
397
|
+
end
|
398
|
+
end #begin
|
399
|
+
return returnCode
|
400
|
+
end #make
|
401
|
+
|
402
|
+
def debug (function, message="")
|
403
|
+
puts "EASYFPM::Packaging."+function+": "+message if @debug
|
404
|
+
end
|
405
|
+
private :debug
|
406
|
+
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
###############################################################################
|
2
|
+
## Class : EASYFPM::Changelog
|
3
|
+
## Author : Erwan SEITE
|
4
|
+
## Aim : Manage EASYFPM changelog Format
|
5
|
+
## Licence : GPL v2
|
6
|
+
## Source : https://github.com/wanix/easyfpm.git
|
7
|
+
###############################################################################
|
8
|
+
require "easyfpm/exceptions"
|
9
|
+
require "time"
|
10
|
+
|
11
|
+
class EASYFPM::PkgChangelog
|
12
|
+
|
13
|
+
@@easyfpmCLRegExp={}
|
14
|
+
@@easyfpmCLRegExp[:comment] = /^\s*#/
|
15
|
+
@@easyfpmCLRegExp[:header] = /^\s*((\d{4}-?\d{2}-?\d{2}) (\d{2}:\d{2}:\d{2} )?)?Version (\d+\.\d+(\.\d+)?(-\d+)?) (.+? )?\(((.+?)(@| at ).+?\.[\d\w]+)\)\s*$/i
|
16
|
+
@@easyfpmCLRegExp[:description] = /^(( )+)(.+)$/
|
17
|
+
@@easyfpmCLRegExp[:ignored] = /^\s*$/
|
18
|
+
|
19
|
+
attr_accessor :defaultDate
|
20
|
+
attr_accessor :pkgname
|
21
|
+
attr_accessor :distribution
|
22
|
+
attr_accessor :urgency
|
23
|
+
|
24
|
+
def initialize(changelogFile)
|
25
|
+
raise ArgumentError, 'the argument "changelogFile" must be a String' unless changelogFile.is_a? String
|
26
|
+
raise Errno::EACCES, "Can't read #{changelogFile}" unless File.readable?(changelogFile)
|
27
|
+
@changelog=changelogFile
|
28
|
+
self.defaultDate = Time.now
|
29
|
+
self.pkgname = File.basename(File.dirname(changelogFile))
|
30
|
+
self.distribution = "stable"
|
31
|
+
self.urgency = "low"
|
32
|
+
end
|
33
|
+
|
34
|
+
def write (format, fileToWrite)
|
35
|
+
raise ArgumentError, 'the argument "format" must be a String' unless format.is_a? String
|
36
|
+
raise ArgumentError, 'the argument "fileToWrite" must be a String' unless fileToWrite.is_a? String
|
37
|
+
|
38
|
+
File.open(fileToWrite,'w') do |file|
|
39
|
+
case format.downcase
|
40
|
+
when "deb", "rpm"
|
41
|
+
return self.print(format,file)
|
42
|
+
else
|
43
|
+
raise EASYFPM::InvalidChangelogFormat, "The format #{format} is not (yet) implemented"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end #write
|
47
|
+
|
48
|
+
def print (format, io_obj=$stdout)
|
49
|
+
raise ArgumentError, 'the argument "format" must be a String' unless format.is_a? String
|
50
|
+
raise ArgumentError, 'the argument "io_obj" must be an IO class or an IO inherited class' unless io_obj.is_a? IO
|
51
|
+
|
52
|
+
case format.downcase
|
53
|
+
when "deb"
|
54
|
+
return printDEB(io_obj)
|
55
|
+
when "rpm"
|
56
|
+
return printRPM(io_obj)
|
57
|
+
else
|
58
|
+
raise EASYFPM::InvalidChangelogFormat, "The format #{format} is not implemented"
|
59
|
+
end
|
60
|
+
end #print
|
61
|
+
|
62
|
+
|
63
|
+
#(private) Write a RPM format changelog on an IO obj
|
64
|
+
#Parameters:
|
65
|
+
# io_obj : IO
|
66
|
+
def printRPM (io_obj=$stdout)
|
67
|
+
returnCode = 0
|
68
|
+
lineNumber=0
|
69
|
+
errorLines = []
|
70
|
+
myChangelog = File.new(@changelog, "r")
|
71
|
+
header = {}
|
72
|
+
while (myLine = myChangelog.gets)
|
73
|
+
lineNumber += 1
|
74
|
+
commentLine = @@easyfpmCLRegExp[:comment].match(myLine)
|
75
|
+
#If we have a comment, we ignore it
|
76
|
+
next if commentLine
|
77
|
+
ignoredLine = @@easyfpmCLRegExp[:ignored].match(myLine)
|
78
|
+
#Line we have explicitely to ignore
|
79
|
+
next if ignoredLine
|
80
|
+
headerLine = @@easyfpmCLRegExp[:header].match(myLine)
|
81
|
+
if headerLine
|
82
|
+
#header line is found, we analyse it
|
83
|
+
#if a header was here before, we display a cariage return
|
84
|
+
io_obj.puts "" if header.length > 0
|
85
|
+
header.clear
|
86
|
+
if headerLine[1]
|
87
|
+
header[:date] = Time.parse(headerLine[1])
|
88
|
+
elsif defaultDate
|
89
|
+
header[:date] = self.defaultDate
|
90
|
+
else
|
91
|
+
header[:date] = Time.now
|
92
|
+
end
|
93
|
+
header[:version] = headerLine[4] if headerLine[4]
|
94
|
+
if headerLine[7]
|
95
|
+
header[:author] = headerLine[7]
|
96
|
+
else
|
97
|
+
header[:author] = headerLine[9]
|
98
|
+
end
|
99
|
+
header[:mail] = headerLine[8] if headerLine[8]
|
100
|
+
#Header in a RedHat format
|
101
|
+
io_obj.puts "* " + header[:date].strftime("%a %b %d %Y") + " " + header[:author] + " <" + header[:mail] + "> " + header[:version]
|
102
|
+
next
|
103
|
+
end
|
104
|
+
descriptionLine = @@easyfpmCLRegExp[:description].match(myLine)
|
105
|
+
if descriptionLine
|
106
|
+
io_obj.puts descriptionLine[1] + "- " + descriptionLine[3]
|
107
|
+
next
|
108
|
+
end
|
109
|
+
|
110
|
+
#A line we can't analyse
|
111
|
+
errorLines.push(" line " + lineNumber.to_s + " : " + myLine)
|
112
|
+
returnCode=1
|
113
|
+
end
|
114
|
+
|
115
|
+
if errorLines.length > 0
|
116
|
+
warn("Error : the followning(s) line(s) are not in easyfpm changelog format :")
|
117
|
+
errorLines.each { |error| warn(error) }
|
118
|
+
end
|
119
|
+
return returnCode
|
120
|
+
end #printRPM
|
121
|
+
private :printRPM
|
122
|
+
|
123
|
+
#(private) Write a DEB format changelog on an IO obj
|
124
|
+
#Parameters:
|
125
|
+
# io_obj : IO
|
126
|
+
def printDEB (io_obj=$stdout)
|
127
|
+
returnCode = 0
|
128
|
+
lineNumber = 0
|
129
|
+
errorLines = []
|
130
|
+
myChangelog = File.new(@changelog, "r")
|
131
|
+
header = {}
|
132
|
+
while (myLine = myChangelog.gets)
|
133
|
+
lineNumber += 1
|
134
|
+
commentLine = @@easyfpmCLRegExp[:comment].match(myLine)
|
135
|
+
#If we have a comment, we ignore it
|
136
|
+
next if commentLine
|
137
|
+
ignoredLine = @@easyfpmCLRegExp[:ignored].match(myLine)
|
138
|
+
#Line we have explicitely to ignore
|
139
|
+
next if ignoredLine
|
140
|
+
headerLine = @@easyfpmCLRegExp[:header].match(myLine)
|
141
|
+
if headerLine
|
142
|
+
#header line is found, we analyse it
|
143
|
+
#if a header was here before, we display the debian style footer for the last one
|
144
|
+
if header.length != 0
|
145
|
+
io_obj.puts " -- " + header[:author] + " <" + header[:mail] + "> " + header[:date].strftime("%a %d %b %Y %H:%M:%S %z")
|
146
|
+
io_obj.puts ""
|
147
|
+
end
|
148
|
+
header.clear
|
149
|
+
if headerLine[1]
|
150
|
+
header[:date] = Time.parse(headerLine[1])
|
151
|
+
elsif defaultDate
|
152
|
+
header[:date] = self.defaultDate
|
153
|
+
else
|
154
|
+
header[:date] = Time.now
|
155
|
+
end
|
156
|
+
header[:version] = headerLine[4] if headerLine[4]
|
157
|
+
if headerLine[7]
|
158
|
+
header[:author] = headerLine[7]
|
159
|
+
else
|
160
|
+
header[:author] = headerLine[9]
|
161
|
+
end
|
162
|
+
header[:mail] = headerLine[8] if headerLine[8]
|
163
|
+
#Debian style header
|
164
|
+
io_obj.puts self.pkgname + " (" + header[:version] + ") " + self.distribution + "; urgency=" + self.urgency
|
165
|
+
next
|
166
|
+
end
|
167
|
+
descriptionLine = @@easyfpmCLRegExp[:description].match(myLine)
|
168
|
+
if descriptionLine
|
169
|
+
if descriptionLine[1].length == 2
|
170
|
+
io_obj.puts " * " + descriptionLine[3]
|
171
|
+
else
|
172
|
+
io_obj.puts myLine
|
173
|
+
end
|
174
|
+
next
|
175
|
+
end
|
176
|
+
|
177
|
+
#A line we can't analyse
|
178
|
+
errorLines.push(" line " + lineNumber.to_s + " : " + myLine)
|
179
|
+
returnCode=1
|
180
|
+
end
|
181
|
+
if header.length != 0
|
182
|
+
#We put the footer for the last header
|
183
|
+
io_obj.puts " -- " + header[:author] + " <" + header[:mail] + "> " + header[:date].strftime("%a %d %b %Y %H:%M:%S %z")
|
184
|
+
end
|
185
|
+
|
186
|
+
if errorLines.length > 0
|
187
|
+
$stderr.puts "Error : the followning(s) line(s) are not in easyfpm changelog format :"
|
188
|
+
errorLines.each { |error| $stderr.puts(error) }
|
189
|
+
end
|
190
|
+
|
191
|
+
return returnCode
|
192
|
+
end #printDEB
|
193
|
+
private :printDEB
|
194
|
+
|
195
|
+
end
|
data/lib/easyfpm.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
###############################################################################
|
2
|
+
## Class : easyfpm
|
3
|
+
## Author : Erwan SEITE
|
4
|
+
## Aim : Manage FPM packaging
|
5
|
+
## Licence : GPL v2
|
6
|
+
## Source : https://github.com/wanix/easyfpm.git
|
7
|
+
###############################################################################
|
8
|
+
|
9
|
+
require "easyfpm/namespace"
|
10
|
+
require "easyfpm/version"
|
11
|
+
require "easyfpm/exceptions"
|
12
|
+
require "easyfpm/configuration"
|
13
|
+
require "easyfpm/mapping"
|
14
|
+
require "easyfpm/packaging"
|
15
|
+
require "easyfpm/pkgchangelog"
|