Skip to content

Commit

Permalink
Windows fixes
Browse files Browse the repository at this point in the history
- Ignore errors when executing `shutil.rmtree()`, because it seems like it's common to fail when deleting git repos on Windows, and since these are temp files, we don't really care that much there's garbage left. Any good OS should clean the temp folders automatically.
- Always find Jinja templates in `PosixPath` mode.
- Ignore `OSError` when trying to enter a possibly git root directory. This is yielded by Windows when the path is a URL and we don't really care about it.
- Fix some tests with non-windows haradcoded stuff.
- Fix a test that was using a Bash script. Modified to be Python, which should work fine cross-system.
- Do not modify EOL in CI.
- Use python executable in tests instead of python3.
- Update pre-commit versions to include pre-commit/pre-commit-hooks#509.
  • Loading branch information
Jairo Llopis committed Aug 3, 2020
1 parent 7da0d74 commit ee1d957
Show file tree
Hide file tree
Showing 13 changed files with 43 additions and 30 deletions.
8 changes: 8 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ on:
branches: [master]
release:
types: [created]
env:
LANG: "en_US.utf-8"
LC_ALL: "en_US.utf-8"
PYTHONIOENCODING: "UTF-8"

jobs:
build:
Expand Down Expand Up @@ -45,6 +49,10 @@ jobs:
shell: bash
- run: git config --global user.email copier@copier
shell: bash
- run: git config --global core.autocrlf false
shell: bash
- run: git config --global core.eol lf
shell: bash
- run: python -m pip install poetry poetry-dynamic-versioning
shell: bash
- run: poetry install
Expand Down
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ repos:

# isorting our imports
- repo: https://github.com/timothycrosley/isort
rev: 4.3.21
rev: 5.2.2
hooks:
- id: isort
additional_dependencies:
Expand All @@ -52,7 +52,7 @@ repos:
# miscellaneous hooks
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.1.0
rev: v3.2.0
hooks:
- id: check-added-large-files
- id: check-ast
Expand Down
2 changes: 1 addition & 1 deletion copier/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ def copy(
raise
finally:
if is_update:
shutil.rmtree(conf.src_path)
shutil.rmtree(conf.src_path, ignore_errors=True)


def copy_local(conf: ConfigData) -> None:
Expand Down
6 changes: 2 additions & 4 deletions copier/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,8 @@ def __init__(self, conf: ConfigData) -> None:
)

def __call__(self, fullpath: StrOrPath) -> str:
relpath = (
str(fullpath).replace(str(self.conf.src_path), "", 1).lstrip(os.path.sep)
)
tmpl = self.env.get_template(relpath)
relpath = Path(fullpath).relative_to(self.conf.src_path).as_posix()
tmpl = self.env.get_template(str(relpath))
return tmpl.render(**self.data)

def string(self, string: StrOrPath) -> str:
Expand Down
6 changes: 2 additions & 4 deletions copier/vcs.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import re
import shutil
import tempfile
from pathlib import Path

Expand All @@ -25,8 +24,8 @@ def is_git_repo_root(path: Path) -> bool:
"""Indicate if a given path is a git repo root directory."""
try:
with local.cwd(path / ".git"):
return bool(git("rev-parse", "--is-inside-git-dir") == "true\n")
except (FileNotFoundError, NotADirectoryError):
return bool(git("rev-parse", "--is-inside-git-dir").strip() == "true")
except OSError:
return False


Expand Down Expand Up @@ -72,7 +71,6 @@ def checkout_latest_tag(local_repo: StrOrPath) -> str:

def clone(url: str, ref: str = "HEAD") -> str:
location = tempfile.mkdtemp(prefix=f"{__name__}.clone.")
shutil.rmtree(location) # Path must not exist
git("clone", "--no-checkout", url, location)
with local.cwd(location):
git("checkout", ref)
Expand Down
6 changes: 3 additions & 3 deletions tests/demo_migrations/copier.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
_exclude:
- tasks.sh
- tasks.py
- migrations.py
- .git

_tasks:
- "[[ _copier_conf.src_path / 'tasks.sh' ]] 1"
- ["[[ _copier_conf.src_path / 'tasks.sh' ]]", 2]
- "python [[ _copier_conf.src_path / 'tasks.py' ]] 1"
- [python, "[[ _copier_conf.src_path / 'tasks.py' ]]", 2]

_migrations:
# This migration is never executed because it's the 1st version copied, and
Expand Down
2 changes: 1 addition & 1 deletion tests/demo_migrations/migrations.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env python
import json
import os
import sys
Expand Down
13 changes: 13 additions & 0 deletions tests/demo_migrations/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env python
import os
import os.path
import sys
from contextlib import suppress

from plumbum.cmd import git

