Skip to content

Commit

Permalink
new (vcs_dependency): add subdirectory property, format pep 508 strin…
Browse files Browse the repository at this point in the history
…g properly

new (poetry-schema): add subdirectory property to git-dependency
new (pip_installer): git repositories are cloned to a tmp folder, to be able to copy only subdirectory to dest
new (locker): write to and read from `poetry.lock` the subdirectory value
new (provider): take the subdirectory value into account when looking for packing
new (package): new property `source_subdirectory`
  • Loading branch information
finswimmer77@gmail.com authored and finswimmer77@gmail.com committed Jan 13, 2020
1 parent f797e17 commit abf7f04
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 8 deletions.
28 changes: 25 additions & 3 deletions poetry/installation/pip_installer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import shutil
import tempfile

from io import open
Expand All @@ -8,6 +9,7 @@
from clikit.io import NullIO

from poetry.repositories.pool import Pool
from poetry.utils._compat import Path
from poetry.utils._compat import encode
from poetry.utils.env import Env
from poetry.utils.helpers import safe_rmtree
Expand Down Expand Up @@ -233,19 +235,39 @@ def install_git(self, package):
from poetry.vcs import Git

src_dir = self._env.path / "src" / package.name
tmp_dir = Path(
tempfile.mkdtemp(
prefix="pypoetry-git-{}".format(
package.source_url.split("/")[-1].rstrip(".git")
)
)
)

if src_dir.exists():
safe_rmtree(str(src_dir))

if tmp_dir.exists():
safe_rmtree(str(tmp_dir))

src_dir.parent.mkdir(exist_ok=True)

git = Git()
git.clone(package.source_url, src_dir)
git.checkout(package.source_reference, src_dir)
try:
git = Git()
git.clone(package.source_url, tmp_dir)
git.checkout(package.source_reference, tmp_dir)

shutil.copytree(str(tmp_dir / package.source_subdirectory), str(src_dir))

except Exception:
raise
finally:
safe_rmtree(str(tmp_dir))

# Now we just need to install from the source directory
pkg = Package(package.name, package.version)
pkg.source_type = "directory"
pkg.source_url = str(src_dir)
pkg.develop = package.develop
pkg.source_subdirectory = package.source_subdirectory

self.install_directory(pkg)
4 changes: 4 additions & 0 deletions poetry/json/schemas/poetry-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,10 @@
"type": "string",
"description": "The revision to checkout."
},
"subdirectory": {
"type": "string",
"description": "path relative to repositories root, where package is located"
},
"python": {
"type": "string",
"description": "The python versions for which the dependency should be installed."
Expand Down
4 changes: 4 additions & 0 deletions poetry/packages/locker.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ def locked_repository(
package.source_type = info["source"].get("type", "")
package.source_url = info["source"]["url"]
package.source_reference = info["source"]["reference"]
package.source_subdirectory = info["source"].get("subdirectory", "")

packages.add_package(package)

Expand Down Expand Up @@ -307,4 +308,7 @@ def _dump_package(self, package): # type: (poetry.packages.Package) -> dict
if package.source_type == "directory":
data["develop"] = package.develop

if package.source_subdirectory:
data["source"]["subdirectory"] = package.source_subdirectory

return data
2 changes: 2 additions & 0 deletions poetry/packages/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ def __init__(self, name, version, pretty_version=None):
self.source_type = ""
self.source_reference = ""
self.source_url = ""
self.source_subdirectory = ""

self.requires = []
self.dev_requires = []
Expand Down Expand Up @@ -299,6 +300,7 @@ def add_dependency(
rev=constraint.get("rev", None),
category=category,
optional=optional,
subdirectory=constraint.get("subdirectory", None),
)
elif "file" in constraint:
file_path = Path(constraint["file"])
Expand Down
12 changes: 10 additions & 2 deletions poetry/packages/vcs_dependency.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
from poetry.vcs import git

from .dependency import Dependency


Expand All @@ -16,7 +14,9 @@ def __init__(
branch=None,
tag=None,
rev=None,
optional=False,
category="main",
subdirectory=None,
optional=False,
):
self._vcs = vcs
Expand All @@ -29,6 +29,7 @@ def __init__(
self._branch = branch
self._tag = tag
self._rev = rev
self._subdirectory = subdirectory

super(VCSDependency, self).__init__(
name, "*", category=category, optional=optional, allows_prereleases=True
Expand All @@ -54,6 +55,10 @@ def tag(self):
def rev(self):
return self._rev

@property
def subdirectory(self):
return self._subdirectory

@property
def reference(self): # type: () -> str
return self._branch or self._tag or self._rev
Expand Down Expand Up @@ -87,6 +92,9 @@ def base_pep_508_name(self): # type: () -> str
self._vcs, parsed_url.format(), self.reference
)

if self.subdirectory:
requirement += "#subdirectory={}".format(self.subdirectory)

return requirement

def is_vcs(self): # type: () -> bool
Expand Down
13 changes: 10 additions & 3 deletions poetry/puzzle/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ def search_for_vcs(self, dependency): # type: (VCSDependency) -> List[Package]
dependency.source,
dependency.reference,
name=dependency.name,
subdirectory=dependency.subdirectory,
)

for extra in dependency.extras:
Expand All @@ -182,8 +183,8 @@ def search_for_vcs(self, dependency): # type: (VCSDependency) -> List[Package]

@classmethod
def get_package_from_vcs(
cls, vcs, url, reference=None, name=None
): # type: (str, str, Optional[str], Optional[str]) -> Package
cls, vcs, url, reference=None, name=None, subdirectory=None
): # type: (str, str, Optional[str], Optional[str], Optional[str]) -> Package
if vcs != "git":
raise ValueError("Unsupported VCS dependency {}".format(vcs))

Expand All @@ -201,7 +202,13 @@ def get_package_from_vcs(

revision = git.rev_parse(reference, tmp_dir).strip()

package = cls.get_package_from_directory(tmp_dir, name=name)
if subdirectory is None:
package = cls.get_package_from_directory(tmp_dir, name=name)
else:
package = cls.get_package_from_directory(
tmp_dir / subdirectory, name=name
)
package.source_subdirectory = Path(subdirectory).as_posix()

package.source_type = "git"
package.source_url = url
Expand Down

0 comments on commit abf7f04

Please sign in to comment.