autoproj 2.7.1 → 2.8.0
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.
- checksums.yaml +5 -5
 - data/Rakefile +31 -1
 - data/autoproj.gemspec +2 -0
 - data/bin/alocate +3 -5
 - data/bin/alog +3 -3
 - data/bin/amake +3 -4
 - data/bin/aup +4 -3
 - data/bin/autoproj +1 -6
 - data/bin/autoproj_bootstrap +153 -47
 - data/bin/autoproj_install +153 -47
 - data/lib/autoproj/autobuild_extensions/dsl.rb +5 -0
 - data/lib/autoproj/bash_completion.rb +26 -0
 - data/lib/autoproj/cli/base.rb +4 -4
 - data/lib/autoproj/cli/build.rb +2 -3
 - data/lib/autoproj/cli/main.rb +52 -2
 - data/lib/autoproj/cli/main_global.rb +39 -0
 - data/lib/autoproj/cli/osdeps.rb +2 -1
 - data/lib/autoproj/cli/update.rb +13 -1
 - data/lib/autoproj/configuration.rb +14 -2
 - data/lib/autoproj/environment.rb +48 -31
 - data/lib/autoproj/ops/install.rb +153 -47
 - data/lib/autoproj/shell_completion.rb +164 -0
 - data/lib/autoproj/templates/helpers.bash.erb +79 -0
 - data/lib/autoproj/templates/helpers.zsh.erb +38 -0
 - data/lib/autoproj/templates/main.bash.erb +35 -0
 - data/lib/autoproj/templates/main.zsh.erb +9 -0
 - data/lib/autoproj/templates/subcommand.bash.erb +50 -0
 - data/lib/autoproj/templates/subcommand.zsh.erb +51 -0
 - data/lib/autoproj/version.rb +1 -1
 - data/lib/autoproj/workspace.rb +97 -19
 - data/lib/autoproj/zsh_completion.rb +43 -0
 - data/shell/autoproj_bash +67 -0
 - data/shell/autoproj_zsh +26 -0
 - data/shell/completion/alocate_bash +68 -0
 - data/shell/completion/alocate_zsh +22 -0
 - data/shell/completion/alog_bash +61 -0
 - data/shell/completion/alog_zsh +20 -0
 - data/shell/completion/amake_bash +77 -0
 - data/shell/completion/amake_zsh +27 -0
 - data/shell/completion/aup_bash +89 -0
 - data/shell/completion/aup_zsh +34 -0
 - data/shell/completion/autoproj_bash +1556 -0
 - data/shell/completion/autoproj_zsh +1005 -0
 - metadata +51 -3
 
    
        data/lib/autoproj/cli/build.rb
    CHANGED
    
    | 
         @@ -13,7 +13,7 @@ def validate_options(selected_packages, options) 
     | 
|
| 
       13 
13 
     | 
    
         
             
                                options[:deps] = false
         
     | 
| 
       14 
14 
     | 
    
         
             
                            end
         
     | 
| 
       15 
15 
     | 
    
         
             
                            if options[:deps].nil?
         
     | 
| 
       16 
     | 
    
         
            -
                                options[:deps] = 
     | 
| 
      
 16 
     | 
    
         
            +
                                options[:deps] =
         
     | 
| 
       17 
17 
     | 
    
         
             
                                    !(options[:rebuild] || options[:force])
         
     | 
| 
       18 
18 
     | 
    
         
             
                            end
         
     | 
| 
       19 
19 
     | 
    
         
             
                            return selected_packages, options
         
     | 
| 
         @@ -78,11 +78,10 @@ def run(selected_packages, options) 
     | 
|
| 
       78 
78 
     | 
    
         
             
                            Autobuild.do_build = true
         
     | 
| 
       79 
79 
     | 
    
         
             
                            ops.build_packages(source_packages, parallel: parallel)
         
     | 
| 
       80 
80 
     | 
    
         
             
                            Autobuild.apply(source_packages, "autoproj-build", ['install'])
         
     | 
| 
      
 81 
     | 
    
         
            +
                            Main.run_post_command_hook(:build, ws, source_packages: source_packages)
         
     | 
| 
       81 
82 
     | 
    
         
             
                        ensure
         
     | 
| 
       82 
83 
     | 
    
         
             
                            export_env_sh
         
     | 
| 
       83 
84 
     | 
    
         
             
                        end
         
     | 
| 
       84 
85 
     | 
    
         
             
                    end
         
     | 
| 
       85 
86 
     | 
    
         
             
                end
         
     | 
| 
       86 
87 
     | 
    
         
             
            end
         
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
    
        data/lib/autoproj/cli/main.rb
    CHANGED
    
    | 
         @@ -2,6 +2,8 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            require 'tty/color'
         
     | 
| 
       3 
3 
     | 
    
         
             
            require 'autoproj/cli/main_test'
         
     | 
| 
       4 
4 
     | 
    
         
             
            require 'autoproj/cli/main_plugin'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'autoproj/cli/main_global'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'autoproj/cli'
         
     | 
| 
       5 
7 
     | 
    
         
             
            require 'autoproj/reporter'
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
       7 
9 
     | 
    
         
             
            module Autoproj
         
     | 
| 
         @@ -9,6 +11,12 @@ module CLI 
     | 
|
| 
       9 
11 
     | 
    
         
             
                    def self.basic_setup
         
     | 
| 
       10 
12 
     | 
    
         
             
                        Encoding.default_internal = Encoding::UTF_8
         
     | 
| 
       11 
13 
     | 
    
         
             
                        Encoding.default_external = Encoding::UTF_8
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                        argv = ARGV.find_all { |arg| arg != "--no-plugins" }
         
     | 
| 
      
 16 
     | 
    
         
            +
                        if argv.size == ARGV.size
         
     | 
| 
      
 17 
     | 
    
         
            +
                            Autoproj::CLI.load_plugins
         
     | 
| 
      
 18 
     | 
    
         
            +
                        end
         
     | 
| 
      
 19 
     | 
    
         
            +
                        argv
         
     | 
| 
       12 
20 
     | 
    
         
             
                    end
         
     | 
| 
       13 
21 
     | 
    
         | 
| 
       14 
22 
     | 
    
         
             
                    class Main < Thor
         
     | 
| 
         @@ -26,6 +34,44 @@ class Main < Thor 
     | 
|
| 
       26 
34 
     | 
    
         
             
                        stop_on_unknown_option! :exec
         
     | 
| 
       27 
35 
     | 
    
         
             
                        check_unknown_options!  except: :exec
         
     | 
| 
       28 
36 
     | 
    
         | 
| 
      
 37 
     | 
    
         
            +
                        # @api private
         
     | 
| 
      
 38 
     | 
    
         
            +
                        #
         
     | 
| 
      
 39 
     | 
    
         
            +
                        # Run hooks defined for a given hook name
         
     | 
| 
      
 40 
     | 
    
         
            +
                        def self.run_post_command_hook(hook_name, ws, **args)
         
     | 
| 
      
 41 
     | 
    
         
            +
                            @post_command_hooks[hook_name].each do |hook|
         
     | 
| 
      
 42 
     | 
    
         
            +
                                hook.call(ws, args)
         
     | 
| 
      
 43 
     | 
    
         
            +
                            end
         
     | 
| 
      
 44 
     | 
    
         
            +
                        end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                        # Register a hook that should be called at a given event
         
     | 
| 
      
 47 
     | 
    
         
            +
                        #
         
     | 
| 
      
 48 
     | 
    
         
            +
                        # @overload register_post_command_hook(:update)
         
     | 
| 
      
 49 
     | 
    
         
            +
                        #   @yieldparam [Workspace] ws
         
     | 
| 
      
 50 
     | 
    
         
            +
                        #   @yieldparam [Hash] params
         
     | 
| 
      
 51 
     | 
    
         
            +
                        #
         
     | 
| 
      
 52 
     | 
    
         
            +
                        #   Hook called after an update operation (from the CLI, either
         
     | 
| 
      
 53 
     | 
    
         
            +
                        #   update or osdeps)
         
     | 
| 
      
 54 
     | 
    
         
            +
                        #
         
     | 
| 
      
 55 
     | 
    
         
            +
                        #   The params contain :source_packages and :osdeps_packages,
         
     | 
| 
      
 56 
     | 
    
         
            +
                        #   respectively the list of names of the source and osdeps packages
         
     | 
| 
      
 57 
     | 
    
         
            +
                        #   selected for the update operation (NOT the list of packages
         
     | 
| 
      
 58 
     | 
    
         
            +
                        #   actually updated)
         
     | 
| 
      
 59 
     | 
    
         
            +
                        #
         
     | 
| 
      
 60 
     | 
    
         
            +
                        # @overload register_post_command_hook(:build)
         
     | 
| 
      
 61 
     | 
    
         
            +
                        #   @yieldparam [Workspace] ws
         
     | 
| 
      
 62 
     | 
    
         
            +
                        #   @yieldparam [Hash] params
         
     | 
| 
      
 63 
     | 
    
         
            +
                        #
         
     | 
