lib/autoproj/cli/update.rb in autoproj-2.0.0.rc38 vs lib/autoproj/cli/update.rb in autoproj-2.0.0.rc39

- old
+ new

@@ -3,87 +3,139 @@ require 'autoproj/ops/import' module Autoproj module CLI class Update < Base - def validate_options(packages, options) - packages, options = super + def validate_options(selection, options) + selection, options = super - if !options[:osdeps] - options[:osdeps_mode] = Array.new - end - if from = options[:from] options[:from] = Autoproj::InstallationManifest.from_workspace_root(options[:from]) end - ws.os_package_installer.filter_uptodate_packages = options[:osdeps_filter_uptodate] - if options[:aup] && !options[:all] && packages.empty? - packages = ['.'] + if options[:aup] && !options[:all] && selection.empty? + if Dir.pwd == ws.root_dir + options[:all] = true + else + selection = [Dir.pwd] + end end - if options[:force_reset] + if options.delete(:force_reset) options[:reset] = :force end if mainline = options[:mainline] if mainline == 'mainline' || mainline == 'true' options[:mainline] = true end end - return packages, options - end + has_explicit_selection = !selection.empty? + selection, config_selected = + normalize_command_line_package_selection(selection) - def run(selected_packages, options) - ws.manifest.accept_unavailable_osdeps = !options[:osdeps] - explicit_selection = !selected_packages.empty? - selected_packages, config_selected = - normalize_command_line_package_selection(selected_packages) - # Autoproj and configuration are updated only if (1) it is # explicitely selected or (2) nothing is explicitely selected update_autoproj = (options[:autoproj] || ( options[:autoproj] != false && - !explicit_selection && + !has_explicit_selection && !options[:config] && !options[:checkout_only]) ) update_config = (options[:config] || config_selected || ( options[:config] != false && - !explicit_selection && + !has_explicit_selection && !options[:autoproj])) update_packages = options[:all] || - (explicit_selection && !selected_packages.empty?) || - (!explicit_selection && !options[:config] && !options[:autoproj]) + (has_explicit_selection && !selection.empty?) || + (!has_explicit_selection && !options[:config] && !options[:autoproj]) - ws.setup - parallel = options[:parallel] || ws.config.parallel_import_level + options[:autoproj] = update_autoproj + options[:config] = update_config + options[:packages] = update_packages + return selection, options + end + def run(selected_packages, options) + ws.manifest.accept_unavailable_osdeps = !options[:osdeps] + + ws.setup ws.autodetect_operating_system(force: true) - if update_autoproj + if options[:autoproj] ws.update_autoproj end - ws.load_package_sets( - mainline: options[:mainline], - only_local: options[:only_local], - checkout_only: !update_config || options[:checkout_only], - reset: options[:reset], - ignore_errors: options[:keep_going], - retry_count: options[:retry_count]) - ws.config.save - if !update_packages - return [], [], true + begin + ws.load_package_sets( + mainline: options[:mainline], + only_local: options[:only_local], + checkout_only: !options[:config] || options[:checkout_only], + reset: options[:reset], + keep_going: options[:keep_going], + retry_count: options[:retry_count]) + rescue ImportFailed => configuration_import_failure + if !options[:keep_going] || !options[:packages] + raise + end + ensure + ws.config.save end + if !options[:packages] + return [], [], [] + end + + osdeps_options = normalize_osdeps_options( + checkout_only: options[:checkout_only], + osdeps_mode: options[:osdeps_mode], + osdeps: options[:osdeps], + osdeps_filter_uptodate: options[:osdeps_filter_uptodate]) + + command_line_selection, selected_packages = + finish_loading_configuration(selected_packages) + source_packages, osdep_packages, import_failure = + update_packages( + selected_packages, + osdeps: options[:osdeps], osdeps_options: osdeps_options, + from: options[:from], + checkout_only: options[:checkout_only], + only_local: options[:only_local], + reset: options[:reset], + deps: options[:deps], + keep_going: options[:keep_going], + parallel: options[:parallel] || ws.config.parallel_import_level, + retry_count: options[:retry_count]) + + ws.finalize_setup + ws.export_installation_manifest + + if options[:osdeps] && !osdep_packages.empty? + ws.install_os_packages(osdep_packages, **osdeps_options) + end + + ws.export_env_sh(source_packages) + Autoproj.message " updated #{ws.root_dir}/#{Autoproj::ENV_FILENAME}", :green + + if import_failure && configuration_import_failure + raise ImportFailed.new(configuration_import_failure.original_errors + import_failure.original_errors) + elsif import_failure + raise import_failure + elsif configuration_import_failure + raise configuration_import_failure + end + + return command_line_selection, source_packages, osdep_packages + end + + def finish_loading_configuration(selected_packages) ws.setup_all_package_directories # Call resolve_user_selection once to auto-add packages resolve_user_selection(selected_packages) # Now we can finalize and re-resolve the selection since the # overrides.rb files might have changed it @@ -96,43 +148,52 @@ if !selected_packages.empty? command_line_selection = resolved_selected_packages.dup else command_line_selection = Array.new end - selected_packages = resolved_selected_packages + return command_line_selection, resolved_selected_packages + end - if other_root = options[:from] - setup_update_from(other_root) + def normalize_osdeps_options( + checkout_only: false, osdeps: true, osdeps_mode: nil, + osdeps_filter_uptodate: true) + + osdeps_options = Hash[install_only: checkout_only] + if osdeps_mode + osdeps_options[:osdeps_mode] = osdeps_mode + elsif !osdeps + osdeps_options[:osdeps_mode] = Array.new end + ws.os_package_installer.filter_uptodate_packages = osdeps_filter_uptodate + osdeps_options + end - osdeps_options = Hash[install_only: options[:checkout_only]] - if options[:osdeps_mode] - osdeps_options[:osdeps_mode] = options[:osdeps_mode] + def update_packages(selected_packages, + from: nil, checkout_only: false, only_local: false, reset: false, + deps: true, keep_going: false, parallel: 1, + retry_count: 0, osdeps: true, osdeps_options: Hash.new) + + if from + setup_update_from(from) end ops = Autoproj::Ops::Import.new(ws) source_packages, osdep_packages = - ops.import_packages(selected_packages, - checkout_only: options[:checkout_only], - only_local: options[:only_local], - reset: options[:reset], - recursive: options[:deps], - ignore_errors: options[:keep_going], - parallel: parallel, - retry_count: options[:retry_count], - install_vcs_packages: (osdeps_options if options[:osdeps])) - - ws.finalize_setup - ws.export_installation_manifest - - if options[:osdeps] && !osdep_packages.empty? - ws.install_os_packages(osdep_packages, **osdeps_options) + ops.import_packages(selected_packages, + checkout_only: checkout_only, + only_local: only_local, + reset: reset, + recursive: deps, + keep_going: keep_going, + parallel: parallel, + retry_count: retry_count, + install_vcs_packages: (osdeps_options if osdeps)) + return source_packages, osdep_packages, nil + rescue PackageImportFailed => import_failure + if !keep_going + raise end - - ws.export_env_sh(source_packages) - Autoproj.message " updated #{ws.root_dir}/#{Autoproj::ENV_FILENAME}", :green - - return command_line_selection, source_packages, osdep_packages + return import_failure.source_packages, import_failure.osdep_packages, import_failure end def load_all_available_package_manifests # Load the manifest for packages that are already present on the # file system