Compare commits
9 Commits
ee973432be
...
v0.7.5
| Author | SHA1 | Date | |
|---|---|---|---|
| da7a499da0 | |||
| 64965c32dd | |||
| 3207bdfdfb | |||
| d8dd604174 | |||
| 7ca9459675 | |||
| 989b0cdcce | |||
| 64d8397092 | |||
| a1b054a672 | |||
| 193c96c5aa |
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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 = [
|
||||||
|
|||||||
3
Justfile
3
Justfile
@@ -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 "
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
shell(f"cd {base_dir}/test && touch changed_file")
|
if reason == "new_file":
|
||||||
|
shell(f"cd {base_dir}/test && touch changed_file")
|
||||||
before = checksum_directory(f"{base_dir}/test")
|
elif reason == "changed_file":
|
||||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
shell(
|
||||||
assert cmd.returncode != 0
|
f"cd {base_dir}/test && git ls-files | shuf | head | while read f ; do echo $RANDOM > $f ; done"
|
||||||
stderr = cmd.stderr.lower()
|
)
|
||||||
assert "refuse" in stderr or "refusing" in stderr
|
elif reason == "deleted_file":
|
||||||
assert "test" in os.listdir(base_dir)
|
shell(f"cd {base_dir}/test && git ls-files | shuf | head | xargs rm -rf")
|
||||||
|
elif reason == "new_commit":
|
||||||
after = checksum_directory(f"{base_dir}/test")
|
shell(
|
||||||
assert before == after
|
f'cd {base_dir}/test && touch changed_file && git add changed_file && git commit -m "commitmsg"'
|
||||||
|
)
|
||||||
|
elif reason == "tracking_branch_mismatch":
|
||||||
def test_worktree_delete_refusal_uncommited_changes_changed_file():
|
shell(
|
||||||
with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
|
f"cd {base_dir}/test && git push origin test && git reset --hard origin/test^"
|
||||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
)
|
||||||
assert cmd.returncode == 0
|
|
||||||
|
else:
|
||||||
shell(f"cd {base_dir}/test && git ls-files | shuf | head | xargs rm -rf")
|
raise NotImplementedError()
|
||||||
|
|
||||||
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(
|
|
||||||
f"cd {base_dir}/test && git ls-files | shuf | head | while read f ; do echo $RANDOM > $f ; done"
|
|
||||||
)
|
|
||||||
|
|
||||||
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_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(
|
|
||||||
f'cd {base_dir}/test && touch changed_file && git add changed_file && git commit -m "commitmsg"'
|
|
||||||
)
|
|
||||||
|
|
||||||
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(
|
|
||||||
f"cd {base_dir}/test && git push origin test && git reset --hard origin/test^"
|
|
||||||
)
|
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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}"
|
||||||
|
|||||||
@@ -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(¤t_dir) {
|
if let Err(e) = std::fs::remove_dir(¤t_dir) {
|
||||||
return Err(WorktreeRemoveFailureReason::Error(format!(
|
return Err(WorktreeRemoveFailureReason::Error(format!(
|
||||||
"Error deleting {}: {}",
|
"Error deleting {}: {}",
|
||||||
&worktree_dir.display(),
|
&worktree_dir.display(),
|
||||||
|
|||||||
Reference in New Issue
Block a user