| 
      
 64 
     | 
    
         
            +
                        #   Hook called after a build operation (from the CLI, build)
         
     | 
| 
      
 65 
     | 
    
         
            +
                        #
         
     | 
| 
      
 66 
     | 
    
         
            +
                        #   The params contain :source_packages, the list of names of the
         
     | 
| 
      
 67 
     | 
    
         
            +
                        #   source and osdeps packages selected for the update operation (NOT
         
     | 
| 
      
 68 
     | 
    
         
            +
                        #   the list of packages actually updated)
         
     | 
| 
      
 69 
     | 
    
         
            +
                        def self.register_post_command_hook(hook_name, &block)
         
     | 
| 
      
 70 
     | 
    
         
            +
                            @post_command_hooks[hook_name.to_sym] << block
         
     | 
| 
      
 71 
     | 
    
         
            +
                        end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                        @post_command_hooks = Hash.new { |h, k| h[k] = Array.new }
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
       29 
75 
     | 
    
         
             
                        no_commands do
         
     | 
| 
       30 
76 
     | 
    
         
             
                            def default_report_on_package_failures
         
     | 
| 
       31 
77 
     | 
    
         
             
                                if options[:debug]
         
     | 
| 
         @@ -79,7 +125,7 @@ def bootstrap(*args) 
     | 
|
| 
       79 
125 
     | 
    
         
             
                            run_autoproj_cli(:bootstrap, :Bootstrap, Hash[], *args)
         
     | 
| 
       80 
126 
     | 
    
         
             
                        end
         
     | 
| 
       81 
127 
     | 
    
         | 
| 
       82 
     | 
    
         
            -
                        desc 'envsh', 'update the  
     | 
| 
      
 128 
     | 
    
         
            +
                        desc 'envsh', 'update the environment files'
         
     | 
| 
       83 
129 
     | 
    
         
             
                        def envsh
         
     | 
| 
       84 
130 
     | 
    
         
             
                            run_autoproj_cli(:envsh, :Envsh, Hash[])
         
     | 
| 
       85 
131 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -163,7 +209,7 @@ def update(*packages) 
     | 
|
| 
       163 
209 
     | 
    
         
             
                                report_options[:on_package_failures] = :report
         
     | 
| 
       164 
210 
     | 
    
         
             
                            end
         
     | 
| 
       165 
211 
     | 
    
         | 
| 
       166 
     | 
    
         
            -
                            run_autoproj_cli(:update, :Update, report_options, *packages)
         
     | 
| 
      
 212 
     | 
    
         
            +
                            run_autoproj_cli(:update, :Update, report_options, *packages, run_hook: true)
         
     | 
| 
       167 
213 
     | 
    
         
             
                        end
         
     | 
| 
       168 
214 
     | 
    
         | 
| 
       169 
215 
     | 
    
         
             
                        desc 'build [PACKAGES]', 'build packages'
         
     | 
| 
         @@ -466,6 +512,9 @@ def install_stage2(root_dir, *vars) 
     | 
|
| 
       466 
512 
     | 
    
         
             
                        desc 'plugin', 'interface to manage autoproj plugins'
         
     | 
| 
       467 
513 
     | 
    
         
             
                        subcommand 'plugin', MainPlugin
         
     | 
| 
       468 
514 
     | 
    
         | 
| 
      
 515 
     | 
    
         
            +
                        desc 'global', 'global management of the known workspaces'
         
     | 
| 
      
 516 
     | 
    
         
            +
                        subcommand 'global', MainGlobal
         
     | 
| 
      
 517 
     | 
    
         
            +
             
     | 
| 
       469 
518 
     | 
    
         
             
                        desc 'patch', 'applies patches necessary for the selected package',
         
     | 
| 
       470 
519 
     | 
    
         
             
                            hide: true
         
     | 
| 
       471 
520 
     | 
    
         
             
                        def patch(*packages)
         
     | 
| 
         @@ -518,3 +567,4 @@ def which(cmd) 
     | 
|
| 
       518 
567 
     | 
    
         
             
                    end
         
     | 
| 
       519 
568 
     | 
    
         
             
                end
         
     | 
| 
       520 
569 
     | 
    
         
             
            end
         
     | 
| 
      
 570 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,39 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Autoproj
         
     | 
| 
      
 2 
     | 
    
         
            +
                module CLI
         
     | 
| 
      
 3 
     | 
    
         
            +
                    class MainGlobal < Thor
         
     | 
| 
      
 4 
     | 
    
         
            +
                        namespace 'global'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                        desc 'register', 'register the current workspace'
         
     | 
| 
      
 7 
     | 
    
         
            +
                        def register
         
     | 
| 
      
 8 
     | 
    
         
            +
                            require 'autoproj'
         
     | 
| 
      
 9 
     | 
    
         
            +
                            ws = Workspace.default
         
     | 
| 
      
 10 
     | 
    
         
            +
                            ws.load_config
         
     | 
| 
      
 11 
     | 
    
         
            +
                            ws.register_workspace
         
     | 
| 
      
 12 
     | 
    
         
            +
                        end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                        desc 'status', 'display information about the known workspaces'
         
     | 
| 
      
 15 
     | 
    
         
            +
                        def status
         
     | 
| 
      
 16 
     | 
    
         
            +
                            require 'autoproj'
         
     | 
| 
      
 17 
     | 
    
         
            +
                            ws = Workspace.registered_workspaces
         
     | 
| 
      
 18 
     | 
    
         
            +
                            fields = Workspace::RegisteredWorkspace.members.map(&:to_s)
         
     | 
| 
      
 19 
     | 
    
         
            +
                            format_w = fields.map(&:length).max + 1
         
     | 
| 
      
 20 
     | 
    
         
            +
                            format = "%-#{format_w}s %s (%s)"
         
     | 
| 
      
 21 
     | 
    
         
            +
                            blocks = ws.map do |w|
         
     | 
| 
      
 22 
     | 
    
         
            +
                                %w[root_dir prefix_dir build_dir].map do |name|
         
     | 
| 
      
 23 
     | 
    
         
            +
                                    dir = w.public_send(name)
         
     | 
| 
      
 24 
     | 
    
         
            +
                                    if dir.start_with?('/')
         
     | 
| 
      
 25 
     | 
    
         
            +
                                        status = if File.directory?(dir)
         
     | 
| 
      
 26 
     | 
    
         
            +
                                                     Autobuild.color('present', :green)
         
     | 
| 
      
 27 
     | 
    
         
            +
                                                 else
         
     | 
| 
      
 28 
     | 
    
         
            +
                                                     Autobuild.color('absent', :yellow)
         
     | 
| 
      
 29 
     | 
    
         
            +
                                                 end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                                        format(format, "#{name}:", dir, status)
         
     | 
| 
      
 32 
     | 
    
         
            +
                                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
                                end.compact.join("\n")
         
     | 
| 
      
 34 
     | 
    
         
            +
                            end
         
     | 
| 
      
 35 
     | 
    
         
            +
                            puts blocks.join("---\n")
         
     | 
| 
      
 36 
     | 
    
         
            +
                        end
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/autoproj/cli/osdeps.rb
    CHANGED
    
    | 
         @@ -29,8 +29,9 @@ def run(user_selection, update: true, **options) 
     | 
|
| 
       29 
29 
     | 
    
         
             
                                run_package_managers_without_packages: true,
         
     | 
| 
       30 
30 
     | 
    
         
             
                                install_only: !update)
         
     | 
| 
       31 
31 
     | 
    
         
             
                            export_env_sh(shell_helpers: shell_helpers)
         
     | 
| 
      
 32 
     | 
    
         
            +
                            Main.run_post_command_hook(:update, ws, source_packages: [],
         
     | 
| 
      
 33 
     | 
    
         
            +
                                osdep_packages: osdep_packages)
         
     | 
| 
       32 
34 
     | 
    
         
             
                        end
         
     | 
| 
       33 
35 
     | 
    
         
             
                    end
         
     | 
| 
       34 
36 
     | 
    
         
             
                end
         
     | 
| 
       35 
37 
     | 
    
         
             
            end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
    
        data/lib/autoproj/cli/update.rb
    CHANGED
    
    | 
         @@ -66,7 +66,7 @@ def validate_options(selection, options) 
     | 
|
| 
       66 
66 
     | 
    
         
             
                            return selection, options
         
     | 
| 
       67 
67 
     | 
    
         
             
                        end
         
     | 
| 
       68 
68 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
                        def run(selected_packages, options)
         
     | 
| 
      
 69 
     | 
    
         
            +
                        def run(selected_packages, run_hook: false, **options)
         
     | 
| 
       70 
70 
     | 
    
         
             
                            ws.manifest.accept_unavailable_osdeps = !options[:osdeps]
         
     | 
| 
       71 
71 
     | 
    
         
             
                            ws.setup
         
     | 
| 
       72 
72 
     | 
    
         
             
                            ws.autodetect_operating_system(force: true)
         
     | 
