e2e: Add caching to git repositories
It's very expensive to create new repositories from scratch. To avoid this, a new repo & remotes are only created if necessary (depending on a cache key given on request). If not created, they are simply copied from a stored, clean repository / remote.
This commit is contained in:
@@ -1,8 +1,14 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
|
from helpers import *
|
||||||
|
|
||||||
|
|
||||||
def pytest_configure(config):
|
def pytest_configure(config):
|
||||||
os.environ["GIT_AUTHOR_NAME"] = "Example user"
|
os.environ["GIT_AUTHOR_NAME"] = "Example user"
|
||||||
os.environ["GIT_AUTHOR_EMAIL"] = "user@example.com"
|
os.environ["GIT_AUTHOR_EMAIL"] = "user@example.com"
|
||||||
os.environ["GIT_COMMITTER_NAME"] = "Example user"
|
os.environ["GIT_COMMITTER_NAME"] = "Example user"
|
||||||
os.environ["GIT_COMMITTER_EMAIL"] = "user@example.com"
|
os.environ["GIT_COMMITTER_EMAIL"] = "user@example.com"
|
||||||
|
|
||||||
|
|
||||||
|
def pytest_unconfigure(config):
|
||||||
|
pass
|
||||||
|
|||||||
@@ -5,12 +5,26 @@ import os.path
|
|||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import shutil
|
||||||
|
import inspect
|
||||||
|
|
||||||
import git
|
import git
|
||||||
|
|
||||||
binary = os.environ["GRM_BINARY"]
|
binary = os.environ["GRM_BINARY"]
|
||||||
|
|
||||||
|
|
||||||
|
def funcname():
|
||||||
|
return inspect.stack()[1][3]
|
||||||
|
|
||||||
|
|
||||||
|
def copytree(src, dest):
|
||||||
|
shutil.copytree(src, dest, dirs_exist_ok=True)
|
||||||
|
|
||||||
|
|
||||||
|
def get_temporary_directory(dir=None):
|
||||||
|
return tempfile.TemporaryDirectory(dir=dir)
|
||||||
|
|
||||||
|
|
||||||
def grm(args, cwd=None, is_invalid=False):
|
def grm(args, cwd=None, is_invalid=False):
|
||||||
cmd = subprocess.run([binary] + args, cwd=cwd, capture_output=True, text=True)
|
cmd = subprocess.run([binary] + args, cwd=cwd, capture_output=True, text=True)
|
||||||
if not is_invalid:
|
if not is_invalid:
|
||||||
@@ -116,78 +130,204 @@ def checksum_directory(path):
|
|||||||
class TempGitRepository:
|
class TempGitRepository:
|
||||||
def __init__(self, dir=None):
|
def __init__(self, dir=None):
|
||||||
self.dir = dir
|
self.dir = dir
|
||||||
pass
|
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.tmpdir = tempfile.TemporaryDirectory(dir=self.dir)
|
self.tmpdir = get_temporary_directory(self.dir)
|
||||||
self.remote_1_dir = tempfile.TemporaryDirectory()
|
self.remote_1 = get_temporary_directory()
|
||||||
self.remote_2_dir = tempfile.TemporaryDirectory()
|
self.remote_2 = get_temporary_directory()
|
||||||
shell(
|
cmd = f"""
|
||||||
f"""
|
|
||||||
cd {self.tmpdir.name}
|
cd {self.tmpdir.name}
|
||||||
git init
|
git -c init.defaultBranch=master init
|
||||||
echo test > root-commit
|
echo test > root-commit
|
||||||
git add root-commit
|
git add root-commit
|
||||||
git commit -m "root-commit"
|
git commit -m "root-commit"
|
||||||
git remote add origin file://{self.remote_1_dir.name}
|
git remote add origin file://{self.remote_1.name}
|
||||||
git remote add otherremote file://{self.remote_2_dir.name}
|
git remote add otherremote file://{self.remote_2.name}
|
||||||
"""
|
"""
|
||||||
)
|
|
||||||
|
shell(cmd)
|
||||||
return self.tmpdir.name
|
return self.tmpdir.name
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
del self.tmpdir
|
pass
|
||||||
del self.remote_1_dir
|
|
||||||
del self.remote_2_dir
|
|
||||||
|
class TempGitRemote:
|
||||||
|
obj = {}
|
||||||
|
|
||||||
|
def __init__(self, tmpdir, remoteid=None):
|
||||||
|
self.tmpdir = tmpdir
|
||||||
|
self.remoteid = remoteid
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls, cachekey=None, initfunc=None):
|
||||||
|
if cachekey is None:
|
||||||
|
tmpdir = get_temporary_directory()
|
||||||
|
shell(
|
||||||
|
f"""
|
||||||
|
cd {tmpdir.name}
|
||||||
|
git -c init.defaultBranch=master init --bare
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
newobj = cls(tmpdir)
|
||||||
|
remoteid = None
|
||||||
|
if initfunc is not None:
|
||||||
|
remoteid = newobj.init(initfunc)
|
||||||
|
newobj.remoteid = remoteid
|
||||||
|
return newobj, remoteid
|
||||||
|
else:
|
||||||
|
refresh = False
|
||||||
|
if cachekey not in cls.obj:
|
||||||
|
tmpdir = get_temporary_directory()
|
||||||
|
shell(
|
||||||
|
f"""
|
||||||
|
cd {tmpdir.name}
|
||||||
|
git -c init.defaultBranch=master init --bare
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
newobj = cls(tmpdir)
|
||||||
|
remoteid = newobj.init(initfunc)
|
||||||
|
newobj.remoteid = remoteid
|
||||||
|
cls.obj[cachekey] = newobj
|
||||||
|
return cls.clone(cls.obj[cachekey])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def clone(cls, source):
|
||||||
|
new_remote = get_temporary_directory()
|
||||||
|
copytree(source.tmpdir.name, new_remote.name)
|
||||||
|
return cls(new_remote, source.remoteid), source.remoteid
|
||||||
|
|
||||||
|
def init(self, func):
|
||||||
|
return func(self.tmpdir.name)
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self.tmpdir
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class TempGitRepositoryWorktree:
|
class TempGitRepositoryWorktree:
|
||||||
def __init__(self):
|
obj = {}
|
||||||
pass
|
|
||||||
|
def __init__(self, remotes, tmpdir, commit, remote1, remote2, remote1id, remote2id):
|
||||||
|
self.remotes = remotes
|
||||||
|
self.tmpdir = tmpdir
|
||||||
|
self.commit = commit
|
||||||
|
self.remote1 = remote1
|
||||||
|
self.remote2 = remote2
|
||||||
|
self.remote1id = remote1id
|
||||||
|
self.remote2id = remote2id
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls, cachekey, branch=None, remotes=2, basedir=None, remote_setup=None):
|
||||||
|
if cachekey not in cls.obj:
|
||||||
|
tmpdir = get_temporary_directory()
|
||||||
|
shell(
|
||||||
|
f"""
|
||||||
|
cd {tmpdir.name}
|
||||||
|
git -c init.defaultBranch=master init
|
||||||
|
echo test > root-commit-in-worktree-1
|
||||||
|
git add root-commit-in-worktree-1
|
||||||
|
git commit -m "root-commit-in-worktree-1"
|
||||||
|
echo test > root-commit-in-worktree-2
|
||||||
|
git add root-commit-in-worktree-2
|
||||||
|
git commit -m "root-commit-in-worktree-2"
|
||||||
|
|
||||||
|
git ls-files | xargs rm -rf
|
||||||
|
mv .git .git-main-working-tree
|
||||||
|
git --git-dir .git-main-working-tree config core.bare true
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
repo = git.Repo(f"{tmpdir.name}/.git-main-working-tree")
|
||||||
|
|
||||||
|
commit = repo.head.commit.hexsha
|
||||||
|
if branch is not None:
|
||||||
|
repo.create_head(branch)
|
||||||
|
|
||||||
|
remote1 = None
|
||||||
|
remote2 = None
|
||||||
|
remote1id = None
|
||||||
|
remote2id = None
|
||||||
|
|
||||||
|
if remotes >= 1:
|
||||||
|
cachekeyremote, initfunc = (remote_setup or ((None, None),))[0]
|
||||||
|
remote1, remote1id = TempGitRemote.get(
|
||||||
|
cachekey=cachekeyremote, initfunc=initfunc
|
||||||
|
)
|
||||||
|
remote1 = remote1
|
||||||
|
remote1id = remote1id
|
||||||
|
shell(
|
||||||
|
f"""
|
||||||
|
cd {tmpdir.name}
|
||||||
|
git --git-dir .git-main-working-tree remote add origin file://{remote1.tmpdir.name}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
repo.remotes.origin.fetch()
|
||||||
|
repo.remotes.origin.push("master")
|
||||||
|
|
||||||
|
if remotes >= 2:
|
||||||
|
cachekeyremote, initfunc = (remote_setup or (None, (None, None)))[1]
|
||||||
|
remote2, remote2id = TempGitRemote.get(
|
||||||
|
cachekey=cachekeyremote, initfunc=initfunc
|
||||||
|
)
|
||||||
|
remote2 = remote2
|
||||||
|
remote2id = remote2id
|
||||||
|
shell(
|
||||||
|
f"""
|
||||||
|
cd {tmpdir.name}
|
||||||
|
git --git-dir .git-main-working-tree remote add otherremote file://{remote2.tmpdir.name}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
repo.remotes.otherremote.fetch()
|
||||||
|
repo.remotes.otherremote.push("master")
|
||||||
|
|
||||||
|
cls.obj[cachekey] = cls(
|
||||||
|
remotes, tmpdir, commit, remote1, remote2, remote1id, remote2id
|
||||||
|
)
|
||||||
|
|
||||||
|
return cls.clone(cls.obj[cachekey], remote_setup=remote_setup)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def clone(cls, source, remote_setup):
|
||||||
|
newdir = get_temporary_directory()
|
||||||
|
|
||||||
|
copytree(source.tmpdir.name, newdir.name)
|
||||||
|
|
||||||
|
remote1 = None
|
||||||
|
remote2 = None
|
||||||
|
remote1id = None
|
||||||
|
remote2id = None
|
||||||
|
repo = git.Repo(os.path.join(newdir.name, ".git-main-working-tree"))
|
||||||
|
if source.remotes >= 1:
|
||||||
|
cachekey, initfunc = (remote_setup or ((None, None),))[0]
|
||||||
|
remote1, remote1id = TempGitRemote.get(cachekey=cachekey, initfunc=initfunc)
|
||||||
|
if remote1id != source.remote1id:
|
||||||
|
repo.remotes.origin.fetch()
|
||||||
|
repo.remotes.origin.push("master")
|
||||||
|
if source.remotes >= 2:
|
||||||
|
cachekey, initfunc = (remote_setup or (None, (None, None)))[1]
|
||||||
|
remote2, remote2id = TempGitRemote.get(cachekey=cachekey, initfunc=initfunc)
|
||||||
|
if remote2id != source.remote2id:
|
||||||
|
repo.remotes.otherremote.fetch()
|
||||||
|
repo.remotes.otherremote.push("master")
|
||||||
|
|
||||||
|
return cls(
|
||||||
|
source.remotes,
|
||||||
|
newdir,
|
||||||
|
source.commit,
|
||||||
|
remote1,
|
||||||
|
remote2,
|
||||||
|
remote1id,
|
||||||
|
remote2id,
|
||||||
|
)
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.tmpdir = tempfile.TemporaryDirectory()
|
return (self.tmpdir.name, self.commit)
|
||||||
self.remote_1_dir = tempfile.TemporaryDirectory()
|
|
||||||
self.remote_2_dir = tempfile.TemporaryDirectory()
|
|
||||||
shell(
|
|
||||||
f"""
|
|
||||||
cd {self.remote_1_dir.name}
|
|
||||||
git init --bare
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
shell(
|
|
||||||
f"""
|
|
||||||
cd {self.remote_2_dir.name}
|
|
||||||
git init --bare
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
shell(
|
|
||||||
f"""
|
|
||||||
cd {self.tmpdir.name}
|
|
||||||
git init
|
|
||||||
echo test > root-commit-in-worktree-1
|
|
||||||
git add root-commit-in-worktree-1
|
|
||||||
git commit -m "root-commit-in-worktree-1"
|
|
||||||
echo test > root-commit-in-worktree-2
|
|
||||||
git add root-commit-in-worktree-2
|
|
||||||
git commit -m "root-commit-in-worktree-2"
|
|
||||||
git remote add origin file://{self.remote_1_dir.name}
|
|
||||||
git remote add otherremote file://{self.remote_2_dir.name}
|
|
||||||
git push origin HEAD:master
|
|
||||||
git ls-files | xargs rm -rf
|
|
||||||
mv .git .git-main-working-tree
|
|
||||||
git --git-dir .git-main-working-tree config core.bare true
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
commit = git.Repo(
|
|
||||||
f"{self.tmpdir.name}/.git-main-working-tree"
|
|
||||||
).head.commit.hexsha
|
|
||||||
return (self.tmpdir.name, commit)
|
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
del self.tmpdir
|
pass
|
||||||
del self.remote_1_dir
|
|
||||||
del self.remote_2_dir
|
|
||||||
|
|
||||||
|
|
||||||
class RepoTree:
|
class RepoTree:
|
||||||
@@ -195,7 +335,7 @@ class RepoTree:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.root = tempfile.TemporaryDirectory()
|
self.root = get_temporary_directory()
|
||||||
self.config = tempfile.NamedTemporaryFile()
|
self.config = tempfile.NamedTemporaryFile()
|
||||||
with open(self.config.name, "w") as f:
|
with open(self.config.name, "w") as f:
|
||||||
f.write(
|
f.write(
|
||||||
@@ -226,7 +366,7 @@ class EmptyDir:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.tmpdir = tempfile.TemporaryDirectory()
|
self.tmpdir = get_temporary_directory()
|
||||||
return self.tmpdir.name
|
return self.tmpdir.name
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
@@ -238,7 +378,7 @@ class NonGitDir:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.tmpdir = tempfile.TemporaryDirectory()
|
self.tmpdir = get_temporary_directory()
|
||||||
shell(
|
shell(
|
||||||
f"""
|
f"""
|
||||||
cd {self.tmpdir.name}
|
cd {self.tmpdir.name}
|
||||||
@@ -258,7 +398,7 @@ class TempGitFileRemote:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
self.tmpdir = tempfile.TemporaryDirectory()
|
self.tmpdir = get_temporary_directory()
|
||||||
shell(
|
shell(
|
||||||
f"""
|
f"""
|
||||||
cd {self.tmpdir.name}
|
cd {self.tmpdir.name}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from helpers import *
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean():
|
def test_worktree_clean():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
assert "test" in os.listdir(base_dir)
|
assert "test" in os.listdir(base_dir)
|
||||||
@@ -17,7 +17,7 @@ def test_worktree_clean():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_refusal_no_tracking_branch():
|
def test_worktree_clean_refusal_no_tracking_branch():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ def test_worktree_clean_refusal_no_tracking_branch():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_refusal_uncommited_changes_new_file():
|
def test_worktree_clean_refusal_uncommited_changes_new_file():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ def test_worktree_clean_refusal_uncommited_changes_new_file():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_refusal_uncommited_changes_changed_file():
|
def test_worktree_clean_refusal_uncommited_changes_changed_file():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -63,7 +63,7 @@ def test_worktree_clean_refusal_uncommited_changes_changed_file():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_refusal_uncommited_changes_cleand_file():
|
def test_worktree_clean_refusal_uncommited_changes_cleand_file():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ def test_worktree_clean_refusal_uncommited_changes_cleand_file():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_refusal_commited_changes():
|
def test_worktree_clean_refusal_commited_changes():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ def test_worktree_clean_refusal_commited_changes():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_refusal_tracking_branch_mismatch():
|
def test_worktree_clean_refusal_tracking_branch_mismatch():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -117,7 +117,7 @@ def test_worktree_clean_refusal_tracking_branch_mismatch():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_fail_from_subdir():
|
def test_worktree_clean_fail_from_subdir():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ def test_worktree_clean_non_git():
|
|||||||
def test_worktree_clean_configured_default_branch(
|
def test_worktree_clean_configured_default_branch(
|
||||||
configure_default_branch, branch_list_empty
|
configure_default_branch, branch_list_empty
|
||||||
):
|
):
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
if configure_default_branch:
|
if configure_default_branch:
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
if branch_list_empty:
|
if branch_list_empty:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from helpers import *
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_never_clean_persistent_branches():
|
def test_worktree_never_clean_persistent_branches():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
f.write(
|
f.write(
|
||||||
"""
|
"""
|
||||||
@@ -33,7 +33,7 @@ def test_worktree_never_clean_persistent_branches():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_clean_branch_merged_into_persistent():
|
def test_worktree_clean_branch_merged_into_persistent():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
f.write(
|
f.write(
|
||||||
"""
|
"""
|
||||||
@@ -72,7 +72,7 @@ def test_worktree_clean_branch_merged_into_persistent():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_no_clean_unmerged_branch():
|
def test_worktree_no_clean_unmerged_branch():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
f.write(
|
f.write(
|
||||||
"""
|
"""
|
||||||
@@ -105,7 +105,7 @@ def test_worktree_no_clean_unmerged_branch():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_branch_merged_into_persistent():
|
def test_worktree_delete_branch_merged_into_persistent():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
f.write(
|
f.write(
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ def test_convert():
|
|||||||
|
|
||||||
|
|
||||||
def test_convert_already_worktree():
|
def test_convert_already_worktree():
|
||||||
with TempGitRepositoryWorktree() as (git_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (git_dir, _commit):
|
||||||
before = checksum_directory(git_dir)
|
before = checksum_directory(git_dir)
|
||||||
|
|
||||||
cmd = grm(["wt", "convert"], cwd=git_dir)
|
cmd = grm(["wt", "convert"], cwd=git_dir)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import git
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_fetch():
|
def test_worktree_fetch():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, root_commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, root_commit):
|
||||||
with TempGitFileRemote() as (remote_path, _remote_sha):
|
with TempGitFileRemote() as (remote_path, _remote_sha):
|
||||||
shell(
|
shell(
|
||||||
f"""
|
f"""
|
||||||
@@ -56,7 +56,7 @@ def test_worktree_fetch():
|
|||||||
@pytest.mark.parametrize("has_changes", [True, False])
|
@pytest.mark.parametrize("has_changes", [True, False])
|
||||||
@pytest.mark.parametrize("stash", [True, False])
|
@pytest.mark.parametrize("stash", [True, False])
|
||||||
def test_worktree_pull(rebase, ffable, has_changes, stash):
|
def test_worktree_pull(rebase, ffable, has_changes, stash):
|
||||||
with TempGitRepositoryWorktree() as (base_dir, root_commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, root_commit):
|
||||||
with TempGitFileRemote() as (remote_path, _remote_sha):
|
with TempGitFileRemote() as (remote_path, _remote_sha):
|
||||||
shell(
|
shell(
|
||||||
f"""
|
f"""
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import git
|
|||||||
@pytest.mark.parametrize("has_changes", [True, False])
|
@pytest.mark.parametrize("has_changes", [True, False])
|
||||||
@pytest.mark.parametrize("stash", [True, False])
|
@pytest.mark.parametrize("stash", [True, False])
|
||||||
def test_worktree_rebase(pull, rebase, ffable, has_changes, stash):
|
def test_worktree_rebase(pull, rebase, ffable, has_changes, stash):
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _root_commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _root_commit):
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
f.write('persistent_branches = ["mybasebranch"]')
|
f.write('persistent_branches = ["mybasebranch"]')
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import pytest
|
|||||||
|
|
||||||
@pytest.mark.parametrize("has_config", [True, False])
|
@pytest.mark.parametrize("has_config", [True, False])
|
||||||
def test_worktree_status(has_config):
|
def test_worktree_status(has_config):
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
if has_config:
|
if has_config:
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
f.write("")
|
f.write("")
|
||||||
@@ -24,7 +24,7 @@ def test_worktree_status(has_config):
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_status_fail_from_subdir():
|
def test_worktree_status_fail_from_subdir():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ def test_worktree_status_non_git():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_status_warn_with_non_worktree_dir():
|
def test_worktree_status_warn_with_non_worktree_dir():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ def test_worktree_add(
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_add_invalid_name():
|
def test_worktree_add_invalid_name():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
for worktree_name in ["/absolute/path" "trailingslash/"]:
|
for worktree_name in ["/absolute/path" "trailingslash/"]:
|
||||||
args = ["wt", "add", worktree_name]
|
args = ["wt", "add", worktree_name]
|
||||||
cmd = grm(args, cwd=base_dir)
|
cmd = grm(args, cwd=base_dir)
|
||||||
@@ -127,7 +127,7 @@ def test_worktree_add_into_invalid_subdirectory():
|
|||||||
def test_worktree_add_with_tracking(
|
def test_worktree_add_with_tracking(
|
||||||
remote_branch_already_exists, has_config, has_default, has_prefix
|
remote_branch_already_exists, has_config, has_default, has_prefix
|
||||||
):
|
):
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
if has_config:
|
if has_config:
|
||||||
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
with open(os.path.join(base_dir, "grm.toml"), "w") as f:
|
||||||
f.write(
|
f.write(
|
||||||
@@ -229,7 +229,7 @@ def test_worktree_add_with_explicit_no_tracking(
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete():
|
def test_worktree_delete():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
assert "test" in os.listdir(base_dir)
|
assert "test" in os.listdir(base_dir)
|
||||||
@@ -246,7 +246,7 @@ def test_worktree_delete():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_refusal_no_tracking_branch():
|
def test_worktree_delete_refusal_no_tracking_branch():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -262,7 +262,7 @@ def test_worktree_delete_refusal_no_tracking_branch():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_refusal_uncommited_changes_new_file():
|
def test_worktree_delete_refusal_uncommited_changes_new_file():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -280,7 +280,7 @@ def test_worktree_delete_refusal_uncommited_changes_new_file():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_refusal_uncommited_changes_changed_file():
|
def test_worktree_delete_refusal_uncommited_changes_changed_file():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -298,7 +298,7 @@ def test_worktree_delete_refusal_uncommited_changes_changed_file():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_refusal_uncommited_changes_deleted_file():
|
def test_worktree_delete_refusal_uncommited_changes_deleted_file():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -318,7 +318,7 @@ def test_worktree_delete_refusal_uncommited_changes_deleted_file():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_refusal_commited_changes():
|
def test_worktree_delete_refusal_commited_changes():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ def test_worktree_delete_refusal_commited_changes():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_refusal_tracking_branch_mismatch():
|
def test_worktree_delete_refusal_tracking_branch_mismatch():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -358,7 +358,7 @@ def test_worktree_delete_refusal_tracking_branch_mismatch():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_delete_force_refusal():
|
def test_worktree_delete_force_refusal():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
|
|
||||||
@@ -368,7 +368,7 @@ def test_worktree_delete_force_refusal():
|
|||||||
|
|
||||||
|
|
||||||
def test_worktree_add_delete_add():
|
def test_worktree_add_delete_add():
|
||||||
with TempGitRepositoryWorktree() as (base_dir, _commit):
|
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||||
assert cmd.returncode == 0
|
assert cmd.returncode == 0
|
||||||
assert "test" in os.listdir(base_dir)
|
assert "test" in os.listdir(base_dir)
|
||||||
|
|||||||
Reference in New Issue
Block a user