lib/autoproj/cli/exec.rb in autoproj-2.14.0 vs lib/autoproj/cli/exec.rb in autoproj-2.15.0

- old
+ new

@@ -1,59 +1,99 @@ -require 'autoproj/find_workspace' -require 'autoproj/ops/cached_env' -require 'autoproj/ops/which' -require 'autoproj/ops/watch' +require "autoproj/find_workspace" +require "autoproj/ops/cached_env" +require "autoproj/ops/which" +require "autoproj/ops/watch" module Autoproj module CLI class Exec def initialize @root_dir = Autoproj.find_workspace_dir unless @root_dir - require 'autoproj/workspace' + require "autoproj/workspace" # Will do all sorts of error reporting, # or may be able to resolve @root_dir = Workspace.default.root_dir end end def load_cached_env env = Ops.load_cached_env(@root_dir) return unless env - Autobuild::Environment. - environment_from_export(env, ENV) + Autobuild::Environment + .environment_from_export(env, ENV) end - def run(cmd, *args, use_cached_env: Ops.watch_running?(@root_dir)) + def try_loading_installation_manifest + Autoproj::InstallationManifest.from_workspace_root(@root_dir) + rescue + end + + PACKAGE_ROOT_PATH_RX = /^(srcdir|builddir|prefix):(.*)$/ + + def resolve_package_root_path(package, manifest) + if (m = PACKAGE_ROOT_PATH_RX.match(package)) + kind = m[1] + name = m[2] + else + kind = "srcdir" + name = package + end + + unless (pkg = manifest.find_package_by_name(name)) + raise ArgumentError, "no package #{name} in this workspace" + end + + unless (dir = pkg.send(kind)) + raise CLIInvalidArguments, "package #{pkg.name} has no #{kind}" + end + + dir + end + + def run( + cmd, *args, + use_cached_env: Ops.watch_running?(@root_dir), + interactive: nil, + package: nil, chdir: nil + ) env = load_cached_env if use_cached_env + manifest = try_loading_installation_manifest if use_cached_env - unless env - require 'autoproj' - require 'autoproj/cli/inspection_tool' + if !env || (package && !manifest) + require "autoproj" + require "autoproj/cli/inspection_tool" ws = Workspace.from_dir(@root_dir) + ws.config.interactive = interactive unless interactive.nil? loader = InspectionTool.new(ws) - loader.initialize_and_load - loader.finalize_setup(Array.new) + loader.initialize_and_load(read_only: true) + loader.finalize_setup(read_only: true) env = ws.full_env.resolved_env + manifest = ws.installation_manifest if package end - path = env['PATH'].split(File::PATH_SEPARATOR) + root_path = resolve_package_root_path(package, manifest) if package + chdir ||= root_path + if chdir + chdir = File.expand_path(chdir, root_path) + chdir_kw = { chdir: chdir } + end + + path = env["PATH"].split(File::PATH_SEPARATOR) program = - begin Ops.which(cmd, path_entries: path) + begin Ops.which(cmd, path_entries: [chdir, *path].compact) rescue ::Exception => e - require 'autoproj' + require "autoproj" raise CLIInvalidArguments, e.message, e.backtrace end begin - ::Process.exec(env, program, *args) + ::Process.exec(env, program, *args, **(chdir_kw || {})) rescue ::Exception => e - require 'autoproj' + require "autoproj" raise CLIInvalidArguments, e.message, e.backtrace end end end end end - -