diff --git a/setup.cfg b/setup.cfg index 7055c0a..b43347d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -47,6 +47,10 @@ install_requires = console_scripts = weasel = weasel.cli:app +[tool:pytest] +markers = + issue: references specific issue + [mypy] ignore_missing_imports = True no_implicit_optional = True diff --git a/weasel/tests/cli/test_cli.py b/weasel/tests/cli/test_cli.py index 9e89534..79e1c81 100644 --- a/weasel/tests/cli/test_cli.py +++ b/weasel/tests/cli/test_cli.py @@ -6,7 +6,7 @@ from weasel.cli.remote_storage import RemoteStorage from weasel.schemas import ProjectConfigSchema, validate -from weasel.util import is_subpath_of, load_project_config, make_tempdir +from weasel.util import git_checkout, is_subpath_of, load_project_config, make_tempdir from weasel.util import validate_project_commands @@ -165,3 +165,28 @@ def test_local_remote_storage_pull_missing(): remote = RemoteStorage(d / "root", str(d / "remote")) assert remote.pull(filename, command_hash="aaaa") is None assert remote.pull(filename) is None + + +def test_project_git_dir_asset(): + with make_tempdir() as d: + # Use a very small repo. + git_checkout( + "https://github.com/explosion/os-signpost.git", + "os_signpost", + d / "signpost", + branch="v0.0.3", + ) + assert os.path.isdir(d / "signpost") + + +@pytest.mark.issue(66) +def test_project_git_file_asset(): + with make_tempdir() as d: + # Use a very small repo. + git_checkout( + "https://github.com/explosion/os-signpost.git", + "README.md", + d / "readme.md", + branch="v0.0.3", + ) + assert os.path.isfile(d / "readme.md") diff --git a/weasel/util/git.py b/weasel/util/git.py index d0a6ec3..401d73a 100644 --- a/weasel/util/git.py +++ b/weasel/util/git.py @@ -1,3 +1,4 @@ +import os import shutil from pathlib import Path from typing import Tuple @@ -41,7 +42,10 @@ def git_checkout( if not is_subpath_of(tmp_dir, source_path): err = f"'{subpath}' is a path outside of the cloned repository." msg.fail(err, repo, exits=1) - shutil.copytree(str(source_path), str(dest)) + if os.path.isdir(source_path): + shutil.copytree(source_path, dest) + else: + shutil.copyfile(source_path, dest) except FileNotFoundError: err = f"Can't clone {subpath}. Make sure the directory exists in the repo (branch '{branch}')" msg.fail(err, repo, exits=1)