9 Commits

7 changed files with 43 additions and 88 deletions

2
Cargo.lock generated
View File

@@ -332,7 +332,7 @@ dependencies = [
[[package]] [[package]]
name = "git-repo-manager" name = "git-repo-manager"
version = "0.7.4" version = "0.7.5"
dependencies = [ dependencies = [
"clap", "clap",
"comfy-table", "comfy-table",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "git-repo-manager" name = "git-repo-manager"
version = "0.7.4" version = "0.7.5"
edition = "2021" edition = "2021"
authors = [ authors = [

View File

@@ -80,3 +80,6 @@ update-cargo-dependencies:
&& . ./venv/bin/activate \ && . ./venv/bin/activate \
&& pip --disable-pip-version-check install -r ./requirements.txt > /dev/null \ && pip --disable-pip-version-check install -r ./requirements.txt > /dev/null \
&& ./update-cargo-dependencies.py && ./update-cargo-dependencies.py
wait:
read -p "[ENTER] to continue "

View File

@@ -5,7 +5,7 @@ remotes and then run `./release (major|minor|patch)`. It will handle a
git-flow-y release, meaning that it will perform a merge from `develop` to git-flow-y release, meaning that it will perform a merge from `develop` to
`master`, create a git tag, sync all remotes and run `cargo publish`. `master`, create a git tag, sync all remotes and run `cargo publish`.
The release script will also run `just check` to make sure that nothing it Make sure to run `just check` before releasing to make sure that nothing is
broken. broken.
As GRM is still `v0.x`, there is not much consideration for backwards As GRM is still `v0.x`, there is not much consideration for backwards
@@ -17,7 +17,7 @@ dependencies](./dependency_updates.md). As `./release.sh patch` is exposed as a
Justfile target (`release-patch`), it's possible to do both in one step: Justfile target (`release-patch`), it's possible to do both in one step:
```bash ```bash
$ just update-dependencies release-patch $ just update-dependencies check release-patch
``` ```
## Release notes ## Release notes

View File

@@ -581,6 +581,7 @@ def test_worktree_delete():
cmd = grm(["wt", "delete", "test"], cwd=base_dir) cmd = grm(["wt", "delete", "test"], cwd=base_dir)
assert cmd.returncode == 0 assert cmd.returncode == 0
assert len(cmd.stdout.strip().split("\n")) == 1
assert "test" not in os.listdir(base_dir) assert "test" not in os.listdir(base_dir)
cmd = grm(["wt", "add", "check"], cwd=base_dir) cmd = grm(["wt", "add", "check"], cwd=base_dir)
@@ -607,6 +608,7 @@ def test_worktree_delete_in_subfolder(has_other_worktree):
cmd = grm(["wt", "delete", "dir/test"], cwd=base_dir) cmd = grm(["wt", "delete", "dir/test"], cwd=base_dir)
assert cmd.returncode == 0 assert cmd.returncode == 0
assert len(cmd.stdout.strip().split("\n")) == 1
if has_other_worktree is True: if has_other_worktree is True:
assert {"test2"} == set(os.listdir(os.path.join(base_dir, "dir"))) assert {"test2"} == set(os.listdir(os.path.join(base_dir, "dir")))
else: else:
@@ -621,6 +623,7 @@ def test_worktree_delete_refusal_no_tracking_branch():
before = checksum_directory(f"{base_dir}/test") before = checksum_directory(f"{base_dir}/test")
cmd = grm(["wt", "delete", "test"], cwd=base_dir) cmd = grm(["wt", "delete", "test"], cwd=base_dir)
assert cmd.returncode != 0 assert cmd.returncode != 0
assert len(cmd.stdout) == 0
stderr = cmd.stderr.lower() stderr = cmd.stderr.lower()
assert "refuse" in stderr or "refusing" in stderr assert "refuse" in stderr or "refusing" in stderr
assert "test" in os.listdir(base_dir) assert "test" in os.listdir(base_dir)
@@ -629,94 +632,45 @@ def test_worktree_delete_refusal_no_tracking_branch():
assert before == after assert before == after
def test_worktree_delete_refusal_uncommited_changes_new_file(): @pytest.mark.parametrize(
"reason",
(
"new_file",
"changed_file",
"deleted_file",
"new_commit",
"tracking_branch_mismatch",
),
)
def test_worktree_delete_refusal(reason):
with TempGitRepositoryWorktree.get(funcname()) 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
if reason == "new_file":
shell(f"cd {base_dir}/test && touch changed_file") shell(f"cd {base_dir}/test && touch changed_file")
elif reason == "changed_file":
before = checksum_directory(f"{base_dir}/test")
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
assert cmd.returncode != 0
stderr = cmd.stderr.lower()
assert "refuse" in stderr or "refusing" in stderr
assert "test" in os.listdir(base_dir)
after = checksum_directory(f"{base_dir}/test")
assert before == after
def test_worktree_delete_refusal_uncommited_changes_changed_file():
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
assert cmd.returncode == 0
shell(f"cd {base_dir}/test && git ls-files | shuf | head | xargs rm -rf")
before = checksum_directory(f"{base_dir}/test")
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
assert cmd.returncode != 0
stderr = cmd.stderr.lower()
assert "refuse" in stderr or "refusing" in stderr
assert "test" in os.listdir(base_dir)
after = checksum_directory(f"{base_dir}/test")
assert before == after
def test_worktree_delete_refusal_uncommited_changes_deleted_file():
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
assert cmd.returncode == 0
shell( shell(
f"cd {base_dir}/test && git ls-files | shuf | head | while read f ; do echo $RANDOM > $f ; done" f"cd {base_dir}/test && git ls-files | shuf | head | while read f ; do echo $RANDOM > $f ; done"
) )
elif reason == "deleted_file":
before = checksum_directory(f"{base_dir}/test") shell(f"cd {base_dir}/test && git ls-files | shuf | head | xargs rm -rf")
cmd = grm(["wt", "delete", "test"], cwd=base_dir) elif reason == "new_commit":
assert cmd.returncode != 0
stderr = cmd.stderr.lower()
assert "refuse" in stderr or "refusing" in stderr
assert "test" in os.listdir(base_dir)
after = checksum_directory(f"{base_dir}/test")
assert before == after
def test_worktree_delete_refusal_commited_changes():
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
assert cmd.returncode == 0
shell( shell(
f'cd {base_dir}/test && touch changed_file && git add changed_file && git commit -m "commitmsg"' f'cd {base_dir}/test && touch changed_file && git add changed_file && git commit -m "commitmsg"'
) )
elif reason == "tracking_branch_mismatch":
before = checksum_directory(f"{base_dir}/test")
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
assert cmd.returncode != 0
stderr = cmd.stderr.lower()
assert "refuse" in stderr or "refusing" in stderr
assert "test" in os.listdir(base_dir)
after = checksum_directory(f"{base_dir}/test")
assert before == after
def test_worktree_delete_refusal_tracking_branch_mismatch():
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
assert cmd.returncode == 0
shell( shell(
f"cd {base_dir}/test && git push origin test && git reset --hard origin/test^" f"cd {base_dir}/test && git push origin test && git reset --hard origin/test^"
) )
else:
raise NotImplementedError()
before = checksum_directory(f"{base_dir}/test") before = checksum_directory(f"{base_dir}/test")
cmd = grm(["wt", "delete", "test"], cwd=base_dir) cmd = grm(["wt", "delete", "test"], cwd=base_dir)
assert cmd.returncode != 0 assert cmd.returncode != 0
assert len(cmd.stdout) == 0
stderr = cmd.stderr.lower() stderr = cmd.stderr.lower()
assert "refuse" in stderr or "refusing" in stderr assert "refuse" in stderr or "refusing" in stderr
assert "test" in os.listdir(base_dir) assert "test" in os.listdir(base_dir)
@@ -732,6 +686,7 @@ def test_worktree_delete_force_refusal():
cmd = grm(["wt", "delete", "test", "--force"], cwd=base_dir) cmd = grm(["wt", "delete", "test", "--force"], cwd=base_dir)
assert cmd.returncode == 0 assert cmd.returncode == 0
assert len(cmd.stdout.strip().split("\n")) == 1
assert "test" not in os.listdir(base_dir) assert "test" not in os.listdir(base_dir)

View File

@@ -94,8 +94,6 @@ if ((changes == 0)); then
exit 1 exit 1
fi fi
just check
sed -i "0,/^version/{s/^version.*$/version = \"${new_version}\"/}" Cargo.toml sed -i "0,/^version/{s/^version.*$/version = \"${new_version}\"/}" Cargo.toml
cargo update --package git-repo-manager --precise "${new_version}" cargo update --package git-repo-manager --precise "${new_version}"

View File

@@ -1268,7 +1268,6 @@ impl RepoHandle {
if let Some(current_dir) = worktree_dir.parent() { if let Some(current_dir) = worktree_dir.parent() {
for current_dir in current_dir.ancestors() { for current_dir in current_dir.ancestors() {
let current_dir = base_dir.join(current_dir); let current_dir = base_dir.join(current_dir);
println!("deleting {}", current_dir.display());
if current_dir if current_dir
.read_dir() .read_dir()
.map_err(|error| { .map_err(|error| {
@@ -1281,7 +1280,7 @@ impl RepoHandle {
.next() .next()
.is_none() .is_none()
{ {
if let Err(e) = std::fs::remove_dir_all(&current_dir) { if let Err(e) = std::fs::remove_dir(&current_dir) {
return Err(WorktreeRemoveFailureReason::Error(format!( return Err(WorktreeRemoveFailureReason::Error(format!(
"Error deleting {}: {}", "Error deleting {}: {}",
&worktree_dir.display(), &worktree_dir.display(),