Changeset 165
Added 'checkout' action to the extension manager (rxm), requires 'svn'. Features:
- Checking out extensions from remote repositories
- Automatic set-up of the svn:externals property (keeps extensions up-to-date)
Aug 04 2007 * 09:23 (about 1 year ago)
Committed by ddenissenko
Affected files:
trunk/config/environment.rb
(Download diff)
| r164 | r165 |
|---|
9 | # (Use only when you can't set environment variables through your web/app server) | 9 | # (Use only when you can't set environment variables through your web/app server) |
10 | # ENV['RAILS_ENV'] = 'production' | 10 | # ENV['RAILS_ENV'] = 'production' |
11 | | 11 | |
12 | RETROSPECTIVA_VERSION = '1.1-DEV (164)' | 12 | RETROSPECTIVA_VERSION = '1.1-DEV (165)' |
13 | | 13 | |
14 | # Load constants | 14 | # Load constants |
15 | require File.join(File.dirname(__FILE__), 'config') | 15 | require File.join(File.dirname(__FILE__), 'config') |
|---|
trunk/lib/retrospectiva/extension_manager/lib/extension_installer.rb
(Download diff)
| r73 | r165 |
|---|
15 | self.installed_extensions.delete(extension) | 15 | self.installed_extensions.delete(extension) |
16 | write_extension_table(valid_extensions) | 16 | write_extension_table(valid_extensions) |
17 | end | 17 | end |
| | 18 | |
| | 19 | def checkout(url) |
| | 20 | extension = url.split('/').last |
| | 21 | `svn co "#{url}" "#{extension_path(extension)}"` |
| | 22 | extension |
| | 23 | end |
18 | | 24 | |
19 | def cleanup_installed_extension_list!(valid_extensions) | 25 | def externalize(extension, url) |
20 | self.installed_extensions.flatten! | 26 | externals = current_externals << [extension, url] |
21 | self.installed_extensions.uniq! | 27 | externals = externals.map{|name,uri| "#{name.ljust(29)} #{uri.chomp('/')}"}.join("\n") |
22 | self.installed_extensions.reject!{|x| !valid_extensions.include?(x)} | 28 | |
23 | self.installed_extensions.collect!{|x| x.to_s} | 29 | Tempfile.open("svn-set-prop") do |file| |
| | 30 | file.write(externals) |
| | 31 | file.flush |
| | 32 | system("svn propset -q svn:externals -F \"#{file.path}\" \"#{extension_path}\"") |
| | 33 | end |
24 | end | 34 | end |
25 | | 35 | |
26 | def list_installed_extensions(valid_extensions) | 36 | def list_installed_extensions(valid_extensions) |
27 | cleanup_installed_extension_list!(valid_extensions) | 37 | cleanup_installed_extension_list!(valid_extensions) |
28 | installed_extensions | 38 | installed_extensions |
29 | end | 39 | end |
30 | | 40 | |
31 | def yaml | | |
32 | File.join(RAILS_ROOT, 'config', 'runtime', 'extensions.yml') | | |
33 | end | | |
34 | | | |
35 | def write_extension_table(valid_extensions) | | |
36 | cleanup_installed_extension_list!(valid_extensions) | | |
37 | File.open(yaml, 'w') do |f| | | |
38 | YAML.dump(self.installed_extensions, f ) | | |
39 | f.close | | |
40 | end | | |
41 | end | | |
42 | | | |
43 | def installed_extensions | 41 | def installed_extensions |
44 | @installed_extensions ||= File.exists?(yaml) ? YAML.load_file(yaml) : [] | 42 | @installed_extensions ||= File.exists?(yaml) ? YAML.load_file(yaml) : [] |
45 | end | 43 | end |
46 | | 44 | |
| | 45 | private |
| | 46 | def yaml |
| | 47 | File.join(RAILS_ROOT, 'config', 'runtime', 'extensions.yml') |
| | 48 | end |
| | 49 | |
| | 50 | def write_extension_table(valid_extensions) |
| | 51 | cleanup_installed_extension_list!(valid_extensions) |
| | 52 | File.open(yaml, 'w') do |f| |
| | 53 | YAML.dump(self.installed_extensions, f ) |
| | 54 | f.close |
| | 55 | end |
| | 56 | end |
| | 57 | |
| | 58 | def cleanup_installed_extension_list!(valid_extensions) |
| | 59 | self.installed_extensions.flatten! |
| | 60 | self.installed_extensions.uniq! |
| | 61 | self.installed_extensions.reject!{|x| !valid_extensions.include?(x)} |
| | 62 | self.installed_extensions.collect!{|x| x.to_s} |
| | 63 | end |
| | 64 | |
| | 65 | def current_externals |
| | 66 | ext = `svn propget svn:externals "#{extension_path}"` |
| | 67 | ext.reject{ |line| line.strip == '' }.map do |line| |
| | 68 | line.strip.split(/\s+/, 2) |
| | 69 | end |
| | 70 | end |
| | 71 | |
| | 72 | def extension_path(extension_name = nil) |
| | 73 | ExtensionManager.extension_path(extension_name) |
| | 74 | end |
47 | end | 75 | end |
48 | | 76 | |
49 | end | 77 | end |
|---|
trunk/lib/retrospectiva/extension_manager/lib/extension_manager.rb
(Download diff)
| r158 | r165 |
|---|
39 | end | 39 | end |
40 | | 40 | |
41 | def available_extensions | 41 | def available_extensions |
42 | unless @available_extensions | 42 | Dir.glob(extension_path('*')).sort.map do |extension_dir| |
43 | @available_extensions = [] | 43 | if File.exists?(File.join(extension_dir, 'ext_info.rb')) |
44 | Dir.glob(extension_path('*')).sort.each do |extension_dir| | 44 | File.basename(extension_dir) |
45 | if File.exists?(File.join(extension_dir, 'ext_info.rb')) | 45 | else |
46 | @available_extensions << File.basename(extension_dir) | 46 | nil |
47 | end | 47 | end |
48 | end | 48 | end.compact |
49 | end | | |
50 | @available_extensions | | |
51 | end | 49 | end |
52 | | 50 | |
53 | def installed_extensions | 51 | def installed_extensions |
|---|
... | | ... | |
|---|
94 | end | 92 | end |
95 | end | 93 | end |
96 | | 94 | |
| | 95 | def checkout_extension(url, externalize = true) |
| | 96 | unless File.directory?("#{extension_path}/.svn") |
| | 97 | return "Your installation is not using Subversion" |
| | 98 | end |
| | 99 | extension = ExtensionInstaller.checkout(url) |
| | 100 | if externalize && available_extensions.include?(extension) |
| | 101 | ExtensionInstaller.externalize(extension, url) |
| | 102 | end |
| | 103 | nil |
| | 104 | end |
| | 105 | |
97 | def install_all_extensions(skip_migration = true) | 106 | def install_all_extensions(skip_migration = true) |
98 | available_extensions.each do |ext| | 107 | available_extensions.each do |ext| |
99 | install_extension(ext, skip_migration) | 108 | install_extension(ext, skip_migration) |
|---|
| r130 | r165 |
|---|
9 | | 9 | |
10 | puts "\n\n----- Retrospectiva extension manager CLI\n" | 10 | puts "\n\n----- Retrospectiva extension manager CLI\n" |
11 | | 11 | |
12 | if (['install', 'uninstall'].include?(ARGV[0]) && !ARGV[1].blank?) || ARGV[0] == 'list' | 12 | if (['install', 'uninstall', 'checkout'].include?(ARGV[0]) && !ARGV[1].blank?) || ARGV[0] == 'list' |
13 | | 13 | |
14 | manager = Retrospectiva::ExtensionManager | 14 | manager = Retrospectiva::ExtensionManager |
15 | force_migration = ARGV.include?('--force-db') | 15 | force_migration = ARGV.include?('--force-db') |
|---|
... | | ... | |
|---|
23 | skip_migration = !ARGV.include?('--remove-db') | 23 | skip_migration = !ARGV.include?('--remove-db') |
24 | manager.uninstall_extension(ARGV[1], skip_migration, force_migration) | 24 | manager.uninstall_extension(ARGV[1], skip_migration, force_migration) |
25 | puts "\n ATTENTION: You need to restart your web-server to take over the changes\n" | 25 | puts "\n ATTENTION: You need to restart your web-server to take over the changes\n" |
26 | end | 26 | when 'checkout' |
| | 27 | externals = !ARGV.include?('--no-externals') |
| | 28 | puts "\n Checking out extension from #{ARGV[1]}\n" |
| | 29 | result = manager.checkout_extension(ARGV[1], externals) |
| | 30 | puts "\n WARNING: #{result}\n" if result |
| | 31 | end |
27 | | 32 | |
28 | puts "\n Available extensions:\n\n" | 33 | puts "\n Available extensions:\n\n" |
29 | manager.available_extensions.each do |ext| | 34 | manager.available_extensions.each do |ext| |
|---|