From patchwork Wed Feb 28 09:44:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575148 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7999633987 for ; Wed, 28 Feb 2024 09:44:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113466; cv=none; b=dZ2NJwoQAHOtoDiRJ3za4ozSkeEEq4RyS49BN8jfZEfDjTbYaSkCNjlR5KLbE9oX9CzOeOpEP8ctZD0dCul32TnmuBCJI55pXsGlRJbGjA9jXcFJxx30rkZ9DdhUg+3gf3JnTOCId6SAjeKMBatQAcILQwbeXixbEwe7zMCJiYk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113466; c=relaxed/simple; bh=CIKQ8Bb1sUrqihQ5MJIFUcbno3QB/yb6ILzqtp+yaVo=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=EUJZ8feY/kHoh59QCquKSdGcYNWEFgMjwZiy0bHQiYX5cLOdQYPXgxU8YGa/m/EU8sbUazINhuoN5Zj1uqfe3BpdSCr4NPX/rkuupyPpPLTccOqTCc6VwfHMosnBIw1UymIkSuJs7K+k+vPcZ1mQGRsjPJlaV5bY/daPizX3nrU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=N3P7VK6a; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="N3P7VK6a" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-33aeb088324so3336482f8f.2 for ; Wed, 28 Feb 2024 01:44:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113461; x=1709718261; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=qTSR9XKJE4GOW6G6lNSpqCjAzTbfFv8qkdL27MvMrxQ=; b=N3P7VK6a6FYfrYYzaOwHFvK0vL8GR7OfL8t294kC1pS6kdqa6hShHwh7SSPsWrqCEO Hmrte0AMvFphcVVLeL2vrdO4aiNJm1FEi/OvKf1DOwr1X/ef+SaTT67/XZNb6YldL/Qw L1Chu3dSTZ9VT8n0PtHerk0x7dvyzOzE8GWYKk10ekB4/30IwUdIAMaizWGM7B8M8lnD S5D+MEg1AVDgfmU1xJ8pIGStU+kmZ5Z0H/7REcsewNgyUjCBKf+SOFzUooEXBtKU8HgL X/kIHSD86N/OMCtIKcsCnobjwy2DYg6HxgNfHlfF3tQixWyn+7li1evZxffD7qkrVzoJ ue9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113461; x=1709718261; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qTSR9XKJE4GOW6G6lNSpqCjAzTbfFv8qkdL27MvMrxQ=; b=jUwP4d/MGK41LL8sxjLdnWMBqn9fOJwULiB202G+7axBLZLWkoxrebQDruzECs6Yig N3TIZJCTy1Rd6ytZI6fj5qTP12I2sp39rf9mbUjiBZigNAGR69wFLBwkHXmBgmtiqGak ewq+eDm+qmZyOnH5gTs+4Ewb8oYhuK7XNIlROJWMQp6m4Jn63wkos/zKQ/dNDzufXc+S 7QTAmQP5f8ZjoHpapFGKuVyrorHOcckRkEQUMu6DBY3oOC7iO/NMEi3bEnsKAezbgGXn 6ny82JUBLgY9bJZQY8mYsGIa+dMktEridROODRuF72uvVRis7seSG4gvFHmQtrqlMVPx /eRw== X-Gm-Message-State: AOJu0YzDChArrbTsGky3kIf2X4/hMu7gKrD3AJbGqU1IFpLSLtD/gT1C DmIv4sF0pFq+Kfr/vvbI9gK+lwqsWztMsa9KPYUrZzUEow180Xabt3TQxIPv X-Google-Smtp-Source: AGHT+IERQaxzaJ17Fw1ABTDYiDS4oc59xewG07391iz1THE0oIrl6ZuShy9cJ5EkRk0X82R25kH3Ww== X-Received: by 2002:a5d:64cb:0:b0:33d:f89b:147b with SMTP id f11-20020a5d64cb000000b0033df89b147bmr1613611wri.26.1709113461115; Wed, 28 Feb 2024 01:44:21 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id u3-20020adfed43000000b0033d9ee09b7asm13800868wro.107.2024.02.28.01.44.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:20 -0800 (PST) Message-ID: <647fa2ed5c5418d2298672a239b7723912358cd7.1709113458.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:07 +0000 Subject: [PATCH v4 01/11] commit-reach(paint_down_to_common): plug two memory leaks Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin When a commit is missing, we return early (currently pretending that no merge basis could be found in that case). At that stage, it is possible that a merge base could have been found already, and added to the `result`, which is now leaked. The priority queue has a similar issue: There might still be a commit in that queue. Let's release both, to address the potential memory leaks. Signed-off-by: Johannes Schindelin --- commit-reach.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/commit-reach.c b/commit-reach.c index a868a575ea1..7ea916f9ebd 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -105,8 +105,11 @@ static struct commit_list *paint_down_to_common(struct repository *r, parents = parents->next; if ((p->object.flags & flags) == flags) continue; - if (repo_parse_commit(r, p)) + if (repo_parse_commit(r, p)) { + clear_prio_queue(&queue); + free_commit_list(result); return NULL; + } p->object.flags |= flags; prio_queue_put(&queue, p); } From patchwork Wed Feb 28 09:44:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575149 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CFDF339BD for ; Wed, 28 Feb 2024 09:44:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113467; cv=none; b=bIgF2UGuWrpvZfc+svje0SeL+vRkYwpRQFRSbK2NtYLxiiY4YtQKu+4ennOo1wvaB52atVIMICQ9lAJOH68oBMNxVH569Xddqmv/ujivaRgCaXkTMIq6vwzdwyouu0Zg57frtT/unwIV8clCL9fqi8KGBlUnMBoHQHJa6QZYCO4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113467; c=relaxed/simple; bh=Yb5I4d4X0STAz8HVRFsE5uLAsM9osTqtn183H3EGqBE=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=LhUFNQPTPvugVPuMM/pvoGysCM6SW3+Vk20hlBaUM4XytRS7xuVeSdN2rFnSs9aCuq2tGvJqC4iqRlX5g7RUxAIKIWCujHw/VySbjN9cXfSUgtj8ft3zvg3LgEvRd2C+wuH3GX279w9tDRzKfD1n5P1pNpFuo/KOSb45WrfExcQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WJuHs3ji; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WJuHs3ji" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-412a3ebad2aso24550475e9.1 for ; Wed, 28 Feb 2024 01:44:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113463; x=1709718263; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=zAPyFrwfCmVzEDacD+j6dAGnCBdXEXmFNhgtGhf5Hoc=; b=WJuHs3jijxxmW//ZAYcIRopK0oy/TMDAmoTsCpUZMZ1VDt38ZiMDa7rDRicaz/PkZb C8s7UIzCJlhVLVSLsa5/PROK44p7dJ0EKU13DPXxZ/l67T7SpF/d68ty1/skTuoI4zZ3 k5hdTfEm1zSJWsykK1rDHnFSscq24ycJYgUB/4oTVlThNJokRIXRjEsRndYKSl/7nCJ+ b5+j2oo9raDopb1eqGNz1GKGbnDofrB6mhPz/UrPyAH6HwN30XhD0Yc3k2LcftwMFEO8 VkvlsHO33Jr755vxxQA5IRmmQZ6VOabMby/klRCL4MQTT8ecGLlcr24/Qa8TDtZF+N86 8MoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113463; x=1709718263; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zAPyFrwfCmVzEDacD+j6dAGnCBdXEXmFNhgtGhf5Hoc=; b=B9181kyxP0dSjtCQ5m14Bjq82N0ZIygAIRvWU6qepuUCma9BpNwFyr6AzGpiwmBUKS wcu/HllAmy5ZA259Qe7lXV52LccPEnIJNlMecfcShSadR088FNDZpANLhUW94iA1ymIR IFXZjLQktxZbz+5W0JMmVevMTyGqHnhWbN0iyw+wQWe8483hAPostV6NUI7DhKuoeYtL eUQdZmUUjHndXS3khed/XaN5UgMaFr3iH7iUKQbJPXzeZkur7se/9nX09jBgPDPGB+O0 m4//XfLhvN60o6O/zHluHbL/lYEoaJ4qsmotfgFou4fYsqZEOguTHOxOtvbmF07N9GU7 OUFg== X-Gm-Message-State: AOJu0YxUcKqSJ8LmBqKD+zdx8Aw0MrpubjOontUHqJYFFr81spMLu9HQ eefZh/yUZiA/mVcMvDbuFMEw7rXe9UhWhnxVb8IcXgW7wRYo5ysW/oMLSyKb X-Google-Smtp-Source: AGHT+IE8W2A24JArQRjw5+sdmLMOkOHQ5lzrohk6YG9htbYwCbKwopEgtvBH7rQxWZ4ne/lW4EcqHg== X-Received: by 2002:a05:600c:4505:b0:410:4a4:6cd0 with SMTP id t5-20020a05600c450500b0041004a46cd0mr11100735wmo.33.1709113462763; Wed, 28 Feb 2024 01:44:22 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id fs11-20020a05600c3f8b00b004129f71b80dsm1534962wmb.28.2024.02.28.01.44.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:21 -0800 (PST) Message-ID: <48e69bf7229bdbf8c944cd8440a54a0ce003ab44.1709113458.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:08 +0000 Subject: [PATCH v4 02/11] commit-reach(repo_in_merge_bases_many): optionally expect missing commits Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin Currently this function treats unrelated commit histories the same way as commit histories with missing commit objects. Typically, missing commit objects constitute a corrupt repository, though, and should be reported as such. The next commits will make it so, but there is one exception: In `git fetch --update-shallow` we _expect_ commit objects to be missing, and we do want to treat the now-incomplete commit histories as unrelated. To allow for that, let's introduce an additional parameter that is passed to `repo_in_merge_bases_many()` to trigger this behavior, and use it in the two callers in `shallow.c`. This commit changes behavior slightly: unless called from the `shallow.c` functions that set the `ignore_missing_commits` bit, any non-existing tip commit that is passed to `repo_in_merge_bases_many()` will now result in an error. Note: When encountering missing commits while traversing the commit history in search for merge bases, with this commit there won't be a change in behavior just yet, their children will still be interpreted as root commits. This bug will get fixed by follow-up commits. Signed-off-by: Johannes Schindelin --- commit-reach.c | 9 +++++---- commit-reach.h | 3 ++- remote.c | 2 +- shallow.c | 5 +++-- t/helper/test-reach.c | 2 +- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/commit-reach.c b/commit-reach.c index 7ea916f9ebd..5c1b5256598 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -467,7 +467,7 @@ int repo_is_descendant_of(struct repository *r, other = with_commit->item; with_commit = with_commit->next; - if (repo_in_merge_bases_many(r, other, 1, &commit)) + if (repo_in_merge_bases_many(r, other, 1, &commit, 0)) return 1; } return 0; @@ -478,17 +478,18 @@ int repo_is_descendant_of(struct repository *r, * Is "commit" an ancestor of one of the "references"? */ int repo_in_merge_bases_many(struct repository *r, struct commit *commit, - int nr_reference, struct commit **reference) + int nr_reference, struct commit **reference, + int ignore_missing_commits) { struct commit_list *bases; int ret = 0, i; timestamp_t generation, max_generation = GENERATION_NUMBER_ZERO; if (repo_parse_commit(r, commit)) - return ret; + return ignore_missing_commits ? 0 : -1; for (i = 0; i < nr_reference; i++) { if (repo_parse_commit(r, reference[i])) - return ret; + return ignore_missing_commits ? 0 : -1; generation = commit_graph_generation(reference[i]); if (generation > max_generation) diff --git a/commit-reach.h b/commit-reach.h index 35c4da49481..68f81549a44 100644 --- a/commit-reach.h +++ b/commit-reach.h @@ -30,7 +30,8 @@ int repo_in_merge_bases(struct repository *r, struct commit *reference); int repo_in_merge_bases_many(struct repository *r, struct commit *commit, - int nr_reference, struct commit **reference); + int nr_reference, struct commit **reference, + int ignore_missing_commits); /* * Takes a list of commits and returns a new list where those diff --git a/remote.c b/remote.c index abb24822beb..763c80f4a7d 100644 --- a/remote.c +++ b/remote.c @@ -2675,7 +2675,7 @@ static int is_reachable_in_reflog(const char *local, const struct ref *remote) if (MERGE_BASES_BATCH_SIZE < size) size = MERGE_BASES_BATCH_SIZE; - if ((ret = repo_in_merge_bases_many(the_repository, commit, size, chunk))) + if ((ret = repo_in_merge_bases_many(the_repository, commit, size, chunk, 0))) break; } diff --git a/shallow.c b/shallow.c index ac728cdd778..dfcc1f86a7f 100644 --- a/shallow.c +++ b/shallow.c @@ -797,7 +797,7 @@ static void post_assign_shallow(struct shallow_info *info, for (j = 0; j < bitmap_nr; j++) if (bitmap[0][j] && /* Step 7, reachability test at commit level */ - !repo_in_merge_bases_many(the_repository, c, ca.nr, ca.commits)) { + !repo_in_merge_bases_many(the_repository, c, ca.nr, ca.commits, 1)) { update_refstatus(ref_status, info->ref->nr, *bitmap); dst++; break; @@ -828,7 +828,8 @@ int delayed_reachability_test(struct shallow_info *si, int c) si->reachable[c] = repo_in_merge_bases_many(the_repository, commit, si->nr_commits, - si->commits); + si->commits, + 1); si->need_reachability_test[c] = 0; } return si->reachable[c]; diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c index 3e173399a00..aa816e168ea 100644 --- a/t/helper/test-reach.c +++ b/t/helper/test-reach.c @@ -113,7 +113,7 @@ int cmd__reach(int ac, const char **av) repo_in_merge_bases(the_repository, A, B)); else if (!strcmp(av[1], "in_merge_bases_many")) printf("%s(A,X):%d\n", av[1], - repo_in_merge_bases_many(the_repository, A, X_nr, X_array)); + repo_in_merge_bases_many(the_repository, A, X_nr, X_array, 0)); else if (!strcmp(av[1], "is_descendant_of")) printf("%s(A,X):%d\n", av[1], repo_is_descendant_of(r, A, X)); else if (!strcmp(av[1], "get_merge_bases_many")) { From patchwork Wed Feb 28 09:44:09 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575151 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0CAA1364DA for ; Wed, 28 Feb 2024 09:44:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113469; cv=none; b=SiS/jTD+M06rF1tYoyAGB2VqV13L35Azaf6kFKU4RzauKLEPVwwiRmEtGOy0wgv37pPdgK84gmE0cyC7MV1Kih3VOIUepZK845g4EMGL+8J7yy57x7qVkVIOQBYOo31jBTkJ0gczF799d/YfP/VzVI2vlFhxby/vhqW5vHq28kc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113469; c=relaxed/simple; bh=vXE57pDk8M69L2XGEl/tCkoyxKi7Kf/uknYfneuYc5g=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=AqiIc/4RaAOlsBiI1UHW4+sgqbD0U93KuM/ed8MlNH3gRya38JVi+/9TNOduNnGlytf5zz/CDGwoJN8N4bfrghHMg3fqCUpl2M5D/4iRu+AE7H5KOfHgtAFgB6GUI8xkNAL3XMQBC+6fspmtwxru/BWLPImRj6iVO8VOcddjJIQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FXAFo9Bn; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FXAFo9Bn" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-512f892500cso3239486e87.3 for ; Wed, 28 Feb 2024 01:44:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113463; x=1709718263; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=TAaq5IldZBAjC8wZRYEnJr7vZQ9Gqj/HdJtn6SyaIN8=; b=FXAFo9BnuSdqMC+VhThiXpFJZPsivBGd7XFUG4qLGvk3pmFE5734PXio/rbyu3MkGN ECR+qsgHV86jhFw5JuVemxh4bfmM7GAqlPQUq2ieaMjkaViwQwzIs39lJX9MA9rWU9Ay AVbICtQxpfhwX9T7hw9Z9PcTzLwJ+VemKnXcJBRaAbkWN8yt4JAgi5r4H6mEVJTjVX4n yp6PIaB7oQ91h6teys69k6WHa3RZL8bpop3htu70Kl3wYv4AFuMp2z/3pMMX6jKvFFkr uTtqR5ssd9Z6o/0K0NoP1WkYkxAySSQciwGS/WKjcha+bXRrW7G1qBSg+IGjc0N6WKFV BNXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113463; x=1709718263; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TAaq5IldZBAjC8wZRYEnJr7vZQ9Gqj/HdJtn6SyaIN8=; b=lcClUxTuLawldA3u4AlEE6M8O2Yo/jv2TT6lgzSodqbU3kOrY6EI0SHrbj+GIW55tb IeeKCtxszB+v+l4Yy0XpgDJ8VrPpct7KnVQXbgFAW4Fgf/iz52lihDq4hPO/eeul9WYP TQI8dGj2mgUU1FE8863xekbbAKaeYdGQknnX0TGh8iGHcnEf5wEm1D+1ViRxwVc2Klcd 7XnsKMjGw/jELu9zAOGrM2Ye9S9BCfSvDpiRiH0S9bY+o0wuGYY+RdEv3b8eIXpFoxbP bfCt6F+od4zSprQATFIT9GEoGC5SZc6FOFrpvBp4XdLtsb778FUWPJfxZyUqpckwd5dQ Yr6Q== X-Gm-Message-State: AOJu0YxBrTLEkI7W7GQ/HBA6DO7Qjscv+eTZfJyBVBNRCxOfdxHoYCZF nA9mHdRF9hOgaEMAndpf0A3dO5ixbetKJfCEhfYNe119sx2g1dYrwWVsK942 X-Google-Smtp-Source: AGHT+IG788BlLtpiJkR9NtAbXywRXN3364Nt5r9fyMWMZ7QA4gyHqVaPKeQusPxfbj1i20i0zS1sLQ== X-Received: by 2002:ac2:4c49:0:b0:512:ec53:5915 with SMTP id o9-20020ac24c49000000b00512ec535915mr9739848lfk.15.1709113463393; Wed, 28 Feb 2024 01:44:23 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id s28-20020a05600c319c00b00412a38e732csm1520194wmp.35.2024.02.28.01.44.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:23 -0800 (PST) Message-ID: <1938b317a49f4d688bfefd7e5a74ad750a55a91a.1709113458.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:09 +0000 Subject: [PATCH v4 03/11] commit-reach(repo_in_merge_bases_many): report missing commits Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin Some functions in Git's source code follow the convention that returning a negative value indicates a fatal error, e.g. repository corruption. Let's use this convention in `repo_in_merge_bases()` to report when one of the specified commits is missing (i.e. when `repo_parse_commit()` reports an error). Also adjust the callers of `repo_in_merge_bases()` to handle such negative return values. Note: As of this patch, errors are returned only if any of the specified merge heads is missing. Over the course of the next patches, missing commits will also be reported by the `paint_down_to_common()` function, which is called by `repo_in_merge_bases_many()`, and those errors will be properly propagated back to the caller at that stage. Signed-off-by: Johannes Schindelin --- builtin/branch.c | 12 +++++-- builtin/fast-import.c | 6 +++- builtin/fetch.c | 2 ++ builtin/log.c | 7 ++-- builtin/merge-base.c | 6 +++- builtin/pull.c | 4 +++ builtin/receive-pack.c | 6 +++- commit-reach.c | 8 +++-- http-push.c | 5 ++- merge-ort.c | 81 ++++++++++++++++++++++++++++++++++++------ merge-recursive.c | 54 +++++++++++++++++++++++----- shallow.c | 18 ++++++---- 12 files changed, 173 insertions(+), 36 deletions(-) diff --git a/builtin/branch.c b/builtin/branch.c index e7ee9bd0f15..7f9e79237f3 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -161,6 +161,8 @@ static int branch_merged(int kind, const char *name, merged = reference_rev ? repo_in_merge_bases(the_repository, rev, reference_rev) : 0; + if (merged < 0) + exit(128); /* * After the safety valve is fully redefined to "check with @@ -169,9 +171,13 @@ static int branch_merged(int kind, const char *name, * any of the following code, but during the transition period, * a gentle reminder is in order. */ - if ((head_rev != reference_rev) && - (head_rev ? repo_in_merge_bases(the_repository, rev, head_rev) : 0) != merged) { - if (merged) + if (head_rev != reference_rev) { + int expect = head_rev ? repo_in_merge_bases(the_repository, rev, head_rev) : 0; + if (expect < 0) + exit(128); + if (expect == merged) + ; /* okay */ + else if (merged) warning(_("deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD"), name, reference_name); diff --git a/builtin/fast-import.c b/builtin/fast-import.c index 444f41cf8ca..14c2efa88fc 100644 --- a/builtin/fast-import.c +++ b/builtin/fast-import.c @@ -1625,6 +1625,7 @@ static int update_branch(struct branch *b) oidclr(&old_oid); if (!force_update && !is_null_oid(&old_oid)) { struct commit *old_cmit, *new_cmit; + int ret; old_cmit = lookup_commit_reference_gently(the_repository, &old_oid, 0); @@ -1633,7 +1634,10 @@ static int update_branch(struct branch *b) if (!old_cmit || !new_cmit) return error("Branch %s is missing commits.", b->name); - if (!repo_in_merge_bases(the_repository, old_cmit, new_cmit)) { + ret = repo_in_merge_bases(the_repository, old_cmit, new_cmit); + if (ret < 0) + exit(128); + if (!ret) { warning("Not updating %s" " (new tip %s does not contain %s)", b->name, oid_to_hex(&b->oid), diff --git a/builtin/fetch.c b/builtin/fetch.c index fd134ba74d9..0584a1f8b64 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -978,6 +978,8 @@ static int update_local_ref(struct ref *ref, uint64_t t_before = getnanotime(); fast_forward = repo_in_merge_bases(the_repository, current, updated); + if (fast_forward < 0) + exit(128); forced_updates_ms += (getnanotime() - t_before) / 1000000; } else { fast_forward = 1; diff --git a/builtin/log.c b/builtin/log.c index ba775d7b5cf..1705da71aca 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1623,7 +1623,7 @@ static struct commit *get_base_commit(const char *base_commit, { struct commit *base = NULL; struct commit **rev; - int i = 0, rev_nr = 0, auto_select, die_on_failure; + int i = 0, rev_nr = 0, auto_select, die_on_failure, ret; switch (auto_base) { case AUTO_BASE_NEVER: @@ -1723,7 +1723,10 @@ static struct commit *get_base_commit(const char *base_commit, rev_nr = DIV_ROUND_UP(rev_nr, 2); } - if (!repo_in_merge_bases(the_repository, base, rev[0])) { + ret = repo_in_merge_bases(the_repository, base, rev[0]); + if (ret < 0) + exit(128); + if (!ret) { if (die_on_failure) { die(_("base commit should be the ancestor of revision list")); } else { diff --git a/builtin/merge-base.c b/builtin/merge-base.c index e68b7fe45d7..0308fd73289 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -103,12 +103,16 @@ static int handle_octopus(int count, const char **args, int show_all) static int handle_is_ancestor(int argc, const char **argv) { struct commit *one, *two; + int ret; if (argc != 2) die("--is-ancestor takes exactly two commits"); one = get_commit_reference(argv[0]); two = get_commit_reference(argv[1]); - if (repo_in_merge_bases(the_repository, one, two)) + ret = repo_in_merge_bases(the_repository, one, two); + if (ret < 0) + exit(128); + if (ret) return 0; else return 1; diff --git a/builtin/pull.c b/builtin/pull.c index be2b2c9ebc9..e6f2942c0c5 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -931,6 +931,8 @@ static int get_can_ff(struct object_id *orig_head, merge_head = lookup_commit_reference(the_repository, orig_merge_head); ret = repo_is_descendant_of(the_repository, merge_head, list); free_commit_list(list); + if (ret < 0) + exit(128); return ret; } @@ -955,6 +957,8 @@ static int already_up_to_date(struct object_id *orig_head, commit_list_insert(theirs, &list); ok = repo_is_descendant_of(the_repository, ours, list); free_commit_list(list); + if (ok < 0) + exit(128); if (!ok) return 0; } diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 8c4f0cb90a9..956fea6293e 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -1546,6 +1546,7 @@ static const char *update(struct command *cmd, struct shallow_info *si) starts_with(name, "refs/heads/")) { struct object *old_object, *new_object; struct commit *old_commit, *new_commit; + int ret2; old_object = parse_object(the_repository, old_oid); new_object = parse_object(the_repository, new_oid); @@ -1559,7 +1560,10 @@ static const char *update(struct command *cmd, struct shallow_info *si) } old_commit = (struct commit *)old_object; new_commit = (struct commit *)new_object; - if (!repo_in_merge_bases(the_repository, old_commit, new_commit)) { + ret2 = repo_in_merge_bases(the_repository, old_commit, new_commit); + if (ret2 < 0) + exit(128); + if (!ret2) { rp_error("denying non-fast-forward %s" " (you should pull first)", name); ret = "non-fast-forward"; diff --git a/commit-reach.c b/commit-reach.c index 5c1b5256598..5ff71d72d51 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -464,11 +464,13 @@ int repo_is_descendant_of(struct repository *r, } else { while (with_commit) { struct commit *other; + int ret; other = with_commit->item; with_commit = with_commit->next; - if (repo_in_merge_bases_many(r, other, 1, &commit, 0)) - return 1; + ret = repo_in_merge_bases_many(r, other, 1, &commit, 0); + if (ret) + return ret; } return 0; } @@ -598,6 +600,8 @@ int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid) commit_list_insert(old_commit, &old_commit_list); ret = repo_is_descendant_of(the_repository, new_commit, old_commit_list); + if (ret < 0) + exit(128); free_commit_list(old_commit_list); return ret; } diff --git a/http-push.c b/http-push.c index a704f490fdb..24c16a4f5ff 100644 --- a/http-push.c +++ b/http-push.c @@ -1576,8 +1576,11 @@ static int verify_merge_base(struct object_id *head_oid, struct ref *remote) struct commit *head = lookup_commit_or_die(head_oid, "HEAD"); struct commit *branch = lookup_commit_or_die(&remote->old_oid, remote->name); + int ret = repo_in_merge_bases(the_repository, branch, head); - return repo_in_merge_bases(the_repository, branch, head); + if (ret < 0) + exit(128); + return ret; } static int delete_remote_branch(const char *pattern, int force) diff --git a/merge-ort.c b/merge-ort.c index 6491070d965..9f3af46333a 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -544,6 +544,7 @@ enum conflict_and_info_types { CONFLICT_SUBMODULE_HISTORY_NOT_AVAILABLE, CONFLICT_SUBMODULE_MAY_HAVE_REWINDS, CONFLICT_SUBMODULE_NULL_MERGE_BASE, + CONFLICT_SUBMODULE_CORRUPT, /* Keep this entry _last_ in the list */ NB_CONFLICT_TYPES, @@ -596,7 +597,9 @@ static const char *type_short_descriptions[] = { [CONFLICT_SUBMODULE_MAY_HAVE_REWINDS] = "CONFLICT (submodule may have rewinds)", [CONFLICT_SUBMODULE_NULL_MERGE_BASE] = - "CONFLICT (submodule lacks merge base)" + "CONFLICT (submodule lacks merge base)", + [CONFLICT_SUBMODULE_CORRUPT] = + "CONFLICT (submodule corrupt)" }; struct logical_conflict_info { @@ -1710,7 +1713,14 @@ static int find_first_merges(struct repository *repo, die("revision walk setup failed"); while ((commit = get_revision(&revs)) != NULL) { struct object *o = &(commit->object); - if (repo_in_merge_bases(repo, b, commit)) + int ret = repo_in_merge_bases(repo, b, commit); + + if (ret < 0) { + object_array_clear(&merges); + release_revisions(&revs); + return ret; + } + if (ret > 0) add_object_array(o, NULL, &merges); } reset_revision_walk(); @@ -1725,9 +1735,17 @@ static int find_first_merges(struct repository *repo, contains_another = 0; for (j = 0; j < merges.nr; j++) { struct commit *m2 = (struct commit *) merges.objects[j].item; - if (i != j && repo_in_merge_bases(repo, m2, m1)) { - contains_another = 1; - break; + if (i != j) { + int ret = repo_in_merge_bases(repo, m2, m1); + if (ret < 0) { + object_array_clear(&merges); + release_revisions(&revs); + return ret; + } + if (ret > 0) { + contains_another = 1; + break; + } } } @@ -1749,7 +1767,7 @@ static int merge_submodule(struct merge_options *opt, { struct repository subrepo; struct strbuf sb = STRBUF_INIT; - int ret = 0; + int ret = 0, ret2; struct commit *commit_o, *commit_a, *commit_b; int parent_count; struct object_array merges; @@ -1796,8 +1814,26 @@ static int merge_submodule(struct merge_options *opt, } /* check whether both changes are forward */ - if (!repo_in_merge_bases(&subrepo, commit_o, commit_a) || - !repo_in_merge_bases(&subrepo, commit_o, commit_b)) { + ret2 = repo_in_merge_bases(&subrepo, commit_o, commit_a); + if (ret2 < 0) { + path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0, + path, NULL, NULL, NULL, + _("Failed to merge submodule %s " + "(repository corrupt)"), + path); + goto cleanup; + } + if (ret2 > 0) + ret2 = repo_in_merge_bases(&subrepo, commit_o, commit_b); + if (ret2 < 0) { + path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0, + path, NULL, NULL, NULL, + _("Failed to merge submodule %s " + "(repository corrupt)"), + path); + goto cleanup; + } + if (!ret2) { path_msg(opt, CONFLICT_SUBMODULE_MAY_HAVE_REWINDS, 0, path, NULL, NULL, NULL, _("Failed to merge submodule %s " @@ -1807,7 +1843,16 @@ static int merge_submodule(struct merge_options *opt, } /* Case #1: a is contained in b or vice versa */ - if (repo_in_merge_bases(&subrepo, commit_a, commit_b)) { + ret2 = repo_in_merge_bases(&subrepo, commit_a, commit_b); + if (ret2 < 0) { + path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0, + path, NULL, NULL, NULL, + _("Failed to merge submodule %s " + "(repository corrupt)"), + path); + goto cleanup; + } + if (ret2 > 0) { oidcpy(result, b); path_msg(opt, INFO_SUBMODULE_FAST_FORWARDING, 1, path, NULL, NULL, NULL, @@ -1816,7 +1861,16 @@ static int merge_submodule(struct merge_options *opt, ret = 1; goto cleanup; } - if (repo_in_merge_bases(&subrepo, commit_b, commit_a)) { + ret2 = repo_in_merge_bases(&subrepo, commit_b, commit_a); + if (ret2 < 0) { + path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0, + path, NULL, NULL, NULL, + _("Failed to merge submodule %s " + "(repository corrupt)"), + path); + goto cleanup; + } + if (ret2 > 0) { oidcpy(result, a); path_msg(opt, INFO_SUBMODULE_FAST_FORWARDING, 1, path, NULL, NULL, NULL, @@ -1841,6 +1895,13 @@ static int merge_submodule(struct merge_options *opt, parent_count = find_first_merges(&subrepo, path, commit_a, commit_b, &merges); switch (parent_count) { + case -1: + path_msg(opt, CONFLICT_SUBMODULE_CORRUPT, 0, + path, NULL, NULL, NULL, + _("Failed to merge submodule %s " + "(repository corrupt)"), + path); + break; case 0: path_msg(opt, CONFLICT_SUBMODULE_FAILED_TO_MERGE, 0, path, NULL, NULL, NULL, diff --git a/merge-recursive.c b/merge-recursive.c index e3beb0801b1..0d931cc14ad 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1144,7 +1144,13 @@ static int find_first_merges(struct repository *repo, die("revision walk setup failed"); while ((commit = get_revision(&revs)) != NULL) { struct object *o = &(commit->object); - if (repo_in_merge_bases(repo, b, commit)) + int ret = repo_in_merge_bases(repo, b, commit); + if (ret < 0) { + object_array_clear(&merges); + release_revisions(&revs); + return ret; + } + if (ret) add_object_array(o, NULL, &merges); } reset_revision_walk(); @@ -1159,9 +1165,17 @@ static int find_first_merges(struct repository *repo, contains_another = 0; for (j = 0; j < merges.nr; j++) { struct commit *m2 = (struct commit *) merges.objects[j].item; - if (i != j && repo_in_merge_bases(repo, m2, m1)) { - contains_another = 1; - break; + if (i != j) { + int ret = repo_in_merge_bases(repo, m2, m1); + if (ret < 0) { + object_array_clear(&merges); + release_revisions(&revs); + return ret; + } + if (ret > 0) { + contains_another = 1; + break; + } } } @@ -1197,7 +1211,7 @@ static int merge_submodule(struct merge_options *opt, const struct object_id *b) { struct repository subrepo; - int ret = 0; + int ret = 0, ret2; struct commit *commit_base, *commit_a, *commit_b; int parent_count; struct object_array merges; @@ -1234,14 +1248,29 @@ static int merge_submodule(struct merge_options *opt, } /* check whether both changes are forward */ - if (!repo_in_merge_bases(&subrepo, commit_base, commit_a) || - !repo_in_merge_bases(&subrepo, commit_base, commit_b)) { + ret2 = repo_in_merge_bases(&subrepo, commit_base, commit_a); + if (ret2 < 0) { + output(opt, 1, _("Failed to merge submodule %s (repository corrupt)"), path); + goto cleanup; + } + if (ret2 > 0) + ret2 = repo_in_merge_bases(&subrepo, commit_base, commit_b); + if (ret2 < 0) { + output(opt, 1, _("Failed to merge submodule %s (repository corrupt)"), path); + goto cleanup; + } + if (!ret2) { output(opt, 1, _("Failed to merge submodule %s (commits don't follow merge-base)"), path); goto cleanup; } /* Case #1: a is contained in b or vice versa */ - if (repo_in_merge_bases(&subrepo, commit_a, commit_b)) { + ret2 = repo_in_merge_bases(&subrepo, commit_a, commit_b); + if (ret2 < 0) { + output(opt, 1, _("Failed to merge submodule %s (repository corrupt)"), path); + goto cleanup; + } + if (ret2) { oidcpy(result, b); if (show(opt, 3)) { output(opt, 3, _("Fast-forwarding submodule %s to the following commit:"), path); @@ -1254,7 +1283,12 @@ static int merge_submodule(struct merge_options *opt, ret = 1; goto cleanup; } - if (repo_in_merge_bases(&subrepo, commit_b, commit_a)) { + ret2 = repo_in_merge_bases(&subrepo, commit_b, commit_a); + if (ret2 < 0) { + output(opt, 1, _("Failed to merge submodule %s (repository corrupt)"), path); + goto cleanup; + } + if (ret2) { oidcpy(result, a); if (show(opt, 3)) { output(opt, 3, _("Fast-forwarding submodule %s to the following commit:"), path); @@ -1402,6 +1436,8 @@ static int merge_mode_and_contents(struct merge_options *opt, &o->oid, &a->oid, &b->oid); + if (result->clean < 0) + return -1; } else if (S_ISLNK(a->mode)) { switch (opt->recursive_variant) { case MERGE_VARIANT_NORMAL: diff --git a/shallow.c b/shallow.c index dfcc1f86a7f..f71496f35c3 100644 --- a/shallow.c +++ b/shallow.c @@ -795,12 +795,16 @@ static void post_assign_shallow(struct shallow_info *info, if (!*bitmap) continue; for (j = 0; j < bitmap_nr; j++) - if (bitmap[0][j] && - /* Step 7, reachability test at commit level */ - !repo_in_merge_bases_many(the_repository, c, ca.nr, ca.commits, 1)) { - update_refstatus(ref_status, info->ref->nr, *bitmap); - dst++; - break; + if (bitmap[0][j]) { + /* Step 7, reachability test at commit level */ + int ret = repo_in_merge_bases_many(the_repository, c, ca.nr, ca.commits, 1); + if (ret < 0) + exit(128); + if (!ret) { + update_refstatus(ref_status, info->ref->nr, *bitmap); + dst++; + break; + } } } info->nr_ours = dst; @@ -830,6 +834,8 @@ int delayed_reachability_test(struct shallow_info *si, int c) si->nr_commits, si->commits, 1); + if (si->reachable[c] < 0) + exit(128); si->need_reachability_test[c] = 0; } return si->reachable[c]; From patchwork Wed Feb 28 09:44:10 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575150 Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 18546364DC for ; Wed, 28 Feb 2024 09:44:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113468; cv=none; b=SJAZS0gvww721REvU0zIeAXNkD81vq34szaH8/sJZtLugpfyZv2YLFv7MmhylZgxE+dz36/X1+vzix8fXEHTJpZ454efgC4vdgztan/Tbb6C5olW94e752aQwpl1FTdXOI9eRhgYZvnCoLm3do4CHopyA4Ns+QGaMbjIOxMSyJs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113468; c=relaxed/simple; bh=4MhjPZCuKVpNh0EyRH5/rOo2hBA243eDsP43+gwPevU=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=kgDlHy6fPri9mOaB1mpLhMsduwmXGU2+XgMLnHpkhKkcuztQoJRmHtwiJBB7LtahSHtufPdedCjpzW4zSVHdNcP23sAW8IpDbSIxiuay+YbTKzg8MPJCJkoKGmCQtryrLMryxXUNMCRS5K4whkQpZW1UPQb1xxB4a6hOU9MjOEE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fWIaCzuG; arc=none smtp.client-ip=209.85.221.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fWIaCzuG" Received: by mail-wr1-f47.google.com with SMTP id ffacd0b85a97d-33d18931a94so3948730f8f.1 for ; Wed, 28 Feb 2024 01:44:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113465; x=1709718265; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=NnIxzez0lIanLyqGuOlIkiD3HmL+wsRoVicOjde7vUU=; b=fWIaCzuGBGLB0E8ik9XFHs2prH96LbpBG4cgf7FXWohKVHpEEHgYg8Hl/7k/xVq0lf +ocSKukXV/wggP15aBH9adQClMfbjbwNef4KkTwmZ4OjPMAh6sdg8SOZWSY5UuFIYs+e Cs0iEKy4VFKN6mwXkp8Ib3OLo8YvdNqfn/+cQh+brzmq/gVK+XB0cfe+0nYIvGMMgv1y atfiN8mHeMsZSbsYQnbDzxzEi0bSc2tkfyC/B3sq/9bKBCTmRUgM3xMBm/K0XTCwATSJ 17gqjp9aV/3yMY5WpeYm0JIPmonAnslbOYRTRTrBJHB8+tlzVjBuqbbbLbO9V7tqssRN pO+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113465; x=1709718265; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NnIxzez0lIanLyqGuOlIkiD3HmL+wsRoVicOjde7vUU=; b=f9GbdrWIhMQIAkTlfWvCpHwWtupKfF9O0GfmL4h3uJq6btmzOZGJKeNR6PfolAzDDF aispnnGDHUJ2OSXlEj9AogIr6lCj/xtliiU4+1WtZI2/lsQyjQ0wv0HKqkXKbgyIZa7T 5M4rGzjPab8WX1fnDjveZ3hfxVPI6f8jtNvwf5GUdxFOdiFWy+PsXr/DwJPxAx6Xxm4g uc7VtIdxkwJjqVD2uiS20PlX8Z8g48FBo3tCLZsacfcvDUIAzH7dK8GPt3sT4S/x0c3B L3CHdQJWv3ST1/KxN4noZVgCTxH2jes+jAlezj2ICyeY89cliavNmms7p7eo7xBdhfzX BWQQ== X-Gm-Message-State: AOJu0YyIJoktRnhTm2i05FpaHDV0Z2h68safolOfEvCEqX+U1qw8klkX +vFZ/I+JaKR78piJLFHzWmi6wzsEZhR96+tHcvbOhWqxIy2dAfuLKrdxAWJt X-Google-Smtp-Source: AGHT+IGJFNzCiNj86LvoxpMBxohDN4hxHgChmEGCquIdK0CP2Z0S0T5Y8eRrzu+7vNqsY4D8rFbsVw== X-Received: by 2002:adf:e0c6:0:b0:33b:8358:2694 with SMTP id m6-20020adfe0c6000000b0033b83582694mr8040430wri.5.1709113464748; Wed, 28 Feb 2024 01:44:24 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id cl7-20020a5d5f07000000b0033dc931eb06sm11384429wrb.0.2024.02.28.01.44.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:23 -0800 (PST) Message-ID: <837aa5a89c640427a5de064da93f1de4934d8212.1709113458.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:10 +0000 Subject: [PATCH v4 04/11] commit-reach(paint_down_to_common): prepare for handling shallow commits Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin When `git fetch --update-shallow` needs to test for commit ancestry, it can naturally run into a missing object (e.g. if it is a parent of a shallow commit). For the purpose of `--update-shallow`, this needs to be treated as if the child commit did not even have that parent, i.e. the commit history needs to be clamped. For all other scenarios, clamping the commit history is actually a bug, as it would hide repository corruption (for an analysis regarding shallow and partial clones, see the analysis further down). Add a flag to optionally ask the function to ignore missing commits, as `--update-shallow` needs it to, while detecting missing objects as a repository corruption error by default. This flag is needed, and cannot replaced by `is_repository_shallow()` to indicate that situation, because that function would return 0 in the `--update-shallow` scenario: There is not actually a `shallow` file in that scenario, as demonstrated e.g. by t5537.10 ("add new shallow root with receive.updateshallow on") and t5538.4 ("add new shallow root with receive.updateshallow on"). Note: shallow commits' parents are set to `NULL` internally already, therefore there is no need to special-case shallow repositories here, as the merge-base logic will not try to access parent commits of shallow commits. Likewise, partial clones aren't an issue either: If a commit is missing during the revision walk in the merge-base logic, it is fetched via `promisor_remote_get_direct()`. And not only the single missing commit object: Due to the way the "promised" objects are fetched (in `fetch_objects()` in `promisor-remote.c`, using `fetch --filter=blob:none`), there is no actual way to fetch a single commit object, as the remote side will pass that commit OID to `pack-objects --revs [...]` which in turn passes it to `rev-list` which interprets this as a commit _range_ instead of a single object. Therefore, in partial clones (unless they are shallow in addition), all commits reachable from a commit that is in the local object database are also present in that local database. Signed-off-by: Johannes Schindelin --- commit-reach.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/commit-reach.c b/commit-reach.c index 5ff71d72d51..7112b10eeea 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -53,7 +53,8 @@ static int queue_has_nonstale(struct prio_queue *queue) static struct commit_list *paint_down_to_common(struct repository *r, struct commit *one, int n, struct commit **twos, - timestamp_t min_generation) + timestamp_t min_generation, + int ignore_missing_commits) { struct prio_queue queue = { compare_commits_by_gen_then_commit_date }; struct commit_list *result = NULL; @@ -108,6 +109,13 @@ static struct commit_list *paint_down_to_common(struct repository *r, if (repo_parse_commit(r, p)) { clear_prio_queue(&queue); free_commit_list(result); + /* + * At this stage, we know that the commit is + * missing: `repo_parse_commit()` uses + * `OBJECT_INFO_DIE_IF_CORRUPT` and therefore + * corrupt commits would already have been + * dispatched with a `die()`. + */ return NULL; } p->object.flags |= flags; @@ -143,7 +151,7 @@ static struct commit_list *merge_bases_many(struct repository *r, return NULL; } - list = paint_down_to_common(r, one, n, twos, 0); + list = paint_down_to_common(r, one, n, twos, 0, 0); while (list) { struct commit *commit = pop_commit(&list); @@ -214,7 +222,7 @@ static int remove_redundant_no_gen(struct repository *r, min_generation = curr_generation; } common = paint_down_to_common(r, array[i], filled, - work, min_generation); + work, min_generation, 0); if (array[i]->object.flags & PARENT2) redundant[i] = 1; for (j = 0; j < filled; j++) @@ -504,7 +512,7 @@ int repo_in_merge_bases_many(struct repository *r, struct commit *commit, bases = paint_down_to_common(r, commit, nr_reference, reference, - generation); + generation, ignore_missing_commits); if (commit->object.flags & PARENT2) ret = 1; clear_commit_marks(commit, all_flags); From patchwork Wed Feb 28 09:44:11 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575152 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC90C36B0E for ; Wed, 28 Feb 2024 09:44:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113469; cv=none; b=JZ4AZsaG9VfocG/MEgq+922MX4I8fd0wLRPNtUV5p8uRflYuae3S7lNEWh/vLabPJQjAsSK5pjIPYm9LwXT2/tOCa1tbvHCVzBMXXUeaOiuHz+WTBbbbHDwm+bTt93lV4G+MzY2ucft/IuTyU3u2S/cK8xrFFCJpaHpdKQLvVjs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113469; c=relaxed/simple; bh=51ySa4HRTmbfzAx+3m0FkYsYG9NeqXVV2Gt2Q7BiPDk=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=iOohPwk9RCLnURbaRLdiTTII7JBVMRkWqlj+pC5NFDFO7Wn2HD1RJSIYKgEyxfooJl5xSEIRbXGmhZ0ei7jcxrm/x9ksgsMuaGtNSnfUoC1oq74MQ+jLN45K4saAze/LrQl5IHzkkLR+V3himy3NUU3AelTZ6rwyhlpghjFVqE0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=D4WgLdBV; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="D4WgLdBV" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-412a588c8b4so21014935e9.0 for ; Wed, 28 Feb 2024 01:44:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113466; x=1709718266; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=PkhpT+ucp6WzLyC55CcklHZz3GJAYR7x1HfXvhtUwr8=; b=D4WgLdBVqgQCH4OIJHLBiBg4TOT45CeVqp4WJR0Jh6m2PSYB/KQFozWKSl5R8uKl3w 3SNBjoztBTDxFP2Eu/ZMo/VGA8dr6g4szko3cGdis5gKabz0OCjUO3tHB2hUUx5Zvm7P jp0TOTUEbuyZpBmmD+3lB2cXIAWpW6VxaykoHyn8Xmz/eaG8xofmRepmR3vHCdZslrs8 b2VgFjjh1SbPkh6piOPK1NfM+GBtFkdTlFi2b1jQy/ZDC6kcsRSUvWh+cgG9lsMv7FMR 8dJ20fZilacbSqHysDqJFy5gHFugh1hCuUhOCUJMUqJM8BsBhb27WtFUlEQHIectSgkr t2Mw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113466; x=1709718266; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PkhpT+ucp6WzLyC55CcklHZz3GJAYR7x1HfXvhtUwr8=; b=LmTc3hzlQcXiReTv3X9HUyEnGnSftSjx0dvg/7XnPq+o5MsL3+Gg438i4PIOMOzVLb D9Di5uvrPZSwKkzVdKnlkWgZUs+yprI6NwAYNGvyL9iiBtOfeGui41eosgg3sr33Br+H hieHkPoYYtrBui1Hn6a+bcOI6/0NOqSuakecGejdB8Ingpkb1sWaYqi6kTgsd5LoBw2j E6u+96QVANjCD3MBOEso5wbej6+TYCwdcqSYZ5w4E2xc4/f9S0Cx4d+9NV+hpCRpq5X8 IJnNFQdMPDA6wPdnI0TBbt7wPUsSjtnCDaU7yk9TG1FtQEI2TQ79yaeCrnZ5h2gyRMKf sRSQ== X-Gm-Message-State: AOJu0YzkbbF8c3gxeTQju5HxMjAUedb1J+7Ii90eXiJV/ogdiOnzKg0Z S+tGFyHIApshVAEhyKiD4J0IwCcjTd3pq3at2c9GX9xhksGE4lOhX2mrvZMV X-Google-Smtp-Source: AGHT+IH1vdXONk8zosf8Rmf9uQTNV2l67xPFkBlLQgvdT4mgklSm4k624zvBZ48MXqsyiNXg94Z+zw== X-Received: by 2002:a5d:4fcf:0:b0:33d:2710:b424 with SMTP id h15-20020a5d4fcf000000b0033d2710b424mr8725966wrw.22.1709113465937; Wed, 28 Feb 2024 01:44:25 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id q1-20020adffec1000000b0033cf80ad6f5sm13898814wrs.60.2024.02.28.01.44.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:25 -0800 (PST) Message-ID: In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:11 +0000 Subject: [PATCH v4 05/11] commit-reach(paint_down_to_common): start reporting errors Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin If a commit cannot be parsed, it is currently ignored when looking for merge bases. That's undesirable as the operation can pretend success in a corrupt repository, even though the command should fail with an error message. Let's start at the bottom of the stack by teaching the `paint_down_to_common()` function to return an `int`: if negative, it indicates fatal error, if 0 success. This requires a couple of callers to be adjusted accordingly. Signed-off-by: Johannes Schindelin --- commit-reach.c | 66 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/commit-reach.c b/commit-reach.c index 7112b10eeea..9ad5f9db4f7 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -50,14 +50,14 @@ static int queue_has_nonstale(struct prio_queue *queue) } /* all input commits in one and twos[] must have been parsed! */ -static struct commit_list *paint_down_to_common(struct repository *r, - struct commit *one, int n, - struct commit **twos, - timestamp_t min_generation, - int ignore_missing_commits) +static int paint_down_to_common(struct repository *r, + struct commit *one, int n, + struct commit **twos, + timestamp_t min_generation, + int ignore_missing_commits, + struct commit_list **result) { struct prio_queue queue = { compare_commits_by_gen_then_commit_date }; - struct commit_list *result = NULL; int i; timestamp_t last_gen = GENERATION_NUMBER_INFINITY; @@ -66,8 +66,8 @@ static struct commit_list *paint_down_to_common(struct repository *r, one->object.flags |= PARENT1; if (!n) { - commit_list_append(one, &result); - return result; + commit_list_append(one, result); + return 0; } prio_queue_put(&queue, one); @@ -95,7 +95,7 @@ static struct commit_list *paint_down_to_common(struct repository *r, if (flags == (PARENT1 | PARENT2)) { if (!(commit->object.flags & RESULT)) { commit->object.flags |= RESULT; - commit_list_insert_by_date(commit, &result); + commit_list_insert_by_date(commit, result); } /* Mark parents of a found merge stale */ flags |= STALE; @@ -108,7 +108,8 @@ static struct commit_list *paint_down_to_common(struct repository *r, continue; if (repo_parse_commit(r, p)) { clear_prio_queue(&queue); - free_commit_list(result); + free_commit_list(*result); + *result = NULL; /* * At this stage, we know that the commit is * missing: `repo_parse_commit()` uses @@ -116,7 +117,10 @@ static struct commit_list *paint_down_to_common(struct repository *r, * corrupt commits would already have been * dispatched with a `die()`. */ - return NULL; + if (ignore_missing_commits) + return 0; + return error(_("could not parse commit %s"), + oid_to_hex(&p->object.oid)); } p->object.flags |= flags; prio_queue_put(&queue, p); @@ -124,7 +128,7 @@ static struct commit_list *paint_down_to_common(struct repository *r, } clear_prio_queue(&queue); - return result; + return 0; } static struct commit_list *merge_bases_many(struct repository *r, @@ -151,7 +155,10 @@ static struct commit_list *merge_bases_many(struct repository *r, return NULL; } - list = paint_down_to_common(r, one, n, twos, 0, 0); + if (paint_down_to_common(r, one, n, twos, 0, 0, &list)) { + free_commit_list(list); + return NULL; + } while (list) { struct commit *commit = pop_commit(&list); @@ -205,7 +212,7 @@ static int remove_redundant_no_gen(struct repository *r, for (i = 0; i < cnt; i++) repo_parse_commit(r, array[i]); for (i = 0; i < cnt; i++) { - struct commit_list *common; + struct commit_list *common = NULL; timestamp_t min_generation = commit_graph_generation(array[i]); if (redundant[i]) @@ -221,8 +228,16 @@ static int remove_redundant_no_gen(struct repository *r, if (curr_generation < min_generation) min_generation = curr_generation; } - common = paint_down_to_common(r, array[i], filled, - work, min_generation, 0); + if (paint_down_to_common(r, array[i], filled, + work, min_generation, 0, &common)) { + clear_commit_marks(array[i], all_flags); + clear_commit_marks_many(filled, work, all_flags); + free_commit_list(common); + free(work); + free(redundant); + free(filled_index); + return -1; + } if (array[i]->object.flags & PARENT2) redundant[i] = 1; for (j = 0; j < filled; j++) @@ -422,6 +437,10 @@ static struct commit_list *get_merge_bases_many_0(struct repository *r, clear_commit_marks_many(n, twos, all_flags); cnt = remove_redundant(r, rslt, cnt); + if (cnt < 0) { + free(rslt); + return NULL; + } result = NULL; for (i = 0; i < cnt; i++) commit_list_insert_by_date(rslt[i], &result); @@ -491,7 +510,7 @@ int repo_in_merge_bases_many(struct repository *r, struct commit *commit, int nr_reference, struct commit **reference, int ignore_missing_commits) { - struct commit_list *bases; + struct commit_list *bases = NULL; int ret = 0, i; timestamp_t generation, max_generation = GENERATION_NUMBER_ZERO; @@ -510,10 +529,11 @@ int repo_in_merge_bases_many(struct repository *r, struct commit *commit, if (generation > max_generation) return ret; - bases = paint_down_to_common(r, commit, - nr_reference, reference, - generation, ignore_missing_commits); - if (commit->object.flags & PARENT2) + if (paint_down_to_common(r, commit, + nr_reference, reference, + generation, ignore_missing_commits, &bases)) + ret = -1; + else if (commit->object.flags & PARENT2) ret = 1; clear_commit_marks(commit, all_flags); clear_commit_marks_many(nr_reference, reference, all_flags); @@ -566,6 +586,10 @@ struct commit_list *reduce_heads(struct commit_list *heads) } } num_head = remove_redundant(the_repository, array, num_head); + if (num_head < 0) { + free(array); + return NULL; + } for (i = 0; i < num_head; i++) tail = &commit_list_insert(array[i], tail)->next; free(array); From patchwork Wed Feb 28 09:44:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575153 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EBA283715E for ; Wed, 28 Feb 2024 09:44:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113470; cv=none; b=MyxPhEzGrrlTTkMWBxxlK63bT30BwafAgSWzx4+M5AhS1hYDvHmAk9Jn2kuQ0jUJp4HVO0PUXCqcnJ7siIdkVS/0fxvesVU5qibnnJYJF7vqSUlK+MgPUnSz/UtWlDXuHreDl5DSD9ajG4rdW7kFVV65gKODLDYyxjJdwY+x5qM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113470; c=relaxed/simple; bh=xxTPOAubrM/wp9qyFuK3vFEIPUvWzFnD62bEAnM2No4=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=g9J6aYSXhLWlckJ3UZS7fMck/14vdW69t4LFBrlmlytvI8R+OXLs9bbikFDtus1ifimnFRdOwlD1BrjTKvyI6h4gCbMdAWz9/SY6GusjhiH6sA1F9UF3hYsUE220rrtzd8POPeg+IwGbe+lUsTQtTr8NTRcKxU/3OtXwkg6V0sY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hD/UkoN6; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hD/UkoN6" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-412a9e9c776so3739115e9.0 for ; Wed, 28 Feb 2024 01:44:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113467; x=1709718267; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=We3Sgt4JHA6aTvCpGEBIN6pAwmTwAf7XFQoin0EiPGQ=; b=hD/UkoN6Cu6G9ms4LKxI8qDNRJyFgRCF1Zi+db3WCMoJT5imFm/nsXRH12oRd188T0 8KzsksvQpsXZNgti0U/EPAimQ2vroJgsN8sALJlOsZyGLGGf5i5YO1df94C5F/cRtEo1 RMaugnHmVmf9GSTGKe3hvf7Fd4f3ym2vZpSdODI6jVq2IzujqMv+geQeZAe5UD/lnVuu zT8dSEVsbK0Cl9NEmRoQK/LIr3oEankeFs9Vr+dxI1zGp34Z8Oa50sp2VD8FpS1yPEXL FNBEhXqKakahSj4eochfGZIxLByBiSwS3zOQakuip3QobinXlInA2gZjE82gNPkxk6vT 2xdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113467; x=1709718267; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=We3Sgt4JHA6aTvCpGEBIN6pAwmTwAf7XFQoin0EiPGQ=; b=b0nVr8Tz+L7/fxJ9zhxTnETg2NUkHE3KnllhhNYanwzFA8qNXW1BrHf7oPuggHoIMi kSoEzQGTa4vkZ5U6ZFP8T24AtHWiO0UzClNOssrHPcrQ5zmbYNbRTSWgEFNTEunazHn2 UfBTHMbXwVqiR9pEwlEaQes/X/k+0mL4C4noSQtWJhSjtlBZ7TQ7iV4gg4T4iYS48Rbk cJSsVgJtKLcXaYMCs+34biMnlcscnsozF4Auww0lp3gn5sTMT/8YKZn9a7KEu21sI1BC BRP1UE3lCb6prB9ePw0e96lEdlaO7TGWpmMNvdnJlUrdwndgAJgQwpplk8Nj7wzHxN0k 4p+g== X-Gm-Message-State: AOJu0YwVnbYiRzfccudNbk4RvFopcnIlcN4KJqRDp7YzMWEjCw4gHHON 1s1ZRgnP7C3nuwXucqWXq5jLM/2P/PBtTQ9+IQuY01OE+FYLyewLpo9pv+ja X-Google-Smtp-Source: AGHT+IFdXnxOnMbGwzxaYd6I8d6T+hCcluTpMWLMx7ijmh6AP/hcRS0yi7MX2/uHjr0MJFi/fnC9RA== X-Received: by 2002:a05:600c:524f:b0:412:9739:717a with SMTP id fc15-20020a05600c524f00b004129739717amr1711237wmb.12.1709113466698; Wed, 28 Feb 2024 01:44:26 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id k7-20020a7bc407000000b004126e26f756sm1525546wmi.43.2024.02.28.01.44.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:26 -0800 (PST) Message-ID: <0f1ce130ce6fa868ea35ee7e96fa00aa52cc1435.1709113458.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:12 +0000 Subject: [PATCH v4 06/11] commit-reach(merge_bases_many): pass on "missing commits" errors Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin The `paint_down_to_common()` function was just taught to indicate parsing errors, and now the `merge_bases_many()` function is aware of that, too. One tricky aspect is that `merge_bases_many()` parses commits of its own, but wants to gracefully handle the scenario where NULL is passed as a merge head, returning the empty list of merge bases. The way this was handled involved calling `repo_parse_commit(NULL)` and relying on it to return an error. This has to be done differently now so that we can handle missing commits correctly by producing a fatal error. Next step: adjust the caller of `merge_bases_many()`: `get_merge_bases_many_0()`. Signed-off-by: Johannes Schindelin --- commit-reach.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/commit-reach.c b/commit-reach.c index 9ad5f9db4f7..ddfec5289dd 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -131,41 +131,49 @@ static int paint_down_to_common(struct repository *r, return 0; } -static struct commit_list *merge_bases_many(struct repository *r, - struct commit *one, int n, - struct commit **twos) +static int merge_bases_many(struct repository *r, + struct commit *one, int n, + struct commit **twos, + struct commit_list **result) { struct commit_list *list = NULL; - struct commit_list *result = NULL; int i; for (i = 0; i < n; i++) { - if (one == twos[i]) + if (one == twos[i]) { /* * We do not mark this even with RESULT so we do not * have to clean it up. */ - return commit_list_insert(one, &result); + *result = commit_list_insert(one, result); + return 0; + } } + if (!one) + return 0; if (repo_parse_commit(r, one)) - return NULL; + return error(_("could not parse commit %s"), + oid_to_hex(&one->object.oid)); for (i = 0; i < n; i++) { + if (!twos[i]) + return 0; if (repo_parse_commit(r, twos[i])) - return NULL; + return error(_("could not parse commit %s"), + oid_to_hex(&twos[i]->object.oid)); } if (paint_down_to_common(r, one, n, twos, 0, 0, &list)) { free_commit_list(list); - return NULL; + return -1; } while (list) { struct commit *commit = pop_commit(&list); if (!(commit->object.flags & STALE)) - commit_list_insert_by_date(commit, &result); + commit_list_insert_by_date(commit, result); } - return result; + return 0; } struct commit_list *get_octopus_merge_bases(struct commit_list *in) @@ -410,10 +418,11 @@ static struct commit_list *get_merge_bases_many_0(struct repository *r, { struct commit_list *list; struct commit **rslt; - struct commit_list *result; + struct commit_list *result = NULL; int cnt, i; - result = merge_bases_many(r, one, n, twos); + if (merge_bases_many(r, one, n, twos, &result) < 0) + return NULL; for (i = 0; i < n; i++) { if (one == twos[i]) return result; From patchwork Wed Feb 28 09:44:13 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575154 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73EF8381D9 for ; Wed, 28 Feb 2024 09:44:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113473; cv=none; b=CWhEj/2W5ZTMOwssnhXVXwSYP7eE7N/1Sk0VfD0jkcM6IzTYze3BhQzYuhWzjpTwsfdtE+7dGciktg9MXoDDI0SbgCnLrLasGx+2TvK+PJ0/4Hv48E8Hn+r0Gyr1f7B2mZB1tmaxkOliQht3qyAjIdfjAaOtdfdIKDcTQo4VWyQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113473; c=relaxed/simple; bh=4sru390Ibo8Xgf1DQbOS/BmNr3Y60J6I13Lau3kJsw4=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=ql4Zuu97w31YSgOGQdsPRwGN5VmLLeAcacK/0XEXF22WXhOi0LI0DX3p5dTClJkVACEteXDIDHY8E/ModTCeoqAu98UPWYPRP6WWk6NZ2wI/VhzF2MV78z5U0w4l8ri/mYfdkCyVKTohdlBjtCRWfP9UtVs1aCFL8HRTmEdV14U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IOXGEOqi; arc=none smtp.client-ip=209.85.167.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IOXGEOqi" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-512e39226efso6875928e87.0 for ; Wed, 28 Feb 2024 01:44:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113468; x=1709718268; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=5FR8nadIybslUzNDZkj0sP76S6uhVz9Mu+LpylHw2qE=; b=IOXGEOqiWirdOlb2LyDlG6DZZ6mvO5cI8BtF+pKM0ObaSx9LcK+1Y0iWtwHmusf+nA aItN9CRWsKo2Dv/clZITDn4ELu3hKjj0BQIQzWQHpiHcXnPisuAClfaW5B0A8mfDeK7u 2rRETUCkVdlNsygyR6pUIYVq9DvNx4EPOOPHJ1yP3t9jlA89f+pmRsKzSWz3nyhpQqrI TDBqAOCJQMMPMuDX3WZNEKkwEVFc0DojuRHRYNtlMYLtY8HivXsLs2cqM0fEIA5fWmwf zL5yxu8D67bdJqB5ur0k/7NXERh5VGAN5xNgc4i041E8b81hWaja8DTbjsheY0BTIjAf 2nYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113468; x=1709718268; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5FR8nadIybslUzNDZkj0sP76S6uhVz9Mu+LpylHw2qE=; b=FBNu0XPeV+xVLninVVEX+o6o6y/J7lzqHqCBIwtk01bj/aoWtA+os9ntrhhOxVOS2d sEVW5kroihudCwPrJGCTkXgBKlxvWqXppeBUCiXfvSIlDK5xCeykRY7Yo8XpbWf7cdgM hQXKuAvtL/B9YcWWXlS3GA+jpEisPXEiIDHiA3IZQN1b6Ht7doeHAYHEXcWuN9ILBgGE FB4QhIKZHUXsDseZ3MJzfTOZe8lmIMZusIW/2d9LiFBZhXLM0uwmFu+2Qq27a/aaHLaH qVkQDAK4XSNfN0JbAhhRRoJHWznsm/P+9sZ58SGHYSOJl8SJlYOsrhxfgSNFdofpze2t pkuw== X-Gm-Message-State: AOJu0YxaE3y23PD5VfWBIBqMtcVBFzmYEh3IanIza1aoeYVm3+mZnQ72 8eYtjvzTMSdeUVbUSyHzoNqMOXPJjb3X5VQ1TjYWNS5QPTL7FGfY3S67VxAE X-Google-Smtp-Source: AGHT+IH97FahrV7lIGIjKkpywmo1tTRwZkf8Iwop53y0iDY11jE0ldjgYRhfJTADQKQUi9tLTCeRjw== X-Received: by 2002:ac2:555c:0:b0:512:e0a8:39d8 with SMTP id l28-20020ac2555c000000b00512e0a839d8mr6875413lfk.43.1709113467972; Wed, 28 Feb 2024 01:44:27 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id h4-20020a05600016c400b0033dda0e82e5sm8769289wrf.32.2024.02.28.01.44.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:27 -0800 (PST) Message-ID: <133b69b6a62abb9317134636d5b323a33814e1ba.1709113458.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:13 +0000 Subject: [PATCH v4 07/11] commit-reach(get_merge_bases_many_0): pass on "missing commits" errors Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin The `merge_bases_many()` function was just taught to indicate parsing errors, and now the `get_merge_bases_many_0()` function is aware of that, too. Next step: adjust the callers of `get_merge_bases_many_0()`. Signed-off-by: Johannes Schindelin --- commit-reach.c | 57 +++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/commit-reach.c b/commit-reach.c index ddfec5289dd..c0123eb7207 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -410,37 +410,38 @@ static int remove_redundant(struct repository *r, struct commit **array, int cnt return remove_redundant_no_gen(r, array, cnt); } -static struct commit_list *get_merge_bases_many_0(struct repository *r, - struct commit *one, - int n, - struct commit **twos, - int cleanup) +static int get_merge_bases_many_0(struct repository *r, + struct commit *one, + int n, + struct commit **twos, + int cleanup, + struct commit_list **result) { struct commit_list *list; struct commit **rslt; - struct commit_list *result = NULL; int cnt, i; - if (merge_bases_many(r, one, n, twos, &result) < 0) - return NULL; + if (merge_bases_many(r, one, n, twos, result) < 0) + return -1; for (i = 0; i < n; i++) { if (one == twos[i]) - return result; + return 0; } - if (!result || !result->next) { + if (!*result || !(*result)->next) { if (cleanup) { clear_commit_marks(one, all_flags); clear_commit_marks_many(n, twos, all_flags); } - return result; + return 0; } /* There are more than one */ - cnt = commit_list_count(result); + cnt = commit_list_count(*result); CALLOC_ARRAY(rslt, cnt); - for (list = result, i = 0; list; list = list->next) + for (list = *result, i = 0; list; list = list->next) rslt[i++] = list->item; - free_commit_list(result); + free_commit_list(*result); + *result = NULL; clear_commit_marks(one, all_flags); clear_commit_marks_many(n, twos, all_flags); @@ -448,13 +449,12 @@ static struct commit_list *get_merge_bases_many_0(struct repository *r, cnt = remove_redundant(r, rslt, cnt); if (cnt < 0) { free(rslt); - return NULL; + return -1; } - result = NULL; for (i = 0; i < cnt; i++) - commit_list_insert_by_date(rslt[i], &result); + commit_list_insert_by_date(rslt[i], result); free(rslt); - return result; + return 0; } struct commit_list *repo_get_merge_bases_many(struct repository *r, @@ -462,7 +462,12 @@ struct commit_list *repo_get_merge_bases_many(struct repository *r, int n, struct commit **twos) { - return get_merge_bases_many_0(r, one, n, twos, 1); + struct commit_list *result = NULL; + if (get_merge_bases_many_0(r, one, n, twos, 1, &result) < 0) { + free_commit_list(result); + return NULL; + } + return result; } struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, @@ -470,14 +475,24 @@ struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, int n, struct commit **twos) { - return get_merge_bases_many_0(r, one, n, twos, 0); + struct commit_list *result = NULL; + if (get_merge_bases_many_0(r, one, n, twos, 0, &result) < 0) { + free_commit_list(result); + return NULL; + } + return result; } struct commit_list *repo_get_merge_bases(struct repository *r, struct commit *one, struct commit *two) { - return get_merge_bases_many_0(r, one, 1, &two, 1); + struct commit_list *result = NULL; + if (get_merge_bases_many_0(r, one, 1, &two, 1, &result) < 0) { + free_commit_list(result); + return NULL; + } + return result; } /* From patchwork Wed Feb 28 09:44:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575155 Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 664F1381D3 for ; Wed, 28 Feb 2024 09:44:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113473; cv=none; b=Q/c58v/8nbAj0dLttQR3z4G6+stw2hB4nuWFBAY8vfC0ELKMQlnXJCcFvDtNKrwKIqE5p/QeqqSWEiFozkd4vSdqMSiKAJZJaF8bxVTqYB8ih8GyL4Pmb6KRKG5K6dDWoZ8lzIDV8roEumw7O4eRnNcFcVOmrPlsyLkd20WfE5o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113473; c=relaxed/simple; bh=r+Lc9CG08TCOztvZD5xlgGknEtghPZgKWTg6YXhfOFA=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=upWCen1cseQvuc6f+odv5RAFvYMmIGEB2jIk9o1xi7epHfw6VzRMgExTzRM0sTSZno/LzCkHAW1AoKgGWGnPuvFrzA/lQZK7v0eJWiWZITUxSFPMDeitCALFaB4G74mUZrW5SOkL6N/xAPVYvWd5tZG38hr0zTQlQAUMVpbKLVg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mLmxFoQQ; arc=none smtp.client-ip=209.85.208.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mLmxFoQQ" Received: by mail-lj1-f178.google.com with SMTP id 38308e7fff4ca-2d29111272eso34444981fa.0 for ; Wed, 28 Feb 2024 01:44:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113469; x=1709718269; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=MWgX7qcbweyURCi15V2lswLOe2et+hrS2He5Bd0a9a4=; b=mLmxFoQQKrx2mFcmHO+nvZHf5qAxxpx40RwA06hRr1697JmBAQLX/32MnVQQtuzvSb 5vXVslb/rCzQGJN4YkvjQZeSdmv8rNMwz07xQ4V7GzLmXhkaPp+arQ9vGKhan9XfWtbo +eTyHZ/vXSQcGZhLDiB30Dl8BC/T8dLicFKrpI8zqasNVFrDzMFasQSNYzkmH4GLBCG5 us0eSBoLRrFYe75P9FWw/SRVtEpQPCUqkn1lCACP5zJ4ZQQ/bWCFZQZWJ/iUQWJ0OUNk atZvUxsk9oKH9lIbVYL2lkK8jk8pfeBDhY9IdFLK6DG2PGBbyIyAL4PIEHOvJ1sxrz+L GiiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113469; x=1709718269; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MWgX7qcbweyURCi15V2lswLOe2et+hrS2He5Bd0a9a4=; b=C/rUzNBfgSigGihHvANYCnA99xnY8XkzVsyfF/fQg/u22n+nmqn/1oxUnL2McYFAAD di/QI79oxloLK/I5nmSPBGH/gGlqsP5pXDvztphyRtiE6JSqeC4mgtoPdgFPmHI5F3Vw BsJ8JhAZVursiw2KoJJF0GZVXjbKTrn8KjqnzC2AKmz/9Hom5q2qpQ3S2QX8itBu4tSR EWVnItfb8MmtIg5+i1GVNNoRV29H/TTwpi+UH3QhRj82ti801FfZpaeroONHbBxCUy5Q LsRLMQOozxlPQI5TGR6fZm6F3WY14PrYeWGd6EbI++NwMf33VK+IrOEYqPxgHsRSNG6J +9ww== X-Gm-Message-State: AOJu0YyQBVBt60jPjaACJFp5hqZ7hkrJ6wR0uOA/aiF+VUYhBqmpMr35 JDrsOrUMdy5vVxPhFoHTQB/QXcwbxMl3fHPsEoC5fyuFg8Hp/jFkVNKB3EPv X-Google-Smtp-Source: AGHT+IG73R4SszGYDJ2mR5yKS5sTivujWPZd7AZXJ96l4dwzYNrwDiCyLzXkxpMwKx9zgbXdX8axLg== X-Received: by 2002:a2e:8507:0:b0:2d2:3e88:7c4f with SMTP id j7-20020a2e8507000000b002d23e887c4fmr7409251lji.43.1709113468550; Wed, 28 Feb 2024 01:44:28 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id dx14-20020a05600c63ce00b004129f28e2cdsm1522152wmb.3.2024.02.28.01.44.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:28 -0800 (PST) Message-ID: In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:14 +0000 Subject: [PATCH v4 08/11] commit-reach(repo_get_merge_bases): pass on "missing commits" errors Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin The `merge_bases_many()` function was just taught to indicate parsing errors, and now the `repo_get_merge_bases()` function (which is also surfaced via the `repo_get_merge_bases()` macro) is aware of that, too. Naturally, there are a lot of callers that need to be adjusted now, too. Next step: adjust the callers of `get_octopus_merge_bases()`. Signed-off-by: Johannes Schindelin --- builtin/log.c | 10 +++++----- builtin/merge-tree.c | 5 +++-- builtin/merge.c | 20 ++++++++++++-------- builtin/rebase.c | 8 +++++--- builtin/rev-parse.c | 5 +++-- commit-reach.c | 23 +++++++++++------------ commit-reach.h | 7 ++++--- diff-lib.c | 5 +++-- log-tree.c | 5 +++-- merge-ort.c | 6 +++++- merge-recursive.c | 4 +++- notes-merge.c | 3 ++- object-name.c | 7 +++++-- revision.c | 12 ++++++++---- sequencer.c | 8 ++++++-- submodule.c | 7 ++++++- t/t4301-merge-tree-write-tree.sh | 12 ++++++++++++ 17 files changed, 96 insertions(+), 51 deletions(-) diff --git a/builtin/log.c b/builtin/log.c index 1705da71aca..befafd6ae04 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1702,11 +1702,11 @@ static struct commit *get_base_commit(const char *base_commit, */ while (rev_nr > 1) { for (i = 0; i < rev_nr / 2; i++) { - struct commit_list *merge_base; - merge_base = repo_get_merge_bases(the_repository, - rev[2 * i], - rev[2 * i + 1]); - if (!merge_base || merge_base->next) { + struct commit_list *merge_base = NULL; + if (repo_get_merge_bases(the_repository, + rev[2 * i], + rev[2 * i + 1], &merge_base) < 0 || + !merge_base || merge_base->next) { if (die_on_failure) { die(_("failed to find exact merge base")); } else { diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c index a35e0452d66..76200250629 100644 --- a/builtin/merge-tree.c +++ b/builtin/merge-tree.c @@ -463,8 +463,9 @@ static int real_merge(struct merge_tree_options *o, * Get the merge bases, in reverse order; see comment above * merge_incore_recursive in merge-ort.h */ - merge_bases = repo_get_merge_bases(the_repository, parent1, - parent2); + if (repo_get_merge_bases(the_repository, parent1, + parent2, &merge_bases) < 0) + exit(128); if (!merge_bases && !o->allow_unrelated_histories) die(_("refusing to merge unrelated histories")); merge_bases = reverse_commit_list(merge_bases); diff --git a/builtin/merge.c b/builtin/merge.c index d748d46e135..ac9d58adc29 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1517,10 +1517,13 @@ int cmd_merge(int argc, const char **argv, const char *prefix) if (!remoteheads) ; /* already up-to-date */ - else if (!remoteheads->next) - common = repo_get_merge_bases(the_repository, head_commit, - remoteheads->item); - else { + else if (!remoteheads->next) { + if (repo_get_merge_bases(the_repository, head_commit, + remoteheads->item, &common) < 0) { + ret = 2; + goto done; + } + } else { struct commit_list *list = remoteheads; commit_list_insert(head_commit, &list); common = get_octopus_merge_bases(list); @@ -1631,7 +1634,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) struct commit_list *j; for (j = remoteheads; j; j = j->next) { - struct commit_list *common_one; + struct commit_list *common_one = NULL; struct commit *common_item; /* @@ -1639,9 +1642,10 @@ int cmd_merge(int argc, const char **argv, const char *prefix) * merge_bases again, otherwise "git merge HEAD^ * HEAD^^" would be missed. */ - common_one = repo_get_merge_bases(the_repository, - head_commit, - j->item); + if (repo_get_merge_bases(the_repository, head_commit, + j->item, &common_one) < 0) + exit(128); + common_item = common_one->item; free_commit_list(common_one); if (!oideq(&common_item->object.oid, &j->item->object.oid)) { diff --git a/builtin/rebase.c b/builtin/rebase.c index 043c65dccd9..06a55fc7325 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -879,7 +879,8 @@ static int can_fast_forward(struct commit *onto, struct commit *upstream, if (!upstream) goto done; - merge_bases = repo_get_merge_bases(the_repository, upstream, head); + if (repo_get_merge_bases(the_repository, upstream, head, &merge_bases) < 0) + exit(128); if (!merge_bases || merge_bases->next) goto done; @@ -898,8 +899,9 @@ static void fill_branch_base(struct rebase_options *options, { struct commit_list *merge_bases = NULL; - merge_bases = repo_get_merge_bases(the_repository, options->onto, - options->orig_head); + if (repo_get_merge_bases(the_repository, options->onto, + options->orig_head, &merge_bases) < 0) + exit(128); if (!merge_bases || merge_bases->next) oidcpy(branch_base, null_oid()); else diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index fde8861ca4e..c97d0f6144c 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -297,7 +297,7 @@ static int try_difference(const char *arg) show_rev(NORMAL, &end_oid, end); show_rev(symmetric ? NORMAL : REVERSED, &start_oid, start); if (symmetric) { - struct commit_list *exclude; + struct commit_list *exclude = NULL; struct commit *a, *b; a = lookup_commit_reference(the_repository, &start_oid); b = lookup_commit_reference(the_repository, &end_oid); @@ -305,7 +305,8 @@ static int try_difference(const char *arg) *dotdot = '.'; return 0; } - exclude = repo_get_merge_bases(the_repository, a, b); + if (repo_get_merge_bases(the_repository, a, b, &exclude) < 0) + exit(128); while (exclude) { struct commit *commit = pop_commit(&exclude); show_rev(REVERSED, &commit->object.oid, NULL); diff --git a/commit-reach.c b/commit-reach.c index c0123eb7207..b2e90687f7c 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -189,9 +189,12 @@ struct commit_list *get_octopus_merge_bases(struct commit_list *in) struct commit_list *new_commits = NULL, *end = NULL; for (j = ret; j; j = j->next) { - struct commit_list *bases; - bases = repo_get_merge_bases(the_repository, i->item, - j->item); + struct commit_list *bases = NULL; + if (repo_get_merge_bases(the_repository, i->item, + j->item, &bases) < 0) { + free_commit_list(bases); + return NULL; + } if (!new_commits) new_commits = bases; else @@ -483,16 +486,12 @@ struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, return result; } -struct commit_list *repo_get_merge_bases(struct repository *r, - struct commit *one, - struct commit *two) +int repo_get_merge_bases(struct repository *r, + struct commit *one, + struct commit *two, + struct commit_list **result) { - struct commit_list *result = NULL; - if (get_merge_bases_many_0(r, one, 1, &two, 1, &result) < 0) { - free_commit_list(result); - return NULL; - } - return result; + return get_merge_bases_many_0(r, one, 1, &two, 1, result); } /* diff --git a/commit-reach.h b/commit-reach.h index 68f81549a44..2c6fcdd34f6 100644 --- a/commit-reach.h +++ b/commit-reach.h @@ -9,9 +9,10 @@ struct ref_filter; struct object_id; struct object_array; -struct commit_list *repo_get_merge_bases(struct repository *r, - struct commit *rev1, - struct commit *rev2); +int repo_get_merge_bases(struct repository *r, + struct commit *rev1, + struct commit *rev2, + struct commit_list **result); struct commit_list *repo_get_merge_bases_many(struct repository *r, struct commit *one, int n, struct commit **twos); diff --git a/diff-lib.c b/diff-lib.c index 0e9ec4f68af..498224ccce2 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -565,7 +565,7 @@ void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb) { int i; struct commit *mb_child[2] = {0}; - struct commit_list *merge_bases; + struct commit_list *merge_bases = NULL; for (i = 0; i < revs->pending.nr; i++) { struct object *obj = revs->pending.objects[i].item; @@ -592,7 +592,8 @@ void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb) mb_child[1] = lookup_commit_reference(the_repository, &oid); } - merge_bases = repo_get_merge_bases(the_repository, mb_child[0], mb_child[1]); + if (repo_get_merge_bases(the_repository, mb_child[0], mb_child[1], &merge_bases) < 0) + exit(128); if (!merge_bases) die(_("no merge base found")); if (merge_bases->next) diff --git a/log-tree.c b/log-tree.c index 504da6b519e..4f337766a39 100644 --- a/log-tree.c +++ b/log-tree.c @@ -1010,7 +1010,7 @@ static int do_remerge_diff(struct rev_info *opt, struct object_id *oid) { struct merge_options o; - struct commit_list *bases; + struct commit_list *bases = NULL; struct merge_result res = {0}; struct pretty_print_context ctx = {0}; struct commit *parent1 = parents->item; @@ -1035,7 +1035,8 @@ static int do_remerge_diff(struct rev_info *opt, /* Parse the relevant commits and get the merge bases */ parse_commit_or_die(parent1); parse_commit_or_die(parent2); - bases = repo_get_merge_bases(the_repository, parent1, parent2); + if (repo_get_merge_bases(the_repository, parent1, parent2, &bases) < 0) + exit(128); /* Re-merge the parents */ merge_incore_recursive(&o, bases, parent1, parent2, &res); diff --git a/merge-ort.c b/merge-ort.c index 9f3af46333a..90d8495ca1f 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -5066,7 +5066,11 @@ static void merge_ort_internal(struct merge_options *opt, struct strbuf merge_base_abbrev = STRBUF_INIT; if (!merge_bases) { - merge_bases = repo_get_merge_bases(the_repository, h1, h2); + if (repo_get_merge_bases(the_repository, h1, h2, + &merge_bases) < 0) { + result->clean = -1; + return; + } /* See merge-ort.h:merge_incore_recursive() declaration NOTE */ merge_bases = reverse_commit_list(merge_bases); } diff --git a/merge-recursive.c b/merge-recursive.c index 0d931cc14ad..d609373d960 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -3638,7 +3638,9 @@ static int merge_recursive_internal(struct merge_options *opt, } if (!merge_bases) { - merge_bases = repo_get_merge_bases(the_repository, h1, h2); + if (repo_get_merge_bases(the_repository, h1, h2, + &merge_bases) < 0) + return -1; merge_bases = reverse_commit_list(merge_bases); } diff --git a/notes-merge.c b/notes-merge.c index 8799b522a55..51282934ae6 100644 --- a/notes-merge.c +++ b/notes-merge.c @@ -607,7 +607,8 @@ int notes_merge(struct notes_merge_options *o, assert(local && remote); /* Find merge bases */ - bases = repo_get_merge_bases(the_repository, local, remote); + if (repo_get_merge_bases(the_repository, local, remote, &bases) < 0) + exit(128); if (!bases) { base_oid = null_oid(); base_tree_oid = the_hash_algo->empty_tree; diff --git a/object-name.c b/object-name.c index 0bfa29dbbfe..63bec6d9a2b 100644 --- a/object-name.c +++ b/object-name.c @@ -1481,7 +1481,7 @@ int repo_get_oid_mb(struct repository *r, struct object_id *oid) { struct commit *one, *two; - struct commit_list *mbs; + struct commit_list *mbs = NULL; struct object_id oid_tmp; const char *dots; int st; @@ -1509,7 +1509,10 @@ int repo_get_oid_mb(struct repository *r, two = lookup_commit_reference_gently(r, &oid_tmp, 0); if (!two) return -1; - mbs = repo_get_merge_bases(r, one, two); + if (repo_get_merge_bases(r, one, two, &mbs) < 0) { + free_commit_list(mbs); + return -1; + } if (!mbs || mbs->next) st = -1; else { diff --git a/revision.c b/revision.c index 00d5c29bfce..eb0d550842f 100644 --- a/revision.c +++ b/revision.c @@ -1965,7 +1965,7 @@ static void add_pending_commit_list(struct rev_info *revs, static void prepare_show_merge(struct rev_info *revs) { - struct commit_list *bases; + struct commit_list *bases = NULL; struct commit *head, *other; struct object_id oid; const char **prune = NULL; @@ -1980,7 +1980,8 @@ static void prepare_show_merge(struct rev_info *revs) other = lookup_commit_or_die(&oid, "MERGE_HEAD"); add_pending_object(revs, &head->object, "HEAD"); add_pending_object(revs, &other->object, "MERGE_HEAD"); - bases = repo_get_merge_bases(the_repository, head, other); + if (repo_get_merge_bases(the_repository, head, other, &bases) < 0) + exit(128); add_rev_cmdline_list(revs, bases, REV_CMD_MERGE_BASE, UNINTERESTING | BOTTOM); add_pending_commit_list(revs, bases, UNINTERESTING | BOTTOM); free_commit_list(bases); @@ -2068,14 +2069,17 @@ static int handle_dotdot_1(const char *arg, char *dotdot, } else { /* A...B -- find merge bases between the two */ struct commit *a, *b; - struct commit_list *exclude; + struct commit_list *exclude = NULL; a = lookup_commit_reference(revs->repo, &a_obj->oid); b = lookup_commit_reference(revs->repo, &b_obj->oid); if (!a || !b) return dotdot_missing(arg, dotdot, revs, symmetric); - exclude = repo_get_merge_bases(the_repository, a, b); + if (repo_get_merge_bases(the_repository, a, b, &exclude) < 0) { + free_commit_list(exclude); + return -1; + } add_rev_cmdline_list(revs, exclude, REV_CMD_MERGE_BASE, flags_exclude); add_pending_commit_list(revs, exclude, flags_exclude); diff --git a/sequencer.c b/sequencer.c index d584cac8ed9..4417f2f1956 100644 --- a/sequencer.c +++ b/sequencer.c @@ -3913,7 +3913,7 @@ static int do_merge(struct repository *r, int run_commit_flags = 0; struct strbuf ref_name = STRBUF_INIT; struct commit *head_commit, *merge_commit, *i; - struct commit_list *bases, *j; + struct commit_list *bases = NULL, *j; struct commit_list *to_merge = NULL, **tail = &to_merge; const char *strategy = !opts->xopts.nr && (!opts->strategy || @@ -4139,7 +4139,11 @@ static int do_merge(struct repository *r, } merge_commit = to_merge->item; - bases = repo_get_merge_bases(r, head_commit, merge_commit); + if (repo_get_merge_bases(r, head_commit, merge_commit, &bases) < 0) { + ret = -1; + goto leave_merge; + } + if (bases && oideq(&merge_commit->object.oid, &bases->item->object.oid)) { ret = 0; diff --git a/submodule.c b/submodule.c index e603a19a876..04931a5474b 100644 --- a/submodule.c +++ b/submodule.c @@ -595,7 +595,12 @@ static void show_submodule_header(struct diff_options *o, (!is_null_oid(two) && !*right)) message = "(commits not present)"; - *merge_bases = repo_get_merge_bases(sub, *left, *right); + *merge_bases = NULL; + if (repo_get_merge_bases(sub, *left, *right, merge_bases) < 0) { + message = "(corrupt repository)"; + goto output_header; + } + if (*merge_bases) { if ((*merge_bases)->item == *left) fast_forward = 1; diff --git a/t/t4301-merge-tree-write-tree.sh b/t/t4301-merge-tree-write-tree.sh index b2c8a43fce3..5d1e7aca4c8 100755 --- a/t/t4301-merge-tree-write-tree.sh +++ b/t/t4301-merge-tree-write-tree.sh @@ -945,4 +945,16 @@ test_expect_success 'check the input format when --stdin is passed' ' test_cmp expect actual ' +test_expect_success 'error out on missing commits as well' ' + git init --bare missing-commit.git && + git rev-list --objects side1 side3 >list-including-initial && + grep -v ^$(git rev-parse side1^) list && + git pack-objects missing-commit.git/objects/pack/missing-initial actual && + test_must_be_empty actual +' + test_done From patchwork Wed Feb 28 09:44:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575158 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E685938382 for ; Wed, 28 Feb 2024 09:44:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113476; cv=none; b=XL3Va+FHU/TDIvyawtZzFQWvg505+kERvom4kpt9xjOEam6tXtRhSL2BGQVD49HRhCQva0Bsiud+HmEh5V87by5G33IhI+r1ZaTC5fSeRwqKkStf4rP0DwOtRU8ZiFZsrEdwOwn0YFb2kXoCCj10H6w1Z5SHEJv9ckYRW83OBpQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113476; c=relaxed/simple; bh=uUQNL0od1oMn7vXGsbgCKQTOwHHPzad6NzkO2pHChtI=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=t01QSDaCStCWbyB/HWSPRRJAxOUIT3Lm6J5F7FcNoyt0fiTp3+YWMNzkV24YLFXcsE5+wIhld5blvTk81tCK5jgsaKnUAIsX/8rFUqk7EjBnRq7tbqMH8Wq4Krj0lctwLuRRgLE9Lvz32MGhDqvb4Gej1vP31SzZsTD64/KMgko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=aTRZwAsc; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="aTRZwAsc" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-412b20dc555so6072935e9.3 for ; Wed, 28 Feb 2024 01:44:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113469; x=1709718269; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=6XsEf3s0TKiM2Ue3xAGxzobH6M9HSAepTLtXiRkRGqQ=; b=aTRZwAscNL4nLZZWJyv4k6wXjhihmvaXM4FH9fEVi97VQUiN0RVOcWh+KDxv2E0BPj /pSiHJ+X1oyKGTRsOKQXTj4taGROWUZDMsu11/8XLvxsEAkCNUZO6182DzoQTGyFveDg tSVWhd/u8Nzapi/UJpLdCgBIgWJR0sEQxgZdsutcwhYYTtARx8cv+x3EIpo7ieM9xddK wq1YZV6szHIRMC76lWxj9P+xuwK69xWH17VVj34T54WMkxdxVoqRYWAjEY0/Qh3CMOly ysmE1bKhOkFckd6w7AfB8BD/dyri5hQz7Ax79r4R5SRyqZ1XQykZx8liHKwq9P2f4rMO XvcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113469; x=1709718269; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6XsEf3s0TKiM2Ue3xAGxzobH6M9HSAepTLtXiRkRGqQ=; b=Au8IXtfR28xTuyRC/coMyJ2CfK4I6ArsHUW/7Ut9oUDAgczWFsjOs+THdd0kg7FHJm Bc7KcVFv2Y7sEd0PdxEpMHK40LhL5lS+m94MLWfK7j1X+9bhDo2JId15KAmDcgX/iwSu wXHQ2IMpuyeGo7aqGtpvTGrWE+l+nyueQzN+EX2J3RtvfVXdSteXeyhBb2mpAux+q6CJ 7z/GKb5iYSOrMQ10pzq+USEmUOyQiZbgkzM53eNt9VRMZ5tUP9DqiTzwN5AkZW0eGR/d Xtue7W3Lqp0wByieuQgAGYX+UwotsHFPYuICcNFCatYK1wVZNS9dD4nDmw93TbCi7HfW 3v8g== X-Gm-Message-State: AOJu0Yz3N1uwWlMaRo2+1sIlfRKHKTeYsXGQ/TapjyuPNtFXydg2aF5W xKdZukda1XARoCEWyejV/sn9+J7DboLzOH2P6cdo39hwUku24OSngSpO+ep4 X-Google-Smtp-Source: AGHT+IGoTQ9H0ceMo98wnEQIx2FjFdicXpgJmaeyUNM7vHk1t8w0hCxngdZY31gp61Y4RDy81OV30w== X-Received: by 2002:a05:600c:198e:b0:412:a392:23b3 with SMTP id t14-20020a05600c198e00b00412a39223b3mr6825231wmq.25.1709113469628; Wed, 28 Feb 2024 01:44:29 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id jn5-20020a05600c6b0500b0041228b2e179sm1513292wmb.39.2024.02.28.01.44.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:28 -0800 (PST) Message-ID: In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:15 +0000 Subject: [PATCH v4 09/11] commit-reach(get_octopus_merge_bases): pass on "missing commits" errors Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin The `merge_bases_many()` function was just taught to indicate parsing errors, and now the `repo_get_merge_bases()` function (which is also surfaced via the `get_merge_bases()` macro) is aware of that, too. Naturally, the callers need to be adjusted now, too. Next step: adjust `repo_get_merge_bases_many()`. Signed-off-by: Johannes Schindelin --- builtin/merge-base.c | 8 ++++++-- builtin/merge.c | 6 +++++- builtin/pull.c | 5 +++-- commit-reach.c | 20 +++++++++++--------- commit-reach.h | 2 +- 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/builtin/merge-base.c b/builtin/merge-base.c index 0308fd73289..2edffc5487e 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -77,13 +77,17 @@ static int handle_independent(int count, const char **args) static int handle_octopus(int count, const char **args, int show_all) { struct commit_list *revs = NULL; - struct commit_list *result, *rev; + struct commit_list *result = NULL, *rev; int i; for (i = count - 1; i >= 0; i--) commit_list_insert(get_commit_reference(args[i]), &revs); - result = get_octopus_merge_bases(revs); + if (get_octopus_merge_bases(revs, &result) < 0) { + free_commit_list(revs); + free_commit_list(result); + return 128; + } free_commit_list(revs); reduce_heads_replace(&result); diff --git a/builtin/merge.c b/builtin/merge.c index ac9d58adc29..94c5b693972 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1526,7 +1526,11 @@ int cmd_merge(int argc, const char **argv, const char *prefix) } else { struct commit_list *list = remoteheads; commit_list_insert(head_commit, &list); - common = get_octopus_merge_bases(list); + if (get_octopus_merge_bases(list, &common) < 0) { + free(list); + ret = 2; + goto done; + } free(list); } diff --git a/builtin/pull.c b/builtin/pull.c index e6f2942c0c5..0c5a55f2f4d 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -820,7 +820,7 @@ static int get_octopus_merge_base(struct object_id *merge_base, const struct object_id *merge_head, const struct object_id *fork_point) { - struct commit_list *revs = NULL, *result; + struct commit_list *revs = NULL, *result = NULL; commit_list_insert(lookup_commit_reference(the_repository, curr_head), &revs); @@ -830,7 +830,8 @@ static int get_octopus_merge_base(struct object_id *merge_base, commit_list_insert(lookup_commit_reference(the_repository, fork_point), &revs); - result = get_octopus_merge_bases(revs); + if (get_octopus_merge_bases(revs, &result) < 0) + exit(128); free_commit_list(revs); reduce_heads_replace(&result); diff --git a/commit-reach.c b/commit-reach.c index b2e90687f7c..288d3d896a2 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -176,24 +176,26 @@ static int merge_bases_many(struct repository *r, return 0; } -struct commit_list *get_octopus_merge_bases(struct commit_list *in) +int get_octopus_merge_bases(struct commit_list *in, struct commit_list **result) { - struct commit_list *i, *j, *k, *ret = NULL; + struct commit_list *i, *j, *k; if (!in) - return ret; + return 0; - commit_list_insert(in->item, &ret); + commit_list_insert(in->item, result); for (i = in->next; i; i = i->next) { struct commit_list *new_commits = NULL, *end = NULL; - for (j = ret; j; j = j->next) { + for (j = *result; j; j = j->next) { struct commit_list *bases = NULL; if (repo_get_merge_bases(the_repository, i->item, j->item, &bases) < 0) { free_commit_list(bases); - return NULL; + free_commit_list(*result); + *result = NULL; + return -1; } if (!new_commits) new_commits = bases; @@ -202,10 +204,10 @@ struct commit_list *get_octopus_merge_bases(struct commit_list *in) for (k = bases; k; k = k->next) end = k; } - free_commit_list(ret); - ret = new_commits; + free_commit_list(*result); + *result = new_commits; } - return ret; + return 0; } static int remove_redundant_no_gen(struct repository *r, diff --git a/commit-reach.h b/commit-reach.h index 2c6fcdd34f6..4690b6ecd0c 100644 --- a/commit-reach.h +++ b/commit-reach.h @@ -21,7 +21,7 @@ struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, struct commit *one, int n, struct commit **twos); -struct commit_list *get_octopus_merge_bases(struct commit_list *in); +int get_octopus_merge_bases(struct commit_list *in, struct commit_list **result); int repo_is_descendant_of(struct repository *r, struct commit *commit, From patchwork Wed Feb 28 09:44:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575156 Received: from mail-lj1-f177.google.com (mail-lj1-f177.google.com [209.85.208.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1844A3838F for ; Wed, 28 Feb 2024 09:44:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113475; cv=none; b=fuAzO39ShI9W88ylxt4sx7fiLUiayPsZNrZ/JGqbGWsqstgQXWhIDGlC0NOplNW4U3sHrIZaE5NJUjurZhwVMDtqpzD8RTbQuRxQEGxzrEJA7HichSSaODxemj6cWh2/07i2gp7QZ1o9q5+n8PtxV9UCaGvw6eBiIGputBg/stc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113475; c=relaxed/simple; bh=053G4gyJCDPXvy4KaKrU+xs7Huyanhwp3MVf7KCDwr4=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=c/+QWnD/mhQc74TXOykBqNrIqOeHreTMpHTUbgv06nNlie53TKj0DX2o3UDqGqHGHzBIrgAeeJB8FdOQjC9S5SVEYsvNI/xYDkVpYGNDF5UGKrQKLvewm9rHYo2bFvL56jhNtoTsEbI9HntLuiR0CZHQJv8ccRDlbM7NmqNKBJI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QiV9zWAj; arc=none smtp.client-ip=209.85.208.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QiV9zWAj" Received: by mail-lj1-f177.google.com with SMTP id 38308e7fff4ca-2d28e465655so40582821fa.0 for ; Wed, 28 Feb 2024 01:44:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113471; x=1709718271; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=MAjm8UNz8yTNpUODr4WHFqUZbJI+oy7Hb6vSSq2LznE=; b=QiV9zWAjP3wu58xM9z1ZLDokJDWtZ1fIgiHwGgvmJSel4IBKJ+VmRvWi+d9MTaQaBX 7JWwJtpH7xRdKEjjh5eTrvPUIID5gpqOiiqzmWH9wWwgRrmQGpIUUbDDt7IUwuIF3bRc Tw4VUKZxG3cuKRJ2QY6UtB1GtN3qmTsGVpee2jxMB2PQtblA9FYOEolVeI0bQydmYRdo GoIWT7Hni6bROgehN4U9KkoUX1lsnsEOmpOhHfOU6f+a07H8CF43J2Ud3M4tuhXNahpC TWwiuiz4mymwwaFY7p6GxBAp1DmivdP6Kao7HGfZWkX6qgAL/dILycsRbmynLC6tqCpq StNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113471; x=1709718271; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MAjm8UNz8yTNpUODr4WHFqUZbJI+oy7Hb6vSSq2LznE=; b=TSyD8nTbkIyTyhsiWh3AvHZ+Gd0TrZBoO2mqGH/j3aasCjgj6XgmQ9IP8/Eaijo+UD qLkfWPsPjbI7Hw/hcUgcOOCexwbntJW7D1DUzsKbbkPBOOB7cxuPohmFt6Ryn8Xls/Ah pw9dt6A3idcrngRBLBapCKKkCbT3TZHFbi34fNmZY3q3iKXPEZKAEzTqsbqTm1jrMXlq IQYcz1oTIkYC/caHtWVodTzOm6CeJsXxvLWihD96yXMNgoAG/BC3lOcpLlQepmdfwcXM fsNWyU4gAnrrMSQiNR00bM+1P2yQChhi+yRIoTPUTGsfMN4JjbxQglXAP7GgAY3HKgwB ZSqg== X-Gm-Message-State: AOJu0YwZ7HxJBbzABydYVSwOSRdczds8/9vw6/YvMiGBq+nrXMXFpT6k nVOQxWr7x09r8N68MbPAkX7SE9j+NbZlNHLtOsE8Xruwl309vkyQdkWYKLGI X-Google-Smtp-Source: AGHT+IH1stcaUwdiq9kaBBU60905HHID4iPZ3jvnhHR/q1ccwduun2RIa5iDqnHI5DZ75bamRSpptA== X-Received: by 2002:a2e:9ada:0:b0:2d2:37e6:501b with SMTP id p26-20020a2e9ada000000b002d237e6501bmr7027251ljj.43.1709113470755; Wed, 28 Feb 2024 01:44:30 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id o30-20020a05600c511e00b0041294d015fbsm1565769wms.40.2024.02.28.01.44.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:30 -0800 (PST) Message-ID: <32587b3caa701cf548de08ddf8a32a80e7de2325.1709113459.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:16 +0000 Subject: [PATCH v4 10/11] commit-reach(repo_get_merge_bases_many): pass on "missing commits" errors Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin The `merge_bases_many()` function was just taught to indicate parsing errors, and now the `repo_get_merge_bases_many()` function is aware of that, too. Naturally, there are a lot of callers that need to be adjusted now, too. Next stop: `repo_get_merge_bases_dirty()`. Signed-off-by: Johannes Schindelin --- bisect.c | 7 ++++--- builtin/log.c | 13 +++++++------ commit-reach.c | 16 ++++++---------- commit-reach.h | 7 ++++--- commit.c | 7 ++++--- t/helper/test-reach.c | 9 ++++++--- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/bisect.c b/bisect.c index 1be8e0a2711..2018466d69f 100644 --- a/bisect.c +++ b/bisect.c @@ -851,10 +851,11 @@ static void handle_skipped_merge_base(const struct object_id *mb) static enum bisect_error check_merge_bases(int rev_nr, struct commit **rev, int no_checkout) { enum bisect_error res = BISECT_OK; - struct commit_list *result; + struct commit_list *result = NULL; - result = repo_get_merge_bases_many(the_repository, rev[0], rev_nr - 1, - rev + 1); + if (repo_get_merge_bases_many(the_repository, rev[0], rev_nr - 1, + rev + 1, &result) < 0) + exit(128); for (; result; result = result->next) { const struct object_id *mb = &result->item->object.oid; diff --git a/builtin/log.c b/builtin/log.c index befafd6ae04..c75790a7cec 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1656,7 +1656,7 @@ static struct commit *get_base_commit(const char *base_commit, struct branch *curr_branch = branch_get(NULL); const char *upstream = branch_get_upstream(curr_branch, NULL); if (upstream) { - struct commit_list *base_list; + struct commit_list *base_list = NULL; struct commit *commit; struct object_id oid; @@ -1667,11 +1667,12 @@ static struct commit *get_base_commit(const char *base_commit, return NULL; } commit = lookup_commit_or_die(&oid, "upstream base"); - base_list = repo_get_merge_bases_many(the_repository, - commit, total, - list); - /* There should be one and only one merge base. */ - if (!base_list || base_list->next) { + if (repo_get_merge_bases_many(the_repository, + commit, total, + list, + &base_list) < 0 || + /* There should be one and only one merge base. */ + !base_list || base_list->next) { if (die_on_failure) { die(_("could not find exact merge base")); } else { diff --git a/commit-reach.c b/commit-reach.c index 288d3d896a2..0aeaef25343 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -462,17 +462,13 @@ static int get_merge_bases_many_0(struct repository *r, return 0; } -struct commit_list *repo_get_merge_bases_many(struct repository *r, - struct commit *one, - int n, - struct commit **twos) +int repo_get_merge_bases_many(struct repository *r, + struct commit *one, + int n, + struct commit **twos, + struct commit_list **result) { - struct commit_list *result = NULL; - if (get_merge_bases_many_0(r, one, n, twos, 1, &result) < 0) { - free_commit_list(result); - return NULL; - } - return result; + return get_merge_bases_many_0(r, one, n, twos, 1, result); } struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, diff --git a/commit-reach.h b/commit-reach.h index 4690b6ecd0c..458043f4d58 100644 --- a/commit-reach.h +++ b/commit-reach.h @@ -13,9 +13,10 @@ int repo_get_merge_bases(struct repository *r, struct commit *rev1, struct commit *rev2, struct commit_list **result); -struct commit_list *repo_get_merge_bases_many(struct repository *r, - struct commit *one, int n, - struct commit **twos); +int repo_get_merge_bases_many(struct repository *r, + struct commit *one, int n, + struct commit **twos, + struct commit_list **result); /* To be used only when object flags after this call no longer matter */ struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, struct commit *one, int n, diff --git a/commit.c b/commit.c index 8405d7c3fce..00add5d81c6 100644 --- a/commit.c +++ b/commit.c @@ -1054,7 +1054,7 @@ struct commit *get_fork_point(const char *refname, struct commit *commit) { struct object_id oid; struct rev_collect revs; - struct commit_list *bases; + struct commit_list *bases = NULL; int i; struct commit *ret = NULL; char *full_refname; @@ -1079,8 +1079,9 @@ struct commit *get_fork_point(const char *refname, struct commit *commit) for (i = 0; i < revs.nr; i++) revs.commit[i]->object.flags &= ~TMP_MARK; - bases = repo_get_merge_bases_many(the_repository, commit, revs.nr, - revs.commit); + if (repo_get_merge_bases_many(the_repository, commit, revs.nr, + revs.commit, &bases) < 0) + exit(128); /* * There should be one and only one merge base, when we found diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c index aa816e168ea..84ee9da8681 100644 --- a/t/helper/test-reach.c +++ b/t/helper/test-reach.c @@ -117,9 +117,12 @@ int cmd__reach(int ac, const char **av) else if (!strcmp(av[1], "is_descendant_of")) printf("%s(A,X):%d\n", av[1], repo_is_descendant_of(r, A, X)); else if (!strcmp(av[1], "get_merge_bases_many")) { - struct commit_list *list = repo_get_merge_bases_many(the_repository, - A, X_nr, - X_array); + struct commit_list *list = NULL; + if (repo_get_merge_bases_many(the_repository, + A, X_nr, + X_array, + &list) < 0) + exit(128); printf("%s(A,X):\n", av[1]); print_sorted_commit_ids(list); } else if (!strcmp(av[1], "reduce_heads")) { From patchwork Wed Feb 28 09:44:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Schindelin X-Patchwork-Id: 13575157 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C1796339BD for ; Wed, 28 Feb 2024 09:44:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113475; cv=none; b=fZeXthaUY3doj4ZqBhipavRTKnQukrcoYQzYMo3Wd88gebY/GDXsHZvAed6SC9dr+LzUplB4+2l7qTi70JI9Ysi+k62Jp0bjsz2iw/XRsK86otGSa2jUWhGhKsu/YnfMai3SX75ZynAvcUSRfswWQ/yp7UQORmXqA0tezAWRo34= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709113475; c=relaxed/simple; bh=uUOOMmadKz5Nnd5Z0oW6BKF780M3ENnI44pPgvMX92A=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=ptSG2IBuT+5dHsaZ73WMFuwSDTt+fMTbxfaqA4SOvLuf6al6DMFtLgTokt7liJjDCTaW0T9arlQAmbpRT3BNPpAiFeqo05++iebEkuxCw1F2VAYEQ4nNZSGkvCjd+c2NdfMKSHa9z0mTCyfvsOSbEv0olJV6+rLgvXtfbOgWEe8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bw4CmT/J; arc=none smtp.client-ip=209.85.128.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bw4CmT/J" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-412b493ed27so2435555e9.2 for ; Wed, 28 Feb 2024 01:44:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709113471; x=1709718271; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=gbBNM9tJUa+ssc+h+r45IX2A/AFl7A8NJ+LiTOCxob0=; b=bw4CmT/J1/8slA7dg7VxLzb/6YiL4mgzsjPAphd+v/H9mU80r4MWJv84iLPVnnbQKR Z5jKsveYCwheEn5PC3+IOiQhOSATEAL6X+GFNfun4bViCTPhnpjKffEw7acPpnxcS79v 46xjBGDn5ecFuO4QN5ahgmoZaknJDk4gc+YGhWuMlRT3lboIu4hQSsEEHABgKEMJYqjv fPFhdvwSn7P4D+wgLzT5kG8VQQ2fxlSgyfW5vb1RJUyZaeAQMWGqql+KfjaYz87qP0Um JXeL0n+i5csj6aBuSL70YLepXINMBYy4seaJ7ZKIs6HaZnWiGi3nzjf96OUO3ZxJzjP6 QHvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709113471; x=1709718271; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gbBNM9tJUa+ssc+h+r45IX2A/AFl7A8NJ+LiTOCxob0=; b=BZ7h8UFKbHx4RMhGdJdgvVZqU0Zdpk16KcOTNJT6hQHI6LG/vtNwg+X1mzfsJD00mM YWVvJX+t21aFqdesjmTUSCQhXCtJxS8lHr80AQ+O7h+ZpjVZ1tnVO02CQqec/0SxDXDl zZIrG2lndsS1z/6Hml2+8oRXxRztd7T/IFPCsqi2gtC7zfqcBD0Ms08XtaMQWxPWWbTN g5CngTluB+8a4kASZMnFBwU2sO7juqYfSCbZit/N9iCb5t69wQOraPBJAM87e5jazxZy BKtH+xi0pfYnr20+UzKTKLeMtsNFoyKiCEPldm3Ni/9BoDKvciHvIPG8yZJ6rVvT50Ke 7otQ== X-Gm-Message-State: AOJu0Yx3BQ/gI7Mt2l8w1ZYqpCJJh3d+E8cCJhTI4HTzqB7qyILKMbjZ WRLXEUPc7DS5h8RyI+uApxenFNy7a4DqfWt7YBlL8KEgCIWP3D1qBu/aPXGh X-Google-Smtp-Source: AGHT+IGAaJ+3ILw6MT9IbKzm1w9kwPqrHB6qJKUf6FPPyFUOdA6N+bSQunVVuIvoGvHp3dgcdHYrAQ== X-Received: by 2002:a05:6000:1243:b0:33d:b32a:8acb with SMTP id j3-20020a056000124300b0033db32a8acbmr9107187wrx.23.1709113471596; Wed, 28 Feb 2024 01:44:31 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id q16-20020adffed0000000b0033ce06c303csm13950234wrs.40.2024.02.28.01.44.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 01:44:31 -0800 (PST) Message-ID: <05de9f2444477dd38b7e1cf67d8d233ce6e0e68b.1709113459.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 28 Feb 2024 09:44:17 +0000 Subject: [PATCH v4 11/11] commit-reach(repo_get_merge_bases_many_dirty): pass on errors Fcc: Sent Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 To: git@vger.kernel.org Cc: Patrick Steinhardt , Dirk Gouders , Johannes Schindelin , Johannes Schindelin From: Johannes Schindelin From: Johannes Schindelin (Actually, this commit is only about passing on "missing commits" errors, but adding that to the commit's title would have made it too long.) The `merge_bases_many()` function was just taught to indicate parsing errors, and now the `repo_get_merge_bases_many_dirty()` function is aware of that, too. Signed-off-by: Johannes Schindelin --- builtin/merge-base.c | 9 ++++++--- commit-reach.c | 16 ++++++---------- commit-reach.h | 7 ++++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/builtin/merge-base.c b/builtin/merge-base.c index 2edffc5487e..a8a1ca53968 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -13,10 +13,13 @@ static int show_merge_base(struct commit **rev, int rev_nr, int show_all) { - struct commit_list *result, *r; + struct commit_list *result = NULL, *r; - result = repo_get_merge_bases_many_dirty(the_repository, rev[0], - rev_nr - 1, rev + 1); + if (repo_get_merge_bases_many_dirty(the_repository, rev[0], + rev_nr - 1, rev + 1, &result) < 0) { + free_commit_list(result); + return -1; + } if (!result) return 1; diff --git a/commit-reach.c b/commit-reach.c index 0aeaef25343..202776b29e9 100644 --- a/commit-reach.c +++ b/commit-reach.c @@ -471,17 +471,13 @@ int repo_get_merge_bases_many(struct repository *r, return get_merge_bases_many_0(r, one, n, twos, 1, result); } -struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, - struct commit *one, - int n, - struct commit **twos) +int repo_get_merge_bases_many_dirty(struct repository *r, + struct commit *one, + int n, + struct commit **twos, + struct commit_list **result) { - struct commit_list *result = NULL; - if (get_merge_bases_many_0(r, one, n, twos, 0, &result) < 0) { - free_commit_list(result); - return NULL; - } - return result; + return get_merge_bases_many_0(r, one, n, twos, 0, result); } int repo_get_merge_bases(struct repository *r, diff --git a/commit-reach.h b/commit-reach.h index 458043f4d58..bf63cc468fd 100644 --- a/commit-reach.h +++ b/commit-reach.h @@ -18,9 +18,10 @@ int repo_get_merge_bases_many(struct repository *r, struct commit **twos, struct commit_list **result); /* To be used only when object flags after this call no longer matter */ -struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r, - struct commit *one, int n, - struct commit **twos); +int repo_get_merge_bases_many_dirty(struct repository *r, + struct commit *one, int n, + struct commit **twos, + struct commit_list **result); int get_octopus_merge_bases(struct commit_list *in, struct commit_list **result);