From afc5fcd7612129d34a666f3195ab3f42bcbcce29 Mon Sep 17 00:00:00 2001 From: vaibhavmashal Date: Tue, 1 Sep 2026 23:07:05 +0530 Subject: [PATCH 1/3] fix(branch): prevent git delete-merged-branches from deleting default branch (#1132) --- bin/git-delete-merged-branches | 3 +- bin/git-show-merged-branches | 3 +- bin/git-show-unmerged-branches | 3 +- helper/git-extra-utility | 8 +++ tests/git-delete-merged-branches.bats | 70 +++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 tests/git-delete-merged-branches.bats diff --git a/bin/git-delete-merged-branches b/bin/git-delete-merged-branches index 38988cf..1721f9d 100755 --- a/bin/git-delete-merged-branches +++ b/bin/git-delete-merged-branches @@ -1,6 +1,7 @@ #!/usr/bin/env bash -branches=$(git branch --no-color --merged | grep -vE "^(\*|\+)" | grep -v "$(git_extra_default_branch)" | grep -v svn) +default_branch=$(git_extra_default_branch) +branches=$(git branch --no-color --merged | sed 's/^[ *+]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn") if [ -n "$branches" ] then echo "$branches" | xargs git branch -d diff --git a/bin/git-show-merged-branches b/bin/git-show-merged-branches index 6b18c78..d959f4e 100755 --- a/bin/git-show-merged-branches +++ b/bin/git-show-merged-branches @@ -1,3 +1,4 @@ #!/usr/bin/env bash -git branch --no-color --merged | grep -v "\*" | grep -v "$(git_extra_default_branch)" | tr -d ' ' +default_branch=$(git_extra_default_branch) +git branch --no-color --merged | sed 's/^[ *+]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn" diff --git a/bin/git-show-unmerged-branches b/bin/git-show-unmerged-branches index 5c4e1ec..5859aff 100755 --- a/bin/git-show-unmerged-branches +++ b/bin/git-show-unmerged-branches @@ -1,3 +1,4 @@ #!/usr/bin/env bash -git branch --no-color --no-merged | grep -v "\*" | grep -v "$(git_extra_default_branch)" | tr -d ' ' +default_branch=$(git_extra_default_branch) +git branch --no-color --no-merged | sed 's/^[ *+]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn" diff --git a/helper/git-extra-utility b/helper/git-extra-utility index 166d074..6ed6943 100755 --- a/helper/git-extra-utility +++ b/helper/git-extra-utility @@ -13,6 +13,14 @@ git_extra_default_branch() { echo "$extras_default_branch" elif [ -n "$init_default_branch" ]; then echo "$init_default_branch" + elif git show-ref --verify --quiet refs/heads/main; then + echo "main" + elif git show-ref --verify --quiet refs/heads/master; then + echo "master" + elif git show-ref --verify --quiet refs/heads/trunk; then + echo "trunk" + elif git show-ref --verify --quiet refs/heads/svn; then + echo "svn" else echo "main" fi diff --git a/tests/git-delete-merged-branches.bats b/tests/git-delete-merged-branches.bats new file mode 100644 index 0000000..c5b5426 --- /dev/null +++ b/tests/git-delete-merged-branches.bats @@ -0,0 +1,70 @@ +# shellcheck shell=bash + +source "$BATS_TEST_DIRNAME/test_util.sh" + +setup_file() { + test_util.setup_file + test_util.install_command delete-merged-branches + test_util.install_command show-merged-branches + test_util.install_command show-unmerged-branches +} + +setup() { + test_util.cd_test + + test_util.git_init + git commit --allow-empty -m "Initial commit" + git branch merged-branch + git branch unmerged-branch + git checkout unmerged-branch + git commit --allow-empty -m "Unmerged commit" + git checkout main +} + +@test "show-merged-branches lists merged branches but not default branch" { + run git show-merged-branches + assert_output "merged-branch" + assert_success +} + +@test "show-unmerged-branches lists unmerged branches" { + run git show-unmerged-branches + assert_output "unmerged-branch" + assert_success +} + +@test "delete-merged-branches deletes merged branches and preserves default and unmerged branches" { + run git delete-merged-branches + assert_success + + run git branch --list + assert_line -p "main" + assert_line -p "unmerged-branch" + refute_line -p "merged-branch" +} + +@test "delete-merged-branches when checked out on feature branch protects default branch" { + git branch merged-feature + git checkout unmerged-branch + run git delete-merged-branches + assert_success + + run git branch --list + assert_line -p "main" + assert_line -p "unmerged-branch" + refute_line -p "merged-feature" +} + +@test "delete-merged-branches handles branch names with special characters" { + git branch "feature/foo+bar" + run git show-merged-branches + assert_line -p "feature/foo+bar" + assert_success + + run git delete-merged-branches + assert_success + + run git branch --list + assert_line -p "main" + refute_line -p "feature/foo+bar" +} From 65e314ce9f554514785e155b9790ff77507ddde3 Mon Sep 17 00:00:00 2001 From: vaibhavmashal Date: Wed, 2 Sep 2026 09:05:15 +0530 Subject: [PATCH 2/3] fix(tests): remove UTF-8 BOM from bats test file --- tests/git-delete-merged-branches.bats | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/git-delete-merged-branches.bats b/tests/git-delete-merged-branches.bats index c5b5426..6eda772 100644 --- a/tests/git-delete-merged-branches.bats +++ b/tests/git-delete-merged-branches.bats @@ -1,4 +1,4 @@ -# shellcheck shell=bash +# shellcheck shell=bash source "$BATS_TEST_DIRNAME/test_util.sh" From fab2c519deafdde0206571e2be1e3551835aa620 Mon Sep 17 00:00:00 2001 From: vaibhavmashal Date: Wed, 2 Sep 2026 21:36:34 +0530 Subject: [PATCH 3/3] fix(branch): exclude current branch before trimming whitespace in delete-merged-branches --- bin/git-delete-merged-branches | 2 +- bin/git-show-merged-branches | 2 +- bin/git-show-unmerged-branches | 2 +- tests/git-delete-merged-branches.bats | 22 +++++++++++----------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bin/git-delete-merged-branches b/bin/git-delete-merged-branches index 1721f9d..b529ed7 100755 --- a/bin/git-delete-merged-branches +++ b/bin/git-delete-merged-branches @@ -1,7 +1,7 @@ #!/usr/bin/env bash default_branch=$(git_extra_default_branch) -branches=$(git branch --no-color --merged | sed 's/^[ *+]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn") +branches=$(git branch --no-color --merged | grep -vE "^(\*|\+)" | sed 's/^[ ]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn") if [ -n "$branches" ] then echo "$branches" | xargs git branch -d diff --git a/bin/git-show-merged-branches b/bin/git-show-merged-branches index d959f4e..17f8f32 100755 --- a/bin/git-show-merged-branches +++ b/bin/git-show-merged-branches @@ -1,4 +1,4 @@ #!/usr/bin/env bash default_branch=$(git_extra_default_branch) -git branch --no-color --merged | sed 's/^[ *+]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn" +git branch --no-color --merged | grep -vE "^(\*|\+)" | sed 's/^[ ]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn" diff --git a/bin/git-show-unmerged-branches b/bin/git-show-unmerged-branches index 5859aff..60fa96b 100755 --- a/bin/git-show-unmerged-branches +++ b/bin/git-show-unmerged-branches @@ -1,4 +1,4 @@ #!/usr/bin/env bash default_branch=$(git_extra_default_branch) -git branch --no-color --no-merged | sed 's/^[ *+]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn" +git branch --no-color --no-merged | grep -vE "^(\*|\+)" | sed 's/^[ ]*//' | grep -Fvx -e "$default_branch" -e "main" -e "master" -e "trunk" -e "svn" diff --git a/tests/git-delete-merged-branches.bats b/tests/git-delete-merged-branches.bats index 6eda772..0336d2e 100644 --- a/tests/git-delete-merged-branches.bats +++ b/tests/git-delete-merged-branches.bats @@ -14,22 +14,22 @@ setup() { test_util.git_init git commit --allow-empty -m "Initial commit" - git branch merged-branch - git branch unmerged-branch - git checkout unmerged-branch + git branch feature-merged + git branch feature-unmerged + git checkout feature-unmerged git commit --allow-empty -m "Unmerged commit" git checkout main } @test "show-merged-branches lists merged branches but not default branch" { run git show-merged-branches - assert_output "merged-branch" + assert_output "feature-merged" assert_success } @test "show-unmerged-branches lists unmerged branches" { run git show-unmerged-branches - assert_output "unmerged-branch" + assert_output "feature-unmerged" assert_success } @@ -39,20 +39,20 @@ setup() { run git branch --list assert_line -p "main" - assert_line -p "unmerged-branch" - refute_line -p "merged-branch" + assert_line -p "feature-unmerged" + refute_line -p "feature-merged" } @test "delete-merged-branches when checked out on feature branch protects default branch" { - git branch merged-feature - git checkout unmerged-branch + git branch other-merged + git checkout feature-unmerged run git delete-merged-branches assert_success run git branch --list assert_line -p "main" - assert_line -p "unmerged-branch" - refute_line -p "merged-feature" + assert_line -p "feature-unmerged" + refute_line -p "other-merged" } @test "delete-merged-branches handles branch names with special characters" {