#!/bin/sh test_description='branch --contains , --no-contains --merged, and --no-merged' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh test_expect_success setup ' >file && git add file && test_tick && git commit -m initial && git branch -M main && git branch side && echo 1 >file && test_tick && git commit -a -m "second on main" && git checkout side && echo 1 >file && test_tick && git commit -a -m "second on side" && git merge main ' test_expect_success 'branch --contains=main' ' git branch --contains=main >actual && { echo " main" && echo "* side" } >expect && test_cmp expect actual ' test_expect_success 'branch --contains main' ' git branch --contains main >actual && { echo " main" && echo "* side" } >expect && test_cmp expect actual ' test_expect_success 'branch --no-contains=main' ' git branch --no-contains=main >actual && test_must_be_empty actual ' test_expect_success 'branch --no-contains main' ' git branch --no-contains main >actual && test_must_be_empty actual ' test_expect_success 'branch --contains=side' ' git branch --contains=side >actual && { echo "* side" } >expect && test_cmp expect actual ' test_expect_success 'branch --no-contains=side' ' git branch --no-contains=side >actual && { echo " main" } >expect && test_cmp expect actual ' test_expect_success 'branch --contains with pattern implies --list' ' git branch --contains=main main >actual && { echo " main" } >expect && test_cmp expect actual ' test_expect_success 'branch --no-contains with pattern implies --list' ' git branch --no-contains=main main >actual && test_must_be_empty actual ' test_expect_success 'side: branch --merged' ' git branch --merged >actual && { echo " main" && echo "* side" } >expect && test_cmp expect actual ' test_expect_success 'branch --merged with pattern implies --list' ' git branch --merged=side main >actual && { echo " main" } >expect && test_cmp expect actual ' test_expect_success 'side: branch --no-merged' ' git branch --no-merged >actual && test_must_be_empty actual ' test_expect_success 'main: branch --merged' ' git checkout main && git branch --merged >actual && { echo "* main" } >expect && test_cmp expect actual ' test_expect_success 'main: branch --no-merged' ' git branch --no-merged >actual && { echo " side" } >expect && test_cmp expect actual ' test_expect_success 'branch --no-merged with pattern implies --list' ' git branch --no-merged=main main >actual && test_must_be_empty actual ' test_expect_success 'implicit --list conflicts with modification options' ' test_must_fail git branch --contains=main -d && test_must_fail git branch --contains=main -m foo && test_must_fail git branch --no-contains=main -d && test_must_fail git branch --no-contains=main -m foo ' test_expect_success 'Assert that --contains only works on commits, not trees & blobs' ' test_must_fail git branch --contains main^{tree} && blob=$(git hash-object -w --stdin <<-\EOF Some blob EOF ) && test_must_fail git branch --contains $blob && test_must_fail git branch --no-contains $blob ' test_expect_success 'multiple branch --contains' ' git checkout -b side2 main && >feature && git add feature && git commit -m "add feature" && git checkout -b next main && git merge side && git branch --contains side --contains side2 >actual && cat >expect <<-\EOF && * next side side2 EOF test_cmp expect actual ' test_expect_success 'multiple branch --merged' ' git branch --merged next --merged main >actual && cat >expect <<-\EOF && main * next side EOF test_cmp expect actual ' test_expect_success 'multiple branch --no-contains' ' git branch --no-contains side --no-contains side2 >actual && cat >expect <<-\EOF && main EOF test_cmp expect actual ' test_expect_success 'multiple branch --no-merged' ' git branch --no-merged next --no-merged main >actual && cat >expect <<-\EOF && side2 EOF test_cmp expect actual ' test_expect_success 'branch --contains combined with --no-contains' ' git checkout -b seen main && git merge side && git merge side2 && git branch --contains side --no-contains side2 >actual && cat >expect <<-\EOF && next side EOF test_cmp expect actual ' test_expect_success 'branch --merged combined with --no-merged' ' git branch --merged seen --no-merged next >actual && cat >expect <<-\EOF && * seen side2 EOF test_cmp expect actual ' # We want to set up a case where the walk for the tracking info # of one branch crosses the tip of another branch (and make sure # that the latter walk does not mess up our flag to see if it was # merged). # # Here "topic" tracks "main" with one extra commit, and "zzz" points to the # same tip as main The name "zzz" must come alphabetically after "topic" # as we process them in that order. test_expect_success 'branch --merged with --verbose' ' git branch --track topic main && git branch zzz topic && git checkout topic && test_commit foo && git branch --merged topic >actual && cat >expect <<-\EOF && main * topic zzz EOF test_cmp expect actual && git branch --verbose --merged topic >actual && cat >expect <<-EOF && main $(git rev-parse --short main) second on main * topic $(git rev-parse --short topic ) [ahead 1] foo zzz $(git rev-parse --short zzz ) second on main EOF test_cmp expect actual ' test_done