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)

r164r165
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)

r73r165
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)

r158r165
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)        

trunk/script/rxm (Download diff)

r130r165
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|