From patchwork Tue Feb 27 13:28: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: 13573783 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.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 2406C13B2AC for ; Tue, 27 Feb 2024 13:28:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040506; cv=none; b=aXlXRWVPWQRB/czywfNv6/OMMoRKy3nPoxjkBLs9wJB8MugkbellWfV9+5jq+EFToJ2oo1w06Rd4UG/nO1vzR2t4R4J5CJOiLv8iBOQsaqx+K0ZN5WLWfimeD7vAxwaIV1RL/bDBT5U28W216jvaHm4i9toq9JNaXDQ/0g5rjo0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040506; c=relaxed/simple; bh=CIKQ8Bb1sUrqihQ5MJIFUcbno3QB/yb6ILzqtp+yaVo=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=lsmG1g7MpeSY6nnnzqyqL2/Nuh0EC/TgfdmHbhAOCsykf6szwyRfAT5ODFY6dj+TuDvZLu7U69K+R16KaY2W4AzTHnP2Y2gj1dCx2kTKJqR7ULJMIixj+ewGFu1Pf/lrMxnKfm/OnZgy2YIfns3R8lnpNLE1AdQZKp7TqBvgctE= 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=b9k96jxl; arc=none smtp.client-ip=209.85.128.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="b9k96jxl" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-412ad927275so4084025e9.3 for ; Tue, 27 Feb 2024 05:28:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040502; x=1709645302; 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=b9k96jxlK1Ox8I3q3wX+3vRml+0eIfDS573uKMlfk+Q6Ksr4z7KUGeo6aScYFPOY14 HLCB5DdEwlJ4zN4p8OiZou7e+MTBatSMoX3tI2KojMB0raGi94+iCIUzSTRh8A36vAIo 12//f8M87xijuTXt1lb4SqnLLozTs6YsNBHY4atlCpihzACXrJK6YRpveri7Y2eVLevY LDgyK+2IZoVhQr8EsvAFs8T9oV6n7x0ZkjIV2TwJ5DrVNBhRrtpDBv/BcAHvxnpkjv2o zE+CEwbfNPGaP8Jku40CHIJY64HS/l+PL9omlcI5be7IoPG9vZniRUU9Qd5Ty1CbXtkT Q09w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040502; x=1709645302; 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=Sk9Cpxky5L/pczIYDUw2+GgoM7cmysY7PpRLl/V9U+TXLaiEKiZqKO8i/JM2WMw1R0 IGcdJjAR5TGSYoSHOoA72JzxyFI2mydB79TDrsRRWaXG+/EV+tmKT/I9eh6JR2DN+4Zm +kPDDU1gPkQylB0hE144ZQVYyOEijMYIBMPYDPWEUbHvj4MZJSHxvzo2K7hwdELSJxlm aMLlsnu76vUs5ptGRyExqgYW4MtjNxZk/m637bux7kXBAY0KF3MslK+CCBb22Up1BILS pSs3Vk7Ecu+K4N3meFytGIWAsg8KEVLirvbiJYr2Tq1TdY40VNb3ps0DUN3MwUsk7Vhu FKXA== X-Gm-Message-State: AOJu0YxKqW7cNkuOApfhd6uY0SIbNzVrTp0rlZCbE5/MSO0vX9Xvoyue wysEmgVVygpxPRhJ5otak7D4CXdJjl+NlLMl+LkTNwUhCh9DPA7Rp4Gnw/Ov X-Google-Smtp-Source: AGHT+IG8U7JKQBpqSX4ec54gBq4ZFXhOAuzxWYAW/omxTE1AIBL7VTdN13j5CpKhohT8yIQ9AyLIYw== X-Received: by 2002:a05:600c:1d9c:b0:412:afed:5cfb with SMTP id p28-20020a05600c1d9c00b00412afed5cfbmr562914wms.15.1709040502466; Tue, 27 Feb 2024 05:28:22 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id q16-20020adffed0000000b0033ce06c303csm11374554wrs.40.2024.02.27.05.28.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:21 -0800 (PST) Message-ID: <6e4e409cd43bcf445f811e171958ef4a169a0163.1709040499.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:07 +0000 Subject: [PATCH v3 01/11] 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 , 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 Tue Feb 27 13:28: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: 13573785 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.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 507B913B2AF for ; Tue, 27 Feb 2024 13:28:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040508; cv=none; b=EgJCsrn4HN11LGHwmaZgDd7SjyqpJ3ZVhx6Rmrf3seHucX8yJKDouFlA3X2BcO8oGOdjmV6NhEeoF/QEV+oHpDLkGH1FA57w97gM79j7KlT3ZLmACoTELoOmfOAaqCqxBtIn8BekLuQQ6aNVB99zag+/ezYb+R1jMo3ELkN5jjs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040508; c=relaxed/simple; bh=Yb5I4d4X0STAz8HVRFsE5uLAsM9osTqtn183H3EGqBE=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=vGbOuppzLcX9ANfZeBcBz0ryjzL2ojSwT+YjVqjjMyAEKCH6KX+4FBTHg6a8JebPzlrZ9krERf8Y52c+45RbQdq4+BgKQJPBu4wNh2u7f4gv1opYnlh6ZcV7RAhNRjvlPXIfB9h+aPf1UUWBmfJWFOKNJ91xpwf6ZjcMF4oxwDk= 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=QlCN4Xsg; arc=none smtp.client-ip=209.85.128.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="QlCN4Xsg" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-4129ed6f514so20367425e9.1 for ; Tue, 27 Feb 2024 05:28:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040503; x=1709645303; 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=QlCN4XsgW4XVr0biJL3j3ieukXGEtEiayN8n7Ic/EFrwGPwRyqV19oLQ/C2ocQRQ7z k3jHkfbX8KDxTm0JegHqYLV1NS1jiv7PU4NyNc49X2O7auH2t5bd9izMRB9YepOGxiZh n1NVb9qvRPf32k7BZlLrWOGWZHcpeZv9dcA/orrRkdx4YYIv/QzhmdWWhq9kwK2YKhgv NnakTQzoK8gT2jhS2RN4ibBN2nC4iIDona9Z/bnvU8kHWUjaK38u96MjMh4/91eU1hHy sIOpQ+DfW3ZmCwn0GLEcohvaMJjiF5rMTXIQVQEjHk46y/ACHcI7FLUqs6mLYd8Yf37i vWFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040503; x=1709645303; 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=iSId93jGkOfVLtR749Jck0myDczt1AJKww0FY5SkCg9yir6dWK/99teuwgZ8MOtXYV L/xFgW7GiFS4ezYGslFuzK8K1zqO4NOaqo4iaIdIoOTU5VM3epZp1bvY2aamsoLlPWoY t3e58o1+T/urhacB5qVVIy20mXwQIpYw2rC9WwIEFmM7uRPspFRm+MdqUJkAVfCez/XG c4HMCHh8/nWiQzrNMBCmIdDdAN90jJiZaCk8TYm8Jeh4YLcfj/lyjL2DrZJUA4Ob32Qi TDmf6xBVy8QFDPEpp8tTbctU91uzCDArwqJB9NIK+pzHsy1D7N8x7uUuSVKu/E1htsGQ Z04A== X-Gm-Message-State: AOJu0YyoTt7FbEsRBOQFRTNI9Oh4e0WaE665/JRQu1phC0DvLINwDq0S dML+RgkuBmFVvC9WHevQbTPyfYXOEAaEsb5TFAZe06TBrsuVIWLruNQhfFOR X-Google-Smtp-Source: AGHT+IGAsJ1JlkZbRgmrPtnTLkw1DcWx3xy1VPzeGp+SJTunqRu5EsjnZXEuSOgmT7qGmPF2JYJsyg== X-Received: by 2002:a05:600c:35c1:b0:412:9064:fd12 with SMTP id r1-20020a05600c35c100b004129064fd12mr6317972wmq.26.1709040503125; Tue, 27 Feb 2024 05:28:23 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id n1-20020a05600c4f8100b004127ead18aasm11459359wmq.22.2024.02.27.05.28.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:22 -0800 (PST) Message-ID: In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:08 +0000 Subject: [PATCH v3 02/11] Prepare `repo_in_merge_bases_many()` to 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 , 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 Tue Feb 27 13:28: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: 13573787 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.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 50B0013B2B4 for ; Tue, 27 Feb 2024 13:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040509; cv=none; b=h8ZetrIA99iDje+5+xcpfgYEGqmXqaWMlajhq358lR+TZJlddCLfUJDJkHHFdsM18V9XzV+OH3uwLmnvyn0QDRHzQubrR7yObFOyYt6jkcWUoPyr1tS3K0xosKqAIczf7CiMv4VMk+5udnLbRugdDj4ogAh7LrEvf1kMWYbDOfU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040509; c=relaxed/simple; bh=vXE57pDk8M69L2XGEl/tCkoyxKi7Kf/uknYfneuYc5g=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=XGj06BOjcXNLhnM24Cldu7p9YlsEdrtuErmHAbvzKZzo2HNPNIaDV1N+vLf21+7n7lNnbQosdzv6qptr9+4MNK/KVPPvu6U7gFNu9hi8Z9jeKdiGsJSFzNLWi6vCZ+IwPnQXQ3Tgj5La+6JVUDjvuCVaq1Tlhyf78pgGeFt2R1M= 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=ESysz0cm; arc=none smtp.client-ip=209.85.128.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="ESysz0cm" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-412a3ebad2aso17344305e9.1 for ; Tue, 27 Feb 2024 05:28:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040504; x=1709645304; 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=ESysz0cmTHRLwWnj4XsmkPwe5/A0isrjKeZoHUEyhDoiC64+GhcjPwyIiOsflQ0F0B GXe0f9wSqGeijVmxz78ocUoM9IBAM/+MsO6f8KhMZ7qu+y8zclGv3AKncRy89bMbSL/w 6p8VCLmUbMTjIcPKnAlwTj/g6Ny4SIOGL9BiURJ8/tkd4CRRLBnWv8YoU8prpkIe3c+4 jFgkJaeQ732adN7gjsc/dgFTSijUhrS7NEFmOFu7gQsexuL6qOkNCv+RfhHapuY8facY Nvj8YN7gN1DNPaq1PiycdkR6YS2HX0P90rLJg0ZPbyQR8P6ZpIKRfdsI7pVfJgpYfMPf qTTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040504; x=1709645304; 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=eQc72/7g2Ln/QW4FAXCCvbi77oTMcKgYnY3lIpEVBN5+F58aeXFrIYdoWsu/MO4khg 1cdQ7t7ZdWNwApUldMfa+/TEukwK8GfLYIRLvT1VMv4NCRUK0j/rWHMr2IdM6Yt+goDE NyEbTU65V1yCKKVFofxLNv7Te3zhgSDhePzGBXC9Gp/jQ6jOeqYtqJmubQpQUB/EiFM4 38npvisJOkztJX5Wb6O7YwSgBkECu/kcQ+AMIWvOuwpeMBRMK0+pJYQd2/4x12k1C8V9 HP/okUI9xJfC/OFPoL4xWBOrljuHod6Bl9pVowy0YehqCMbSy/rIdZ1NsrFPsdSUwUvm kRdg== X-Gm-Message-State: AOJu0Yz5bHBhaUY2HG8TKhOGGfaY/7Pi0cPuq4X+6L6JzZNp0N13Lnid 8vYoFCMH99QEaFkEy5aN4fQww+2KwGm4v/CF8Eqw3FyBRDLZJkPow8fZ9Jlg X-Google-Smtp-Source: AGHT+IE9FVORZwqljdlQkZZZRi7z7dCpTH5B6FZ0ELHHbhjQAHh2wnyzUL/pchTyhw0Nr2GlSN6sUQ== X-Received: by 2002:a05:600c:1f82:b0:412:7489:c8c0 with SMTP id je2-20020a05600c1f8200b004127489c8c0mr6774506wmb.34.1709040504224; Tue, 27 Feb 2024 05:28:24 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id g14-20020a05600c310e00b00412a3420e71sm7725640wmo.0.2024.02.27.05.28.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:23 -0800 (PST) Message-ID: <0aaa224b5db2e78c1848ab76f5b8b73331fe9cc9.1709040499.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:09 +0000 Subject: [PATCH v3 03/11] Start reporting missing commits in `repo_in_merge_bases_many()` 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 , 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 Tue Feb 27 13:28: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: 13573784 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (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 A3D2C13B78F for ; Tue, 27 Feb 2024 13:28:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040508; cv=none; b=JJXePDbWKo0tydWDnHg49YWq/oCZlJ399rbVX4RvLolyy8oXp/2KIwWRkXmyJhIjKB9Ta/t9i9yauAD48hYblqJpmbwQGlFCHZWTWPNahX0KPcsYUze0GQNYzCntJRYG7YXXIEzCuDr9D4b5mjteQBfgCUKuIiPev+8A8e4UBHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040508; c=relaxed/simple; bh=XK+Coh5PwwNEzPwXMw8DdCAp0qD9ozktfiVc/5uk2rQ=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=PbT1fjxx9rqzGEVXrYuZv1/Fgn8MAnMhsiTnWGbOD5iSLBmPQdHf871bwpnHahO6j6dD9kK4amv/VpvJ/r/kzZc/PuNBl7JJaklL2EA2znKPr37d04R4BPEBXD1MYrUJvXkguI3zVaepjr+stbojSH1iVdM0omPdcXqO/U5c7O0= 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=V/TS1Wcx; arc=none smtp.client-ip=209.85.221.52 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="V/TS1Wcx" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-33d32f74833so2363831f8f.3 for ; Tue, 27 Feb 2024 05:28:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040505; x=1709645305; 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=FH5F4ez2NmzNeSHSGewWiOcbU5KriPIckDGLw8M93Tw=; b=V/TS1WcxWWg5fhwiss87tqTYnwB8C85fnAyCYi1KjMvvXZn+K9qB42ncf9NxfsXgq1 qVmpkcveDXQw5pHcF3p3hDOkxOsM6OxpNz5w0YMpwg9TzNfSdASqOfOQ9uYypG+rtjpo wKd/p7Tasy7eH9cfuJkf5wxs6tvLLDpWjGZ6nTVcTnHuoa9Vv8t40xFEO97rCGp4+OmP EDAWRU2isMvMF8SC34Pu91LGe9v0CCU5sYDCFrj/IHBBSs8TjtD8wbr/esX8lsvnnS+C QSQrCZpRPs5q/rM/c/gvKwgKZnKHoDNrZqdTfqO6F6sdNep23136LZODcAi1HKIr+Yva Eaew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040505; x=1709645305; 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=FH5F4ez2NmzNeSHSGewWiOcbU5KriPIckDGLw8M93Tw=; b=bWNjArehR1B1r94YpcaTaZv4FQ5c824UEX9uNw1YZLLx+rnnMH0PVtx+cXrn5vvQnC aDKJdVotrm8uq74CXmI8nCPRLMpUcElawG5K+H9aZs5i3GL50cVEPeRmDyLCxNNYSQO7 y09pAoBszqJhc5S6Rz9JYCEZyHgj2+BC780Re9PBXMdVAnMklG5m9GJLbDTHpM05ZMgZ Vimn936yFz3guZZCF5H2McWXUXwcSZxCQVTOO/meUAxuaErPcEjI3ZTASf/srT1AXulf +r4qJOSdGOQm+Ip/LkBkAEKbMKCKdT81XZhJOqVX7mIWdfCrFRnKE/wOLwDxr1TtOVXA GKRg== X-Gm-Message-State: AOJu0Yx2BOZoPHEPFcDKXmC986GKk6STEekQpsxFlvJeE60zA6JdvkHy HSJVKdTo0siUtkVcks8wXDMqPCCcUDBei1EjgGCoJhbYJ1Es3Yj/B6B8Ansr X-Google-Smtp-Source: AGHT+IG8yUNBttwyzEDASyBqdYuGxQ2b96lRsxCh1BvP5iTchvzjZ11QKGjtQJXkJfzfUsU7txI/aA== X-Received: by 2002:a5d:6b0f:0:b0:33d:c65a:b5dd with SMTP id v15-20020a5d6b0f000000b0033dc65ab5ddmr5609782wrw.63.1709040504790; Tue, 27 Feb 2024 05:28:24 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id bp19-20020a5d5a93000000b0033d4c3b0beesm11848272wrb.19.2024.02.27.05.28.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:24 -0800 (PST) Message-ID: <84e7fbc07e08956e6c493baf499fee455887b16c.1709040499.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:10 +0000 Subject: [PATCH v3 04/11] Prepare `paint_down_to_common()` 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 , 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). To accommodate, the merge base logic will need to be able to handle this situation gracefully. Currently, that logic pretends that a missing parent commit is equivalent to a missing parent commit, and for the purpose of `--update-shallow` that is exactly what we need it to do. Therefore, let's introduce a flag to indicate when that is precisely the logic we want. We need a flag, and cannot rely on `is_repository_shallow()` to indicate that situation, because that function would return 0: There may not actually be a `shallow` file, 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 Tue Feb 27 13:28: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: 13573786 Received: from mail-lj1-f174.google.com (mail-lj1-f174.google.com [209.85.208.174]) (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 EFA0E13DB90 for ; Tue, 27 Feb 2024 13:28:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040509; cv=none; b=hij2W6BhkEbqxfaW/owHRSoUnYlWK1iVMipu4NblFaARyFq/oK+xxaDXNVhmXXDxeg9T/qH4eEhXHNo5ac0dXn7mZ9p9buxkBMlRKz62WvCkPERZDF3rptLd2YChWFGW4zw91svyDSJRUAof9io0usehGZ1cYlx9s3uqOWGmfVc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040509; c=relaxed/simple; bh=+pZqO4z9dzPxkYeO95GzM11oRgZZU6Hu7Qf1EyX5XlA=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=F3uBKLZjS5MC96VQbUamwjlO7CPnBqi1AKW13lXXd5Aj52jPGwVDe2nvn11PWseXTohSypOB8hN3oqaCedlYLmTf5xWzyxtzV04bZoNXSIZtZUWj72f7FDZ5mxzDN+q0PcS80SMp88gEj1gCiZKQLXUPZS4Y+8/JVV0h0tcGzec= 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=iiBMZi/6; arc=none smtp.client-ip=209.85.208.174 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="iiBMZi/6" Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-2d27184197cso52184901fa.1 for ; Tue, 27 Feb 2024 05:28:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040506; x=1709645306; 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=mN1V+1j8c+E3JD8Ld0NDPVa4IYGtQUvIiMGNp6/rDak=; b=iiBMZi/61PDs/wFe2ViI/R9Nf/KMvkMUg4DlMt9eRLqULzJV2DiXPm5eBZXyi8+Lqu dMhZqW4bQN1h+s5HthiAAGq0EIV2IZaOtpwXUJp2/DjXp9uxwbpb7SfihfWKgBbqroV9 xChDL+TlPYASqp9HvFyVTdg5D/Fgmcb8A5myeVG2gBYFGqeX79lKMhSdVxamfWZJTuP/ lj2FPg6wqFw5WfD3/u+x8YhGyIQ5luIr0q+5AzntMp1xqvqZmVRrlt3wOb/dptofGpKJ QCZq00O0GnoVVdgt8YjAyF1QJV7ty96rJPXfKMscGmqwTPM6D4SrqDELp7euYAzFhkVN 5ylA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040506; x=1709645306; 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=mN1V+1j8c+E3JD8Ld0NDPVa4IYGtQUvIiMGNp6/rDak=; b=Td0yil5y49jf5nIzIoHfojrv7rF6FakxXcpiL6FUu2Qek1oTLO3+dC78E9zmqUSJfW zneDa7zzZmONPfskjExmPQj31xUSIReWvL3mgMJ71VO/6f1bfpwJNhUNXKWAo2cA+Tgw SA62yFbxpwDOozYiX+fok9KoMq9ox43JQIzv5l5QIb6EWgGPX3dTvt4TH2YefOd2PdxN zHePE02IyxEypfFx2UsoANroOMZ2ce0N3/SR5FYk2C/TWeQUF9kzwMeEqa//ku4Yzc8P 6rZmMq+SCC3S2dDcc7SemMWRSxtVLJG96ytK7OuIvibhPwGUz9KGqee2ggvgb3gfEpPf dctA== X-Gm-Message-State: AOJu0YyPtEsaBIMihz/UXMVs/l6BMzBHnlmSo9tA1GYDbb1/rpx4Pp4y PmEuVftyniuJP+w1tlYI+d3liP8kFzoDO6QzrUOZga6F3MfHnDLXqS/grFUC X-Google-Smtp-Source: AGHT+IFbb2uyBBvYtUgYnexXDTM71joph8pZUipP01HqgUdAZ9jLrRhEK13SMkSiUneWwkwrF6KLGw== X-Received: by 2002:a2e:b88a:0:b0:2d2:a3c4:4f with SMTP id r10-20020a2eb88a000000b002d2a3c4004fmr981153ljp.35.1709040505612; Tue, 27 Feb 2024 05:28:25 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id a20-20020a05600c225400b00410df4bf22esm15124634wmm.38.2024.02.27.05.28.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:25 -0800 (PST) Message-ID: <85332b58c37717b5b8b6c826a2a3388dce3b0daa.1709040499.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:11 +0000 Subject: [PATCH v3 05/11] commit-reach: start reporting errors in `paint_down_to_common()` 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 , 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..9148a7dcbc0 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) < 0) { + 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 Tue Feb 27 13:28: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: 13573788 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 645B113DBA4 for ; Tue, 27 Feb 2024 13:28:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040510; cv=none; b=Jj+Mw7bVYf29r7KrHydMxx2yt4gAtt8la1OHPL5jFFHgjdgb7+Nr96nAAE5XD22KXS5GAIPvHnThMgSPr8DPgF2YpAyasYKKtoFN5GibSuiC36lz8ZbTctBr0Z3gYw2OcNr25YUgjBf3FAZKF0uY/KqdK06bauHPPUzsL/qkiFk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040510; c=relaxed/simple; bh=PUvI8mflEWOq2BwZiRa/nQDGYx9iFMV5Pd34ga33pGg=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=GUTfNPbAETfxb4iMdpPihxEYDuFNVbMRQB4vINZ+CccMy9BVpu/G75v18WOkemiKDkctEDUU55/p/gwZarlcQiiHkOrefZbZ3wLdE1WZDmTjDZM5YI8lmLbCN/GT8MaFtVffozvyZmmjYsuQbyNadqYiREYLTP7RYW26XvyHC2Q= 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=VE7U0P9l; arc=none smtp.client-ip=209.85.128.51 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="VE7U0P9l" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-412a9457b2eso9126625e9.1 for ; Tue, 27 Feb 2024 05:28:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040506; x=1709645306; 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=ls2gfG7/KzRPf3br5sgCg2MiCtFeXyjXvkeYAyegKIQ=; b=VE7U0P9l7DB52gUl3oUAxzi7mh0VN4qaTYp+JQ3qldoMbim8CbzZwFuS1I06IlBF+R fIaSqgHUFvDRQpE/ZAZ889iEHcM9OvaCDfX8QB2ZcojGykoDTXeFYsPWNpDSg01GtZNy 9gSWghwux3+sy4f1Hf3Ld8+cbdo77LY0LafP6FPre2ez9+Tx2aCQU4sCEvNEaTRq0+OO ydwLR7494Zh6sI+5Opkuu9d7Kwz9bdzCwN97Eo1W0xWSj3yBehqRzO2DGlBBa12ef1G7 4CEOb4vDrHNxAM6S3hoiyL3k9DNLNtw5P4Zw5QJlENKPZFhRQGg+nxacHX0XeqNQwc0d BIuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040506; x=1709645306; 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=ls2gfG7/KzRPf3br5sgCg2MiCtFeXyjXvkeYAyegKIQ=; b=DRbjjaQEnZNllAFnsurCBBAGSa8zxSTogIhoeRgwrGti1SB4N9ScMnPCumd1HDIf6/ 9WCwXAOeraOl2lW/AFuzys1WXKCrTd1xwQIh7CcphIEpgmxx+lL/DdqnPQSFMcHWSrDa qhuxdtANSNSAc9hmWEO26JUK8sz539mUwofoAvJgMjkRk9iIR9Il3HjtMdFKR5TfVh+n otg9OyHrUfHsrNFv5XrSasjn2WSBKOCVG96Z2MFSCThvUmQXbK+PdqBtyiKINNjNLLNW oci7cQVbXNsQM/7cIQQtSEWJ9kK9gj5Zd4hWpf3t5hL79Wz5sHMNqBazlsyerUFPwOPh e+lA== X-Gm-Message-State: AOJu0YyGysFY17HnvGKuRqMg94ZNLmMjBKwSVNhLqcbpMx7xg0ke+06m bDY+49QgZcfDyfcoXBPmcSIge91APsytCcvjAykikeeoTustAx+rKk2mfHlv X-Google-Smtp-Source: AGHT+IF+OX9B5Tgy0rNpllNmLyzkd+0Yb7HxTTNq16qM+FPyejsS5r2vPhgEq0DMD1GPuUpIQOnDow== X-Received: by 2002:a05:600c:1c1c:b0:412:952f:ca35 with SMTP id j28-20020a05600c1c1c00b00412952fca35mr9176918wms.14.1709040506176; Tue, 27 Feb 2024 05:28:26 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 10-20020a05600c028a00b004122aba0008sm11159483wmk.11.2024.02.27.05.28.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:25 -0800 (PST) Message-ID: <2ae6a54dd596c3192b5be32f0e4e2605f4aac6bd.1709040499.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:12 +0000 Subject: [PATCH v3 06/11] merge_bases_many(): pass on errors from `paint_down_to_common()` 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 , 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 9148a7dcbc0..2c74583c8e0 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) < 0) { 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 Tue Feb 27 13:28: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: 13573789 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (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 D32DE141988 for ; Tue, 27 Feb 2024 13:28:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040511; cv=none; b=g0njkPqFOwUNI3UWIC6u66yUndCfAN5JjBXhfDRLeN4DipT1hPJ5LS/tx5rCjvPa2fv8TVwwPsmwzVegQ82HcF5V1tfwc884uSVjnE65+p8R5ApKrGhMYvYotqBCkR4KErOADfXwTPWQu78V9RJVWkmNUx4z/cjeUNOh0tfOehs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040511; c=relaxed/simple; bh=GMisT3c0UH8nvhHSntvgDda4WOaTeQgKFgBvq9WNG3s=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=CWXNvj9B1w7WMpR6N7sYYB522s9PWqphsZaa6/qADNZMdT51pVS8suZv6Q5ioyTL297w1UFUip91D5RfTUnYf43zZlcx8W/RzOpY7fGLTpWfhAHYbo200QAins/a3OLM/7wDD9srhVN+AiH3/9Qcsm/qFjtxPc2zGCvlrBgXFWc= 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=nV0SHxr7; arc=none smtp.client-ip=209.85.167.41 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="nV0SHxr7" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-512b700c8ebso5302476e87.0 for ; Tue, 27 Feb 2024 05:28:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040507; x=1709645307; 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=NZYTa7/iq5fGG8lMxU083J6LdnIvDMjkHZYAAFHn/9g=; b=nV0SHxr7/vnANSpQ6BUDYaM/vsR8jAd6YULjGoj4tRRAambge5tqgQxlzkBaevFaLs jXwj/ZIpCRGPpDczWHua+FuzyyywDX7KSSaTvtTEwcDRfB9bcoNmEvxvNyIuQITuc/gy wr3TSE8YkiWM8bhy4UIc/0wjdJ/Ub2Z68ljY0V+MVE/Nhb9sYh+m/URRLjv3QHM7nEgB Palr+Am1bTZ89YSPLDV1mP12Br/HnAufhtr+sGZ8dl2yW3c1UpvDUB9V/LlUy9B2mVyw 0p2Y7Fy+lXRhUPbjs2LAU525ahjO5tyOyT3/1p1pB/ydTuaja406l1iZtVqP85bDRfEj Ksaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040507; x=1709645307; 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=NZYTa7/iq5fGG8lMxU083J6LdnIvDMjkHZYAAFHn/9g=; b=ITU9ZErKyfngSJzMvjQLwyT892o/L4J5LvfBE94f1y/dPc1bRYlI1YEMmlJqvkogYN c8FK1Eou4x3eSBIcgM4r6dZzueKf8O0iDrmz9z8PzgXWsxfRo7jBtF2lWF/W/DGkHSQj T3M9gL6s2GtA3fSAdo01IZcxAfRUmi6ra38gGZnd1UVyrFpbQ8f15jI+7DkKWnjoeruH LHLsz27Z89nFeW98Jp1whiBS2ijPv62sggnwOpbq7bjRxwN3JWwT3Dn/E7ZcoYCNCcvh In23+k50hGodho6VYVe2iq36evHu5hvfWNy1neok3KrzCB9rbGuJtc0+NC+VZSDn9r5M sU/A== X-Gm-Message-State: AOJu0YyhkWG+prMwoda9OHMHBuWkVPRAEKKLi3Q+g/Up68oCPBmUs+hg vzI+mIRVwKSgWzGvqJqi3dJD500PXKOvf6CSMpBMAKbQ1T2I7uA4WseHoTxE X-Google-Smtp-Source: AGHT+IGLBVdGDJsvHeeeUOeOC0YN3tHpEO4SCVEtdDkb/3tiuBcliNA8J6hRxneP2gx22b0eaVdVkw== X-Received: by 2002:a05:6512:108f:b0:512:b00f:a55e with SMTP id j15-20020a056512108f00b00512b00fa55emr8094641lfg.13.1709040507522; Tue, 27 Feb 2024 05:28:27 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 26-20020a05600c029a00b004128e903b2csm14892139wmk.39.2024.02.27.05.28.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:26 -0800 (PST) Message-ID: <4321795102d5cc5f4e599cba0ff623b5eb31b5bd.1709040499.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:13 +0000 Subject: [PATCH v3 07/11] get_merge_bases_many_0(): pass on errors from `merge_bases_many()` 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 , 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 2c74583c8e0..5fa0abc7d1e 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 Tue Feb 27 13:28: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: 13573790 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 28EC414199F for ; Tue, 27 Feb 2024 13:28:29 +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=1709040512; cv=none; b=Ewn2NHdW/X+wdaIRGQ2lfWmW+oJguQF4LtzYyNI+nRrt3wze9WaIFD/kuTkN85QLUmVx7diOvKfPUpZiRe95GDhy6IkrH6ToyeENdGWe5wSlgMYTTvzLJeicCcK9Matwnj//VdGYtuE8eJnp74CQ05BdUjVU1+CpACeBY0JG818= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040512; c=relaxed/simple; bh=k82XXytIOf1iUdIbwqVKYDEdc+wyvr0BoBxa3J3j5h0=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=i2lTDOFbfzCmwqVLVIg6JjpStUZXxYtY+iU5yN2UpSDL3tdQGdHYD1IcPaWV+yKGFQ7IgYbsx5BnO67wD6AmFEIeHBMv8HIZwWxkuzn8FBxYKyz02atvmkj8H642DHnRsYmP0sW1UE3JR3gITbtQSftDridAqToEXc6dIFdegeU= 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=aN085qbj; 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="aN085qbj" Received: by mail-lj1-f177.google.com with SMTP id 38308e7fff4ca-2d22b8c6e0dso46294061fa.2 for ; Tue, 27 Feb 2024 05:28:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040508; x=1709645308; 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=f1P9ivwVvGfGXy67eLQ3BFxWbwUzX4jOeNotuFovadI=; b=aN085qbjzmSGUjJs0yYTrWYOgYfm0JWVgcY7mECsYFQ2TSyX6jTg9NJyUis/yL33// 0Wge7WHgpmYXOPwQemUdu9iiI6918+J87wpB+cMtnKmRyP80HvFjrzZDqNOSm5/np0F6 h7gA29AJMneaAKPpk9/sKxSGuCaFbwrydIxIdqvrmmVPVboByEeqM5+bqSwfynAcP9hi u+9wK33XKTmKpvAEVyiQatIXwFv9FzX5+f7EjflAGjdZRDsrC+wjFhdVIBIAZG+YdxjM 0GMmppHXD/OyQ7eJdjp/GsFk6FLXfe9dKao8um0lpXxncT4THo7PCU1DLvKFNHe6qFQG P/Zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040508; x=1709645308; 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=f1P9ivwVvGfGXy67eLQ3BFxWbwUzX4jOeNotuFovadI=; b=fTq9DzjNGb+To46Ni7i1ti+Wx1jzRSzkiUn3SCp3mrzWQknsgxBXok3E+o9YNzmfG/ 0xWqCfHj/4iiyBF/DBluD0oblcFE/F2xMkdEPAwjJd3I94Vr+dzwy2bXDDes4zrYXQ73 oLbtObBLFQwHc6Ycyqg7W37fCHo3wrJQNoUDMbFntIjSYOp+YabyT+AXozAm9QMcM1Qc fDpnEnvx9lGTlpryz0xsamZUEZP34kXGYNNhEB2rUW3gojqKAIEHkKiDsm/Cihwm0Cf4 mey7xlNGF3+xFIEf++pHwYGuj+m7Nj5eo27NjONkn/zTeg5kt4sZ7+4Qqgil+WeRt6ge TqUA== X-Gm-Message-State: AOJu0YyB2KH6CAEVWkYWyw3Q9Tth5aSj6yEZvQjk+/84d5FZUyP9UoGK 39tJ9uh4jVSEDz1Z1AaeiOTUBQrBnoTonctzwv9UCrxACB77Ymyj6SWUmfYT X-Google-Smtp-Source: AGHT+IH4epuz77SmfviDzSN01eCr1zoNnrbcec8k++tA8bOX8PVC7UAlyXsC269N2DYWvSy69Uv5pQ== X-Received: by 2002:a2e:960e:0:b0:2d2:39ab:eee1 with SMTP id v14-20020a2e960e000000b002d239abeee1mr5903246ljh.32.1709040508106; Tue, 27 Feb 2024 05:28:28 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id bq7-20020a5d5a07000000b0033cddadde6esm11657444wrb.80.2024.02.27.05.28.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:27 -0800 (PST) Message-ID: <35545c4b777efc3f4ede2ea2dbe3934eaaec34a5.1709040499.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:14 +0000 Subject: [PATCH v3 08/11] repo_get_merge_bases(): pass on errors from `merge_bases_many()` 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 , 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 5fa0abc7d1e..10e625ff51b 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 Tue Feb 27 13:28: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: 13573791 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.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 D654D1420A5 for ; Tue, 27 Feb 2024 13:28:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040512; cv=none; b=FwSTFG9s1RRl/eGR0JMivISG2TGs/vDfaJtbOWshK0boEL06ZPvccezTHBhj/yyYXLwYyQxtk8KoY+FKSPcJzRBhoohoySCjwDj7bxzEHHd3v6AbrAM9WcaR76TtdIlP5yZadjq1epnHxEr8/KjRic+oipvwNQ5fb7sx/ImQ4vI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040512; c=relaxed/simple; bh=hzRxdBrl2ByI5HBj9L44tIXXHO2fkT2SNobbwjCZPCg=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=RPaMdycWrvtwvzDFLnIV377nNh87MkWo3lkwM7E6ZtG7QApQ/JGy3vzSVz/ABcdQp+9w7IM9jMgNPlR5d0RhDKkIS+TzuXwbklYZxjRQWkwvBC6NT43CvORg3h3f0xD/ScXOCz7jhE5f5XQKM21fk8eXaTpZJykscp43LNNyvdM= 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=PXbpFj+3; arc=none smtp.client-ip=209.85.128.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="PXbpFj+3" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-412a4848f0dso15120775e9.1 for ; Tue, 27 Feb 2024 05:28:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040509; x=1709645309; 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=KjZk1iDVFshalJ84DkUa03UuxpWms0aWmK5IcaENZJk=; b=PXbpFj+36IKag+hzaT48VxnNKqhAN56rgSX0gic+XnEnNunh11kHe12/+NdH/c142w 12unyLSHi5ELOPJYuUAbw3agHsgofrMY7rmU4He3BrUsLWeh3DElaIWdOJ9qbNxBUYJX qbCkOiwZ1umB+ut0DajnBsTKV6KsFFtNn58AmCTSXRPaAfv7FwiNKTY2UkfAVuqLcAKk fblymmoG2wGhtxbZ7aa/JqaTQHvlKXFh9ZYv42jyB+2nGgadOW2we9CedRQlSv+FHvXK BEnFXCc+vuYReC1Abt/NcMxlkW31pazPxQ9y/j4rJvQbwTqsYyabjV0IRK7P+Gbuxz6J du6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040509; x=1709645309; 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=KjZk1iDVFshalJ84DkUa03UuxpWms0aWmK5IcaENZJk=; b=Z58EYqUTeOD75j3CrJdlbH5D/75rUgo/yM9bhM3P0clje9swrIjfOtHf1/wRFTwoTj RdmAekWFIwV8ybuBawaiaLVAUPup8L031I2hQ9QXSG+fyykrpOD5heC2ndes0nvhR/sY oWZoUY7V4HotM3DAGcbtXd69P0RvyY5XBAHdL6pbgqGnXwr5947QsQA9y64vp7dJxZ6l OzctnSqgPsd6qPdP1gYk+/gbpa/GI2UyrYu/GrT2ITSUVxUBZar2p4BIB9X3Fl15gSxp ECBReqmWKmsXXRM0j3eOO7nx0HYq13kzQHMK/a4gFtoEL0X1HP33D5pfAFPJQ0Q++dJZ xkHA== X-Gm-Message-State: AOJu0YyBsJ05t2xnw+lEWuomkoIzE0k2WTBV2d71mT84/DChSpGjFpx2 Ux0jnYNpTJXkZHbJp+z1RQz5S1IPwqZp+cFwENqDSUsNppa0Dcwry2reL6/a X-Google-Smtp-Source: AGHT+IGBXp7yY5coT6MOF52xbWThnVIP5PVaTHAzY+aGVO879PEKMQ9agFxiwzdzHF11eK2DGAZksg== X-Received: by 2002:adf:f305:0:b0:33d:69c1:dcc3 with SMTP id i5-20020adff305000000b0033d69c1dcc3mr6882315wro.56.1709040508964; Tue, 27 Feb 2024 05:28:28 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id v6-20020a5d59c6000000b0033dd4673a4asm1270472wry.71.2024.02.27.05.28.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:28 -0800 (PST) Message-ID: In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:15 +0000 Subject: [PATCH v3 09/11] get_octopus_merge_bases(): pass on errors from `merge_bases_many()` 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 , 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 10e625ff51b..fa21a8f2f6b 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 Tue Feb 27 13:28: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: 13573792 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.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 2F15E1420DC for ; Tue, 27 Feb 2024 13:28:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040514; cv=none; b=phn+wB6Ipg0sEzehiFId5MTwfVkq38o5nxQy0VKEM6VSF4PrIjywz2AkpDJcJJ5vsFAK2+R9Y8L60+dOYD30iN/7v9x2KJFYviDBDjJet0SINIihCNnF477jsY4WNcT2T3dRtntEWzkQiieXeJND2wrblDj3YCahXxl5o0ykka8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040514; c=relaxed/simple; bh=CLpj2eQfppOLJzGwC3VItCwf3+h1DC58UrsmbIL/P+U=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=KIPBPcqv0ow61AI5HJhrbGYyiCud9wMMnioiTFmjubewBZP4P7LW2PQQLzIeqZP9SGrJFLdtXhSK/ovzCFA6fAyiGz9YGI/sJ/Gn4ek2EHi9tpls4B2tGDDAc1nKmUfZFypCShDqaWv5p481QXBKFd6MLdcezr9DgAjGIvMpczE= 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=BQPUNnVB; arc=none smtp.client-ip=209.85.221.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="BQPUNnVB" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-33dcad9e3a2so1334474f8f.3 for ; Tue, 27 Feb 2024 05:28:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040510; x=1709645310; 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=IpB/h3lwfLFrLf+CGh0DZz5bM0QyAjW0iXQElsRCUNk=; b=BQPUNnVB4EcYK4aIJsZ4AzHRwTJDt0FCB0iwkUs2kutXfvYgsmINhF9s4V4oqfrRxf 9ENF+N8I71pWJSlo7aHxVqKplkmcZWD2BqNayKFv3gattW48brzr/9qRlclQJhd3n25/ 5KeTL+YUMSJ2hvovgX1AiutHOsj5p6zoda4btBbStRT11d+7tWX/EPNjq/ROM0LoBKsx XbI76XSaa9+pDEJOieToYyCLExInOPi/r/jTNOLtchwqvwo5g46fhYQtCBjdP/Ay3YqW 0QV2TBlgyA331SsdjOGV8Zic4qPgaWkbM8zpPOmWqEiq5zEDLgqxj+apVzPAyOF+oLhq n1kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040510; x=1709645310; 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=IpB/h3lwfLFrLf+CGh0DZz5bM0QyAjW0iXQElsRCUNk=; b=JNHvk2tnmPfBpfHPMWQs/fNZtIzd4hmKMcY4Dh3xk8bI8jTNABp+iFLqu2tWHCflG1 aMEIFB5i+5urjnii6ednGqdrSBRjVi04i22Q1MOFNWFHzbJTMKBOiilON3IBTePoLtnx +utyCt8M0254sOzjIDpqxU//KMaecSPmSOWBN8dpjTXl4pNLGuyu8abjZFdL2xhe3aWw HbMIpG79ZxWJjdyiVgQTiNZUVzd6adGUcppNmO1iOfI3Chlc9DH34TD4CeJ5NmuMNFGz dpl4jmNBqE0QNFXsXG+6X1ZQyZfXnN+zEi6V5fwqn5ZJJJEuN3+neh2KvyH+O/R84T4r 1RHA== X-Gm-Message-State: AOJu0YxZIZmZKbrTJ/X/pF/ns1oJkQxu5rRdnTFKTSsybqJsLlIoINIP RHIUzvLtry3EJ3iO5/kEPC2y/Jk9bOjePrmg9/jSnRtvLLoNfZFAmiTOafjR X-Google-Smtp-Source: AGHT+IH7YXaK5ipabNhqKFfRQoVYNQXdfvc86FW3xvGLp3ZE9Z39iF/hvjC4/2PXLKr0pvLVVhRqZQ== X-Received: by 2002:adf:fd92:0:b0:33c:f35c:a395 with SMTP id d18-20020adffd92000000b0033cf35ca395mr6732542wrr.52.1709040509755; Tue, 27 Feb 2024 05:28:29 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id k29-20020adfb35d000000b0033de2f2a88dsm4424665wrd.103.2024.02.27.05.28.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:29 -0800 (PST) Message-ID: In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:16 +0000 Subject: [PATCH v3 10/11] repo_get_merge_bases_many(): pass on errors from `merge_bases_many()` 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 , 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 fa21a8f2f6b..954a05399f1 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 Tue Feb 27 13:28: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: 13573793 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (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 107671448D7 for ; Tue, 27 Feb 2024 13:28:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040514; cv=none; b=Xi2pEmsqMu5EEeeGrx10yllNSNgDlFL5fuiF5FTycD2jYS643e6wOwb1GUVkq3xESGQxngh1HorUgm0MpOAnc26TkZwaY+uMNSMr/E5FgsOgBdmz5D9ZQrDkmmjsy0WsGlhv7f0DvFEmAm4LHbD5YYRmGwhOH/+6o0TopGl+gD8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709040514; c=relaxed/simple; bh=ycRcJNh4RBH0q+Ha2b1dfdCgivn8LOTTSA25a7ks9Io=; h=Message-ID:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=bGht+Fpu0/YLKY5Y2sQv2ENAuTboZNdJJhjIe3ElOGngxM38fE8qyuoT7Bs5nKvLWWNT1838QFq9gTXR83iJYIFjQ3kY6lrWZUC9mJXqFRBEBy3pkk4Ugoxd/Ni/vWFWfgMDwG5W6c7Ct66tQ1yj7yOpk073+P3rFvRnS88H0WA= 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=Y1GozOOX; arc=none smtp.client-ip=209.85.167.52 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="Y1GozOOX" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-512fd840142so2657744e87.2 for ; Tue, 27 Feb 2024 05:28:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709040511; x=1709645311; 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=8ATFgjL2j9vsAkuTtdOxufbw4oIBU/BIZVTdpWAvcts=; b=Y1GozOOXlJyGnoV8Ewinxwijvwl5rBXEWcRk+DwhmezCg1wt+goyuUuGU+GLXAh1rW aadfo7yMw68Hl0RKqoSZiak5ihGdBGmExhPlvIixwhaVhYQjPDzMt5PQjAqMJf2FdWlr OlVz5FbKW6HMXh5bdoW+3+TqYSMcDaDI1aXQoG0d2VD/j2cOCz0vUaIkvQyllxXQw8MI cFT3i8fQSUEDc9J5k9ce3kZ5ATXwWjEgEjdH35Malo7FIUGe36BFs7m+WZ5GgIsiNl6I REK6HqHURaLUl+wt+skgQGW6sBlG+/tzVHnzdxJS9uV6BBL/RNL5SuarI/oebC22MD/I TD+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709040511; x=1709645311; 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=8ATFgjL2j9vsAkuTtdOxufbw4oIBU/BIZVTdpWAvcts=; b=Vq3M/bwoc9sRQoB0L2IInMRjwA54+byAkBY7jrRKDevsZHyDvEF2Zhzb9fyBBjTmBE a6vgQer2GYhCAIs3wDFmbvrQ3+7ZIKsB3WqMR0Fd6X37Qjz2cSusJe0m21u9wnlrtoIV zZQ1AvNd3yIzDclAnSU5gEG1czAsC43W0HBiTs1n66cj8mL2kQFFu8iFyx20SymkmpZB gnQPO/n73dI2tBrIGqsQPnLFS95L/tT7daPHubHWbWbz7Tr2tlgB7UBF0dee7l5Vjli0 mjQlMdkHWoQvN/6+9hzojUn7HNz9IHWEWVbfGF84xP7AfQ8JzdnQ7Qzew8lA6CH8W3a5 daHg== X-Gm-Message-State: AOJu0YyycUvjsl99sqFprlEMLX6J7VVMucyFt96Jxv9o8Cv/WIYy/GFf xrp/u+/XHGN2uU+lh9n+KX9OPI4vopffr5QVWWulxyRGwpMuhzlUYgGbc57w X-Google-Smtp-Source: AGHT+IHEeDmPphvscRK+VSJHilRUV8iWW0QR7zVxWAz/+IYdbkrgLZ+R6yP9zLWfS53kefiaHjlp6A== X-Received: by 2002:ac2:5468:0:b0:513:14a2:c3b7 with SMTP id e8-20020ac25468000000b0051314a2c3b7mr321519lfn.69.1709040511076; Tue, 27 Feb 2024 05:28:31 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id i10-20020a05600c290a00b0040fccf7e8easm14990739wmd.36.2024.02.27.05.28.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Feb 2024 05:28:30 -0800 (PST) Message-ID: In-Reply-To: References: Date: Tue, 27 Feb 2024 13:28:17 +0000 Subject: [PATCH v3 11/11] repo_get_merge_bases_many_dirty(): pass on errors from `merge_bases_many()` 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 , 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_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 954a05399f1..2c69cb83d6f 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);