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,30 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
#Sample pre-delete.sh script for easyfpm : https://github.com/wanix/easyfpm.git
|
3
|
+
#Usage for deb : https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html
|
4
|
+
#Usage for rpm : http://www.rpm.org/max-rpm-snapshot/s1-rpm-inside-scripts.html
|
5
|
+
|
6
|
+
myOperation=${1}
|
7
|
+
|
8
|
+
case ${myOperation} in
|
9
|
+
0) #Uninstall RedHat
|
10
|
+
exit 0;;
|
11
|
+
1) #Upgrade RedHat
|
12
|
+
exit 0;;
|
13
|
+
remove) #Debian:
|
14
|
+
#prerm remove
|
15
|
+
#or conflictor's-prerm remove in-favour <package> <new-version>
|
16
|
+
exit 0;;
|
17
|
+
upgrade) #Debian:
|
18
|
+
#old-prerm upgrade <new-version>
|
19
|
+
exit 0;;
|
20
|
+
deconfigure) #Debian:
|
21
|
+
#deconfigured's-prerm deconfigure in-favour <package-being-installed> <version> [removing <conflicting-package> <version>]
|
22
|
+
exit 0;;
|
23
|
+
failed-upgrade) #Debian:
|
24
|
+
#new-prerm failed-upgrade <old-version>
|
25
|
+
exit 0;;
|
26
|
+
\?) #Unknown
|
27
|
+
exit 1;;
|
28
|
+
*) exit 1;;
|
29
|
+
esac
|
30
|
+
exit 0
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
#Sample pre-install.sh script for easyfpm : https://github.com/wanix/easyfpm.git
|
3
|
+
#Usage for deb : https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html
|
4
|
+
#Usage for rpm : http://www.rpm.org/max-rpm-snapshot/s1-rpm-inside-scripts.html
|
5
|
+
|
6
|
+
myOperation=${1}
|
7
|
+
|
8
|
+
case ${myOperation} in
|
9
|
+
1) #Install RedHat
|
10
|
+
exit 0;;
|
11
|
+
2) #Upgrade RedHat
|
12
|
+
exit 0;;
|
13
|
+
install) #Debian:
|
14
|
+
#new-preinst install
|
15
|
+
#or new-preinst install <old-version>
|
16
|
+
exit 0;;
|
17
|
+
upgrade) #Debian:
|
18
|
+
#new-preinst upgrade <old-version>
|
19
|
+
exit 0;;
|
20
|
+
abort-upgrade) #Debian:
|
21
|
+
#old-preinst abort-upgrade <new-version>
|
22
|
+
exit 0;;
|
23
|
+
\?) #Unknown
|
24
|
+
exit 1;;
|
25
|
+
*) exit 1;;
|
26
|
+
esac
|
27
|
+
exit 0
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# This is a mapping sample
|
3
|
+
#
|
4
|
+
# source file (root dir is pkg-src-dir) => destination (root dir is pkg-prefix)
|
5
|
+
#
|
6
|
+
|
7
|
+
#This example suppose we want to package an apache specific configuration
|
8
|
+
# Tree on dev
|
9
|
+
# myapp
|
10
|
+
# conf.d/myapp.conf
|
11
|
+
# site/<php code>
|
12
|
+
# doc
|
13
|
+
#
|
14
|
+
# the pkg-source-dir is /home/packager/retrieve/myapp
|
15
|
+
# the pkg-prefix is /
|
16
|
+
|
17
|
+
conf.d/myapp.conf => etc/apache2/site-available/myapp.conf
|
18
|
+
site => app/httpd/www/myapp
|
19
|
+
doc => usr/share/doc/myapp
|
20
|
+
|
@@ -0,0 +1,274 @@
|
|
1
|
+
###############################################################################
|
2
|
+
## Class : EASYFPM::CommandLine
|
3
|
+
## Author : Erwan SEITE
|
4
|
+
## Aim : Manage EASYFPM Command Line
|
5
|
+
## Licence : GPL v2
|
6
|
+
## Source : https://github.com/wanix/easyfpm.git
|
7
|
+
###############################################################################
|
8
|
+
require "easyfpm"
|
9
|
+
require "optparse"
|
10
|
+
begin
|
11
|
+
require "unixconfigstyle"
|
12
|
+
rescue LoadError
|
13
|
+
require "rubygems"
|
14
|
+
require "unixconfigstyle"
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
class EASYFPM::CommandLine
|
19
|
+
|
20
|
+
def initialize()
|
21
|
+
@easyfpmconf = UnixConfigStyle.new()
|
22
|
+
@verbose = false
|
23
|
+
@dryrun = false
|
24
|
+
@debug=false
|
25
|
+
@labels = []
|
26
|
+
parse()
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
#(private) Parse the command line arguments and create a UnixConfigStyle object
|
31
|
+
def parse(*args)
|
32
|
+
easyfpmconffiles = []
|
33
|
+
options = {}
|
34
|
+
labelListAsked = false
|
35
|
+
optparse = OptionParser.new do |opts|
|
36
|
+
opts.banner = "Usage easyfpm [options]"
|
37
|
+
|
38
|
+
opts.on("--config-file [string]", String, "Configuration file's path", " (can be declared multiple times, declarative order is priority order)") do |opt|
|
39
|
+
easyfpmconffiles.push(opt)
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on("--label [list by comma]", String, "Labels to work with", " (can be declared multiple times)") do |opt|
|
43
|
+
@labels.concat(opt.split(','))
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on("--pkg-name [string]", String, "Package name") do |opt|
|
47
|
+
@easyfpmconf.addValues(opt,"pkg-name")
|
48
|
+
end
|
49
|
+
|
50
|
+
opts.on("--pkg-type [string]", String, "Package type") do |opt|
|
51
|
+
@easyfpmconf.addValues(opt,"pkg-type")
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.on("--pkg-version [string]", String, "Package version, example 1.0") do |opt|
|
55
|
+
@easyfpmconf.addValues(opt,"pkg-version")
|
56
|
+
end
|
57
|
+
|
58
|
+
opts.on("--pkg-src-dir [string]", String, "Package source dir") do |opt|
|
59
|
+
@easyfpmconf.addValues(opt,"pkg-src-dir")
|
60
|
+
end
|
61
|
+
|
62
|
+
opts.on("--pkg-mapping [string]", String, "Package install map file") do |opt|
|
63
|
+
@easyfpmconf.addValues(opt,"pkg-mapping")
|
64
|
+
end
|
65
|
+
|
66
|
+
opts.on("--pkg-prefix [string]", String, "Package installation prefix") do |opt|
|
67
|
+
@easyfpmconf.addValues(opt,"pkg-prefix")
|
68
|
+
end
|
69
|
+
|
70
|
+
opts.on("--pkg-output-dir [string]", String, "Destination dir for packages") do |opt|
|
71
|
+
@easyfpmconf.addValues(opt,"pkg-output-dir")
|
72
|
+
end
|
73
|
+
|
74
|
+
opts.on("--pkg-description [string]", String, "Package description") do |opt|
|
75
|
+
@easyfpmconf.addValues(opt,"pkg-description")
|
76
|
+
end
|
77
|
+
|
78
|
+
opts.on("--pkg-arch [string]", String, "Package architecture") do |opt|
|
79
|
+
@easyfpmconf.addValues(opt,"pkg-arch")
|
80
|
+
end
|
81
|
+
|
82
|
+
opts.on("--pkg-content [string]", String, "source elements to package") do |opt|
|
83
|
+
@easyfpmconf.addValues(opt,"pkg-content")
|
84
|
+
end
|
85
|
+
|
86
|
+
opts.on("--pkg-user [string]", String, "Owner of package's elements") do |opt|
|
87
|
+
@easyfpmconf.addValues(opt,"pkg-user")
|
88
|
+
end
|
89
|
+
|
90
|
+
opts.on("--pkg-group [string]", String, "Group of package's elements") do |opt|
|
91
|
+
@easyfpmconf.addValues(opt,"pkg-group")
|
92
|
+
end
|
93
|
+
|
94
|
+
opts.on("--template-activated [yes|no]", String, "Activate fpm templating mode") do |opt|
|
95
|
+
@easyfpmconf.addValues(opt,"template-activated")
|
96
|
+
end
|
97
|
+
|
98
|
+
opts.on("--template-value [string key:value]", String, "Couple key:value for fpm templating") do |opt|
|
99
|
+
@easyfpmconf.addValues(opt,"template-value")
|
100
|
+
end
|
101
|
+
|
102
|
+
opts.on("--pkg-preinst [string]", String, "Path to pre-install package script") do |opt|
|
103
|
+
@easyfpmconf.addValues(opt,"pkg-preinst")
|
104
|
+
end
|
105
|
+
|
106
|
+
opts.on("--pkg-postinst [string]", String, "Path to post-install package script") do |opt|
|
107
|
+
@easyfpmconf.addValues(opt,"pkg-postinst")
|
108
|
+
end
|
109
|
+
|
110
|
+
opts.on("--pkg-prerm [string]", String, "Path to pre-delete package script") do |opt|
|
111
|
+
@easyfpmconf.addValues(opt,"pkg-prerm")
|
112
|
+
end
|
113
|
+
|
114
|
+
opts.on("--pkg-postrm [string]", String, "Path to post-delete package script") do |opt|
|
115
|
+
@easyfpmconf.addValues(opt,"pkg-postrm")
|
116
|
+
end
|
117
|
+
|
118
|
+
opts.on("--pkg-iteration [string]", String, "Package iteration") do |opt|
|
119
|
+
@easyfpmconf.addValues(opt,"pkg-iteration")
|
120
|
+
end
|
121
|
+
|
122
|
+
opts.on("--pkg-epoch [integer]", Integer, "Package epoch value") do |opt|
|
123
|
+
@easyfpmconf.addValues(opt,"pkg-epoch")
|
124
|
+
end
|
125
|
+
|
126
|
+
opts.on("--easyfpm-pkg-changelog [string]", String, "Path to an easyfpm format changelog file") do |opt|
|
127
|
+
@easyfpmconf.addValues(opt,"easyfpm-pkg-changelog")
|
128
|
+
end
|
129
|
+
|
130
|
+
opts.on("--pkg-vendor [string]", String, "Package vendor name") do |opt|
|
131
|
+
@easyfpmconf.addValues(opt,"pkg-vendor")
|
132
|
+
end
|
133
|
+
|
134
|
+
opts.on("--pkg-url [string]", String, "Package vendor url") do |opt|
|
135
|
+
@easyfpmconf.addValues(opt,"pkg-url")
|
136
|
+
end
|
137
|
+
|
138
|
+
opts.on("--pkg-license [string]", String, "Package license") do |opt|
|
139
|
+
@easyfpmconf.addValues(opt,"pkg-license")
|
140
|
+
end
|
141
|
+
|
142
|
+
opts.on("--pkg-config-files [string]", String, "Files or directories considered as conf in the targeted OS", " (can be declared multiple time)") do |opt|
|
143
|
+
@easyfpmconf.addValues(opt,"pkg-config-files")
|
144
|
+
end
|
145
|
+
|
146
|
+
opts.on("--pkg-depends [string]", String, "Package dependancie"," (can be declared multiple times)") do |opt|
|
147
|
+
@easyfpmconf.addValues(opt,"pkg-depends")
|
148
|
+
end
|
149
|
+
|
150
|
+
opts.on("--pkg-suffix [string]", String, "Package suffix") do |opt|
|
151
|
+
@easyfpmconf.addValues(opt,"pkg-suffix")
|
152
|
+
end
|
153
|
+
|
154
|
+
opts.on("--pkg-changelog [string]", String, "Package changelog (in the wanted format for the package)") do |opt|
|
155
|
+
@easyfpmconf.addValues(opt,"pkg-changelog")
|
156
|
+
end
|
157
|
+
|
158
|
+
opts.on("--pkg-force [yes|no]", String, "Force package generation even if the same name exists") do |opt|
|
159
|
+
@easyfpmconf.addValues(opt,"pkg-force")
|
160
|
+
end
|
161
|
+
|
162
|
+
opts.on("--pkg-category [string]", String, "Category for this package") do |opt|
|
163
|
+
@easyfpmconf.addValues(opt,"pkg-category")
|
164
|
+
end
|
165
|
+
|
166
|
+
opts.on("--pkg-provides [string]", String, "A tag of what provides this package"," (can be declared multiple times)") do |opt|
|
167
|
+
@easyfpmconf.addValues(opt,"pkg-provides")
|
168
|
+
end
|
169
|
+
|
170
|
+
opts.on("--pkg-conflicts [string]", String, "Other packages that conflict with that one"," (can be declared multiple times)") do |opt|
|
171
|
+
@easyfpmconf.addValues(opt,"pkg-conflicts")
|
172
|
+
end
|
173
|
+
|
174
|
+
opts.on("--pkg-recommends [string]", String, "Other package to recommend"," (can be declared multiple times)") do |opt|
|
175
|
+
@easyfpmconf.addValues(opt,"pkg-recommends")
|
176
|
+
end
|
177
|
+
|
178
|
+
opts.on("--pkg-suggests [string]", String, "Other package to suggests"," (can be declared multiple times)") do |opt|
|
179
|
+
@easyfpmconf.addValues(opt,"pkg-suggests")
|
180
|
+
end
|
181
|
+
|
182
|
+
opts.on("--pkg-directories [string]", String, "Mark recursively a directory on the targeted system as being owned by the package"," (can be declared multiple times)") do |opt|
|
183
|
+
@easyfpmconf.addValues(opt,"pkg-directories")
|
184
|
+
end
|
185
|
+
|
186
|
+
opts.on("--pkg-maintainer [string]", String, "The maintainer of this package") do |opt|
|
187
|
+
@easyfpmconf.addValues(opt,"pkg-maintainer")
|
188
|
+
end
|
189
|
+
|
190
|
+
opts.on("--pkg-compression [string]", String, "The compression to use with this package (may not be possible)") do |opt|
|
191
|
+
@easyfpmconf.addValues(opt,"pkg-compression")
|
192
|
+
end
|
193
|
+
|
194
|
+
opts.on("--pkg-priority [string]", String, "The package 'priority' (depends of the targetted package type") do |opt|
|
195
|
+
@easyfpmconf.addValues(opt,"pkg-priority")
|
196
|
+
end
|
197
|
+
|
198
|
+
opts.on("--pkg-replaces [string]", String, "Other packages this package replace"," (can be declared multiple times)") do |opt|
|
199
|
+
@easyfpmconf.addValues(opt,"pkg-replaces")
|
200
|
+
end
|
201
|
+
|
202
|
+
opts.on("-v", "--verbose", "Verbose mode") do |opt|
|
203
|
+
@verbose = true;
|
204
|
+
end
|
205
|
+
|
206
|
+
opts.on("--debug", "Debug mode") do |opt|
|
207
|
+
@debug = true;
|
208
|
+
end
|
209
|
+
|
210
|
+
opts.on("-n", "--dry-run", "Do not exec fpm, juste print what would be done") do |opt|
|
211
|
+
@dryrun = true;
|
212
|
+
end
|
213
|
+
|
214
|
+
opts.on("--version", "Display version and quit") do |opt|
|
215
|
+
puts "easyfpm version #{EASYFPM::VERSION}"
|
216
|
+
exit
|
217
|
+
end
|
218
|
+
|
219
|
+
opts.on("--label-list", String, "Display the availables labels and quit") do |opt|
|
220
|
+
labelListAsked=true
|
221
|
+
end
|
222
|
+
|
223
|
+
opts.on("--help", "Display help and quit") do |opt|
|
224
|
+
puts opts
|
225
|
+
exit
|
226
|
+
end
|
227
|
+
end #OptionParser.new do
|
228
|
+
|
229
|
+
optparse.parse!
|
230
|
+
easyfpmconffiles.each do |conffile|
|
231
|
+
@easyfpmconf.push_unix_config_file(conffile)
|
232
|
+
end
|
233
|
+
if labelListAsked
|
234
|
+
labels = @easyfpmconf.getSections()
|
235
|
+
if labels.empty?
|
236
|
+
puts "No labels available"
|
237
|
+
else
|
238
|
+
puts "Availables labels :"
|
239
|
+
labels.each do |label|
|
240
|
+
puts " - "+label
|
241
|
+
end
|
242
|
+
end
|
243
|
+
exit
|
244
|
+
end
|
245
|
+
end #parse
|
246
|
+
private :parse
|
247
|
+
|
248
|
+
# For debugging purpose, print the UnixConfigStyle object for this instance
|
249
|
+
def print()
|
250
|
+
@easyfpmconf.print()
|
251
|
+
end #print
|
252
|
+
|
253
|
+
# Run the command line given
|
254
|
+
#def run(*args)
|
255
|
+
def run()
|
256
|
+
returnCode=true
|
257
|
+
if @labels.empty?
|
258
|
+
easyfpmpkg = EASYFPM::Packaging.new(@easyfpmconf)
|
259
|
+
easyfpmpkg.verbose = @verbose
|
260
|
+
easyfpmpkg.dryrun = @dryrun
|
261
|
+
easyfpmpkg.debug = @debug
|
262
|
+
returnCode=false unless easyfpmpkg.makeAll()
|
263
|
+
else
|
264
|
+
@labels.each do |label|
|
265
|
+
easyfpmpkg = EASYFPM::Packaging.new(@easyfpmconf,label)
|
266
|
+
easyfpmpkg.verbose = @verbose
|
267
|
+
easyfpmpkg.dryrun = @dryrun
|
268
|
+
easyfpmpkg.debug = @debug
|
269
|
+
returnCode=false unless easyfpmpkg.make(label)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
return returnCode
|
273
|
+
end #run
|
274
|
+
end
|
@@ -0,0 +1,274 @@
|
|
1
|
+
###############################################################################
|
2
|
+
## Class : EASYFPM::Configuration
|
3
|
+
## Author : Erwan SEITE
|
4
|
+
## Aim : Manage EASYFPM Conf
|
5
|
+
## Licence : GPL v2
|
6
|
+
## Source : https://github.com/wanix/easyfpm.git
|
7
|
+
###############################################################################
|
8
|
+
require "easyfpm/exceptions"
|
9
|
+
begin
|
10
|
+
require "unixconfigstyle"
|
11
|
+
rescue LoadError
|
12
|
+
require "rubygems"
|
13
|
+
require "unixconfigstyle"
|
14
|
+
end
|
15
|
+
|
16
|
+
class EASYFPM::Configuration
|
17
|
+
|
18
|
+
@@templateVarExpReg = /(\{\{([\d\w\-]+?)\}\})/
|
19
|
+
@@defaultLabelName = "@@easyfpm-default@@"
|
20
|
+
|
21
|
+
attr_reader :conf
|
22
|
+
|
23
|
+
#Initialize the class
|
24
|
+
def initialize (unixconfigstyle, specificLabel=nil)
|
25
|
+
raise ArgumentError, 'the argument "unixconfigstyle" must be an UnixConfigStyle object' unless unixconfigstyle.is_a? UnixConfigStyle
|
26
|
+
raise ArgumentError, 'the argument "specificLabel" must be an String' unless (specificLabel.is_a? String or specificLabel == nil)
|
27
|
+
|
28
|
+
@conf={}
|
29
|
+
createconf(unixconfigstyle,specificLabel)
|
30
|
+
raise EASYFPM::InvalidConfiguration, "No configuration found (error with the label #{specificLabel}?" if @conf.empty?
|
31
|
+
replaceTemplateVars()
|
32
|
+
raise EASYFPM::InvalidConfiguration, "Error(s) during validation" unless validate()
|
33
|
+
end
|
34
|
+
|
35
|
+
#Create the easyfpm struct configuration from an UnixConfigStyle object
|
36
|
+
def createconf(unixconfigstyle, specificLabel=nil)
|
37
|
+
#No work if the conf is empty
|
38
|
+
return nil if unixconfigstyle.isEmpty?()
|
39
|
+
#No work if the conf doesn't contain the wanted label
|
40
|
+
return nil unless ( specificLabel==nil or unixconfigstyle.sectionExists?(specificLabel) )
|
41
|
+
#We create an array with all keys presents in the conf
|
42
|
+
allkeys=unixconfigstyle.getAllKeys(specificLabel)
|
43
|
+
if (specificLabel == nil)
|
44
|
+
if unixconfigstyle.haveSections?()
|
45
|
+
#We have section, we create a separate conf for each one
|
46
|
+
unixconfigstyle.getSections().each { |section| @conf[section]={} }
|
47
|
+
else
|
48
|
+
#No sections, only the default config
|
49
|
+
@conf[@@defaultLabelName]={}
|
50
|
+
end
|
51
|
+
else
|
52
|
+
#We create config only for this specific label
|
53
|
+
@conf[specificLabel]={}
|
54
|
+
end
|
55
|
+
#We have our label(s)
|
56
|
+
#It's now time to filter the configuration and create a valid conf
|
57
|
+
|
58
|
+
#Foreach conf label
|
59
|
+
@conf.each_key do |label|
|
60
|
+
confsection=label
|
61
|
+
confsection=unixconfigstyle.getRootSectionName() if (label==@@defaultLabelName)
|
62
|
+
|
63
|
+
#Foreach key found
|
64
|
+
allkeys.each do |param|
|
65
|
+
#If the param has no value (???), next
|
66
|
+
next unless unixconfigstyle.getValues(param,confsection,true)
|
67
|
+
case param
|
68
|
+
#Params for which each member of array is a string line
|
69
|
+
when "pkg-description"
|
70
|
+
@conf[label][param]=unixconfigstyle.getValues(param,confsection,true).join("\n").strip
|
71
|
+
|
72
|
+
#Params for which each member is a string separated with a space
|
73
|
+
when "pkg-content"
|
74
|
+
@conf[label][param]=unixconfigstyle.getValues(param,confsection,true).join(" ").strip
|
75
|
+
|
76
|
+
#Params for which we need to keep an array:
|
77
|
+
when "pkg-depends","template-value","pkg-config-files","pkg-provides","pkg-conflicts","pkg-replaces","pkg-directories","pkg-recommends","pkg-suggests"
|
78
|
+
@conf[label][param]=unixconfigstyle.getValues(param,confsection,true)
|
79
|
+
|
80
|
+
else
|
81
|
+
#For the others, the last one is the right string
|
82
|
+
@conf[label][param]=unixconfigstyle.getValues(param,confsection,true).last.strip
|
83
|
+
end #case
|
84
|
+
end #allkeys.each
|
85
|
+
|
86
|
+
#Now, we have specific rules :
|
87
|
+
#If we have a mapping AND a content, we delete the content
|
88
|
+
@conf[label].delete("pkg-content") if (@conf[label].has_key? "pkg-content" and @conf[label].has_key? "pkg-mapping")
|
89
|
+
#If we have an easyfpm-pkg-changelog AND a pkg-changelog, the pkg-changelog stay
|
90
|
+
@conf[label].delete("easyfpm-pkg-changelog") if (@conf[label].has_key? "easyfpm-pkg-changelog" and @conf[label].has_key? "pkg-changelog")
|
91
|
+
|
92
|
+
end #@conf.each_key
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
end #createconf
|
97
|
+
|
98
|
+
# (private) replace the easyfpm vars value
|
99
|
+
# the recursive param is here to stop multi recursive call
|
100
|
+
# We limit the work to two calls
|
101
|
+
def replaceTemplateVars(recursive=false)
|
102
|
+
#We start to scan each value if a var is present
|
103
|
+
return false if @conf.empty?
|
104
|
+
newTemplateFound=false
|
105
|
+
@conf.keys.each do |label|
|
106
|
+
@conf[label].keys.each do |param|
|
107
|
+
if (@conf[label][param].is_a? Array)
|
108
|
+
#Array of String
|
109
|
+
@conf[label][param].each_index do |index|
|
110
|
+
if containTemplateVar?(@conf[label][param][index])
|
111
|
+
@conf[label][param][index]=replaceTemplateVar(@conf[label][param][index],label)
|
112
|
+
newTemplateFound=true if containTemplateVar?(@conf[label][param][index])
|
113
|
+
end
|
114
|
+
end #@conf[label][param].each_index
|
115
|
+
else
|
116
|
+
#Should be String
|
117
|
+
if containTemplateVar?(@conf[label][param])
|
118
|
+
@conf[label][param]=replaceTemplateVar(@conf[label][param],label)
|
119
|
+
newTemplateFound=true if containTemplateVar?(@conf[label][param])
|
120
|
+
end
|
121
|
+
end #if (@conf[myLabel][param].is_a? Array)
|
122
|
+
end #@conf[myLabel].keys.each
|
123
|
+
end #@conf.getKeys.each
|
124
|
+
|
125
|
+
#First pass done, second needed ?
|
126
|
+
replaceTemplateVars(true) if (recursive == false and newTemplateFound == true)
|
127
|
+
raise EASYFPM::LoopTemplateDetected, "Need more than two occurs of function replaceTemplateVars()" if (recursive == true and newTemplateFound == true)
|
128
|
+
end
|
129
|
+
private :replaceTemplateVars
|
130
|
+
|
131
|
+
# (private) return true if the string contain at list one var
|
132
|
+
def containTemplateVar?(myString)
|
133
|
+
return false if (myString == nil)
|
134
|
+
return true if myString.match(@@templateVarExpReg)
|
135
|
+
return false
|
136
|
+
end
|
137
|
+
private :containTemplateVar?
|
138
|
+
|
139
|
+
# (private) return a string with vars replaced if a corresponding value is found
|
140
|
+
def replaceTemplateVar(myString, workinglabel)
|
141
|
+
# return myString
|
142
|
+
#foreach matchdata on each string
|
143
|
+
myString.to_enum(:scan, @@templateVarExpReg).map { Regexp.last_match }.each do |matchData|
|
144
|
+
myParam=matchData[2]
|
145
|
+
#If we can't found the key, we stop
|
146
|
+
raise EASYFPM::NoTemplateFound , "the key #{myParam} is not found for label #{workinglabel}" unless @conf[workinglabel].has_key? myParam
|
147
|
+
#If the value is not a String, error
|
148
|
+
raise EASYFPM::InvalidTemplateType, "the value given by the key #{myParam} can't be a multiline one" unless @conf[workinglabel][myParam].is_a? String
|
149
|
+
#Replace the template with its value
|
150
|
+
myString.gsub!(matchData[1],@conf[workinglabel][myParam])
|
151
|
+
end #myString.to_enum(:scan...
|
152
|
+
return myString
|
153
|
+
end
|
154
|
+
private :replaceTemplateVar
|
155
|
+
|
156
|
+
# (private) Validate the given configuration and clean it if necessary
|
157
|
+
def validate
|
158
|
+
errorlist = []
|
159
|
+
#We have to analyse some parameters and some ones MUST be present
|
160
|
+
@conf.keys.each do |label|
|
161
|
+
if (label == @@defaultLabelName)
|
162
|
+
displaylabel=""
|
163
|
+
else
|
164
|
+
displaylabel="[section "+label+"] "
|
165
|
+
end
|
166
|
+
|
167
|
+
#Looking for mandatory params
|
168
|
+
errorlist.push(displaylabel+"The parameter pkg-name (--pkg-name) MUST be given") unless @conf[label].has_key? "pkg-name"
|
169
|
+
errorlist.push(displaylabel+"The parameter pkg-src-dir (--pkg-src-dir) MUST be given") unless @conf[label].has_key? "pkg-src-dir"
|
170
|
+
errorlist.push(displaylabel+"The parameter pkg-version (--pkg-version) MUST be given") unless @conf[label].has_key? "pkg-version"
|
171
|
+
errorlist.push(displaylabel+"One of the two parameters pkg-content (--pkg-content) or pkg-mapping (--pkg-mapping) MUST be given") unless (@conf[label].has_key? "pkg-content" or @conf[label].has_key? "pkg-mapping")
|
172
|
+
errorlist.push(displaylabel+"The parameter pkg-type (--pkg-type) MUST be given") unless @conf[label].has_key? "pkg-type"
|
173
|
+
|
174
|
+
@conf[label].keys.each do |param|
|
175
|
+
case param
|
176
|
+
#these parameters are directories which must exists and be readable
|
177
|
+
when "pkg-src-dir"
|
178
|
+
errorlist.push(displaylabel+"The directory #{@conf[label][param]} (given by --#{param}) MUST exists") unless File.directory?(@conf[label][param])
|
179
|
+
|
180
|
+
#pkg-content can be replaced by pkg-mapping (higher priority for this last one)
|
181
|
+
#If no mapping, all the files or directories given must existsi and be readable in pkg-src-dir
|
182
|
+
when "pkg-content"
|
183
|
+
next unless @conf[label].has_key? "pkg-src-dir"
|
184
|
+
#If we already have an error on pkg-src-dir, next
|
185
|
+
next unless File.directory?(@conf[label]["pkg-src-dir"])
|
186
|
+
@conf[label][param].split.each do |fileOrDir|
|
187
|
+
errorlist.push(displaylabel+"The file (or directory) #{@conf[label]["pkg-src-dir"]}/#{fileOrDir} (given by --pkg-content) MUST be readable") unless (File.readable?(@conf[label]["pkg-src-dir"]+"/"+fileOrDir))
|
188
|
+
end
|
189
|
+
|
190
|
+
#the followings parameters must be readable files
|
191
|
+
when "pkg-mapping","easyfpm-pkg-changelog","pkg-changelog","pkg-preinst","pkg-postinst","pkg-prerm","pkg-postrm"
|
192
|
+
errorlist.push(displaylabel+"The file #{@conf[label][param]} (given by --#{param}) MUST be readable") unless (File.readable?(@conf[label][param]))
|
193
|
+
|
194
|
+
#the following parameters must be writable directories
|
195
|
+
when "pkg-output-dir"
|
196
|
+
errorlist.push(displaylabel+"The directory #{@conf[label][param]} (given by --#{param}) MUST exists and be writable") unless (File.directory?(@conf[label][param]) and File.writable?(@conf[label][param]))
|
197
|
+
|
198
|
+
#The following parameters should be only yes or no
|
199
|
+
when "template-activated", "pkg-force"
|
200
|
+
errorlist.push(displaylabel+"The param #{param} should accept only 'yes' or 'no' (and not #{@conf[label][param]})") unless (@conf[label][param].downcase == "yes" or @conf[label][param].downcase == "no")
|
201
|
+
end #case param
|
202
|
+
end #conf[label].keys.each do
|
203
|
+
end #@conf.keys.each
|
204
|
+
|
205
|
+
unless errorlist.empty?
|
206
|
+
warn("Errors in configuration detected:")
|
207
|
+
errorlist.each do |currenterror|
|
208
|
+
warn(" "+currenterror)
|
209
|
+
end
|
210
|
+
return false
|
211
|
+
end
|
212
|
+
return true
|
213
|
+
end #validate
|
214
|
+
private :validate
|
215
|
+
|
216
|
+
# Print the configuration (debugging)
|
217
|
+
def print(specificLabel=nil)
|
218
|
+
if (specificLabel == nil)
|
219
|
+
@conf.each_key do |label|
|
220
|
+
printLabelConf(label)
|
221
|
+
end
|
222
|
+
else
|
223
|
+
printLabelConf(specificLabel)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
#Print the configuration for one label (debugging)
|
228
|
+
def printLabelConf(specificLabel)
|
229
|
+
if (specificLabel == @@defaultLabelName)
|
230
|
+
puts "========================================"
|
231
|
+
puts " Default package conf"
|
232
|
+
puts "========================================"
|
233
|
+
else
|
234
|
+
puts "========================================"
|
235
|
+
puts " Configuration label #{specificLabel}"
|
236
|
+
puts "========================================"
|
237
|
+
end
|
238
|
+
@conf[specificLabel].each_key do |param|
|
239
|
+
header="<"+param+"> : "
|
240
|
+
if @conf[specificLabel][param].is_a? Array
|
241
|
+
puts header+@conf[specificLabel][param][0]
|
242
|
+
subheader=" "*header.length()
|
243
|
+
index=1
|
244
|
+
while index < @conf[specificLabel][param].length()
|
245
|
+
puts subheader+@conf[specificLabel][param][index]
|
246
|
+
index += 1
|
247
|
+
end
|
248
|
+
else
|
249
|
+
puts header+@conf[specificLabel][param].to_s
|
250
|
+
end #if @conf[specificLabel][param].is_a Array
|
251
|
+
end #@conf[specificLabel].each_key
|
252
|
+
end
|
253
|
+
private :printLabelConf
|
254
|
+
|
255
|
+
#return true if any labels are defined
|
256
|
+
def hasLabels?()
|
257
|
+
return false if @conf.has_key? @@defaultLabelName
|
258
|
+
return true
|
259
|
+
end
|
260
|
+
|
261
|
+
#return all labels into Array, nil if no labels
|
262
|
+
def getLabels()
|
263
|
+
return nil unless hasLabels?()
|
264
|
+
return @conf.keys()
|
265
|
+
end
|
266
|
+
|
267
|
+
#return an hash for the label configuration
|
268
|
+
#return nil if problem
|
269
|
+
def getLabelHashConf(label=nil)
|
270
|
+
label=@@defaultLabelName if label == nil
|
271
|
+
return nil unless @conf.has_key? label
|
272
|
+
return @conf[label]
|
273
|
+
end
|
274
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# The EASYFPM exceptions
|
2
|
+
|
3
|
+
#Raised if an unknown changelog format is asked
|
4
|
+
class EASYFPM::InvalidChangelogFormat < StandardError; end
|
5
|
+
#Raised if a needed argument for a package is missing
|
6
|
+
class EASYFPM::MissingArgument < StandardError; end
|
7
|
+
#Raised if a packaging label is asked and not configured
|
8
|
+
class EASYFPM::NoSuchSection < StandardError; end
|
9
|
+
#Raised if a loop is detected with templates
|
10
|
+
class EASYFPM::LoopTemplateDetected < StandardError; end
|
11
|
+
#Raised if a template var is asked and not found
|
12
|
+
class EASYFPM::NoTemplateFound < StandardError; end
|
13
|
+
#Raised if a template var is not a string
|
14
|
+
class EASYFPM::InvalidTemplateType < StandardError; end
|
15
|
+
#Raised if a configuration is not validated
|
16
|
+
class EASYFPM::InvalidConfiguration < StandardError; end
|
17
|
+
#Raised if a problem is detected on the system
|
18
|
+
class EASYFPM::InvalidEnvironment < StandardError; end
|