| 
         @@ -127,6 +127,18 @@ def run(selected_packages, options) 
     | 
|
| 
       127 
127 
     | 
    
         
             
                                ws.install_os_packages(osdep_packages, **osdeps_options)
         
     | 
| 
       128 
128 
     | 
    
         
             
                            end
         
     | 
| 
       129 
129 
     | 
    
         | 
| 
      
 130 
     | 
    
         
            +
                            if run_hook
         
     | 
| 
      
 131 
     | 
    
         
            +
                                if options[:osdeps]
         
     | 
| 
      
 132 
     | 
    
         
            +
                                    CLI::Main.run_post_command_hook(:update, ws,
         
     | 
| 
      
 133 
     | 
    
         
            +
                                        source_packages: source_packages,
         
     | 
| 
      
 134 
     | 
    
         
            +
                                        osdep_packages: osdep_packages)
         
     | 
| 
      
 135 
     | 
    
         
            +
                                else
         
     | 
| 
      
 136 
     | 
    
         
            +
                                    CLI::Main.run_post_command_hook(:update, ws,
         
     | 
| 
      
 137 
     | 
    
         
            +
                                        source_packages: source_packages,
         
     | 
| 
      
 138 
     | 
    
         
            +
                                        osdep_packages: [])
         
     | 
| 
      
 139 
     | 
    
         
            +
                                end
         
     | 
| 
      
 140 
     | 
    
         
            +
                            end
         
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
       130 
142 
     | 
    
         
             
                            export_env_sh
         
     | 
| 
       131 
143 
     | 
    
         | 
| 
       132 
144 
     | 
    
         
             
                            if !options[:auto_exclude]
         
     | 
| 
         @@ -344,7 +344,7 @@ def apply_autobuild_configuration 
     | 
|
| 
       344 
344 
     | 
    
         
             
                            end
         
     | 
| 
       345 
345 
     | 
    
         
             
                        end
         
     | 
| 
       346 
346 
     | 
    
         
             
                    end
         
     | 
| 
       347 
     | 
    
         
            -
             
     | 
| 
      
 347 
     | 
    
         
            +
             
     | 
| 
       348 
348 
     | 
    
         
             
                    # A cache directory for autobuild's importers
         
     | 
| 
       349 
349 
     | 
    
         
             
                    def importer_cache_dir
         
     | 
| 
       350 
350 
     | 
    
         
             
                        get('importer_cache_dir', nil)
         
     | 
| 
         @@ -367,6 +367,18 @@ def prefix_dir 
     | 
|
| 
       367 
367 
     | 
    
         
             
                        get('prefix', 'install')
         
     | 
| 
       368 
368 
     | 
    
         
             
                    end
         
     | 
| 
       369 
369 
     | 
    
         | 
| 
      
 370 
     | 
    
         
            +
                    # Sets the shells used in this workspace.
         
     | 
| 
      
 371 
     | 
    
         
            +
                    def user_shells=(shells)
         
     | 
| 
      
 372 
     | 
    
         
            +
                        set('user_shells', shells, true)
         
     | 
| 
      
 373 
     | 
    
         
            +
                    end
         
     | 
| 
      
 374 
     | 
    
         
            +
             
     | 
| 
      
 375 
     | 
    
         
            +
                    # The shells used in this workspace.
         
     | 
| 
      
 376 
     | 
    
         
            +
                    #
         
     | 
| 
      
 377 
     | 
    
         
            +
                    # @return [Array<String>]
         
     | 
| 
      
 378 
     | 
    
         
            +
                    def user_shells
         
     | 
| 
      
 379 
     | 
    
         
            +
                        get('user_shells', [])
         
     | 
| 
      
 380 
     | 
    
         
            +
                    end
         
     | 
| 
      
 381 
     | 
    
         
            +
             
     | 
| 
       370 
382 
     | 
    
         
             
                    # Defines the temporary area in which packages should put their build
         
     | 
| 
       371 
383 
     | 
    
         
             
                    # files
         
     | 
| 
       372 
384 
     | 
    
         
             
                    #
         
     | 
| 
         @@ -433,7 +445,7 @@ def randomize_layout=(value) 
     | 
|
| 
       433 
445 
     | 
    
         
             
                        'test' => false]
         
     | 
| 
       434 
446 
     | 
    
         | 
| 
       435 
447 
     | 
    
         
             
                    # The configuration key that should be used to store the utility
         
     | 
| 
       436 
     | 
    
         
            -
                    # enable/disable information 
     | 
| 
      
 448 
     | 
    
         
            +
                    # enable/disable information
         
     | 
| 
       437 
449 
     | 
    
         
             
                    #
         
     | 
| 
       438 
450 
     | 
    
         
             
                    # @param [String] the utility name
         
     | 
| 
       439 
451 
     | 
    
         
             
                    # @return [String] the config key
         
     | 
    
        data/lib/autoproj/environment.rb
    CHANGED
    
    | 
         @@ -24,38 +24,55 @@ def export_env_sh(subdir = nil, options = Hash.new) 
     | 
|
| 
       24 
24 
     | 
    
         
             
                        options = validate_options options,
         
     | 
| 
       25 
25 
     | 
    
         
             
                            shell_helpers: true
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                        filename = if subdir
         
     | 
| 
       28 
     | 
    
         
            -
                               File.join(root_dir, subdir, ENV_FILENAME)
         
     | 
| 
       29 
     | 
    
         
            -
                           else
         
     | 
| 
       30 
     | 
    
         
            -
                               File.join(root_dir, ENV_FILENAME)
         
     | 
| 
       31 
     | 
    
         
            -
                           end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
27 
     | 
    
         
             
                        shell_dir = File.expand_path(File.join("..", "..", "shell"), File.dirname(__FILE__))
         
     | 
| 
       34 
     | 
    
         
            -
                         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                        end
         
     | 
| 
      
 28 
     | 
    
         
            +
                        completion_dir = File.join(shell_dir, 'completion')
         
     | 
| 
      
 29 
     | 
    
         
            +
                        env_updated = false
         
     | 
| 
       37 
30 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                         
     | 
| 
       39 
     | 
    
         
            -
                             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
                        (['sh'] + Autoproj.workspace.config.user_shells).to_set.each do |shell|
         
     | 
| 
      
 32 
     | 
    
         
            +
                            env_filename = if shell == 'sh'
         
     | 
| 
      
 33 
     | 
    
         
            +
                                               ENV_FILENAME
         
     | 
| 
      
 34 
     | 
    
         
            +
                                           else
         
     | 
| 
      
 35 
     | 
    
         
            +
                                               (Pathname(ENV_FILENAME).sub_ext '').to_s.concat(".#{shell}")
         
     | 
| 
      
 36 
     | 
    
         
            +
                                           end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                            filename = if subdir
         
     | 
| 
      
 39 
     | 
    
         
            +
                                File.join(root_dir, subdir, env_filename)
         
     | 
| 
      
 40 
     | 
    
         
            +
                            else
         
     | 
| 
      
 41 
     | 
    
         
            +
                                File.join(root_dir, env_filename)
         
     | 
| 
       41 
42 
     | 
    
         
             
                            end
         
     | 
| 
       42 
43 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                            if  
     | 
| 
       45 
     | 
    
         
            -
                                 
     | 
| 
       46 
     | 
    
         
            -
                                 
     | 
| 
       47 
     | 
    
         
            -
                                     
     | 
| 
       48 
     | 
    
         
            -
                                     
     | 
| 
       49 
     | 
    
         
            -
                                 
     | 
| 
       50 
     | 
    
         
            -
                                EOF
         
     | 
| 
      
 44 
     | 
    
         
            +
                            helper = File.join(shell_dir, "autoproj_#{shell}")
         
     | 
| 
      
 45 
     | 
    
         
            +
                            if options[:shell_helpers]
         
     | 
| 
      
 46 
     | 
    
         
            +
                                source_after(helper, shell: shell) if File.file?(helper)
         
     | 
| 
      
 47 
     | 
    
         
            +
                                %w[alocate alog amake aup autoproj].each do |tool|
         
     | 
| 
      
 48 
     | 
    
         
            +
                                    completion_file = File.join(completion_dir, "#{tool}_#{shell}")
         
     | 
| 
      
 49 
     | 
    
         
            +
                                    source_after(completion_file, shell: shell) if File.file?(completion_file)
         
     | 
| 
      
 50 
     | 
    
         
            +
                                end
         
     | 
| 
       51 
51 
     | 
    
         
             
                            end
         
     | 
| 
       52 
     | 
    
         
            -
                            super(io)
         
     | 
| 
       53 
     | 
    
         
            -
                        end
         
     | 
| 
       54 
52 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
      
 53 
     | 
    
         
            +
                            existing_content =
         
     | 
| 
      
 54 
     | 
    
         
            +
                                begin File.read(filename)
         
     | 
| 
      
 55 
     | 
    
         
            +
                                rescue SystemCallError
         
     | 
| 
      
 56 
     | 
    
         
            +
                                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                            StringIO.open(new_content = String.new, 'w') do |io|
         
     | 
