Skip to content

Commit aa3ee0f

Browse files
committed
Construct relative req lines to match what pip install understands
Based on findings at #1329 (comment)
1 parent 6468e37 commit aa3ee0f

2 files changed

Lines changed: 15 additions & 6 deletions

File tree

piptools/utils.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,14 @@ def format_requirement(
154154
else:
155155
fragment = fragment_string(ireq)
156156
extras = f"[{','.join(sorted(ireq.extras))}]" if ireq.extras else ""
157-
delimiter = "#" if extras and not fragment else ""
157+
# pip install needs different relpath formats, depending on extras and fragments:
158+
# https://github.com/jazzband/pip-tools/pull/1329#issuecomment-1056409415
159+
if fragment or not extras:
160+
prefix = "file:"
161+
delimiter = ""
162+
else:
163+
prefix = ""
164+
delimiter = "#"
158165
if not from_dir:
159166
line = (
160167
f"-e {path_to_url(ireq.local_file_path)}{fragment}{delimiter}{extras}"
@@ -163,9 +170,9 @@ def format_requirement(
163170
)
164171
else:
165172
try:
166-
path_url = "file:" + os.path.relpath(
167-
ireq.local_file_path, from_dir
168-
).replace(os.path.sep, "/")
173+
relpath = os.path.relpath(ireq.local_file_path, from_dir).replace(
174+
os.path.sep, "/"
175+
)
169176
except ValueError:
170177
# On Windows, a relative path is not always possible (no common ancestor)
171178
line = (
@@ -174,7 +181,9 @@ def format_requirement(
174181
else _build_direct_reference_best_efforts(ireq)
175182
)
176183
else:
177-
line = f"{'-e ' if ireq.editable else ''}{path_url}{fragment}{delimiter}{extras}"
184+
if not prefix and not relpath.startswith("."):
185+
prefix = "./"
186+
line = f"{'-e ' if ireq.editable else ''}{prefix}{relpath}{fragment}{extras}"
178187

179188
if marker:
180189
line = f"{line} ; {marker}"

tests/test_cli_compile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ def test_local_file_uri_package(
671671
),
672672
pytest.param(
673673
"./small_fake_with_extras[dev,test]",
674-
"file:small_fake_with_extras#[dev,test]",
674+
"./small_fake_with_extras[dev,test]",
675675
id="relative path with extras",
676676
),
677677
pytest.param(

0 commit comments

Comments
 (0)