spiderfw 0.6.16 → 0.6.17
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/CHANGELOG +9 -0
- data/Rakefile +8 -5
- data/VERSION +1 -1
- data/apps/core/auth/data/locale/it/LC_MESSAGES/spider_auth.mo +0 -0
- data/apps/core/auth/po/it/spider_auth.po +3 -3
- data/apps/core/auth/po/spider_auth.pot +3 -3
- data/apps/core/components/data/locale/it/LC_MESSAGES/spider_components.mo +0 -0
- data/apps/core/components/po/it/spider_components.po +7 -7
- data/apps/core/components/po/spider_components.pot +7 -7
- data/apps/core/components/public/js/spider.js +4 -2
- data/apps/core/forms/data/locale/it/LC_MESSAGES/spider_forms.mo +0 -0
- data/apps/core/forms/po/it/spider_forms.po +2 -2
- data/apps/core/forms/po/spider_forms.pot +2 -2
- data/apps/core/forms/widgets/form/form.rb +20 -6
- data/apps/master/_init.rb +0 -1
- data/apps/master/data/locale/it/LC_MESSAGES/master.mo +0 -0
- data/apps/master/master.rb +4 -0
- data/apps/master/po/it/master.po +62 -25
- data/apps/master/po/master.pot +45 -20
- data/apps/messenger/_init.rb +2 -21
- data/apps/messenger/backends/sms/test.rb +25 -0
- data/apps/messenger/config/test.config.yml +6 -1
- data/apps/messenger/controllers/mixins/messenger_helper.rb +30 -5
- data/apps/messenger/data/locale/it/LC_MESSAGES/spider_messenger.mo +0 -0
- data/apps/messenger/messenger.rb +40 -2
- data/apps/servant/lib/commands_processor.rb +1 -1
- data/apps/worker/worker.rb +15 -10
- data/data/locale/it/LC_MESSAGES/spider.mo +0 -0
- data/lib/spiderfw/app.rb +3 -3
- data/lib/spiderfw/cache/template_cache.rb +4 -0
- data/lib/spiderfw/cmd/cmd.rb +0 -2
- data/lib/spiderfw/cmd/commands/app.rb +89 -6
- data/lib/spiderfw/cmd/commands/setup.rb +13 -40
- data/lib/spiderfw/config/configuration.rb +1 -0
- data/lib/spiderfw/config/options/spider.rb +9 -8
- data/lib/spiderfw/controller/mixins/http_mixin.rb +9 -0
- data/lib/spiderfw/env.rb +3 -1
- data/lib/spiderfw/i18n/cldr.rb +39 -13
- data/lib/spiderfw/i18n/i18n.rb +9 -0
- data/lib/spiderfw/i18n/javascript_parser.rb +1 -1
- data/lib/spiderfw/i18n/shtml_parser.rb +1 -1
- data/lib/spiderfw/model/base_model.rb +1 -1
- data/lib/spiderfw/model/inline_model.rb +13 -1
- data/lib/spiderfw/model/mappers/db_mapper.rb +5 -0
- data/lib/spiderfw/model/mappers/mapper.rb +9 -4
- data/lib/spiderfw/model/migrations/drop_element.rb +26 -0
- data/lib/spiderfw/model/migrations/irreversible_migration.rb +9 -0
- data/lib/spiderfw/model/migrations/migration.rb +7 -0
- data/lib/spiderfw/model/migrations/replace.rb +32 -0
- data/lib/spiderfw/model/migrations.rb +21 -0
- data/lib/spiderfw/model/model.rb +4 -1
- data/lib/spiderfw/model/storage/db/db_storage.rb +1 -1
- data/lib/spiderfw/setup/app_manager.rb +281 -200
- data/lib/spiderfw/setup/setup_task.rb +80 -35
- data/lib/spiderfw/spider.rb +28 -13
- data/lib/spiderfw/templates/layout.rb +40 -8
- data/lib/spiderfw/templates/resources/sass.rb +21 -0
- data/lib/spiderfw/test.rb +1 -1
- data/lib/spiderfw/utils/events/event_source.rb +1 -2
- data/lib/spiderfw/utils/gems.rb +5 -1
- metadata +11 -4
@@ -3,53 +3,33 @@ require 'fileutils'
|
|
3
3
|
|
4
4
|
module Spider
|
5
5
|
|
6
|
-
|
6
|
+
class AppManager
|
7
7
|
|
8
|
-
def self.
|
8
|
+
def self.installed?(app)
|
9
9
|
require 'spiderfw/home'
|
10
|
-
home = Spider::Home.new(Dir.pwd)
|
11
|
-
installed = {}
|
12
10
|
Spider.init_base
|
13
|
-
|
14
|
-
|
15
|
-
installed[app] = {
|
16
|
-
:active => active.include?(app)
|
17
|
-
}
|
18
|
-
if spec = info[:spec]
|
19
|
-
installed[app].merge!({
|
20
|
-
:version => spec.version
|
21
|
-
})
|
22
|
-
end
|
23
|
-
end
|
24
|
-
to_inst = apps.select{ |a| !installed[a] }
|
25
|
-
to_upd = apps.select{ |a| installed[a] }
|
26
|
-
install_apps(to_inst, options)
|
27
|
-
update_apps(to_upd, options)
|
28
|
-
return {:installed => to_inst, :updated => to_upd}
|
11
|
+
@home_apps ||= Spider.home.apps
|
12
|
+
@home_apps[app]
|
29
13
|
end
|
30
14
|
|
31
|
-
def self.
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
require 'git'
|
38
|
-
use_git = true
|
39
|
-
rescue LoadError => exc
|
40
|
-
Spider.output exc.message, :ERROR
|
41
|
-
Spider.output "git gem not available; install git gem for Git support", :ERROR
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
existent = []
|
46
|
-
apps.each do |app|
|
47
|
-
if File.exist?("apps/#{app}")
|
48
|
-
Spider.output _("%s already exists, skipping") % app
|
49
|
-
existent << app
|
50
|
-
end
|
15
|
+
def self.git_available?
|
16
|
+
begin
|
17
|
+
require 'git'
|
18
|
+
return true
|
19
|
+
rescue LoadError => exc
|
20
|
+
return false
|
51
21
|
end
|
52
|
-
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.tmp_path(home_path)
|
25
|
+
tmp_path = File.join(home_path, 'tmp', 'app_update')
|
26
|
+
end
|
27
|
+
|
28
|
+
def tmp_path
|
29
|
+
self.class.tmp_path(@home_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.resolve(apps, options={})
|
53
33
|
specs = []
|
54
34
|
url = options[:url]
|
55
35
|
unless url
|
@@ -57,152 +37,100 @@ module Spider
|
|
57
37
|
Spider.init_base
|
58
38
|
url = Spider.config.get('app_server.url')
|
59
39
|
end
|
40
|
+
install = []
|
41
|
+
update = []
|
42
|
+
res = {:install => install, :update => update}
|
43
|
+
return res if apps.empty?
|
44
|
+
require 'spiderfw/setup/app_server_client'
|
60
45
|
client = Spider::AppServerClient.new(url)
|
61
46
|
if options[:no_deps]
|
62
47
|
specs = client.get_specs(apps)
|
63
48
|
else
|
64
49
|
specs = client.get_deps(apps, :no_optional => !options[:optional])
|
65
50
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
:no_optional_gems => options[:no_optional_gems]
|
75
|
-
}
|
76
|
-
i_options[:ssh_user] = options[:ssh_user] if options[:ssh_user]
|
77
|
-
inst_specs = specs.reject{ |s| existent.include? s.app_id }
|
78
|
-
Spider::AppManager.install(inst_specs, Dir.pwd, i_options)
|
79
|
-
unless options[:no_activate]
|
80
|
-
require 'spiderfw/spider'
|
81
|
-
specs_hash = {}
|
82
|
-
specs.each{ |s| specs_hash[s.app_id] = s }
|
83
|
-
Spider.activate_apps(deps, specs_hash)
|
51
|
+
specs.each do |spec|
|
52
|
+
if prev = installed?(spec.app_id)
|
53
|
+
if (options[:refresh] && options[:refresh].include?(spec.app_id) ) || (prev[:spec] && prev[:spec].version < spec.version)
|
54
|
+
update << spec
|
55
|
+
end
|
56
|
+
else
|
57
|
+
install << spec
|
58
|
+
end
|
84
59
|
end
|
85
|
-
|
60
|
+
return res
|
86
61
|
end
|
87
62
|
|
88
|
-
def self.
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
if options[:all]
|
94
|
-
require 'spiderfw/home'
|
95
|
-
home = Spider::Home.new(Dir.pwd)
|
96
|
-
apps = home.list_apps
|
97
|
-
end
|
98
|
-
if apps.empty?
|
99
|
-
Spider.output _("No app to update")
|
100
|
-
exit
|
101
|
-
end
|
102
|
-
specs = []
|
103
|
-
client = Spider::AppServerClient.new(url)
|
104
|
-
if options[:no_deps]
|
105
|
-
specs = client.get_specs(apps)
|
106
|
-
else
|
107
|
-
specs = client.get_deps(apps, :no_optional => options[:no_optional])
|
108
|
-
end
|
109
|
-
deps = specs.map{ |s| s.app_id }
|
110
|
-
unless (deps - apps).empty?
|
111
|
-
Spider.output _("The following apps will be updated as a dependency:")
|
112
|
-
Spider.output((deps - apps).inspect)
|
113
|
-
end
|
114
|
-
Spider::AppManager.update(specs, Dir.pwd, {
|
115
|
-
:use_git => !options[:no_git],
|
116
|
-
:no_gems => options[:no_gems],
|
117
|
-
:no_optional_gems => options[:no_optional_gems]
|
118
|
-
})
|
63
|
+
def self.get_apps(apps, options={})
|
64
|
+
specs = resolve(apps, options)
|
65
|
+
manager = self.new(options)
|
66
|
+
manager.install(specs)
|
67
|
+
return specs
|
119
68
|
end
|
120
69
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
if spec.git_repo && options[:use_git]
|
136
|
-
git_install(spec, home_path, options)
|
137
|
-
else
|
138
|
-
pack_install(spec, home_path, options)
|
139
|
-
end
|
70
|
+
|
71
|
+
def install(specs, options)
|
72
|
+
options[:home_path] ||= Dir.pwd
|
73
|
+
@home_path = options[:home_path]
|
74
|
+
all_specs = specs[:install] + specs[:update]
|
75
|
+
|
76
|
+
pre_run(all_specs, options)
|
77
|
+
specs[:install].each do |spec|
|
78
|
+
do_install(spec, options)
|
79
|
+
end
|
80
|
+
pre_update(specs[:update], options)
|
81
|
+
begin
|
82
|
+
specs[:update].each do |spec|
|
83
|
+
do_update(spec, options)
|
140
84
|
end
|
85
|
+
post_update(specs[:update], options)
|
86
|
+
rescue => exc
|
87
|
+
rollback_update
|
88
|
+
raise
|
89
|
+
end
|
90
|
+
unless options[:no_activate]
|
91
|
+
require 'spiderfw/spider'
|
92
|
+
specs_hash = {}
|
93
|
+
all_specs.each{ |s| specs_hash[s.app_id] = s }
|
94
|
+
Spider.activate_apps(specs[:install].map{ |s| s.app_id }, specs_hash)
|
141
95
|
end
|
142
|
-
|
96
|
+
Spider.output _("Install done.")
|
143
97
|
end
|
144
98
|
|
145
|
-
def
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
99
|
+
def do_install(spec, options)
|
100
|
+
app_path = File.join(@home_path, "apps/#{spec.app_id}")
|
101
|
+
raise "App #{spec.app_id} is already installed" if File.exists?(app_path)
|
102
|
+
use_git = false
|
103
|
+
if spec.git_repo && options[:use_git]
|
104
|
+
use_git = true
|
150
105
|
end
|
151
|
-
|
152
|
-
|
153
|
-
Spider.output _("Fetching %s from %s") % [spec.app_id, repo_url]
|
154
|
-
|
155
|
-
if options[:ssh_user] && repo_url =~ /ssh:\/\/([^@]+@)?(.+)/
|
156
|
-
repo_url = "ssh://#{options[:ssh_user]}@#{$2}"
|
106
|
+
if use_git && !self.class.git_available?
|
107
|
+
Spider.output _("Can't install app #{spec.id} via git, since git gem is not available") % spec.app_id, :ERROR
|
157
108
|
end
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
`git submodule init`
|
163
|
-
`git submodule update`
|
109
|
+
if use_git
|
110
|
+
git_install(spec, options)
|
111
|
+
else
|
112
|
+
pack_install(spec, options)
|
164
113
|
end
|
165
|
-
repo.add(['.gitmodules', "apps/#{spec.id}"])
|
166
|
-
repo.commit(_("Added app %s") % spec.id)
|
167
114
|
end
|
168
115
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
dest = File.join(home_path, "apps/#{spec.app_id}")
|
176
|
-
FileUtils.mkdir_p(dest)
|
177
|
-
open tmp_path, Gem.binary_mode do |io|
|
178
|
-
Gem::Package::TarReader.new(io) do |reader|
|
179
|
-
reader.each do |entry|
|
180
|
-
dest_path = File.join(dest, entry.full_name)
|
181
|
-
if entry.directory?
|
182
|
-
FileUtils.mkdir(dest_path)
|
183
|
-
elsif entry.file?
|
184
|
-
File.open(dest_path, 'w') do |f|
|
185
|
-
f << entry.read
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
116
|
+
|
117
|
+
def do_update(spec, options)
|
118
|
+
use_git = false
|
119
|
+
if spec.git_repo && !options[:no_git]
|
120
|
+
app_path = File.join(@home_path, "apps/#{spec.app_id}")
|
121
|
+
use_git = true if File.directory?(File.join(app_path, '.git'))
|
190
122
|
end
|
191
|
-
if
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
repo.add("apps/#{spec.id}")
|
199
|
-
repo.commit(_("Added app %s") % spec.id)
|
200
|
-
rescue => exc
|
201
|
-
end
|
123
|
+
if use_git && !self.class.git_available?
|
124
|
+
Spider.output _("Can't update app #{spec.id} via git, since git gem is not available") % spec.app_id, :ERROR
|
125
|
+
end
|
126
|
+
if use_git
|
127
|
+
git_update(spec, options)
|
128
|
+
else
|
129
|
+
pack_update(spec, options)
|
202
130
|
end
|
203
131
|
end
|
204
132
|
|
205
|
-
def
|
133
|
+
def pre_run(specs, options={})
|
206
134
|
require 'rubygems'
|
207
135
|
require 'rubygems/command.rb'
|
208
136
|
require 'rubygems/dependency_installer.rb'
|
@@ -244,47 +172,137 @@ module Spider
|
|
244
172
|
end
|
245
173
|
end
|
246
174
|
|
247
|
-
def self.
|
248
|
-
end
|
249
|
-
|
250
|
-
def self.post_setup(specs, options={})
|
175
|
+
def self.post_run(specs, options={})
|
251
176
|
#require 'bundler'
|
252
177
|
#Bundler::Installer.install(options[:home_path], Bundler.definitions, {})
|
253
178
|
end
|
254
179
|
|
255
|
-
def
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
git_available = nil
|
180
|
+
def pre_update(specs, options={})
|
181
|
+
tmp_path = File.join(self.tmp_path, "update-#{DateTime.now.strftime('%Y%m%d-%H%M')}")
|
182
|
+
@backup_path = tmp_path
|
183
|
+
FileUtils.mkdir_p(tmp_path)
|
260
184
|
specs.each do |spec|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
185
|
+
app_path = File.join(@home_path, 'apps', spec.id)
|
186
|
+
FileUtils.cp_r(app_path, tmp_path)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def post_update(specs, options)
|
191
|
+
return if specs.empty?
|
192
|
+
require 'spiderfw/home'
|
193
|
+
Spider.init_base
|
194
|
+
@done_tasks = {}
|
195
|
+
specs.each do |spec|
|
196
|
+
prev_spec = Spider.home.apps[spec.app_id][:spec]
|
197
|
+
prev_v = prev_spec.version if prev_spec
|
198
|
+
@done_tasks[spec.app_id] = setup(spec.app_id, prev_v, spec.version)
|
199
|
+
end
|
200
|
+
Spider.output _("Doing cleanup...")
|
201
|
+
@done_tasks.each do |app, tasks|
|
202
|
+
next unless tasks
|
203
|
+
tasks.each do |task|
|
268
204
|
begin
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
Spider.
|
273
|
-
use_git = false
|
205
|
+
task.do_cleanup
|
206
|
+
rescue => exc
|
207
|
+
Spider.logger.error("Cleanup failed for #{app}:")
|
208
|
+
Spider.logger.error(exc)
|
274
209
|
end
|
275
210
|
end
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
211
|
+
end
|
212
|
+
if options[:clear_cache]
|
213
|
+
Spider.output _("Clearing cache...")
|
214
|
+
Spider::Template.cache.clear!
|
215
|
+
Spider::Layout.clear_compiled_folder!
|
216
|
+
end
|
217
|
+
if options[:restart]
|
218
|
+
Spider.output _("Restarting server...")
|
219
|
+
Spider.restart!
|
220
|
+
end
|
221
|
+
Spider.output _("Post-update done")
|
222
|
+
end
|
223
|
+
|
224
|
+
def rollback_update
|
225
|
+
Dir.new(@backup_path).each do |app|
|
226
|
+
next if app[0].chr == '.'
|
227
|
+
installed = File.join(@home_path, 'apps', app)
|
228
|
+
FileUtils.rm_rf(installed) if File.exists?(installed)
|
229
|
+
FileUtils.mv(File.join(@backup_path, app), installed)
|
230
|
+
end
|
231
|
+
if @done_tasks
|
232
|
+
@done_tasks.each do |app, tasks|
|
233
|
+
next unless tasks
|
234
|
+
tasks.reverse.each do |task|
|
235
|
+
task.down
|
236
|
+
end
|
280
237
|
end
|
281
238
|
end
|
282
239
|
end
|
283
240
|
|
284
|
-
|
241
|
+
|
242
|
+
def git_install(spec, options={})
|
243
|
+
require 'git'
|
244
|
+
if ::File.exist?("apps/#{spec.id}")
|
245
|
+
Spider.output _("%s already installed, skipping") % spec.id
|
246
|
+
return
|
247
|
+
end
|
248
|
+
repo = Git.open(@home_path)
|
249
|
+
repo_url = spec.git_repo_rw || spec.git_repo
|
250
|
+
Spider.output _("Fetching %s from %s") % [spec.app_id, repo_url]
|
251
|
+
|
252
|
+
if options[:ssh_user] && repo_url =~ /ssh:\/\/([^@]+@)?(.+)/
|
253
|
+
repo_url = "ssh://#{options[:ssh_user]}@#{$2}"
|
254
|
+
end
|
255
|
+
|
256
|
+
ENV['GIT_WORK_TREE'] = nil
|
257
|
+
Dir.chdir(@home_path) do
|
258
|
+
`git submodule add #{repo_url} apps/#{spec.id}`
|
259
|
+
`git submodule init`
|
260
|
+
`git submodule update`
|
261
|
+
end
|
262
|
+
repo.add(['.gitmodules', "apps/#{spec.id}"])
|
263
|
+
repo.commit(_("Added app %s") % spec.id)
|
264
|
+
end
|
265
|
+
|
266
|
+
def pack_install(spec, options={})
|
267
|
+
require 'rubygems/package'
|
268
|
+
client = AppServerClient.new(spec.app_server)
|
269
|
+
print _("Fetching %s from server... ") % spec.app_id
|
270
|
+
tmp_path = client.fetch_app(spec.app_id)
|
271
|
+
Spider.output _("Fetched.")
|
272
|
+
dest = File.join(@home_path, "apps/#{spec.app_id}")
|
273
|
+
FileUtils.mkdir_p(dest)
|
274
|
+
open tmp_path, Gem.binary_mode do |io|
|
275
|
+
Gem::Package::TarReader.new(io) do |reader|
|
276
|
+
reader.each do |entry|
|
277
|
+
dest_path = File.join(dest, entry.full_name)
|
278
|
+
if entry.directory?
|
279
|
+
FileUtils.mkdir(dest_path)
|
280
|
+
elsif entry.file?
|
281
|
+
File.open(dest_path, 'w') do |f|
|
282
|
+
f << entry.read
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
if File.directory?(File.join(@home_path, '.git'))
|
289
|
+
begin
|
290
|
+
require 'git'
|
291
|
+
rescue LoadError
|
292
|
+
end
|
293
|
+
begin
|
294
|
+
repo = Git.open(home_path)
|
295
|
+
repo.add("apps/#{spec.id}")
|
296
|
+
repo.commit(_("Added app %s") % spec.id)
|
297
|
+
rescue => exc
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
def git_update(spec, options={})
|
285
303
|
require 'git'
|
286
|
-
home_repo = Git.open(home_path)
|
287
|
-
app_path = File.join(home_path, "apps
|
304
|
+
home_repo = Git.open(@home_path)
|
305
|
+
app_path = File.join(@home_path, "apps", spec.id)
|
288
306
|
app_repo = Git.open(app_path)
|
289
307
|
Spider.output _("Updating %s from %s") % [spec.app_id, spec.git_repo]
|
290
308
|
Dir.chdir(app_path) do
|
@@ -292,11 +310,12 @@ module Spider
|
|
292
310
|
end
|
293
311
|
response = err = nil
|
294
312
|
Dir.chdir(app_path) do
|
295
|
-
`git --git-dir='#{app_path}/.git' pull origin master`
|
313
|
+
response = `git --git-dir='#{app_path}/.git' pull origin master`
|
296
314
|
end
|
315
|
+
require 'ruby-debug'
|
297
316
|
if response =~ /Aborting/
|
298
317
|
Spider.output err, :ERROR
|
299
|
-
|
318
|
+
raise "Unable to update"
|
300
319
|
end
|
301
320
|
Dir.chdir(app_path) do
|
302
321
|
app_repo.reset('HEAD', :hard => true)
|
@@ -304,20 +323,24 @@ module Spider
|
|
304
323
|
end
|
305
324
|
|
306
325
|
home_repo.add("apps/#{spec.id}")
|
307
|
-
|
326
|
+
begin
|
327
|
+
home_repo.commit(_("Updated app %s") % spec.id)
|
328
|
+
rescue => exc
|
329
|
+
raise unless exc.message =~ /no changes added to commit/
|
330
|
+
end
|
308
331
|
end
|
309
332
|
|
310
|
-
def
|
333
|
+
def pack_update(spec, options={})
|
311
334
|
require 'fileutils'
|
312
335
|
require 'date'
|
313
336
|
require 'time'
|
314
|
-
app_path = File.join(home_path, "apps/#{spec.id}")
|
315
|
-
tmp_path =
|
337
|
+
app_path = File.join(@home_path, "apps/#{spec.id}")
|
338
|
+
tmp_path = self.tmp_path
|
316
339
|
FileUtils.mkdir_p(tmp_path)
|
317
340
|
tmp_app_path = File.join(tmp_path, "#{spec.id}-update-#{DateTime.now.strftime('%Y%m%d-%H%M')}")
|
318
341
|
begin
|
319
342
|
FileUtils.mv(app_path, tmp_app_path)
|
320
|
-
rescue Errno::
|
343
|
+
rescue Errno::EACCES
|
321
344
|
if RUBY_PLATFORM =~ /win32|mingw/
|
322
345
|
Spider.output(
|
323
346
|
_("Can't update #{spec.id} app: ensure you have no files or folders of this app open"),
|
@@ -326,19 +349,77 @@ module Spider
|
|
326
349
|
else
|
327
350
|
Spider.output exc, :ERROR
|
328
351
|
end
|
352
|
+
exit
|
329
353
|
end
|
330
354
|
begin
|
331
|
-
pack_install(spec,
|
355
|
+
pack_install(spec, options)
|
332
356
|
FileUtils.rm_rf(tmp_app_path)
|
333
357
|
rescue => exc
|
334
358
|
Spider.output _("Update of %s failed") % spec.id, :ERROR
|
335
359
|
Spider.output exc, :ERROR
|
336
360
|
FileUtils.rm_rf(app_path)
|
337
361
|
FileUtils.mv(tmp_app_path, app_path)
|
362
|
+
raise
|
338
363
|
end
|
339
364
|
end
|
340
365
|
|
366
|
+
def setup(name, from=nil, to=nil)
|
367
|
+
require 'spiderfw/setup/setup_task'
|
368
|
+
Spider.init
|
369
|
+
Spider.load_app(name) unless Spider.apps[name]
|
370
|
+
app = Spider.apps_by_short_name[name]
|
371
|
+
path = app.setup_path
|
372
|
+
unless to
|
373
|
+
version = from
|
374
|
+
from = nil
|
375
|
+
end
|
376
|
+
current = from || app.installed_version
|
377
|
+
new_version = to || app.version
|
378
|
+
return unless File.exist?(path)
|
379
|
+
tasks = []
|
380
|
+
if version
|
381
|
+
tasks = ["#{@version}.rb"]
|
382
|
+
else
|
383
|
+
tasks = Dir.entries(path).reject{ |p| p[0].chr == '.'}.sort{ |a, b|
|
384
|
+
va = Gem::Version.new(File.basename(a, '.rb'))
|
385
|
+
vb = Gem::Version.new(File.basename(b, '.rb'))
|
386
|
+
va <=> vb
|
387
|
+
}
|
388
|
+
if from || to
|
389
|
+
tasks.reject!{ |t|
|
390
|
+
v = Gem::Version.new(File.basename(t, '.rb'))
|
391
|
+
if from && v <= from
|
392
|
+
true
|
393
|
+
elsif to && v > to
|
394
|
+
true
|
395
|
+
else
|
396
|
+
false
|
397
|
+
end
|
398
|
+
}
|
399
|
+
end
|
400
|
+
end
|
401
|
+
done_tasks = []
|
402
|
+
|
403
|
+
tasks.each do |task|
|
404
|
+
Spider.output _("Running setup task #{path+'/'+task}...")
|
405
|
+
t = Spider::SetupTask.load("#{path}/#{task}")
|
406
|
+
t.app = app
|
407
|
+
begin
|
408
|
+
done_tasks << t
|
409
|
+
t.do_sync
|
410
|
+
t.do_up
|
411
|
+
Spider.output _("Setup task done")
|
412
|
+
rescue => exc
|
413
|
+
Spider.output exc, :ERROR
|
414
|
+
done_tasks.reverse.each{ |dt| dt.do_down } # FIXME: rescue and log errors in down
|
415
|
+
raise
|
416
|
+
end
|
417
|
+
end
|
418
|
+
app.installed_version = app.version
|
419
|
+
done_tasks
|
420
|
+
end
|
421
|
+
|
341
422
|
|
342
423
|
end
|
343
424
|
|
344
|
-
end
|
425
|
+
end
|