| 
      
 59 
     | 
    
         
            +
                                if inherit?
         
     | 
| 
      
 60 
     | 
    
         
            +
                                    io.write <<-EOF
         
     | 
| 
      
 61 
     | 
    
         
            +
                                    if test -n "$AUTOPROJ_CURRENT_ROOT" && test "$AUTOPROJ_CURRENT_ROOT" != "#{root_dir}"; then
         
     | 
| 
      
 62 
     | 
    
         
            +
                                        echo "the env.sh from $AUTOPROJ_CURRENT_ROOT is already loaded. Start a new shell before sourcing this one"
         
     | 
| 
      
 63 
     | 
    
         
            +
                                        return
         
     | 
| 
      
 64 
     | 
    
         
            +
                                    fi
         
     | 
| 
      
 65 
     | 
    
         
            +
                                    EOF
         
     | 
| 
      
 66 
     | 
    
         
            +
                                end
         
     | 
| 
      
 67 
     | 
    
         
            +
                                super(io, shell: shell)
         
     | 
| 
      
 68 
     | 
    
         
            +
                            end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                            if new_content != existing_content
         
     | 
| 
      
 71 
     | 
    
         
            +
                                Ops.atomic_write(filename) { |io| io.write new_content }
         
     | 
| 
      
 72 
     | 
    
         
            +
                                env_updated = true
         
     | 
| 
      
 73 
     | 
    
         
            +
                            end
         
     | 
| 
       58 
74 
     | 
    
         
             
                        end
         
     | 
| 
      
 75 
     | 
    
         
            +
                        env_updated
         
     | 
| 
       59 
76 
     | 
    
         
             
                    end
         
     | 
| 
       60 
77 
     | 
    
         
             
                end
         
     | 
| 
       61 
78 
     | 
    
         | 
| 
         @@ -76,16 +93,16 @@ def self.env_add_path(name, *value) 
     | 
|
| 
       76 
93 
     | 
    
         
             
                    env.add_path(name, *value)
         
     | 
| 
       77 
94 
     | 
    
         
             
                end
         
     | 
| 
       78 
95 
     | 
    
         
             
                # @deprecated call Autoproj.env.source_after instead
         
     | 
| 
       79 
     | 
    
         
            -
                def self.env_source_file(file)
         
     | 
| 
       80 
     | 
    
         
            -
                    env.source_after(file)
         
     | 
| 
      
 96 
     | 
    
         
            +
                def self.env_source_file(file, shell: 'sh')
         
     | 
| 
      
 97 
     | 
    
         
            +
                    env.source_after(file, shell: shell)
         
     | 
| 
       81 
98 
     | 
    
         
             
                end
         
     | 
| 
       82 
99 
     | 
    
         
             
                # @deprecated call Autoproj.env.source_after instead
         
     | 
| 
       83 
     | 
    
         
            -
                def self.env_source_after(file)
         
     | 
| 
       84 
     | 
    
         
            -
                    env.source_after(file)
         
     | 
| 
      
 100 
     | 
    
         
            +
                def self.env_source_after(file, shell: 'sh')
         
     | 
| 
      
 101 
     | 
    
         
            +
                    env.source_after(file, shell: shell)
         
     | 
| 
       85 
102 
     | 
    
         
             
                end
         
     | 
| 
       86 
103 
     | 
    
         
             
                # @deprecated call Autoproj.env.source_before instead
         
     | 
| 
       87 
     | 
    
         
            -
                def self.env_source_before(file)
         
     | 
| 
       88 
     | 
    
         
            -
                    env.source_before(file)
         
     | 
| 
      
 104 
     | 
    
         
            +
                def self.env_source_before(file, shell: 'sh')
         
     | 
| 
      
 105 
     | 
    
         
            +
                    env.source_before(file, shell: shell)
         
     | 
| 
       89 
106 
     | 
    
         
             
                end
         
     | 
| 
       90 
107 
     | 
    
         
             
                # @deprecated call Autoproj.env.inherit instead
         
     | 
| 
       91 
108 
     | 
    
         
             
                def self.env_inherit(*names)
         
     | 
    
        data/lib/autoproj/ops/install.rb
    CHANGED
    
    | 
         @@ -47,13 +47,15 @@ def initialize(root_dir) 
     | 
|
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
                            load_config
         
     | 
| 
       49 
49 
     | 
    
         
             
                            if config['ruby_executable'] != Gem.ruby
         
     | 
| 
       50 
     | 
    
         
            -
                                raise "this autoproj installation was already bootstrapped using  
     | 
| 
      
 50 
     | 
    
         
            +
                                raise "this autoproj installation was already bootstrapped using "\
         
     | 
| 
      
 51 
     | 
    
         
            +
                                    "#{config['ruby_executable']}, but you are currently running "\
         
     | 
| 
      
 52 
     | 
    
         
            +
                                    "under #{Gem.ruby}. Changing the ruby interpreter in a given "\
         
     | 
| 
      
 53 
     | 
    
         
            +
                                    "workspace is not supported, you need to do a clean bootstrap"
         
     | 
| 
       51 
54 
     | 
    
         
             
                            end
         
     | 
| 
       52 
55 
     | 
    
         
             
                            @ruby_executable = config['ruby_executable']
         
     | 
| 
       53 
56 
     | 
    
         
             
                            @local = false
         
     | 
| 
       54 
57 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                             
     | 
| 
       56 
     | 
    
         
            -
                            @gems_install_path     = default_gem_path
         
     | 
| 
      
 58 
     | 
    
         
            +
                            install_gems_in_gem_user_dir
         
     | 
| 
       57 
59 
     | 
    
         
             
                        end
         
     | 
| 
       58 
60 
     | 
    
         | 
| 
       59 
61 
     | 
    
         
             
                        def env_for_child
         
     | 
| 
         @@ -132,13 +134,15 @@ def gem_path_suffix 
     | 
|
| 
       132 
134 
     | 
    
         
             
                        #
         
     | 
| 
       133 
135 
     | 
    
         
             
                        # They are installed in a versioned subdirectory of this path, e.g.
         
     | 
| 
       134 
136 
     | 
    
         
             
                        # {#gem_path_suffix}.
         
     | 
| 
       135 
     | 
    
         
            -
                        # 
     | 
| 
      
 137 
     | 
    
         
            +
                        #
         
     | 
| 
       136 
138 
     | 
    
         
             
                        # @return [String]
         
     | 
| 
       137 
139 
     | 
    
         
             
                        attr_reader :gems_install_path
         
     | 
| 
       138 
140 
     | 
    
         
             
                        # The GEM_HOME under which the workspace's gems should be installed
         
     | 
| 
       139 
     | 
    
         
            -
                        # 
     | 
| 
      
 141 
     | 
    
         
            +
                        #
         
     | 
| 
       140 
142 
     | 
    
         
             
                        # @return [String]
         
     | 
| 
       141 
     | 
    
         
            -
                        def gems_gem_home 
     | 
| 
      
 143 
     | 
    
         
            +
                        def gems_gem_home
         
     | 
| 
      
 144 
     | 
    
         
            +
                            File.join(gems_install_path, gem_path_suffix)
         
     | 
| 
      
 145 
     | 
    
         
            +
                        end
         
     | 
| 
       142 
146 
     | 
    
         
             
                        # Sets where the workspace's gems should be installed
         
     | 
| 
       143 
147 
     | 
    
         
             
                        #
         
     | 
| 
       144 
148 
     | 
    
         
             
                        # @param [String] path the absolute path that should be given to
         
     | 
| 
         @@ -147,17 +151,41 @@ def gems_gem_home; File.join(gems_install_path, gem_path_suffix) end 
     | 
|
| 
       147 
151 
     | 
    
         
             
                        def gems_install_path=(path)
         
     | 
| 
       148 
152 
     | 
    
         
             
                            @gems_install_path = path
         
     | 
| 
       149 
153 
     | 
    
         
             
                        end
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
                        private def xdg_var(varname, default)
         
     | 
| 
      
 156 
     | 
    
         
            +
                            if (env = ENV[varname]) && !env.empty?
         
     | 
| 
      
 157 
     | 
    
         
            +
                                env
         
     | 
| 
      
 158 
     | 
    
         
            +
                            else
         
     | 
| 
      
 159 
     | 
    
         
            +
                                default
         
     | 
| 
      
 160 
     | 
    
         
            +
                            end
         
     | 
| 
      
 161 
     | 
    
         
            +
                        end
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
       150 
163 
     | 
    
         
             
                        # Install autoproj in Gem's default user dir
         
     | 
| 
       151 
164 
     | 
    
         
             
                        def install_gems_in_gem_user_dir
         
     | 
| 
       152 
     | 
    
         
            -
                             
     | 
| 
      
 165 
     | 
    
         
            +
                            xdg_default_gem_path = xdg_var('XDG_DATA_HOME',
         
     | 
| 
      
 166 
     | 
    
         
            +
                                File.join(Dir.home, '.local', 'share', 'autoproj', 'gems'))
         
     | 