with open("created-with-tasks.txt", "a", newline="\n") as cwt:
cwt.write(" ".join([os.environ["STAGE"]] + sys.argv[1:]) + "\n")
git("init")
with suppress(FileNotFoundError):
os.unlink("delete-in-tasks.txt")
4 changes: 0 additions & 4 deletions tests/demo_migrations/tasks.sh

This file was deleted.

6 changes: 3 additions & 3 deletions tests/test_config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import re
from pathlib import Path

import pytest
Expand Down Expand Up @@ -45,11 +44,12 @@ def test_read_data(tmp_path, template):


def test_invalid_yaml(capsys):
conf_path = Path("tests/demo_invalid/copier.yml")
conf_path = Path("tests", "demo_invalid", "copier.yml")
with pytest.raises(InvalidConfigFileError):
load_yaml_data(conf_path)
out, _ = capsys.readouterr()
assert re.search(r"INVALID.*tests/demo_invalid/copier\.yml", out)
assert "INVALID CONFIG FILE" in out
assert str(conf_path) in out


@pytest.mark.parametrize(
Expand Down
6 changes: 3 additions & 3 deletions tests/test_migrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def test_migrations_and_tasks(tmpdir: py.path.local):
assert not (tmp_path / "delete-in-tasks.txt").exists()
assert (tmp_path / "delete-in-migration-v2.txt").isfile()
assert not (tmp_path / "migrations.py").exists()
assert not (tmp_path / "tasks.sh").exists()
assert not (tmp_path / "tasks.py").exists()
assert not glob(str(tmp_path / "*-before.txt"))
assert not glob(str(tmp_path / "*-after.txt"))
answers = yaml.safe_load((tmp_path / ".copier-answers.yml").read())
Expand All @@ -53,7 +53,7 @@ def test_migrations_and_tasks(tmpdir: py.path.local):
assert not (tmp_path / "delete-in-tasks.txt").exists()
assert not (tmp_path / "delete-in-migration-v2.txt").exists()
assert not (tmp_path / "migrations.py").exists()
assert not (tmp_path / "tasks.sh").exists()
assert not (tmp_path / "tasks.py").exists()
assert (tmp_path / "v1.0.0-v2-v2.0-before.json").isfile()
assert (tmp_path / "v1.0.0-v2-v2.0-after.json").isfile()
answers = yaml.safe_load((tmp_path / ".copier-answers.yml").read())
Expand Down Expand Up @@ -100,7 +100,7 @@ def test_pre_migration_modifies_answers(tmp_path_factory):
_migrations:
- version: v2
before:
- - python3
- - python
- -c
- |
import sys, yaml, pathlib
Expand Down
8 changes: 4 additions & 4 deletions tests/test_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ def test_output(capsys, tmp_path):
out, _ = capsys.readouterr()
assert re.search(r"create[^\s]* config\.py", out)
assert re.search(r"create[^\s]* pyproject\.toml", out)
assert re.search(r"create[^\s]* doc/images/nslogo\.gif", out)
assert re.search(r"create[^\s]* doc[/\\]images[/\\]nslogo\.gif", out)


def test_output_pretend(capsys, tmp_path):
render(tmp_path, quiet=False, pretend=True)
out, _ = capsys.readouterr()
assert re.search(r"create[^\s]* config\.py", out)
assert re.search(r"create[^\s]* pyproject\.toml", out)
assert re.search(r"create[^\s]* doc/images/nslogo\.gif", out)
assert re.search(r"create[^\s]* doc[/\\]images[/\\]nslogo\.gif", out)


def test_output_force(capsys, tmp_path):
Expand All @@ -27,7 +27,7 @@ def test_output_force(capsys, tmp_path):
assert re.search(r"conflict[^\s]* config\.py", out)
assert re.search(r"force[^\s]* config\.py", out)
assert re.search(r"identical[^\s]* pyproject\.toml", out)
assert re.search(r"identical[^\s]* doc/images/nslogo\.gif", out)
assert re.search(r"identical[^\s]* doc[/\\]images[/\\]nslogo\.gif", out)


def test_output_skip(capsys, tmp_path):
Expand All @@ -38,7 +38,7 @@ def test_output_skip(capsys, tmp_path):
assert re.search(r"conflict[^\s]* config\.py", out)
assert re.search(r"skip[^\s]* config\.py", out)
assert re.search(r"identical[^\s]* pyproject\.toml", out)
assert re.search(r"identical[^\s]* doc/images/nslogo\.gif", out)
assert re.search(r"identical[^\s]* doc[/\\]images[/\\]nslogo\.gif", out)


def test_output_quiet(capsys, tmp_path):
Expand Down
2 changes: 1 addition & 1 deletion tests/test_vcs.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,4 @@ def test_clone():
tmp = vcs.clone("https://github.com/copier-org/copier.git")
assert tmp
assert exists(join(tmp, "README.md"))
shutil.rmtree(tmp)
shutil.rmtree(tmp, ignore_errors=True)

0 comments on commit ee1d957

Please sign in to comment.