build-tool 0.5.7 → 0.6.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rvmrc +1 -0
- data/.yardopts +1 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +56 -0
- data/History.txt +64 -0
- data/README.txt +0 -7
- data/Rakefile +8 -56
- data/bin/build-tool +4 -1
- data/build-tool.gemspec +62 -0
- data/db/migrations/20110703074000_add_command_logs.rb +17 -0
- data/db/migrations/20110703075000_add_module_logs.rb +20 -0
- data/db/migrations/20110815170000_add_features.rb +17 -0
- data/db/migrations/20120103204700_add_modules.rb +17 -0
- data/db/migrations/20120106181200_add_settings.rb +18 -0
- data/lib/build-tool.rb +3 -4
- data/lib/build-tool/application.rb +127 -37
- data/lib/build-tool/build-system/autoconf.rb +2 -8
- data/lib/build-tool/build-system/base.rb +12 -4
- data/lib/build-tool/build-system/cmake.rb +2 -0
- data/lib/build-tool/build-system/custom.rb +2 -0
- data/lib/build-tool/build-system/kdel10n.rb +2 -0
- data/lib/build-tool/build-system/make.rb +2 -0
- data/lib/build-tool/build-system/none.rb +2 -0
- data/lib/build-tool/build-system/qmake.rb +2 -0
- data/lib/build-tool/build-system/qt.rb +4 -0
- data/lib/build-tool/cfg/lexer.rex +40 -8
- data/lib/build-tool/cfg/lexer_base.rb +3 -1
- data/lib/build-tool/cfg/node.rb +17 -1
- data/lib/build-tool/cfg/parser.y +92 -10
- data/lib/build-tool/cfg/visitor.rb +202 -78
- data/lib/build-tool/command_actions.rb +26 -10
- data/lib/build-tool/commands.rb +289 -197
- data/lib/build-tool/commands/build.rb +13 -9
- data/lib/build-tool/commands/configuration.rb +25 -0
- data/lib/build-tool/commands/configuration/edit.rb +42 -0
- data/lib/build-tool/commands/configuration/list.rb +48 -0
- data/lib/build-tool/commands/configure.rb +9 -5
- data/lib/build-tool/commands/ctags.rb +8 -3
- data/lib/build-tool/commands/environments.rb +2 -4
- data/lib/build-tool/commands/environments/list.rb +13 -10
- data/lib/build-tool/commands/environments/set.rb +5 -1
- data/lib/build-tool/commands/features.rb +24 -0
- data/lib/build-tool/commands/features/disable.rb +70 -0
- data/lib/build-tool/commands/features/enable.rb +66 -0
- data/lib/build-tool/commands/features/list.rb +92 -0
- data/lib/build-tool/commands/fetch.rb +9 -3
- data/lib/build-tool/commands/files.rb +9 -5
- data/lib/build-tool/commands/gc.rb +48 -15
- data/lib/build-tool/commands/history.rb +21 -16
- data/lib/build-tool/commands/info.rb +16 -13
- data/lib/build-tool/commands/install.rb +8 -4
- data/lib/build-tool/commands/modules.rb +2 -4
- data/lib/build-tool/commands/modules/cleanup.rb +52 -0
- data/lib/build-tool/commands/modules/disable.rb +95 -0
- data/lib/build-tool/commands/modules/enable.rb +52 -0
- data/lib/build-tool/commands/modules/info.rb +44 -35
- data/lib/build-tool/commands/modules/list.rb +67 -15
- data/lib/build-tool/commands/modules/shell.rb +8 -2
- data/lib/build-tool/commands/rebase.rb +15 -7
- data/lib/build-tool/commands/recipes.rb +2 -4
- data/lib/build-tool/commands/recipes/add.rb +16 -2
- data/lib/build-tool/commands/recipes/edit.rb +72 -0
- data/lib/build-tool/commands/recipes/incoming.rb +11 -7
- data/lib/build-tool/commands/recipes/info.rb +12 -8
- data/lib/build-tool/commands/recipes/install.rb +37 -42
- data/lib/build-tool/commands/recipes/list.rb +6 -2
- data/lib/build-tool/configuration.rb +88 -3
- data/lib/build-tool/environment.rb +2 -0
- data/lib/build-tool/errors.rb +5 -0
- data/lib/build-tool/history.rb +3 -181
- data/lib/build-tool/model/command_log.rb +93 -0
- data/lib/build-tool/model/feature.rb +80 -0
- data/lib/build-tool/{module.rb → model/module.rb} +110 -29
- data/lib/build-tool/model/module_log.rb +64 -0
- data/lib/build-tool/model/setting.rb +84 -0
- data/lib/build-tool/recipe.rb +40 -18
- data/lib/build-tool/repository.rb +39 -33
- data/lib/build-tool/server.rb +27 -3
- data/lib/build-tool/singleton.rb +2 -0
- data/lib/build-tool/sshkey.rb +2 -0
- data/lib/build-tool/state_helper.rb +64 -0
- data/lib/build-tool/vcs/archive.rb +3 -1
- data/lib/build-tool/vcs/base.rb +13 -0
- data/lib/build-tool/vcs/git-svn.rb +36 -14
- data/lib/build-tool/vcs/git.rb +180 -44
- data/lib/build-tool/vcs/mercurial.rb +25 -13
- data/lib/build-tool/vcs/svn.rb +20 -15
- data/lib/build-tool/version.rb +30 -0
- data/lib/mj/error.rb +2 -0
- data/lib/mj/logging.rb +2 -0
- data/lib/mj/mixins/inherited_attributes.rb +73 -0
- data/lib/mj/tools/editor.rb +34 -0
- data/lib/mj/tools/ssh.rb +2 -0
- data/lib/mj/tools/subprocess.rb +2 -1
- data/lib/mj/vcs/git.rb +14 -2
- data/lib/mj/visitor.rb +22 -0
- data/tasks/db.rake +36 -0
- data/tasks/racc.rake +14 -0
- data/tasks/rdoc.rake +8 -0
- data/tasks/rexical.rake +14 -0
- data/tasks/test.rake +21 -0
- data/test/integration/history_test.rb +88 -0
- data/test/integration/parser_configuration.rb +36 -0
- data/test/integration/parser_environment_parser.rb +156 -0
- data/test/integration/parser_feature_test.rb +75 -0
- data/test/integration/parser_git-svn_test.rb +92 -0
- data/test/integration/parser_git_test.rb +97 -0
- data/test/integration/parser_mercurial_test.rb +77 -0
- data/test/integration/parser_module_test.rb +103 -0
- data/test/integration/parser_svn_test.rb +92 -0
- data/test/integration/parser_test.rb +73 -0
- data/test/test_helper.rb +61 -0
- data/test/unit/configuration_test.rb +36 -0
- data/test/unit/git_configuration_test.rb +163 -0
- data/test/unit/git_svn_configuration_test.rb +240 -0
- data/test/unit/mercurial_configuration_test.rb +64 -0
- data/test/unit/model/command_log_test.rb +103 -0
- data/test/unit/model/feature_test.rb +29 -0
- data/test/unit/model/module_log_test.rb +70 -0
- data/test/unit/model/module_test.rb +32 -0
- data/test/unit/repository_test.rb +110 -0
- data/test/unit/server_test.rb +66 -0
- data/test/unit/svn_configuration_test.rb +90 -0
- metadata +134 -93
- data/Manifest.txt +0 -80
- data/db/migrations/001_command_histories.rb +0 -20
- data/db/migrations/002_module_events.rb +0 -24
- data/db/migrations/003_command_histories_add_logfile.rb +0 -19
- data/lib/build-tool/GUI.rb +0 -360
- data/lib/build-tool/commands/help.rb +0 -22
- data/lib/build-tool/commands/lsfeatures.rb +0 -76
- data/lib/build-tool/feature.rb +0 -47
@@ -0,0 +1,80 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'active_record'
|
4
|
+
|
5
|
+
module BuildTool
|
6
|
+
|
7
|
+
# A feature bundles modules and makes it possible to enable/disable them together.
|
8
|
+
class Feature < ActiveRecord::Base
|
9
|
+
|
10
|
+
validates_uniqueness_of :name, :scope => :parent_id
|
11
|
+
|
12
|
+
# A short description for the feature
|
13
|
+
attr_accessor :description
|
14
|
+
|
15
|
+
# A long description for the feature
|
16
|
+
attr_accessor :long_description
|
17
|
+
|
18
|
+
# The default state of the feature
|
19
|
+
attr_accessor :default_active
|
20
|
+
|
21
|
+
# The modules associated with this feature
|
22
|
+
attr_reader :modules
|
23
|
+
|
24
|
+
# The environments associated with this feature
|
25
|
+
attr_reader :environments
|
26
|
+
|
27
|
+
# Custom initialization
|
28
|
+
after_initialize :my_initialize
|
29
|
+
def my_initialize
|
30
|
+
@description = nil
|
31
|
+
@long_description = nil
|
32
|
+
@modules = []
|
33
|
+
@environments = []
|
34
|
+
@default_active = true
|
35
|
+
end
|
36
|
+
|
37
|
+
# Is the feature active?
|
38
|
+
def active?
|
39
|
+
state = active.nil? ? default_active : active
|
40
|
+
if parent_id.nil?
|
41
|
+
state
|
42
|
+
else
|
43
|
+
parent.active? && state
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Return a character showing the features active state.
|
48
|
+
def active_char
|
49
|
+
if active?
|
50
|
+
ANSI::Code.green { "A" }
|
51
|
+
else
|
52
|
+
"I"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Is the feature active by default?
|
57
|
+
def default_active?
|
58
|
+
default_active
|
59
|
+
end
|
60
|
+
|
61
|
+
# Return a unique name for the feature.
|
62
|
+
#
|
63
|
+
# The name is scoped with the parents name.
|
64
|
+
def path
|
65
|
+
if parent.nil?
|
66
|
+
name
|
67
|
+
else
|
68
|
+
"%s/%s" % [ parent.name, name ]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_s
|
73
|
+
"Feature #{name} ( #{self.active} / #{self.default_active} )"
|
74
|
+
end
|
75
|
+
|
76
|
+
belongs_to :parent, :class_name => 'BuildTool::Feature'
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -1,5 +1,8 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
1
3
|
require 'mj/tools/ssh'
|
2
4
|
|
5
|
+
require 'active_record'
|
3
6
|
require 'fileutils'
|
4
7
|
|
5
8
|
module BuildTool
|
@@ -7,17 +10,27 @@ module BuildTool
|
|
7
10
|
#
|
8
11
|
# Represents the information associated with a buildable module.
|
9
12
|
#
|
10
|
-
class Module
|
13
|
+
class Module < ActiveRecord::Base
|
14
|
+
|
15
|
+
# The name of the module
|
16
|
+
validates_uniqueness_of :name
|
17
|
+
|
18
|
+
# Modules are sorted by name
|
19
|
+
def <=>( other )
|
20
|
+
self.name <=> other.name
|
21
|
+
end
|
11
22
|
|
12
|
-
#
|
13
|
-
|
23
|
+
# A command can have many module events
|
24
|
+
has_many :module_logs, :class_name => "BuildTool::History::ModuleLog", :order => :id, :foreign_key => :module, :primary_key => :name, :dependent => :destroy
|
25
|
+
|
26
|
+
# Custom initialization
|
27
|
+
after_initialize :my_initialize
|
28
|
+
def my_initialize()
|
14
29
|
if name.nil?
|
15
30
|
raise StandardError, "Module name is required!"
|
16
31
|
end
|
17
32
|
@active = nil
|
18
33
|
@patches = Array.new
|
19
|
-
@name = name
|
20
|
-
@parent = parent
|
21
34
|
@local_path = nil
|
22
35
|
@build_prefix = nil
|
23
36
|
@remote_path = nil
|
@@ -27,6 +40,9 @@ def initialize( name, parent = nil )
|
|
27
40
|
@is_template = false
|
28
41
|
@vcs_configuration = nil
|
29
42
|
@feature = nil
|
43
|
+
@default_active = true
|
44
|
+
@found_in_recipe = false
|
45
|
+
@parent = nil
|
30
46
|
|
31
47
|
@long_description = nil
|
32
48
|
@description = nil
|
@@ -35,21 +51,41 @@ def initialize( name, parent = nil )
|
|
35
51
|
#
|
36
52
|
### ATTRIBUTES
|
37
53
|
#
|
54
|
+
|
38
55
|
attr_writer :feature
|
39
|
-
attr_writer :active
|
40
56
|
attr_reader :patches
|
41
|
-
attr_reader :parent
|
42
57
|
|
58
|
+
# The previous version of this module.
|
59
|
+
attr_accessor :parent
|
60
|
+
|
61
|
+
# Signals wether the module was found in the recipe or only in the database.
|
62
|
+
attr_accessor :found_in_recipe
|
63
|
+
|
64
|
+
# The default state of the feature
|
65
|
+
attr_accessor :default_active
|
66
|
+
|
67
|
+
# Is the module active by default?
|
68
|
+
def default_active?
|
69
|
+
@default_active
|
70
|
+
end
|
71
|
+
|
72
|
+
# Is the module active?
|
43
73
|
def active?
|
44
|
-
# If the module is activated that wins
|
45
|
-
if
|
46
|
-
if
|
47
|
-
|
74
|
+
# If the module is explicitely de/activated that wins
|
75
|
+
if active.nil?
|
76
|
+
# if the module is active by default let the feature decide if present.
|
77
|
+
if default_active?
|
78
|
+
if @feature.nil?
|
79
|
+
return true
|
80
|
+
else
|
81
|
+
return @feature.active?
|
82
|
+
end
|
48
83
|
else
|
49
|
-
|
84
|
+
# The feature is not active by default.
|
85
|
+
return false
|
50
86
|
end
|
51
87
|
else
|
52
|
-
return
|
88
|
+
return active
|
53
89
|
end
|
54
90
|
end
|
55
91
|
|
@@ -74,7 +110,7 @@ def build_prefix
|
|
74
110
|
# Return our own buildsystem if there is one
|
75
111
|
return @build_prefix if @build_prefix
|
76
112
|
# Return our parents buildsystem if there is one
|
77
|
-
return
|
113
|
+
return parent.build_prefix if parent && parent.build_prefix
|
78
114
|
# Nothing
|
79
115
|
nil
|
80
116
|
end
|
@@ -92,8 +128,8 @@ def build_system
|
|
92
128
|
# Return our own buildsystem if there is one
|
93
129
|
return @build_system if @build_system
|
94
130
|
# Return our parents buildsystem if there is one
|
95
|
-
if
|
96
|
-
@build_system =
|
131
|
+
if parent && parent.build_system
|
132
|
+
@build_system = parent.build_system.dup
|
97
133
|
@build_system.module = self
|
98
134
|
return @build_system
|
99
135
|
end
|
@@ -112,6 +148,18 @@ def build_system_required
|
|
112
148
|
raise ConfigurationError, "No build system configured for #{name}!"
|
113
149
|
end
|
114
150
|
|
151
|
+
# Return true if the last build failed for whatever reason
|
152
|
+
def broken?
|
153
|
+
lastlog = BuildTool::History::CommandLog.last_by_module( name )
|
154
|
+
return true if lastlog.empty?
|
155
|
+
lastlog[0].module_logs.where( :module => name ).each do |e|
|
156
|
+
if e.state != History::ModuleLog::FINISHED_SUCCESSFUL
|
157
|
+
return true
|
158
|
+
end
|
159
|
+
end
|
160
|
+
return false
|
161
|
+
end
|
162
|
+
|
115
163
|
def checkedout?
|
116
164
|
vcs_required.checkedout?
|
117
165
|
end
|
@@ -136,7 +184,7 @@ def environment
|
|
136
184
|
# Return our own buildsystem if there is one
|
137
185
|
return @environment if @environment
|
138
186
|
# Return our parents buildsystem if there is one
|
139
|
-
return
|
187
|
+
return parent.environment if parent && parent.environment
|
140
188
|
# Nothing
|
141
189
|
nil
|
142
190
|
end
|
@@ -169,7 +217,7 @@ def install_prefix
|
|
169
217
|
# Return our own buildsystem if there is one
|
170
218
|
return @install_prefix if @install_prefix
|
171
219
|
# Return our parents buildsystem if there is one
|
172
|
-
return
|
220
|
+
return parent.install_prefix if parent && parent.install_prefix
|
173
221
|
# Nothing
|
174
222
|
nil
|
175
223
|
end
|
@@ -191,7 +239,7 @@ def local_path=( local_path )
|
|
191
239
|
end
|
192
240
|
|
193
241
|
def local_path
|
194
|
-
@local_path ||
|
242
|
+
@local_path || name
|
195
243
|
end
|
196
244
|
|
197
245
|
attr_writer :long_description
|
@@ -199,9 +247,6 @@ def long_description
|
|
199
247
|
@long_description
|
200
248
|
end
|
201
249
|
|
202
|
-
# The module name
|
203
|
-
attr_reader :name
|
204
|
-
|
205
250
|
# Remote path
|
206
251
|
def remote_path=( remote_path )
|
207
252
|
raise ConfigurationError, "Attempt to set remote_path for module template #{name}" if is_template?
|
@@ -209,7 +254,7 @@ def remote_path=( remote_path )
|
|
209
254
|
end
|
210
255
|
|
211
256
|
def remote_path
|
212
|
-
@remote_path ||
|
257
|
+
@remote_path || name
|
213
258
|
end
|
214
259
|
|
215
260
|
def source_directory
|
@@ -217,6 +262,38 @@ def source_directory
|
|
217
262
|
end
|
218
263
|
alias source_directory_required source_directory
|
219
264
|
|
265
|
+
# Returns a current state in string format
|
266
|
+
def state
|
267
|
+
lastlog = BuildTool::History::CommandLog.last_by_module( name )
|
268
|
+
return 'UNKNOWN' if lastlog.empty?
|
269
|
+
lastlog[0].module_logs.where( :module => name ).each do |e|
|
270
|
+
if e.state != History::ModuleLog::FINISHED_SUCCESSFUL
|
271
|
+
return "#{e.state_str} (#{e.event})"
|
272
|
+
end
|
273
|
+
end
|
274
|
+
return History::ModuleLog::state_str( History::ModuleLog::FINISHED_SUCCESSFUL )
|
275
|
+
end
|
276
|
+
|
277
|
+
# Return the current state as one char.
|
278
|
+
def state_char
|
279
|
+
lastlog = BuildTool::History::CommandLog.last_by_module( name )
|
280
|
+
return '?' if lastlog.empty?
|
281
|
+
lastlog[0].module_logs.where( :module => name ).each do |e|
|
282
|
+
if e.state != History::ModuleLog::FINISHED_SUCCESSFUL
|
283
|
+
return "#{e.state_char}"
|
284
|
+
end
|
285
|
+
end
|
286
|
+
return History::ModuleLog::state_char( History::ModuleLog::FINISHED_SUCCESSFUL )
|
287
|
+
end
|
288
|
+
|
289
|
+
def active_char
|
290
|
+
if active?
|
291
|
+
ANSI::Code.green { "A" }
|
292
|
+
else
|
293
|
+
"I"
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
220
297
|
def vcs
|
221
298
|
return vcs_configuration.vcs( self ) if vcs_configuration
|
222
299
|
nil
|
@@ -225,10 +302,10 @@ def vcs
|
|
225
302
|
attr_writer :vcs_configuration
|
226
303
|
def vcs_configuration
|
227
304
|
return @vcs_configuration if @vcs_configuration
|
228
|
-
if
|
229
|
-
# puts "copying vcs for #{name} from #{
|
230
|
-
vc =
|
231
|
-
vc.copy_configuration(
|
305
|
+
if parent && parent.vcs_configuration
|
306
|
+
# puts "copying vcs for #{name} from #{parent.name}"
|
307
|
+
vc = parent.vcs_configuration.class.new
|
308
|
+
vc.copy_configuration( parent.vcs_configuration )
|
232
309
|
@vcs_configuration = vc
|
233
310
|
return vc
|
234
311
|
end
|
@@ -261,6 +338,10 @@ def remove_build_directory
|
|
261
338
|
build_system_required.remove_build_directory
|
262
339
|
end
|
263
340
|
|
341
|
+
def remove_source_directory
|
342
|
+
build_system_required.remove_source_directory
|
343
|
+
end
|
344
|
+
|
264
345
|
# Clone the repository.
|
265
346
|
def clone
|
266
347
|
vcs_required.clone
|
@@ -280,8 +361,8 @@ def fetch
|
|
280
361
|
|
281
362
|
# Update the local changes with remote changes. Do not fetch changes
|
282
363
|
# from the remote repository.
|
283
|
-
def rebase
|
284
|
-
vcs_required.rebase
|
364
|
+
def rebase( verbose )
|
365
|
+
vcs_required.rebase( verbose )
|
285
366
|
if !patches.empty?
|
286
367
|
if !vcs.patches_supported?
|
287
368
|
raise NotImplementedError, "Patch support not implemented for vcs #{vcs.name}"
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'active_record'
|
4
|
+
require 'build-tool/state_helper'
|
5
|
+
|
6
|
+
module BuildTool
|
7
|
+
|
8
|
+
#
|
9
|
+
# Provide method to add and retrieve entries from the history
|
10
|
+
#
|
11
|
+
module History
|
12
|
+
|
13
|
+
# Represents a module event.
|
14
|
+
#
|
15
|
+
# A module event is updating, compiling etc. a module.
|
16
|
+
class ModuleLog < ActiveRecord::Base
|
17
|
+
|
18
|
+
include StateHelper
|
19
|
+
|
20
|
+
# A module event belongs to a command
|
21
|
+
belongs_to :command_log
|
22
|
+
|
23
|
+
# A module event belongs to a module
|
24
|
+
belongs_to :module, :foreign_key => :module, :primary_key => :name
|
25
|
+
|
26
|
+
def duration
|
27
|
+
if self.finished_at
|
28
|
+
dur = self.finished_at - self.started_at
|
29
|
+
"%02d:%02d" % [ dur.to_i / 60, (dur% 60 ).to_i ]
|
30
|
+
else
|
31
|
+
"-----"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Call this if the command is finished. [:finished] will be set to Time.now,
|
36
|
+
# [:state] to the given value and the object is saved.
|
37
|
+
def finished( state )
|
38
|
+
self.finished_at = Time.now
|
39
|
+
self.state = state
|
40
|
+
save
|
41
|
+
end
|
42
|
+
|
43
|
+
# Call this when the command is started. [:started] will be set to Time.now and
|
44
|
+
# the object is saved.
|
45
|
+
def started
|
46
|
+
self.started_at = Time.now
|
47
|
+
save!
|
48
|
+
end
|
49
|
+
|
50
|
+
# Make sure a finished command has one of the accepted finished states.
|
51
|
+
def before_update
|
52
|
+
super
|
53
|
+
if !self.finished_at.nil?
|
54
|
+
raise StandardError, "Wrong state for finished Command" if ! [ FINISHED_SUCCESSFUL, FINISHED_WITH_ERRORS, CANCELED_BY_USER ].include? self.state
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class << self
|
59
|
+
|
60
|
+
end # class self
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end # module BuildTool::History
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'active_record'
|
4
|
+
|
5
|
+
module BuildTool
|
6
|
+
|
7
|
+
class Setting < ActiveRecord::Base
|
8
|
+
|
9
|
+
# Custom initialization
|
10
|
+
after_initialize :my_initialize
|
11
|
+
def my_initialize()
|
12
|
+
@description = nil
|
13
|
+
@default = ""
|
14
|
+
@seen = false
|
15
|
+
end
|
16
|
+
|
17
|
+
# The description for this setting
|
18
|
+
attr_accessor :description
|
19
|
+
|
20
|
+
# The default value for this setting
|
21
|
+
attr_accessor :default
|
22
|
+
|
23
|
+
# If the setting has been seen
|
24
|
+
attr_accessor :seen
|
25
|
+
|
26
|
+
def value()
|
27
|
+
rv = read_attribute( :value )
|
28
|
+
return @default if rv.nil?
|
29
|
+
rv
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_hash()
|
33
|
+
return {
|
34
|
+
:name => name,
|
35
|
+
:value => value,
|
36
|
+
:description => description }
|
37
|
+
end
|
38
|
+
|
39
|
+
class<<self
|
40
|
+
|
41
|
+
def export( settings, only = [] )
|
42
|
+
only = settings.keys if only.empty?
|
43
|
+
values = []
|
44
|
+
only.sort.each do |name|
|
45
|
+
# Skip internal settings.
|
46
|
+
next if name.start_with?( 'BUILD_TOOL.' )
|
47
|
+
# Check for unknown settings.
|
48
|
+
if not settings.has_key?( name )
|
49
|
+
logger.warn( 'Unknown setting %s skipped' % name )
|
50
|
+
next
|
51
|
+
end
|
52
|
+
s = settings[name]
|
53
|
+
values << s.to_hash()
|
54
|
+
end
|
55
|
+
return values
|
56
|
+
end
|
57
|
+
|
58
|
+
def import( settings, new )
|
59
|
+
new.each do |v|
|
60
|
+
if not settings.has_key?( v[:name] )
|
61
|
+
logger.warn( 'Unknown setting %s skipped' % name )
|
62
|
+
next
|
63
|
+
end
|
64
|
+
s = settings[v[:name]]
|
65
|
+
if s.value != v[:value]
|
66
|
+
s.value = v[:value]
|
67
|
+
logger.info( 'Setting %s to "%s"' % [ s.name, s.value ] )
|
68
|
+
s.save!
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# #name is in the database.
|
76
|
+
validates_uniqueness_of :name
|
77
|
+
|
78
|
+
def to_s()
|
79
|
+
self.value.to_s
|
80
|
+
end
|
81
|
+
|
82
|
+
end # class Setting
|
83
|
+
|
84
|
+
end
|