| 
      
 167 
     | 
    
         
            +
                            default_gem_path = File.join(
         
     | 
| 
      
 168 
     | 
    
         
            +
                                Dir.home, '.autoproj', 'gems')
         
     | 
| 
      
 169 
     | 
    
         
            +
                            @gems_install_path =
         
     | 
| 
      
 170 
     | 
    
         
            +
                                if File.directory?(xdg_default_gem_path)
         
     | 
| 
      
 171 
     | 
    
         
            +
                                    xdg_default_gem_path
         
     | 
| 
      
 172 
     | 
    
         
            +
                                elsif File.directory?(default_gem_path)
         
     | 
| 
      
 173 
     | 
    
         
            +
                                    default_gem_path
         
     | 
| 
      
 174 
     | 
    
         
            +
                                else
         
     | 
| 
      
 175 
     | 
    
         
            +
                                    xdg_default_gem_path
         
     | 
| 
      
 176 
     | 
    
         
            +
                                end
         
     | 
| 
       153 
177 
     | 
    
         
             
                        end
         
     | 
| 
       154 
178 
     | 
    
         | 
| 
       155 
179 
     | 
    
         
             
                        # Whether autoproj should prefer OS-independent packages over their
         
     | 
| 
       156 
180 
     | 
    
         
             
                        # OS-packaged equivalents (e.g. the thor gem vs. the ruby-thor
         
     | 
| 
       157 
181 
     | 
    
         
             
                        # Debian package)
         
     | 
| 
       158 
     | 
    
         
            -
                        def prefer_indep_over_os_packages 
     | 
| 
      
 182 
     | 
    
         
            +
                        def prefer_indep_over_os_packages?
         
     | 
| 
      
 183 
     | 
    
         
            +
                            @prefer_indep_over_os_packages
         
     | 
| 
      
 184 
     | 
    
         
            +
                        end
         
     | 
| 
       159 
185 
     | 
    
         
             
                        # (see #prefer_index_over_os_packages?)
         
     | 
| 
       160 
     | 
    
         
            -
                        def prefer_indep_over_os_packages=(flag) 
     | 
| 
      
 186 
     | 
    
         
            +
                        def prefer_indep_over_os_packages=(flag)
         
     | 
| 
      
 187 
     | 
    
         
            +
                            @prefer_indep_over_os_packages = !!flag
         
     | 
| 
      
 188 
     | 
    
         
            +
                        end
         
     | 
| 
       161 
189 
     | 
    
         | 
| 
       162 
190 
     | 
    
         
             
                        def self.guess_gem_program
         
     | 
| 
       163 
191 
     | 
    
         
             
                            ruby_bin = RbConfig::CONFIG['RUBY_INSTALL_NAME']
         
     | 
| 
         @@ -165,7 +193,7 @@ def self.guess_gem_program 
     | 
|
| 
       165 
193 
     | 
    
         | 
| 
       166 
194 
     | 
    
         
             
                            candidates = ['gem']
         
     | 
| 
       167 
195 
     | 
    
         
             
                            if ruby_bin =~ /^ruby(.+)$/
         
     | 
| 
       168 
     | 
    
         
            -
                                candidates.unshift "gem#{$1}" 
     | 
| 
      
 196 
     | 
    
         
            +
                                candidates.unshift "gem#{$1}"
         
     | 
| 
       169 
197 
     | 
    
         
             
                            end
         
     | 
| 
       170 
198 
     | 
    
         | 
| 
       171 
199 
     | 
    
         
             
                            candidates.each do |gem_name|
         
     | 
| 
         @@ -173,7 +201,8 @@ def self.guess_gem_program 
     | 
|
| 
       173 
201 
     | 
    
         
             
                                    return gem_full_path
         
     | 
| 
       174 
202 
     | 
    
         
             
                                end
         
     | 
| 
       175 
203 
     | 
    
         
             
                            end
         
     | 
| 
       176 
     | 
    
         
            -
                            raise ArgumentError, "cannot find a gem program  
     | 
| 
      
 204 
     | 
    
         
            +
                            raise ArgumentError, "cannot find a gem program "\
         
     | 
| 
      
 205 
     | 
    
         
            +
                                "(tried #{candidates.sort.join(", ")} in #{ruby_bindir})"
         
     | 
| 
       177 
206 
     | 
    
         
             
                        end
         
     | 
| 
       178 
207 
     | 
    
         | 
| 
       179 
208 
     | 
    
         
             
                        # The content of the default {#gemfile}
         
     | 
| 
         @@ -197,39 +226,48 @@ def parse_options(args = ARGV) 
     | 
|
| 
       197 
226 
     | 
    
         
             
                                opt.on '--skip-stage2', 'do not run the stage2 install' do
         
     | 
| 
       198 
227 
     | 
    
         
             
                                    @skip_stage2 = true
         
     | 
| 
       199 
228 
     | 
    
         
             
                                end
         
     | 
| 
       200 
     | 
    
         
            -
                                opt.on '--gem-source=URL', String, "use this source for RubyGems  
     | 
| 
      
 229 
     | 
    
         
            +
                                opt.on '--gem-source=URL', String, "use this source for RubyGems "\
         
     | 
| 
      
 230 
     | 
    
         
            +
                                    "instead of rubygems.org" do |url|
         
     | 
| 
       201 
231 
     | 
    
         
             
                                    @gem_source = url
         
     | 
| 
       202 
232 
     | 
    
         
             
                                end
         
     | 
| 
       203 
     | 
    
         
            -
                                opt.on '--gems-path=PATH', "install gems under this path instead  
     | 
| 
      
 233 
     | 
    
         
            +
                                opt.on '--gems-path=PATH', "install gems under this path instead "\
         
     | 
| 
      
 234 
     | 
    
         
            +
                                    "of ~/.autoproj/gems" do |path|
         
     | 
| 
       204 
235 
     | 
    
         
             
                                    self.gems_install_path     = path
         
     | 
| 
       205 
236 
     | 
    
         
             
                                end
         
     | 
| 
       206 
237 
     | 
    
         
             
                                opt.on '--public-gems', "install gems in the default gem location" do
         
     | 
| 
       207 
238 
     | 
    
         
             
                                    self.install_gems_in_gem_user_dir
         
     | 
| 
       208 
239 
     | 
    
         
             
                                end
         
     | 
| 
       209 
     | 
    
         
            -
                                opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided  
     | 
| 
      
 240 
     | 
    
         
            +
                                opt.on '--version=VERSION_CONSTRAINT', String, 'use the provided "\
         
     | 
| 
      
 241 
     | 
    
         
            +
                                    "string as a version constraint for autoproj' do |version|
         
     | 
| 
       210 
242 
     | 
    
         
             
                                    if @gemfile
         
     | 
| 
       211 
243 
     | 
    
         
             
                                        raise "cannot give both --version and --gemfile"
         
     | 
| 
       212 
244 
     | 
    
         
             
                                    end
         
     | 
| 
       213 
245 
     | 
    
         
             
                                    @gemfile = default_gemfile_contents(version)
         
     | 
| 
       214 
246 
     | 
    
         
             
                                end
         
     | 
| 
       215 
     | 
    
         
            -
                                opt.on '--gemfile=PATH', String, 'use the given Gemfile to install  
     | 
| 
      
 247 
     | 
    
         
            +
                                opt.on '--gemfile=PATH', String, 'use the given Gemfile to install "\
         
     | 
| 
      
 248 
     | 
    
         
            +
                                    "autoproj instead of the default' do |path|
         
     | 
| 
       216 
249 
     | 
    
         
             
                                    if @gemfile
         
     | 
| 
       217 
250 
     | 
    
         
             
                                        raise "cannot give both --version and --gemfile"
         
     | 
| 
       218 
251 
     | 
    
         
             
                                    end
         
     | 
| 
       219 
252 
     | 
    
         
             
                                    @gemfile = File.read(path)
         
     | 
| 
       220 
253 
     | 
    
         
             
                                end
         
     | 
| 
       221 
     | 
    
         
            -
                                opt.on '--seed-config=PATH', String, 'path to a seed file that  
     | 
| 
      
 254 
     | 
    
         
            +
                                opt.on '--seed-config=PATH', String, 'path to a seed file that "\
         
     | 
| 
      
 255 
     | 
    
         
            +
                                    "should be used to initialize the configuration' do |path|
         
     | 
| 
       222 
256 
     | 
    
         
             
                                    @config.merge!(YAML.load(File.read(path)))
         
     | 
| 
       223 
257 
     | 
    
         
             
                                end
         
     | 
| 
       224 
     | 
    
         
            -
                                opt.on '--prefer-os-independent-packages', 'prefer OS-independent  
     | 
| 
      
 258 
     | 
    
         
            +
                                opt.on '--prefer-os-independent-packages', 'prefer OS-independent "\
         
     | 
| 
      
 259 
     | 
    
         
            +
                                    "packages (such as a RubyGem) over their OS-packaged equivalent "\
         
     | 
