diff --git a/news/2422.bugfix.md b/news/2422.bugfix.md new file mode 100644 index 0000000000..a470af4cbf --- /dev/null +++ b/news/2422.bugfix.md @@ -0,0 +1 @@ +Resolve `-r` requirements paths relative to the requirement file they are specified in \ No newline at end of file diff --git a/src/pdm/formats/requirements.py b/src/pdm/formats/requirements.py index 6f412a6ec2..a14aacfbe6 100644 --- a/src/pdm/formats/requirements.py +++ b/src/pdm/formats/requirements.py @@ -52,7 +52,7 @@ def _clean_line(self, line: str) -> str: return "" return line.split(" #", 1)[0].strip() - def _parse_line(self, line: str) -> None: + def _parse_line(self, filename: str, line: str) -> None: if not line.startswith("-"): # Starts with a requirement, just ignore all per-requirement options req_string = line.split(" -", 1)[0].strip() @@ -76,7 +76,8 @@ def _parse_line(self, line: str) -> None: if args.editable: self.requirements.append(parse_requirement(" ".join(args.editable), True)) if args.requirement: - self.parse(args.requirement) + referenced_requirements = str(Path(filename).parent.joinpath(args.requirement)) + self.parse(referenced_requirements) def parse(self, filename: str) -> None: with open(filename, encoding="utf-8") as f: @@ -86,10 +87,10 @@ def parse(self, filename: str) -> None: this_line += line[:-1].rstrip() + " " continue this_line += line - self._parse_line(this_line) + self._parse_line(filename, this_line) this_line = "" if this_line: - self._parse_line(this_line) + self._parse_line(filename, this_line) def check_fingerprint(project: Project, filename: PathLike) -> bool: diff --git a/src/pdm/installers/installers.py b/src/pdm/installers/installers.py index dfd86e0c2d..6bb97fa365 100644 --- a/src/pdm/installers/installers.py +++ b/src/pdm/installers/installers.py @@ -73,8 +73,7 @@ def _is_namespace_package(root: str) -> bool: def _create_symlinks_recursively(source: str, destination: str) -> Iterable[str]: - """Create symlinks recursively from source to destination. - Caveats: This don't work for pkgutil or pkg_resources namespace packages. + """Create symlinks recursively from source to destination. In the following ways: package <-- link __init__.py namespace_package <-- mkdir