Skip to content

Commit 5d191f6

Browse files
Fix inject --force reinstall behavior (#1833)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 87e6e0c commit 5d191f6

4 files changed

Lines changed: 30 additions & 1 deletion

File tree

changelog.d/1545.bugfix.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Ensure `pipx inject --force` reinstalls injected packages without persisting the force-reinstall option in package
2+
metadata.

src/pipx/commands/inject.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ def inject_dep(
9797
package_name=package_name,
9898
package_or_url=package_spec,
9999
pip_args=pip_args,
100+
install_only_pip_args=["--force-reinstall"] if force else None,
100101
include_dependencies=include_dependencies,
101102
include_apps=include_apps,
102103
is_main_package=False,

src/pipx/venv.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,20 +324,22 @@ def install_package(
324324
include_apps: bool,
325325
is_main_package: bool,
326326
suffix: str = "",
327+
install_only_pip_args: list[str] | None = None,
327328
) -> None:
328329
# package_name in package specifier can mismatch URL due to user error
329330
package_or_url = fix_package_name(package_or_url, package_name)
330331

331332
# check syntax and clean up spec and pip_args
332333
(package_or_url, pip_args) = parse_specifier_for_install(package_or_url, pip_args)
334+
install_pip_args = [*(install_only_pip_args or []), *pip_args]
333335

334336
_LOGGER.info("Installing %s", package_descr := full_package_description(package_name, package_or_url))
335337
with animate(f"installing {package_descr}", self.do_animation):
336338
process = self.backend.install(
337339
venv_root=self.root,
338340
venv_python=self.python_path,
339341
requirements=[package_or_url],
340-
pip_args=pip_args,
342+
pip_args=install_pip_args,
341343
verbose=self.verbose,
342344
)
343345
if process.returncode:

tests/test_inject.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
from helpers import PIPX_METADATA_LEGACY_VERSIONS, mock_legacy_venv, run_pipx_cli, skip_if_windows
88
from package_info import PKG
9+
from pipx import paths
10+
from pipx.pipx_metadata_file import PipxMetadata
911

1012

1113
# Note that this also checks that packages used in other tests can be injected individually
@@ -113,3 +115,25 @@ def test_inject_with_req_file(pipx_temp_env, capsys, caplog, tmp_path, with_pack
113115
captured = capsys.readouterr()
114116
injected = re.findall(r"injected package (.+?) into venv pycowsay", captured.out)
115117
assert set(injected) == {pkg for pkg, _ in packages}
118+
119+
120+
def test_force_inject_reinstalls_without_storing_force(pipx_temp_env, caplog):
121+
assert not run_pipx_cli(["install", "pycowsay"])
122+
assert not run_pipx_cli(["inject", "pycowsay", PKG["black"]["spec"], "--pip-args=--no-cache-dir"])
123+
124+
caplog.clear()
125+
assert not run_pipx_cli(
126+
[
127+
"inject",
128+
"pycowsay",
129+
PKG["black"]["spec"],
130+
"--force",
131+
"--verbose",
132+
"--pip-args=--no-cache-dir",
133+
]
134+
)
135+
136+
assert "--force-reinstall" in caplog.text
137+
138+
metadata = PipxMetadata(paths.ctx.venvs / "pycowsay")
139+
assert metadata.injected_packages["black"].pip_args == ["--no-cache-dir"]

0 commit comments

Comments
 (0)