| 
      
 260 
     | 
    
         
            +
                                    "(e.g. the thor gem vs. the ruby-thor debian package)' do
         
     | 
| 
       225 
261 
     | 
    
         
             
                                    @prefer_indep_over_os_packages = true
         
     | 
| 
       226 
262 
     | 
    
         
             
                                end
         
     | 
| 
       227 
     | 
    
         
            -
                                opt.on '--[no-]color', 'do not use colored output (enabled by  
     | 
| 
      
 263 
     | 
    
         
            +
                                opt.on '--[no-]color', 'do not use colored output (enabled by "\
         
     | 
| 
      
 264 
     | 
    
         
            +
                                    "default if the terminal supports it)' do |color|
         
     | 
| 
       228 
265 
     | 
    
         
             
                                    if color then autoproj_options << "--color"
         
     | 
| 
       229 
266 
     | 
    
         
             
                                    else autoproj_options << '--no-color'
         
     | 
| 
       230 
267 
     | 
    
         
             
                                    end
         
     | 
| 
       231 
268 
     | 
    
         
             
                                end
         
     | 
| 
       232 
     | 
    
         
            -
                                opt.on '--[no-]progress', 'do not use progress output (enabled by  
     | 
| 
      
 269 
     | 
    
         
            +
                                opt.on '--[no-]progress', 'do not use progress output (enabled by "\
         
     | 
| 
      
 270 
     | 
    
         
            +
                                    "default if the terminal supports it)' do |color|
         
     | 
| 
       233 
271 
     | 
    
         
             
                                    if color then autoproj_options << "--progress"
         
     | 
| 
       234 
272 
     | 
    
         
             
                                    else autoproj_options << '--no-progress'
         
     | 
| 
       235 
273 
     | 
    
         
             
                                    end
         
     | 
| 
         @@ -262,9 +300,11 @@ def install_bundler(gem_program, silent: false) 
     | 
|
| 
       262 
300 
     | 
    
         | 
| 
       263 
301 
     | 
    
         
             
                            result = system(
         
     | 
| 
       264 
302 
     | 
    
         
             
                                env_for_child.merge('GEM_HOME' => gems_gem_home),
         
     | 
| 
       265 
     | 
    
         
            -
                                Gem.ruby, gem_program, 'install', 
     | 
| 
       266 
     | 
    
         
            -
                                     
     | 
| 
       267 
     | 
    
         
            -
                                     
     | 
| 
      
 303 
     | 
    
         
            +
                                Gem.ruby, gem_program, 'install',
         
     | 
| 
      
 304 
     | 
    
         
            +
                                    '--env-shebang', '--no-document', '--no-format-executable',
         
     | 
| 
      
 305 
     | 
    
         
            +
                                    '--clear-sources', '--source', gem_source,
         
     | 
| 
      
 306 
     | 
    
         
            +
                                    *local, "--bindir=#{File.join(gems_gem_home, 'bin')}",
         
     | 
| 
      
 307 
     | 
    
         
            +
                                    'bundler', **redirection)
         
     | 
| 
       268 
308 
     | 
    
         | 
| 
       269 
309 
     | 
    
         
             
                            if !result
         
     | 
| 
       270 
310 
     | 
    
         
             
                                STDERR.puts "FATAL: failed to install bundler in #{gems_gem_home}"
         
     | 
| 
         @@ -275,14 +315,15 @@ def install_bundler(gem_program, silent: false) 
     | 
|
| 
       275 
315 
     | 
    
         
             
                            if File.exist?(bundler_path)
         
     | 
| 
       276 
316 
     | 
    
         
             
                                bundler_path
         
     | 
| 
       277 
317 
     | 
    
         
             
                            else
         
     | 
| 
       278 
     | 
    
         
            -
                                STDERR.puts "gem install bundler returned successfully, but still  
     | 
| 
      
 318 
     | 
    
         
            +
                                STDERR.puts "gem install bundler returned successfully, but still "\
         
     | 
| 
      
 319 
     | 
    
         
            +
                                    "cannot find bundler in #{bundler_path}"
         
     | 
| 
       279 
320 
     | 
    
         
             
                                nil
         
     | 
| 
       280 
321 
     | 
    
         
             
                            end
         
     | 
| 
       281 
322 
     | 
    
         
             
                        end
         
     | 
| 
       282 
323 
     | 
    
         | 
| 
       283 
324 
     | 
    
         
             
                        def install_autoproj(bundler)
         
     | 
| 
       284 
     | 
    
         
            -
                            # Force bundler to update. If the user does not want this, let 
     | 
| 
       285 
     | 
    
         
            -
                            # Gemfile with tighter version constraints
         
     | 
| 
      
 325 
     | 
    
         
            +
                            # Force bundler to update. If the user does not want this, let
         
     | 
| 
      
 326 
     | 
    
         
            +
                            # him specify a Gemfile with tighter version constraints
         
     | 
| 
       286 
327 
     | 
    
         
             
                            lockfile = File.join(dot_autoproj, 'Gemfile.lock')
         
     | 
| 
       287 
328 
     | 
    
         
             
                            if File.exist?(lockfile)
         
     | 
| 
       288 
329 
     | 
    
         
             
                                FileUtils.rm lockfile
         
     | 
| 
         @@ -294,6 +335,7 @@ def install_autoproj(bundler) 
     | 
|
| 
       294 
335 
     | 
    
         
             
                            opts << '--local' if local?
         
     | 
| 
       295 
336 
     | 
    
         
             
                            opts << "--path=#{gems_install_path}"
         
     | 
| 
       296 
337 
     | 
    
         
             
                            shims_path = File.join(dot_autoproj, 'bin')
         
     | 
| 
      
 338 
     | 
    
         
            +
             
     | 
| 
       297 
