From cdc5c68155a5d4dab9ee1a82e56c3684debf4388 Mon Sep 17 00:00:00 2001 From: Ashwin Nair Date: Sun, 29 May 2022 11:22:59 +0400 Subject: [PATCH] Add support for subdirectories in git urls --- src/poetry/installation/executor.py | 5 +++ .../subdirectories/one-copy/one/__init__.py | 0 .../subdirectories/one-copy/pyproject.toml | 4 +++ .../demo/subdirectories/one/one/__init__.py | 0 .../demo/subdirectories/one/pyproject.toml | 4 +++ .../demo/subdirectories/two/pyproject.toml | 4 +++ .../demo/subdirectories/two/two/__init__.py | 0 tests/installation/test_executor.py | 34 +++++++++++++++++++ 8 files changed, 51 insertions(+) create mode 100644 tests/fixtures/git/github.com/demo/subdirectories/one-copy/one/__init__.py create mode 100644 tests/fixtures/git/github.com/demo/subdirectories/one/one/__init__.py create mode 100644 tests/fixtures/git/github.com/demo/subdirectories/two/two/__init__.py diff --git a/src/poetry/installation/executor.py b/src/poetry/installation/executor.py index fadd1bc2e92..c582b0d9ea7 100644 --- a/src/poetry/installation/executor.py +++ b/src/poetry/installation/executor.py @@ -535,6 +535,9 @@ def _install_directory(self, operation: Install | Update) -> int: else: req = Path(package.source_url).resolve(strict=False) + if package.source_subdirectory: + req /= package.source_subdirectory + pyproject = PyProjectTOML(os.path.join(req, "pyproject.toml")) if pyproject.is_poetry_project(): @@ -762,6 +765,8 @@ def _create_git_url_reference(self, package: Package) -> dict[str, Any]: "commit_id": package.source_resolved_reference, }, } + if package.source_subdirectory: + reference["subdirectory"] = package.source_subdirectory return reference diff --git a/tests/fixtures/git/github.com/demo/subdirectories/one-copy/one/__init__.py b/tests/fixtures/git/github.com/demo/subdirectories/one-copy/one/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/fixtures/git/github.com/demo/subdirectories/one-copy/pyproject.toml b/tests/fixtures/git/github.com/demo/subdirectories/one-copy/pyproject.toml index 39265efe4a3..1548c3a33a1 100644 --- a/tests/fixtures/git/github.com/demo/subdirectories/one-copy/pyproject.toml +++ b/tests/fixtures/git/github.com/demo/subdirectories/one-copy/pyproject.toml @@ -7,3 +7,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.7" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/tests/fixtures/git/github.com/demo/subdirectories/one/one/__init__.py b/tests/fixtures/git/github.com/demo/subdirectories/one/one/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/fixtures/git/github.com/demo/subdirectories/one/pyproject.toml b/tests/fixtures/git/github.com/demo/subdirectories/one/pyproject.toml index 39265efe4a3..1548c3a33a1 100644 --- a/tests/fixtures/git/github.com/demo/subdirectories/one/pyproject.toml +++ b/tests/fixtures/git/github.com/demo/subdirectories/one/pyproject.toml @@ -7,3 +7,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.7" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/tests/fixtures/git/github.com/demo/subdirectories/two/pyproject.toml b/tests/fixtures/git/github.com/demo/subdirectories/two/pyproject.toml index da13d8cdc58..6a54d8938ff 100644 --- a/tests/fixtures/git/github.com/demo/subdirectories/two/pyproject.toml +++ b/tests/fixtures/git/github.com/demo/subdirectories/two/pyproject.toml @@ -7,3 +7,7 @@ license = "MIT" [tool.poetry.dependencies] python = "~2.7 || ^3.4" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/tests/fixtures/git/github.com/demo/subdirectories/two/two/__init__.py b/tests/fixtures/git/github.com/demo/subdirectories/two/two/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/installation/test_executor.py b/tests/installation/test_executor.py index 6d67c36770f..7f60905a33c 100644 --- a/tests/installation/test_executor.py +++ b/tests/installation/test_executor.py @@ -553,6 +553,40 @@ def test_executor_should_write_pep610_url_references_for_git( ) +def test_executor_should_write_pep610_url_references_for_git_with_subdirectories( + tmp_venv: VirtualEnv, + pool: Pool, + config: Config, + io: BufferedIO, + mock_file_downloads: None, +): + package = Package( + "two", + "2.0.0", + source_type="git", + source_reference="master", + source_resolved_reference="123456", + source_url="https://github.com/demo/subdirectories.git", + source_subdirectory="two", + ) + + executor = Executor(tmp_venv, pool, config, io) + executor.execute([Install(package)]) + verify_installed_distribution( + tmp_venv, + package, + { + "vcs_info": { + "vcs": "git", + "requested_revision": "master", + "commit_id": "123456", + }, + "url": package.source_url, + "subdirectory": package.source_subdirectory, + }, + ) + + def test_executor_should_use_cached_link_and_hash( tmp_venv: VirtualEnv, pool: Pool,