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" +}