From: "Nikolaus Schuetz via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Phillip Wood <phillip.wood123@gmail.com>,
Nikolaus Schuetz <nikolauspschuetz@gmail.com>,
Nikolaus Schuetz <nikolauspschuetz@gmail.com>
Subject: [PATCH v2] merge-base: add tests for --is-ancestor
Date: Thu, 30 Jul 2026 06:19:09 +0000 [thread overview]
Message-ID: <pull.2186.v2.git.1785392350660.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2186.git.1784998828879.gitgitgadget@gmail.com>
From: Nikolaus Schuetz <nikolauspschuetz@gmail.com>
`git merge-base --is-ancestor A B` is used a lot in scripts but has no
tests. Add some to t6010 covering its exit codes: 0 when A is an
ancestor of B, 1 when it is not, and 128 (not 1) when given a bad
argument. Also check that --is-ancestor and --all can't be combined,
and that the resulting error names both options.
Signed-off-by: Nikolaus Schuetz <nikolauspschuetz@gmail.com>
---
merge-base: add tests for --is-ancestor
Changes since v1, per review:
* Reuse the E---D---C---B---A history and the G/H merges from the "set
up G and H" test instead of creating a separate repository.
* Add a test that --is-ancestor requires exactly two commits: too few
is a usage error (exit 129), while more than two is rejected with
"--is-ancestor takes exactly two commits" (exit 128).
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2186%2Fnikolauspschuetz%2Ft6010-test-is-ancestor-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2186/nikolauspschuetz/t6010-test-is-ancestor-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2186
Range-diff vs v1:
1: e512e35788 ! 1: 319bf89d25 merge-base: add tests for --is-ancestor
@@ t/t6010-merge-base.sh: test_expect_success 'merge-base --octopus --all for compl
test_cmp expected actual
'
-+test_expect_success 'setup --is-ancestor' '
-+ git init is-ancestor &&
-+ (
-+ cd is-ancestor &&
-+ test_commit one &&
-+ test_commit two &&
-+ git checkout -b side one &&
-+ test_commit three
-+ )
++test_expect_success '--is-ancestor with an ancestor and a descendant' '
++ git merge-base --is-ancestor $E $A &&
++ test_expect_code 1 git merge-base --is-ancestor $A $E
+'
+
-+test_expect_success '--is-ancestor parent and child' '
-+ git -C is-ancestor merge-base --is-ancestor one two &&
-+ test_expect_code 1 git -C is-ancestor merge-base --is-ancestor two one
++test_expect_success '--is-ancestor treats a commit as its own ancestor' '
++ git merge-base --is-ancestor $A $A
+'
+
-+test_expect_success '--is-ancestor self' '
-+ git -C is-ancestor merge-base --is-ancestor two two
++test_expect_success '--is-ancestor with diverged commits' '
++ test_expect_code 1 git merge-base --is-ancestor $G $H &&
++ test_expect_code 1 git merge-base --is-ancestor $H $G
+'
+
-+test_expect_success '--is-ancestor diverged commits' '
-+ test_expect_code 1 git -C is-ancestor merge-base --is-ancestor three two
++test_expect_success '--is-ancestor exits 128 on a bad commit' '
++ test_expect_code 128 git merge-base --is-ancestor $A no-such-commit &&
++ test_expect_code 128 git merge-base --is-ancestor no-such-commit $A
+'
+
-+test_expect_success '--is-ancestor exit 128 non-existent commit' '
-+ test_expect_code 128 git -C is-ancestor merge-base --is-ancestor one no-such-commit &&
-+ test_expect_code 128 git -C is-ancestor merge-base --is-ancestor no-such-commit one
++test_expect_success '--is-ancestor requires exactly two commits' '
++ test_expect_code 129 git merge-base --is-ancestor &&
++ test_expect_code 129 git merge-base --is-ancestor $A &&
++ test_expect_code 128 git merge-base --is-ancestor $E $A $B 2>err &&
++ test_grep ".--is-ancestor takes exactly two commits" err
+'
+
+test_expect_success '--is-ancestor and --all cannot be used together' '
-+ test_expect_code 128 git -C is-ancestor merge-base --is-ancestor --all one two 2>err &&
++ test_expect_code 128 git merge-base --is-ancestor --all $E $A 2>err &&
+ test_grep "options .--is-ancestor. and .--all. cannot be used together" err
+'
+
t/t6010-merge-base.sh | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/t/t6010-merge-base.sh b/t/t6010-merge-base.sh
index 44c726ea39..21f09a678f 100755
--- a/t/t6010-merge-base.sh
+++ b/t/t6010-merge-base.sh
@@ -305,4 +305,35 @@ test_expect_success 'merge-base --octopus --all for complex tree' '
test_cmp expected actual
'
+test_expect_success '--is-ancestor with an ancestor and a descendant' '
+ git merge-base --is-ancestor $E $A &&
+ test_expect_code 1 git merge-base --is-ancestor $A $E
+'
+
+test_expect_success '--is-ancestor treats a commit as its own ancestor' '
+ git merge-base --is-ancestor $A $A
+'
+
+test_expect_success '--is-ancestor with diverged commits' '
+ test_expect_code 1 git merge-base --is-ancestor $G $H &&
+ test_expect_code 1 git merge-base --is-ancestor $H $G
+'
+
+test_expect_success '--is-ancestor exits 128 on a bad commit' '
+ test_expect_code 128 git merge-base --is-ancestor $A no-such-commit &&
+ test_expect_code 128 git merge-base --is-ancestor no-such-commit $A
+'
+
+test_expect_success '--is-ancestor requires exactly two commits' '
+ test_expect_code 129 git merge-base --is-ancestor &&
+ test_expect_code 129 git merge-base --is-ancestor $A &&
+ test_expect_code 128 git merge-base --is-ancestor $E $A $B 2>err &&
+ test_grep ".--is-ancestor takes exactly two commits" err
+'
+
+test_expect_success '--is-ancestor and --all cannot be used together' '
+ test_expect_code 128 git merge-base --is-ancestor --all $E $A 2>err &&
+ test_grep "options .--is-ancestor. and .--all. cannot be used together" err
+'
+
test_done
base-commit: f60db8d575adb79761d363e026fb49bddf330c73
--
gitgitgadget
prev parent reply other threads:[~2026-07-30 6:19 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-25 17:00 [PATCH] merge-base: add tests for --is-ancestor Nikolaus Schuetz via GitGitGadget
2026-07-28 22:48 ` Junio C Hamano
2026-07-29 9:39 ` Phillip Wood
2026-07-29 15:31 ` Junio C Hamano
2026-07-30 6:19 ` Nikolaus Schuetz via GitGitGadget [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2186.v2.git.1785392350660.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=nikolauspschuetz@gmail.com \
--cc=phillip.wood123@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.