339 
     | 
    
         
             
                            result = system(clean_env,
         
     | 
| 
       298 
340 
     | 
    
         
             
                                Gem.ruby, bundler, 'install',
         
     | 
| 
       299 
341 
     | 
    
         
             
                                    "--gemfile=#{autoproj_gemfile_path}",
         
     | 
| 
         @@ -306,12 +348,14 @@ def install_autoproj(bundler) 
     | 
|
| 
       306 
348 
     | 
    
         
             
                                exit 1
         
     | 
| 
       307 
349 
     | 
    
         
             
                            end
         
     | 
| 
       308 
350 
     | 
    
         
             
                        ensure
         
     | 
| 
       309 
     | 
    
         
            -
                            self.class.rewrite_shims(shims_path, ruby_executable, 
     | 
| 
      
 351 
     | 
    
         
            +
                            self.class.rewrite_shims(shims_path, ruby_executable,
         
     | 
| 
      
 352 
     | 
    
         
            +
                                root_dir, autoproj_gemfile_path, gems_gem_home)
         
     | 
| 
       310 
353 
     | 
    
         
             
                        end
         
     | 
| 
       311 
354 
     | 
    
         | 
| 
       312 
355 
     | 
    
         
             
                        EXCLUDED_FROM_SHIMS = %w{rake thor}
         
     | 
| 
       313 
356 
     | 
    
         | 
| 
       314 
     | 
    
         
            -
                        def self.rewrite_shims(shim_path, ruby_executable, 
     | 
| 
      
 357 
     | 
    
         
            +
                        def self.rewrite_shims(shim_path, ruby_executable,
         
     | 
| 
      
 358 
     | 
    
         
            +
                            root_dir, autoproj_gemfile_path, gems_gem_home)
         
     | 
| 
       315 
359 
     | 
    
         
             
                            FileUtils.mkdir_p shim_path
         
     | 
| 
       316 
360 
     | 
    
         
             
                            File.open(File.join(shim_path, 'ruby'), 'w') do |io|
         
     | 
| 
       317 
361 
     | 
    
         
             
                                io.puts "#! /bin/sh"
         
     | 
| 
         @@ -319,10 +363,9 @@ def self.rewrite_shims(shim_path, ruby_executable, root_dir, autoproj_gemfile_pa 
     | 
|
| 
       319 
363 
     | 
    
         
             
                            end
         
     | 
| 
       320 
364 
     | 
    
         
             
                            FileUtils.chmod 0755, File.join(shim_path, 'ruby')
         
     | 
| 
       321 
365 
     | 
    
         | 
| 
       322 
     | 
    
         
            -
                            FileUtils.touch File.join(shim_path, 'bundler')
         
     | 
| 
       323 
     | 
    
         
            -
                            FileUtils.touch File.join(shim_path, 'bundle')
         
     | 
| 
       324 
366 
     | 
    
         
             
                            Dir.glob(File.join(shim_path, '*')) do |bin_script|
         
     | 
| 
       325 
     | 
    
         
            -
                                next  
     | 
| 
      
 367 
     | 
    
         
            +
                                next unless File.file?(bin_script)
         
     | 
| 
      
 368 
     | 
    
         
            +
             
     | 
| 
       326 
369 
     | 
    
         
             
                                bin_name = File.basename(bin_script)
         
     | 
| 
       327 
370 
     | 
    
         
             
                                if EXCLUDED_FROM_SHIMS.include?(bin_name)
         
     | 
| 
       328 
371 
     | 
    
         
             
                                    FileUtils.rm_f bin_script
         
     | 
| 
         @@ -332,19 +375,46 @@ def self.rewrite_shims(shim_path, ruby_executable, root_dir, autoproj_gemfile_pa 
     | 
|
| 
       332 
375 
     | 
    
         | 
| 
       333 
376 
     | 
    
         
             
                                bin_shim = File.join(shim_path, bin_name)
         
     | 
| 
       334 
377 
     | 
    
         
             
                                bin_script_lines = File.readlines(bin_script)
         
     | 
| 
      
 378 
     | 
    
         
            +
                                next if has_autoproj_preamble?(bin_script_lines)
         
     | 
| 
      
 379 
     | 
    
         
            +
             
     | 
| 
       335 
380 
     | 
    
         
             
                                File.open(bin_shim, 'w') do |io|
         
     | 
| 
       336 
381 
     | 
    
         
             
                                    if bin_name == 'bundler' || bin_name == 'bundle'
         
     | 
| 
       337 
     | 
    
         
            -
                                        io.puts shim_bundler( 
     | 
| 
      
 382 
     | 
    
         
            +
                                        io.puts shim_bundler(bin_script_lines, ruby_executable,
         
     | 
| 
      
 383 
     | 
    
         
            +
                                            autoproj_gemfile_path, gems_gem_home)
         
     | 
| 
       338 
384 
     | 
    
         
             
                                    else
         
     | 
| 
       339 
     | 
    
         
            -
                                         
     | 
| 
       340 
     | 
    
         
            -
             
     | 
| 
      
 385 
     | 
    
         
            +
                                        io.puts shim_script(bin_script_lines, ruby_executable, root_dir,
         
     | 
| 
      
 386 
     | 
    
         
            +
                                            autoproj_gemfile_path, gems_gem_home)
         
     | 
| 
       341 
387 
     | 
    
         
             
                                    end
         
     | 
| 
       342 
388 
     | 
    
         
             
                                end
         
     | 
| 
       343 
389 
     | 
    
         
             
                                FileUtils.chmod 0755, bin_shim
         
     | 
| 
       344 
390 
     | 
    
         
             
                            end
         
     | 
| 
       345 
391 
     | 
    
         
             
                        end
         
     | 
| 
       346 
392 
     | 
    
         | 
| 
       347 
     | 
    
         
            -
                        def self. 
     | 
| 
      
 393 
     | 
    
         
            +
                        def self.new_style_bundler_binstub?(script_lines)
         
     | 
| 
      
 394 
     | 
    
         
            +
                            script_lines.any? { |l| l =~ /This file was generated by Bundler/ }
         
     | 
| 
      
 395 
     | 
    
         
            +
                        end
         
     | 
| 
      
 396 
     | 
    
         
            +
             
     | 
| 
      
 397 
     | 
    
         
            +
                        def self.has_autoproj_preamble?(script_lines)
         
     | 
| 
      
 398 
     | 
    
         
            +
                            script_lines.any? { |l| l =~ /Autoproj generated preamble/ }
         
     | 
| 
      
 399 
     | 
    
         
            +
                        end
         
     | 
| 
      
 400 
     | 
    
         
            +
             
     | 
| 
      
 401 
     | 
    
         
            +
                        def self.shim_bundler(script_lines, ruby_executable, autoproj_gemfile_path, gems_gem_home)
         
     | 
| 
      
 402 
     | 
    
         
            +
                            return shim_bundler_old(ruby_executable, autoproj_gemfile_path, gems_gem_home) \
         
     | 
| 
      
 403 
     | 
    
         
            +
                                unless new_style_bundler_binstub?(script_lines)
         
     | 
| 
      
 404 
     | 
    
         
            +
             
     | 
| 
      
 405 
     | 
    
         
            +
                            script_lines.insert(1, <<-RESTART_BUNDLER)
         
     | 
| 
      
 406 
     | 
    
         
            +
            # Autoproj generated preamble
         
     | 
| 
      
 407 
     | 
    
         
            +
            if defined?(Bundler)
         
     | 
| 
      
 408 
     | 
    
         
            +
                Bundler.with_clean_env do
         
     | 
| 
      
 409 
     | 
    
         
            +
                    exec($0, *ARGV)
         
     | 
| 
      
 410 
     | 
    
         
            +
                end
         
     | 
| 
      
 411 
     | 
    
         
            +
            end
         
     | 
| 
      
 412 
     | 
    
         
            +
            ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
         
     | 
| 
      
 413 
     | 
    
         
            +
                            RESTART_BUNDLER
         
     | 
| 
      
 414 
     | 
    
         
            +
                            script_lines.join
         
     | 
| 
      
 415 
     | 
    
         
            +
                        end
         
     | 
| 
      
 416 
     | 
    
         
            +
             
     | 
| 
      
 417 
     | 
    
         
            +
                        def self.shim_bundler_old(ruby_executable, autoproj_gemfile_path, gems_gem_home)
         
     | 
| 
       348 
418 
     | 
    
         
             
            "#! #{ruby_executable}
         
     | 
| 
       349 
419 
     | 
    
         | 
| 
       350 
420 
     | 
    
         
             
            if defined?(Bundler)
         
     | 
| 
         @@ -360,8 +430,35 @@ def self.shim_bundler(ruby_executable, autoproj_gemfile_path, gems_gem_home) 
     | 
|
| 
       360 
430 
     | 
    
         | 
| 
       361 
431 
     | 
    
         
             
            load Gem.bin_path('bundler', 'bundler')"
         
     | 
| 
       362 
432 
     | 
    
         
             
                        end
         
     | 
| 
       363 
     | 
    
         
            -
             
     | 
| 
       364 
     | 
    
         
            -
                        def self.shim_script(ruby_executable, root_dir, 
     | 
| 
      
 433 
     | 
    
         
            +
             
     | 
| 
      
 434 
     | 
    
         
            +
                        def self.shim_script(script_lines, ruby_executable, root_dir,
         
     | 
| 
      
 435 
     | 
    
         
            +
                                autoproj_gemfile_path, gems_gem_home)
         
     | 
| 
      
 436 
     | 
    
         
            +
                            new_style = !script_lines.empty? && script_lines.any? do |l|
         
     | 
| 
      
 437 
     | 
    
         
            +
                                l =~ /This file was generated by Bundler/
         
     | 
| 
      
 438 
     | 
    
         
            +
                            end
         
     | 
| 
      
 439 
     | 
    
         
            +
                            load_line = script_lines.grep(/load Gem.bin_path/).first
         
     | 
| 
      
 440 
     | 
    
         
            +
                            return shim_script_old(ruby_executable, root_dir,
         
     | 
| 
      
 441 
     | 
    
         
            +
                                autoproj_gemfile_path, gems_gem_home, load_line) \
         
     | 
| 
      
 442 
     | 
    
         
            +
                                unless new_style
         
     | 
| 
      
 443 
     | 
    
         
            +
             
     | 
| 
      
 444 
     | 
    
         
            +
                            script_lines.insert(1, <<-AUTOPROJ_PREAMBLE)
         
     | 
| 
      
 445 
     | 
    
         
            +
            # Autoproj generated preamble, v1
         
     | 
| 
      
 446 
     | 
    
         
            +
            if defined?(Bundler)
         
     | 
| 
      
 447 
     | 
    
         
            +
                Bundler.with_clean_env do
         
     | 
| 
      
 448 
     | 
    
         
            +
                    exec(Hash['RUBYLIB' => nil], $0, *ARGV)
         
     | 
| 
      
 449 
     | 
    
         
            +
                end
         
     | 
| 
      
 450 
     | 
    
         
            +
            elsif ENV['RUBYLIB']
         
     | 
| 
      
 451 
     | 
    
         
            +
                exec(Hash['RUBYLIB' => nil], $0, *ARGV)
         
     | 
| 
      
 452 
     | 
    
         
            +
            end
         
     | 
| 
      
 453 
     | 
    
         
            +
             
     | 
| 
      
 454 
     | 
    
         
            +
            ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
         
     | 
| 
      
 455 
     | 
    
         
            +
            ENV['AUTOPROJ_CURRENT_ROOT'] = '#{root_dir}'
         
     | 
| 
      
 456 
     | 
    
         
            +
                            AUTOPROJ_PREAMBLE
         
     | 
| 
      
 457 
     | 
    
         
            +
                            return script_lines.join
         
     | 
| 
      
 458 
     | 
    
         
            +
                        end
         
     | 
| 
      
 459 
     | 
    
         
            +
             
     | 
| 
      
 460 
     | 
    
         
            +
                        def self.shim_script_old(ruby_executable, root_dir, autoproj_gemfile_path,
         
     | 
| 
      
 461 
     | 
    
         
            +
                            gems_gem_home, load_line)
         
     | 
| 
       365 
462 
     | 
    
         
             
            "#! #{ruby_executable}
         
     | 
| 
       366 
463 
     | 
    
         | 
| 
       367 
464 
     | 
    
         
             
            if defined?(Bundler)
         
     | 
| 
         @@ -423,9 +520,10 @@ def save_gemfile 
     | 
|
| 
       423 
520 
     | 
    
         
             
                                "if File.file?(config_path)",
         
     | 
| 
       424 
521 
     | 
    
         
             
                                "    require 'yaml'",
         
     | 
| 
       425 
522 
     | 
    
         
             
                                "    config = YAML.load(File.read(config_path)) || Hash.new",
         
     | 
| 
       426 
     | 
    
         
            -
                                "    (config['plugins'] || Hash.new). 
     | 
| 
       427 
     | 
    
         
            -
                                "         
     | 
| 
       428 
     | 
    
         
            -
                                " 
     | 
| 
      
 523 
     | 
    
         
            +
                                "    (config['plugins'] || Hash.new).",
         
     | 
| 
      
 524 
     | 
    
         
            +
                                "        each do |plugin_name, (version, options)|",
         
     | 
| 
      
 525 
     | 
    
         
            +
                                "            gem plugin_name, version, **options",
         
     | 
| 
      
 526 
     | 
    
         
            +
                                "        end",
         
     | 
| 
       429 
527 
     | 
    
         
             
                                "end"
         
     | 
| 
       430 
528 
     | 
    
         
             
                            ].join("\n")
         
     | 
| 
       431 
529 
     | 
    
         | 
| 
         @@ -439,7 +537,8 @@ def save_gemfile 
     | 
|
| 
       439 
537 
     | 
    
         | 
| 
       440 
538 
     | 
    
         | 
| 
       441 
539 
     | 
    
         
             
                        def find_in_clean_path(command, *additional_paths)
         
     | 
| 
       442 
     | 
    
         
            -
                            clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR) + 
     | 
| 
      
 540 
     | 
    
         
            +
                            clean_path = env_for_child['PATH'].split(File::PATH_SEPARATOR) +
         
     | 
| 
      
 541 
     | 
    
         
            +
                                additional_paths
         
     | 
| 
       443 
542 
     | 
    
         
             
                            clean_path.each do |p|
         
     | 
| 
       444 
543 
     | 
    
         
             
                                full_path = File.join(p, command)
         
     | 
| 
       445 
544 
     | 
    
         
             
                                if File.file?(full_path)
         
     | 
| 
         @@ -463,7 +562,8 @@ def gem_bindir 
     | 
|
| 
       463 
562 
     | 
    
         
             
                            #
         
     | 
| 
       464 
563 
     | 
    
         
             
                            # So, we're calling 'gem' as a subcommand to discovery the
         
     | 
| 
       465 
564 
     | 
    
         
             
                            # actual bindir
         
     | 
| 
       466 
     | 
    
         
            -
                            bindir = IO.popen(env_for_child, 
     | 
| 
      
 565 
     | 
    
         
            +
                            bindir = IO.popen(env_for_child,
         
     | 
| 
      
 566 
     | 
    
         
            +
                                [Gem.ruby, '-e', 'puts "#{Gem.user_dir}/bin"']).read
         
     | 
| 
       467 
567 
     | 
    
         
             
                            if bindir
         
     | 
| 
       468 
568 
     | 
    
         
             
                                @gem_bindir = bindir.chomp
         
     | 
| 
       469 
569 
     | 
    
         
             
                            else
         
     | 
| 
         @@ -473,7 +573,9 @@ def gem_bindir 
     | 
|
| 
       473 
573 
     | 
    
         | 
| 
       474 
574 
     | 
    
         
             
                        def install
         
     | 
| 
       475 
575 
     | 
    
         
             
                            if ENV['BUNDLER_GEMFILE']
         
     | 
| 
       476 
     | 
    
         
            -
                                raise "cannot run autoproj_install or autoproj_bootstrap while  
     | 
| 
      
 576 
     | 
    
         
            +
                                raise "cannot run autoproj_install or autoproj_bootstrap while "\
         
     | 
| 
      
 577 
     | 
    
         
            +
                                    "under a 'bundler exec' subcommand or having loaded an env.sh. "\
         
     | 
| 
      
 578 
     | 
    
         
            +
                                    "Open a new console and try again"
         
     | 
| 
       477 
579 
     | 
    
         
             
                            end
         
     | 
| 
       478 
580 
     | 
    
         | 
| 
       479 
581 
     | 
    
         
             
                            gem_program  = self.class.guess_gem_program
         
     | 
| 
         @@ -503,7 +605,7 @@ def install 
     | 
|
| 
       503 
605 
     | 
    
         | 
| 
       504 
606 
     | 
    
         
             
                        def load_config
         
     | 
| 
       505 
607 
     | 
    
         
             
                            v1_config_path = File.join(root_dir, 'autoproj', 'config.yml')
         
     | 
| 
       506 
     | 
    
         
            -
             
     | 
| 
      
 608 
     | 
    
         
            +
             
     | 
| 
       507 
609 
     | 
    
         
             
                            config = Hash.new
         
     | 
| 
       508 
610 
     | 
    
         
             
                            if File.file?(v1_config_path)
         
     | 
| 
       509 
611 
     | 
    
         
             
                                config.merge!(YAML.load(File.read(v1_config_path)) || Hash.new)
         
     | 
| 
         @@ -517,7 +619,10 @@ def load_config 
     | 
|
| 
       517 
619 
     | 
    
         
             
                            ruby_executable = File.join(ruby_bindir, ruby)
         
     | 
| 
       518 
620 
     | 
    
         
             
                            if current = config['ruby_executable'] # When upgrading or reinstalling
         
     | 
| 
       519 
621 
     | 
    
         
             
                                if current != ruby_executable
         
     | 
| 
       520 
     | 
    
         
            -
                                    raise "this workspace has already been initialized using  
     | 
| 
      
 622 
     | 
    
         
            +
                                    raise "this workspace has already been initialized using "\
         
     | 
| 
      
 623 
     | 
    
         
            +
                                    "#{current}, you cannot run autoproj install with "\
         
     | 
| 
      
 624 
     | 
    
         
            +
                                    "#{ruby_executable}. If you know what you're doing, "\
         
     | 
| 
      
 625 
     | 
    
         
            +
                                    "delete the ruby_executable line in config.yml and try again"
         
     | 
| 
       521 
626 
     | 
    
         
             
                                end
         
     | 
| 
       522 
627 
     | 
    
         
             
                            else
         
     | 
| 
       523 
628 
     | 
    
         
             
                                config['ruby_executable'] = ruby_executable
         
     | 
| 
         @@ -576,18 +681,19 @@ def stage2(*vars) 
     | 
|
| 
       576 
681 
     | 
    
         
             
                            save_env_sh(*vars)
         
     | 
| 
       577 
682 
     | 
    
         
             
                            puts "running 'autoproj envsh' to generate a proper env.sh"
         
     | 
| 
       578 
683 
     | 
    
         
             
                            if !system(Gem.ruby, autoproj_path, 'envsh', *autoproj_options)
         
     | 
| 
       579 
     | 
    
         
            -
                                STDERR.puts "failed to run autoproj envsh on the newly installed  
     | 
| 
      
 684 
     | 
    
         
            +
                                STDERR.puts "failed to run autoproj envsh on the newly installed "\
         
     | 
| 
      
 685 
     | 
    
         
            +
                                    "autoproj (#{autoproj_path})"
         
     | 
| 
       580 
686 
     | 
    
         
             
                                exit 1
         
     | 
| 
       581 
687 
     | 
    
         
             
                            end
         
     | 
| 
       582 
688 
     | 
    
         
             
                            # This is really needed on an existing install to install the
         
     | 
| 
       583 
689 
     | 
    
         
             
                            # gems that were present in the v1 layout
         
     | 
| 
       584 
690 
     | 
    
         
             
                            puts "running 'autoproj osdeps' to re-install missing gems"
         
     | 
| 
       585 
691 
     | 
    
         
             
                            if !system(Gem.ruby, autoproj_path, 'osdeps')
         
     | 
| 
       586 
     | 
    
         
            -
                                STDERR.puts "failed to run autoproj osdeps on the newly installed  
     | 
| 
      
 692 
     | 
    
         
            +
                                STDERR.puts "failed to run autoproj osdeps on the newly installed "\
         
     | 
| 
      
 693 
     | 
    
         
            +
                                    "autoproj (#{autoproj_path})"
         
     | 
| 
       587 
694 
     | 
    
         
             
                                exit 1
         
     | 
| 
       588 
695 
     | 
    
         
             
                            end
         
     | 
| 
       589 
696 
     | 
    
         
             
                        end
         
     | 
| 
       590 
697 
     | 
    
         
             
                    end
         
     | 
| 
       591 
698 
     | 
    
         
             
                end
         
     | 
| 
       592 
699 
     | 
    
         
             
            end
         
     | 
| 
       593 
     | 
    
         
            -
             
     |