|  | #!/bin/sh | 
|  |  | 
|  | test_description='branch --contains <commit>, --no-contains <commit> --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_i18ncmp expect actual | 
|  | ' | 
|  |  | 
|  | test_done |