From 3a93dd9f62c4c219cfbc452e69852a2499324f98 Mon Sep 17 00:00:00 2001 From: Michael Montalbo Date: Fri, 27 Feb 2026 17:44:10 -0800 Subject: [PATCH] diff: fix crash with --find-object outside repository When "git diff --find-object=" is run outside a git repository, the option parsing callback eagerly resolves the OID via repo_get_oid(), which reaches get_main_ref_store() and hits a BUG() assertion because no repository has been set up. Check startup_info->have_repository before attempting to resolve the OID, and return a user-friendly error instead. Signed-off-by: Michael Montalbo --- diff.c | 2 ++ t/t4053-diff-no-index.sh | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/diff.c b/diff.c index a68ddd2168ba1c..8f0f141be7e30c 100644 --- a/diff.c +++ b/diff.c @@ -5215,6 +5215,8 @@ static int diff_opt_find_object(const struct option *option, struct object_id oid; BUG_ON_OPT_NEG(unset); + if (!startup_info->have_repository) + return error(_("--find-object requires a git repository")); if (repo_get_oid(the_repository, arg, &oid)) return error(_("unable to resolve '%s'"), arg); diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh index 69599279e96bb7..15076dfe0dcb07 100755 --- a/t/t4053-diff-no-index.sh +++ b/t/t4053-diff-no-index.sh @@ -76,6 +76,16 @@ test_expect_success 'git diff --no-index executed outside repo gives correct err ) ' +test_expect_success 'git diff --find-object outside repo fails gracefully' ' + ( + GIT_CEILING_DIRECTORIES=$TRASH_DIRECTORY/non && + export GIT_CEILING_DIRECTORIES && + cd non/git && + test_must_fail git diff --find-object=abc123 2>err && + test_grep "find-object requires a git repository" err + ) +' + test_expect_success 'diff D F and diff F D' ' ( cd repo &&