From ecbab56a03de4bf37d82ac7c9681a5f1e58d7a2c Mon Sep 17 00:00:00 2001 From: gh271 Date: Fri, 10 Jan 2025 16:12:26 +0100 Subject: [PATCH] Add --all-shells flag to ensure_path (#1591) --- changelog.d/1585.feature.md | 1 + src/pipx/commands/ensure_path.py | 12 +++++++----- src/pipx/main.py | 7 ++++++- 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 changelog.d/1585.feature.md diff --git a/changelog.d/1585.feature.md b/changelog.d/1585.feature.md new file mode 100644 index 0000000000..7ee16a809c --- /dev/null +++ b/changelog.d/1585.feature.md @@ -0,0 +1 @@ +Add `--all-shells` flag to `pipx ensurepath`. diff --git a/src/pipx/commands/ensure_path.py b/src/pipx/commands/ensure_path.py index f8cdc1452b..4ec7826fdd 100644 --- a/src/pipx/commands/ensure_path.py +++ b/src/pipx/commands/ensure_path.py @@ -51,7 +51,7 @@ def get_pipx_user_bin_path() -> Optional[Path]: return pipx_bin_path -def ensure_path(location: Path, *, force: bool, prepend: bool = False) -> Tuple[bool, bool]: +def ensure_path(location: Path, *, force: bool, prepend: bool = False, all_shells: bool = False) -> Tuple[bool, bool]: """Ensure location is in user's PATH or add it to PATH. If prepend is True, location will be prepended to PATH, else appended. Returns True if location was added to PATH @@ -63,9 +63,9 @@ def ensure_path(location: Path, *, force: bool, prepend: bool = False) -> Tuple[ if force or (not in_current_path and not need_shell_restart): if prepend: - path_added = userpath.prepend(location_str, "pipx") + path_added = userpath.prepend(location_str, "pipx", all_shells=all_shells) else: - path_added = userpath.append(location_str, "pipx") + path_added = userpath.append(location_str, "pipx", all_shells=all_shells) if not path_added: print( pipx_wrap( @@ -100,7 +100,7 @@ def ensure_path(location: Path, *, force: bool, prepend: bool = False) -> Tuple[ return (path_added, need_shell_restart) -def ensure_pipx_paths(force: bool, prepend: bool = False) -> ExitCode: +def ensure_pipx_paths(force: bool, prepend: bool = False, all_shells: bool = False) -> ExitCode: """Returns pipx exit code.""" bin_paths = {paths.ctx.bin_dir} @@ -113,7 +113,9 @@ def ensure_pipx_paths(force: bool, prepend: bool = False) -> ExitCode: path_action_str = "prepended to" if prepend else "appended to" for bin_path in bin_paths: - (path_added_current, need_shell_restart_current) = ensure_path(bin_path, prepend=prepend, force=force) + (path_added_current, need_shell_restart_current) = ensure_path( + bin_path, prepend=prepend, force=force, all_shells=all_shells + ) path_added |= path_added_current need_shell_restart |= need_shell_restart_current diff --git a/src/pipx/main.py b/src/pipx/main.py index ab19fb6a74..f06e47c4e2 100644 --- a/src/pipx/main.py +++ b/src/pipx/main.py @@ -414,7 +414,7 @@ def run_pipx_command(args: argparse.Namespace, subparsers: Dict[str, argparse.Ar return commands.run_pip(package, venv_dir, args.pipargs, args.verbose) elif args.command == "ensurepath": try: - return commands.ensure_pipx_paths(prepend=args.prepend, force=args.force) + return commands.ensure_pipx_paths(prepend=args.prepend, force=args.force, all_shells=args.all_shells) except Exception as e: logger.debug("Uncaught Exception:", exc_info=True) raise PipxError(str(e), wrap_message=False) from None @@ -906,6 +906,11 @@ def _add_ensurepath(subparsers: argparse._SubParsersAction, shared_parser: argpa "PATH already contains paths to pipx and pipx-install apps." ), ) + p.add_argument( + "--all-shells", + action="store_true", + help=("Add directories to PATH in all shells instead of just the current one."), + ) def _add_environment(subparsers: argparse._SubParsersAction, shared_parser: argparse.ArgumentParser) -> None: