From patchwork Tue Jun 11 06:42:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xing Xin X-Patchwork-Id: 13693170 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (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 89A5D1EA8F for ; Tue, 11 Jun 2024 06:42:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718088135; cv=none; b=VMLPcmt+HNVKAk624p+y85mAcRqINo+p7YMmzewCUaZV+frWa3uKPP6SJZQteS7P8M1fUIBo/Io6XbFdbLldIshMMHoUAXBjY8q5FTqXCctIRjZO/kjEY5zGYBSuZe4Rcp9JU0Wt90dYMiIBD87O8V/Uozr+OVMMf8VwGf5BIWM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718088135; c=relaxed/simple; bh=/tENE3Kgl1cYhu0N5e4hM8lvQ9F5tFHbMwVAioiliyY=; h=Message-Id:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=mi3Nj82vZ/tLihYxv8cmUBYcisk//ofSfuzMNbP9pDA2vXhLdtu72qUNGWb89DviwIGHZVs10HBsJUspeCjNJcnyd0M79KkpYi9EpVrWiT2k0ZrziFxODRx0PVaBvZh4ic73vfNkL8nie1j1zAxPREoYkiX86sxbl0XhkidnXY8= 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=QElXvkEp; arc=none smtp.client-ip=209.85.221.54 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="QElXvkEp" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-35f2266edd8so582695f8f.0 for ; Mon, 10 Jun 2024 23:42:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718088130; x=1718692930; 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=O1vTJEyiG2vXL6cdAMlKLrLvnBGFQoqjVV/+UtqDT8E=; b=QElXvkEpuI5s1P4AvEYvBB66aTj/eMCixtJH/7j2mjJA+wzw0ltuN2GgqrdFkPDGGD p5akwLyYJQfWFsTFdwg/ymN3TJhmSl+Afiuyr/ywRTmSl9H+0VkLDJfbuhhXUEHYcx9Q yHa9XsFzmnDRrqiLJ7SSlHG9+yo7xgNA3nFG1Y39Ka//2rjZV0ioYo9OFNLTUl2EMt/5 cU1RQevwFtoacKO/A/luCzb3tbFHHSX6N/Cj08caVTd+WXFuhGykCHKrBZVIQIcItQBj mmMMXIKPF+Vvmz6W+4vDAfQ1KjvX1kegjjT46eD2Cks524N8WcEmuJpcX2Ob3oy49eqK R4Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718088130; x=1718692930; 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=O1vTJEyiG2vXL6cdAMlKLrLvnBGFQoqjVV/+UtqDT8E=; b=eRO6NeFBO4qGQcCW6/JJaHhhV2F8m0lt86IM6dX91blBlNSTGgvTtS7CAVHI0XRNlX Tk1NfkPOERLMYDiQAOSpWiimwJUN8ceeNt0Xy9PGz/R7Vd/ONrsbxHrzYEH9lTZ4OddK yQplt3qPBEv3SbjKdWLLpyHS3anppBmVBs47r2DyPTB259dkdRCejIrr4KKIja5hrgSV wc3xB2JwS2IFPpmsPphQ7kSasp1Jo5No1C247pHkEbzLVrCcZI1yrtRU/hKse4VqhIJG 1U4vMO+rUhF0MT2wBkxmxyK7S171XIQTbNo+oP71d3TTSRPRrJH0k/AUNxtRh7m44FIv cG+A== X-Gm-Message-State: AOJu0YxvhjZQtJ60urCCTxDEaHA1e+oyQl0KCCpPkeIPv7WSYock24Qu JPdcAu03vsFjte1m+5T2S/Psm7s68H8XlizezfUloZtpJtzlFj1TAjFd5w== X-Google-Smtp-Source: AGHT+IGOHnlpCdhYt7nF0/K6v8OdnPNh1Ljh80qEiRbRUzvUnlrr5480h1MbFrNJC5KDVytTXnBxhQ== X-Received: by 2002:a5d:45d0:0:b0:35f:1f36:c4c6 with SMTP id ffacd0b85a97d-35f1f36c558mr4718947f8f.62.1718088129938; Mon, 10 Jun 2024 23:42:09 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-35f1d5f484csm6610953f8f.63.2024.06.10.23.42.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 23:42:09 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Tue, 11 Jun 2024 06:42:03 +0000 Subject: [PATCH v5 1/4] bundle-uri: verify oid before writing refs 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 , Karthik Nayak , blanet , Xing Xin From: Xing Xin From: Xing Xin When using the bundle-uri mechanism with a bundle list containing multiple interrelated bundles, we encountered a bug where tips from downloaded bundles were not discovered, thus resulting in rather slow clones. This was particularly problematic when employing the "creationTokens" heuristic. To reproduce this issue, consider a repository with a single branch "main" pointing to commit "A". Firstly, create a base bundle with: git bundle create base.bundle main Then, add a new commit "B" on top of "A", and create an incremental bundle for "main": git bundle create incr.bundle A..main Now, generate a bundle list with the following content: [bundle] version = 1 mode = all heuristic = creationToken [bundle "base"] uri = base.bundle creationToken = 1 [bundle "incr"] uri = incr.bundle creationToken = 2 A fresh clone with the bundle list above should result in a reference "refs/bundles/main" pointing to "B" in the new repository. However, git would still download everything from the server, as if it had fetched nothing locally. So why the "refs/bundles/main" is not discovered? After some digging I found that: 1. Bundles in bundle list are downloaded to local files via `bundle-uri.c:download_bundle_list` or via `bundle-uri.c:fetch_bundles_by_token` for the "creationToken" heuristic. 2. Each bundle is unbundled via `bundle-uri.c:unbundle_from_file`, which is called by `bundle-uri.c:unbundle_all_bundles` or called within `bundle-uri.c:fetch_bundles_by_token` for the "creationToken" heuristic. 3. To get all prerequisites of the bundle, the bundle header is read inside `bundle-uri.c:unbundle_from_file` to by calling `bundle.c:read_bundle_header`. 4. Then it calls `bundle.c:unbundle`, which calls `bundle.c:verify_bundle` to ensure the repository contains all the prerequisites. 5. `bundle.c:verify_bundle` calls `parse_object`, which eventually invokes `packfile.c:prepare_packed_git` or `packfile.c:reprepare_packed_git`, filling `raw_object_store->packed_git` and setting `packed_git_initialized`. 6. If `bundle.c:unbundle` succeeds, it writes refs via `refs.c:refs_update_ref` with `REF_SKIP_OID_VERIFICATION` set. Here bundle refs which can target arbitrary objects are written to the repository. 7. Finally, in `fetch-pack.c:do_fetch_pack_v2`, the functions `fetch-pack.c:mark_complete_and_common_ref` and `fetch-pack.c:mark_tips` are called with `OBJECT_INFO_QUICK` set to find local tips for negotiation. The `OBJECT_INFO_QUICK` flag prevents `packfile.c:reprepare_packed_git` from being called, resulting in failures to parse OIDs that reside only in the latest bundle. In the example above, when unbunding "incr.bundle", "base.pack" is added to `packed_git` due to prerequisites verification. However, "B" cannot be found for negotiation because it exists in "incr.pack", which is not included in `packed_git`. This commit fixes the bug by removing `REF_SKIP_OID_VERIFICATION` flag when writing bundle refs. When `refs.c:refs_update_ref` is called to to write the corresponding bundle refs, it triggers `refs.c:ref_transaction_commit`. This, in turn, invokes `refs.c:ref_transaction_prepare`, which calls `transaction_prepare` of the refs storage backend. For files backend, this function is `files-backend.c:files_transaction_prepare`, and for reftable backend, it is `reftable-backend.c:reftable_be_transaction_prepare`. Both functions eventually call `object.c:parse_object`, which can invoke `packfile.c:reprepare_packed_git` to refresh `packed_git`. This ensures that bundle refs point to valid objects and that all tips from bundle refs are correctly parsed during subsequent negotiations. A test has been added to demonstrate that bundles with incorrect headers, where refs point to non-existent objects, do not result in any bundle refs being created in the repository. Additionally, a set of negotiation-related tests for fetching with bundle-uri has been included. Reviewed-by: Karthik Nayak Reviewed-by: Patrick Steinhardt Signed-off-by: Xing Xin --- bundle-uri.c | 3 +- t/t5558-clone-bundle-uri.sh | 153 +++++++++++++++++++++++++++++++++++- 2 files changed, 150 insertions(+), 6 deletions(-) diff --git a/bundle-uri.c b/bundle-uri.c index 91b3319a5c1..65666a11d9c 100644 --- a/bundle-uri.c +++ b/bundle-uri.c @@ -400,8 +400,7 @@ static int unbundle_from_file(struct repository *r, const char *file) refs_update_ref(get_main_ref_store(the_repository), "fetched bundle", bundle_ref.buf, oid, has_old ? &old_oid : NULL, - REF_SKIP_OID_VERIFICATION, - UPDATE_REFS_MSG_ON_ERR); + 0, UPDATE_REFS_MSG_ON_ERR); } bundle_header_release(&header); diff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh index 1ca5f745e73..8f4f802e4f1 100755 --- a/t/t5558-clone-bundle-uri.sh +++ b/t/t5558-clone-bundle-uri.sh @@ -19,10 +19,19 @@ test_expect_success 'fail to clone from non-bundle file' ' test_expect_success 'create bundle' ' git init clone-from && - git -C clone-from checkout -b topic && - test_commit -C clone-from A && - test_commit -C clone-from B && - git -C clone-from bundle create B.bundle topic + ( + cd clone-from && + git checkout -b topic && + + test_commit A && + git bundle create A.bundle topic && + + test_commit B && + git bundle create B.bundle topic && + + # Create a bundle with reference pointing to non-existent object. + sed "s/$(git rev-parse A)/$(git rev-parse B)/" bad-header.bundle + ) ' test_expect_success 'clone with path bundle' ' @@ -33,6 +42,16 @@ test_expect_success 'clone with path bundle' ' test_cmp expect actual ' +test_expect_success 'clone with bundle that has bad header' ' + git clone --bundle-uri="clone-from/bad-header.bundle" \ + clone-from clone-bad-header 2>err && + # Write bundle ref fails, but clone can still proceed. + commit_b=$(git -C clone-from rev-parse B) && + test_grep "trying to write ref '\''refs/bundles/topic'\'' with nonexistent object $commit_b" err && + git -C clone-bad-header for-each-ref --format="%(refname)" >refs && + ! grep "refs/bundles/" refs +' + test_expect_success 'clone with path bundle and non-default hash' ' test_when_finished "rm -rf clone-path-non-default-hash" && GIT_DEFAULT_HASH=sha256 git clone --bundle-uri="clone-from/B.bundle" \ @@ -259,6 +278,132 @@ test_expect_success 'clone bundle list (file, any mode, all failures)' ' ! grep "refs/bundles/" refs ' +######################################################################### +# Clone negotiation related tests begin here + +test_expect_success 'negotiation: bundle with part of wanted commits' ' + test_when_finished rm -rf trace*.txt && + GIT_TRACE_PACKET="$(pwd)/trace-packet.txt" \ + git clone --no-local --bundle-uri="clone-from/A.bundle" \ + clone-from nego-bundle-part && + git -C nego-bundle-part for-each-ref --format="%(refname)" >refs && + grep "refs/bundles/" refs >actual && + cat >expect <<-\EOF && + refs/bundles/topic + EOF + test_cmp expect actual && + # Ensure that refs/bundles/topic are sent as "have". + grep "clone> have $(git -C clone-from rev-parse A)" trace-packet.txt +' + +test_expect_success 'negotiation: bundle with all wanted commits' ' + test_when_finished rm -rf trace*.txt && + GIT_TRACE_PACKET="$(pwd)/trace-packet.txt" \ + git clone --no-local --single-branch --branch=topic --no-tags \ + --bundle-uri="clone-from/B.bundle" \ + clone-from nego-bundle-all && + git -C nego-bundle-all for-each-ref --format="%(refname)" >refs && + grep "refs/bundles/" refs >actual && + cat >expect <<-\EOF && + refs/bundles/topic + EOF + test_cmp expect actual && + # We already have all needed commits so no "want" needed. + ! grep "clone> want " trace-packet.txt +' + +test_expect_success 'negotiation: bundle list (no heuristic)' ' + test_when_finished rm -f trace*.txt && + cat >bundle-list <<-EOF && + [bundle] + version = 1 + mode = all + + [bundle "bundle-1"] + uri = file://$(pwd)/clone-from/bundle-1.bundle + + [bundle "bundle-2"] + uri = file://$(pwd)/clone-from/bundle-2.bundle + EOF + + GIT_TRACE_PACKET="$(pwd)/trace-packet.txt" \ + git clone --no-local --bundle-uri="file://$(pwd)/bundle-list" \ + clone-from nego-bundle-list-no-heuristic && + + git -C nego-bundle-list-no-heuristic for-each-ref --format="%(refname)" >refs && + grep "refs/bundles/" refs >actual && + cat >expect <<-\EOF && + refs/bundles/base + refs/bundles/left + EOF + test_cmp expect actual && + grep "clone> have $(git -C nego-bundle-list-no-heuristic rev-parse refs/bundles/left)" trace-packet.txt +' + +test_expect_success 'negotiation: bundle list (creationToken)' ' + test_when_finished rm -f trace*.txt && + cat >bundle-list <<-EOF && + [bundle] + version = 1 + mode = all + heuristic = creationToken + + [bundle "bundle-1"] + uri = file://$(pwd)/clone-from/bundle-1.bundle + creationToken = 1 + + [bundle "bundle-2"] + uri = file://$(pwd)/clone-from/bundle-2.bundle + creationToken = 2 + EOF + + GIT_TRACE_PACKET="$(pwd)/trace-packet.txt" \ + git clone --no-local --bundle-uri="file://$(pwd)/bundle-list" \ + clone-from nego-bundle-list-heuristic && + + git -C nego-bundle-list-heuristic for-each-ref --format="%(refname)" >refs && + grep "refs/bundles/" refs >actual && + cat >expect <<-\EOF && + refs/bundles/base + refs/bundles/left + EOF + test_cmp expect actual && + grep "clone> have $(git -C nego-bundle-list-heuristic rev-parse refs/bundles/left)" trace-packet.txt +' + +test_expect_success 'negotiation: bundle list with all wanted commits' ' + test_when_finished rm -f trace*.txt && + cat >bundle-list <<-EOF && + [bundle] + version = 1 + mode = all + heuristic = creationToken + + [bundle "bundle-1"] + uri = file://$(pwd)/clone-from/bundle-1.bundle + creationToken = 1 + + [bundle "bundle-2"] + uri = file://$(pwd)/clone-from/bundle-2.bundle + creationToken = 2 + EOF + + GIT_TRACE_PACKET="$(pwd)/trace-packet.txt" \ + git clone --no-local --single-branch --branch=left --no-tags \ + --bundle-uri="file://$(pwd)/bundle-list" \ + clone-from nego-bundle-list-all && + + git -C nego-bundle-list-all for-each-ref --format="%(refname)" >refs && + grep "refs/bundles/" refs >actual && + cat >expect <<-\EOF && + refs/bundles/base + refs/bundles/left + EOF + test_cmp expect actual && + # We already have all needed commits so no "want" needed. + ! grep "clone> want " trace-packet.txt +' + ######################################################################### # HTTP tests begin here From patchwork Tue Jun 11 06:42:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xing Xin X-Patchwork-Id: 13693169 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 CCB07171099 for ; Tue, 11 Jun 2024 06:42:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718088134; cv=none; b=ixmIJWe8xRByf7BF7c1MGEuaIxs5kb8qNoKw5v3on85QS7zOJjj2AHFOViILpP4yYI2UADwIhJ8pcIlU3rdtbmWqhYjDyIwzSqXe+TkC+9TP6ACwhbojDsaf2gToz3X58H1tYtSV3SOFujrSEemON+OcpVnBzOIJaGOlbPJiuPU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718088134; c=relaxed/simple; bh=XLb5xiWA4dAF2Fx/JHqqeBya6F3OqFt/2QpQOAIOTOo=; h=Message-Id:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=ePW4xEP2bZS8SSepZbyODthF1Q94OFoVcrId3wIyoPbzAbrncGcssAquJpaGNSOlN/RAWsLK+ZSvsdGhQk+UuBcnzTu+jHOcjnnpBxCBbwJ59MiJfs0BzLFN0gXRaxVcHSnRNCXgV2F9dck7K6kxniq43/PtlWFfRG/mUhNCLXo= 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=gi1raEU2; arc=none smtp.client-ip=209.85.128.46 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="gi1raEU2" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-421bb51d81aso5754225e9.3 for ; Mon, 10 Jun 2024 23:42:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718088131; x=1718692931; 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=G968azMSMZxhGCb7WK9dg8PxA15ncjcjODXB2hpkuVM=; b=gi1raEU2S/qA1LcZONWAt6ndsIGXscLaODeHywmCcQTvbfz02o8H8UWoICtLP5sdRK Z/kf3PBebYqQiRXW1tg5TIeDRNrL3U9RlF0JR+rVOQIEaHIbV9MdN1xJGNN9DsvkAu+j U4uPcjOF2TsT1/EFJtPSdbIGfVhJNm7ygaotSLsWPebFfQ3z/aYcKDDW1lmfhG8icN/h r4dI93sJl8xrGSY/2N4Mt2Lb+tiu7Z0WwQIX6VUDqQ1Hi0g7PXX9IiYjjIEhCjs9m6UE TV+dqSxbvIhEiPfbqXTDiBqbZdX+GAlQGnphceiqPKW/03OyteS92DJWxbxx0J9Ovj9i pToQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718088131; x=1718692931; 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=G968azMSMZxhGCb7WK9dg8PxA15ncjcjODXB2hpkuVM=; b=kXHKGCWVm8/GGewTSSsC1rAqyaU1bkkzB5vcGw24EFKOehn20ZdPECez/KrSf1z9W5 EkFMZRWYF9XY391xvKUdfSylXvBqdtFDhA4R47rRjVK4Pv0FXqZimBqXYdwUxGtuKfnK QHA2b6cm3HUwT9MXhAcPb8XBMHBal8qa5FFAw5B+IE0OvLI0/Qd+//OR3lx93EfveBRk mZgwwLT0x2s/NNyPgGt/zU2eSUnIYs85T9FK2QO3wLsOhLMAuts/5AlBlHg6lSBih7bA NjQd7yN/7zk1+PjInXszy63zuKu8kMEWt+sm6G2dBSfYkzgrlYd9k/GVRmasmKY1sBCX hcYg== X-Gm-Message-State: AOJu0YzgjahXFGvQ+hmtAXrU/sHwX6/ex4TDjZRL2GeGfYR9hCgnAbPl vmPN4vp5EcwO6ateOSdA7jTQSGzDs600feBKL6zIl657DCmZRxJNCrrlsA== X-Google-Smtp-Source: AGHT+IHZqylbFHAYkEaxLJKsofvuYoSodPXp91MggVKq6p9K0Z1fT+y9LkSGZdeU5sW/IMH/XK64NQ== X-Received: by 2002:a05:600c:3c83:b0:41c:13f6:206d with SMTP id 5b1f17b1804b1-42164a2e9d4mr101812695e9.25.1718088130772; Mon, 10 Jun 2024 23:42:10 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4215c2c7396sm164915905e9.33.2024.06.10.23.42.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 23:42:10 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Tue, 11 Jun 2024 06:42:04 +0000 Subject: [PATCH v5 2/4] fetch-pack: expose fsckObjects configuration logic 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 , Karthik Nayak , blanet , Xing Xin From: Xing Xin From: Xing Xin Currently, we can use "transfer.fsckObjects" and the more specific "fetch.fsckObjects" to control checks for broken objects in received packs during fetches. However, these configurations were only acknowledged by `fetch-pack.c:get_pack` and did not take effect in direct bundle fetches and fetches with _bundle-uri_ enabled. This commit exposes the fetch-then-transfer configuration logic by adding a new function `fetch_pack_fsck_objects` in fetch-pack.h. This new function is used to replace the assignment for `fsck_objects` in `fetch-pack.c:get_pack`. In the next commit, it will also be used by `bundle.c:unbundle` to better fit fetching scenarios. Helped-by: Junio C Hamano Helped-by: Patrick Steinhardt Signed-off-by: Xing Xin --- fetch-pack.c | 17 +++++++++++------ fetch-pack.h | 5 +++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/fetch-pack.c b/fetch-pack.c index 7d2aef21add..3acff2baf09 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -954,12 +954,7 @@ static int get_pack(struct fetch_pack_args *args, strvec_push(&cmd.args, alternate_shallow_file); } - if (fetch_fsck_objects >= 0 - ? fetch_fsck_objects - : transfer_fsck_objects >= 0 - ? transfer_fsck_objects - : 0) - fsck_objects = 1; + fsck_objects = fetch_pack_fsck_objects(); if (do_keep || args->from_promisor || index_pack_args || fsck_objects) { if (pack_lockfiles || fsck_objects) @@ -2046,6 +2041,16 @@ static const struct object_id *iterate_ref_map(void *cb_data) return &ref->old_oid; } +int fetch_pack_fsck_objects(void) +{ + fetch_pack_setup(); + if (fetch_fsck_objects >= 0) + return fetch_fsck_objects; + if (transfer_fsck_objects >= 0) + return transfer_fsck_objects; + return 0; +} + struct ref *fetch_pack(struct fetch_pack_args *args, int fd[], const struct ref *ref, diff --git a/fetch-pack.h b/fetch-pack.h index 6775d265175..b5c579cdae2 100644 --- a/fetch-pack.h +++ b/fetch-pack.h @@ -101,4 +101,9 @@ void negotiate_using_fetch(const struct oid_array *negotiation_tips, */ int report_unmatched_refs(struct ref **sought, int nr_sought); +/* + * Return true if checks for broken objects in received pack are required. + */ +int fetch_pack_fsck_objects(void); + #endif From patchwork Tue Jun 11 06:42:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xing Xin X-Patchwork-Id: 13693171 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.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 4535D171E4B for ; Tue, 11 Jun 2024 06:42:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718088136; cv=none; b=bl5UIC3xvpl3uWjnje5zh5ElmzwFkTmJpxBer4RgklmVVkmSphYjNF8j2XWS+SAx5us9NZlmffAADkoW8qhKZR1Pww4WXL96IZTFkwgZrsbBS8w/I5OWnStXOIdJCnmT5cU1779VmKH1E7imneDcf+bDEdaJLDVhnxjzDrWVoLI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718088136; c=relaxed/simple; bh=uY7Ik3MwExJq3S2q6LxEWcHNMokuiMVt7i44ZgC/mlA=; h=Message-Id:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=Cc3C9oaA/DgGU3q09fR9iUq1vN7wCqrz9FinsYNBzLsnFNby1qr0lq5UPnH0nJJgH6ObH0Y07uib2VktOJcKx/gLgrp4pAm0u0jXZOOu3n/wd8xw92bW2+n1/0TKZd8MQ1X/VZQwlql+kkaCHlXxKTh6XBekcB49D1Gjw3jupaI= 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=UgAqjWJB; arc=none smtp.client-ip=209.85.128.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="UgAqjWJB" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-42172ed3487so28185765e9.0 for ; Mon, 10 Jun 2024 23:42:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718088132; x=1718692932; 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=VC8lDPj8VFxY0Lxpu41yeqXcWQrVOyHCBQZ4hCu15jg=; b=UgAqjWJB0wRAh4JuAgHA1PGp9s7axAb/OmYTxK2rQbkF2NLBQLrsQWTfFR5hOAAPKB Gem2nZtoiJQldmtExbwxgeNroNYjXZSYZI/iHJ1LAPsjCaFMuMM6/Sl1v10WRME1U/kT KQ+KHmZMnu0ehrNac6GRie9cQ1qd/w9uzqF0eo1n1SIyV7llgV2XOPP+HZ9IGIiJUtyn l+cebvJBDvzj7KusWzi+/eX3cGR8GjexRklCn2ZZg1FSyagtwKyUPudVrEviJW7+Om0l Mq00lE9GWVNpeb5MLxeE8cmLib4kQMz64O0FKyxuCeY7o9KVfN9nKsJcJU8AAdzhtVbT 8HNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718088132; x=1718692932; 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=VC8lDPj8VFxY0Lxpu41yeqXcWQrVOyHCBQZ4hCu15jg=; b=D2jLgmXxFTiDVyfXdyHAbSTWBzrwv4JicHvH2Xl9VR/2+hxcHOD37213KZe9g5wj3y /GQWFLZHLWEjzfOasqb/Lz5Kodhx01s20PPxANzETlmm1PRso81MCO+Df7lan3JK22AQ bgL95dhMc0Qk3daPzkThaeIXUAatNSkz8VT7xiLOV6Tp9sXhQ53XgwH5RmgzsIhg7vKs t6wLwbJJRj/nuxJUVRMQR9kWCPhwC/nmbpkK2TSlQS0i9DDnlNtk914z+ly3wziCKxGR ZikzvgPuFobsZQOYSlNK+gF/VBdnHoTrRcbm3mYAgBqZeNtYZzYQeQvTyMZFeWiHlYku ayiw== X-Gm-Message-State: AOJu0Yxh6uT7t5FaGlPnfCh/b1GVFJBPi4V0qMNb4FTWtEJPm8uAEe5R KR+9v6ZfqcOPH0RW2W3mzBzDiTbYsSbBkwfbBkq8rSnPmXaulER/ZrXZGg== X-Google-Smtp-Source: AGHT+IEwUwzmdsjZGyQyJvgjCOIOBL9tNJU327s6ZJ6jqzyRRT73cEjOCXTKbwsysYn1kGVMGzN3vg== X-Received: by 2002:a5d:64c8:0:b0:35f:2092:39fd with SMTP id ffacd0b85a97d-35f20923acdmr5489526f8f.36.1718088131794; Mon, 10 Jun 2024 23:42:11 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-35f2bccc281sm1277472f8f.107.2024.06.10.23.42.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 23:42:11 -0700 (PDT) Message-Id: <0a18d7839be67d6c0be137c7e15dff9663a161a8.1718088127.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 11 Jun 2024 06:42:05 +0000 Subject: [PATCH v5 3/4] unbundle: extend options to support object verification 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 , Karthik Nayak , blanet , Xing Xin From: Xing Xin From: Xing Xin This commit extends object verification support in `bundle.c:unbundle` by adding two new options to `verify_bundle_flags`: - `VERIFY_BUNDLE_FSCK_ALWAYS` explicitly enables checks for broken objects. It will be used to add "--fsck-objects" support for "git bundle unbundle" in a separate series. - `VERIFY_BUNDLE_FSCK_FOLLOW_FETCH` is designed to be used during fetch operations, specifically for direct bundle fetches and _bundle-uri_ enabled fetches. When enabled, `bundle.c:unbundle` invokes `fetch-pack.c:fetch_pack_fsck_objects` to determine whether to enable checks for broken objects. Passing this flag during fetching will be implemented in a subsequent commit. Note that the option `VERIFY_BUNDLE_FSCK_ALWAYS` takes precedence over `VERIFY_BUNDLE_FSCK_FOLLOW_FETCH`. Reviewed-by: Patrick Steinhardt Signed-off-by: Xing Xin --- bundle.c | 10 ++++++++++ bundle.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/bundle.c b/bundle.c index 95367c2d0a0..53ac73834ea 100644 --- a/bundle.c +++ b/bundle.c @@ -17,6 +17,7 @@ #include "list-objects-filter-options.h" #include "connected.h" #include "write-or-die.h" +#include "fetch-pack.h" static const char v2_bundle_signature[] = "# v2 git bundle\n"; static const char v3_bundle_signature[] = "# v3 git bundle\n"; @@ -615,6 +616,7 @@ int unbundle(struct repository *r, struct bundle_header *header, enum verify_bundle_flags flags) { struct child_process ip = CHILD_PROCESS_INIT; + int fsck_objects = 0; if (verify_bundle(r, header, flags)) return -1; @@ -625,6 +627,14 @@ int unbundle(struct repository *r, struct bundle_header *header, if (header->filter.choice) strvec_push(&ip.args, "--promisor=from-bundle"); + if (flags & VERIFY_BUNDLE_FSCK_ALWAYS) + fsck_objects = 1; + else if (flags & VERIFY_BUNDLE_FSCK_FOLLOW_FETCH) + fsck_objects = fetch_pack_fsck_objects(); + + if (fsck_objects) + strvec_push(&ip.args, "--fsck-objects"); + if (extra_index_pack_args) { strvec_pushv(&ip.args, extra_index_pack_args->v); strvec_clear(extra_index_pack_args); diff --git a/bundle.h b/bundle.h index 021adbdcbb3..a39d8ea1a7e 100644 --- a/bundle.h +++ b/bundle.h @@ -33,6 +33,8 @@ int create_bundle(struct repository *r, const char *path, enum verify_bundle_flags { VERIFY_BUNDLE_VERBOSE = (1 << 0), VERIFY_BUNDLE_QUIET = (1 << 1), + VERIFY_BUNDLE_FSCK_ALWAYS = (1 << 2), + VERIFY_BUNDLE_FSCK_FOLLOW_FETCH = (1 << 3), }; int verify_bundle(struct repository *r, struct bundle_header *header, From patchwork Tue Jun 11 06:42:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xing Xin X-Patchwork-Id: 13693172 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 C914D171E58 for ; Tue, 11 Jun 2024 06:42:14 +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=1718088136; cv=none; b=AxEW90ibMsWKLEFY/dVWOzR8NJleMx9jE4u7sRBEaLpUpfRxsx5/NzuOPRRYeKHDRMfgRIMTGF12PjwuGVlOm/zkfT8EWh8M34CKXKDNFDjC4Mtsoe9+dPdsMnCwkemvPEXyPIORgE9i20JdRcr6dUddBY8/tQJX+tWVVH0IOow= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718088136; c=relaxed/simple; bh=F6POH7ho8PGBmVNlJkF7VXrw0V3ik8Zi0l7km5vLw/8=; h=Message-Id:In-Reply-To:References:From:Date:Subject:Content-Type: MIME-Version:To:Cc; b=iRtEz2SjBSseSB4KDEDUJ0pPxMV+ZSzHuzYVpwpaIGMGhZa7XR4NsxJMy4T0qVR1+p48E/3Uq6SSB4tj1ZyJ61ecCOB+zHfbej0u83ImtHS3m/3mi6XwmOlOt4DAbKCjlrszte4uEEhQKT7fydoXU3/5Hsr75pGaJ9nvA7fjmVo= 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=ky+qQYal; 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="ky+qQYal" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4218314a6c7so16593175e9.0 for ; Mon, 10 Jun 2024 23:42:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1718088133; x=1718692933; 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=P2qqmGU50yzWE1RKi003nosD8p/1ffXWT+ICSAiCNJA=; b=ky+qQYalV5vJIJpBvHQcKpPbq3Z0X4LLjsmVIFetvE4QpYE+jF9pJQ9LCaUS92BtTs LUmyXUUOKTiyTUa5h1zcAMUx4VVljMEY7Ia8GPpy7shMfcPtBXZ+EOeTfoUUzW3sGNA0 D73oegu/fSdEG8VmobkNn2SCyVaxGVeEZncRgNvdM44kD+fwOExYiFixf7p9tiedcLrx JdnS4WOO50oOS538XVxfoFLW1F0+FWEjwk/VX+YdxvHeMWspqVdMUELH2Nb2T37/v1xp m9Y4Nf8JMY54cmnVzni92FfaM9ACGr3ld/D1ACF1FCJ3Omqr39B146K4gtounOOrNEw6 gXIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718088133; x=1718692933; 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=P2qqmGU50yzWE1RKi003nosD8p/1ffXWT+ICSAiCNJA=; b=XKByM4oPV6ni/03mVkTNHgxsa4sxk4Xo4Az3B2pJoiaUAP3xumSkaDogCFASd8uIYX cFxzX6b6IAH3R4pIZjr516dE+kwev9Qu7+l1RGrfimxw9Hc2oDldQfQfH4YQUKwvSwvp 0UvYYs3Hg0s7iLOaiNnS6tbPMSkvQ+Ka3q5z1BiSR39tBTU+rNlXTesRSUOBAigs65ey rhBhVZrK/ezoV6GRWVC3m83v3/RcqIfeIqrcha8yMloGsixwGHUqDaCry7ajHd7AIci2 APCkmri2LtKARe3Z21ZGdpv2f7I+RVl7GMzgzcHiREoJhWNIN8YhNv8kYN5KB6jTaJix YU5w== X-Gm-Message-State: AOJu0YwSlYUT0nBB1KhsLndwkFAogk0Sgsx+Q7RG3Q1YuPI2gY5MXjNa v435JQQkb/RN6bfIdPVM54B0DBtkHtcIqGlJU8wXn/IRih2f2iFM2j3DyQ== X-Google-Smtp-Source: AGHT+IFotFoyDP7yvOs+eiaoM3oAA9xo1oRsehKR8E+LjDWIP1rz3shtzLReM6IBKpox5PjBQzyT+g== X-Received: by 2002:a05:600c:1988:b0:421:63f7:7e13 with SMTP id 5b1f17b1804b1-42164a3aff5mr76645745e9.39.1718088132620; Mon, 10 Jun 2024 23:42:12 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-35f215d4602sm5467703f8f.74.2024.06.10.23.42.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Jun 2024 23:42:12 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Tue, 11 Jun 2024 06:42:06 +0000 Subject: [PATCH v5 4/4] unbundle: use VERIFY_BUNDLE_FSCK_FOLLOW_FETCH for fetches 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 , Karthik Nayak , blanet , Xing Xin From: Xing Xin From: Xing Xin This commit passes `VERIFY_BUNDLE_FSCK_FOLLOW_FETCH` to `unbundle` in the fetching process, including: - `transport.c:fetch_refs_from_bundle` for direct bundle fetches. - `bundle-uri.c:unbundle_from_file` for bundle-uri enabled fetches. This addition ensures a consistent logic for object verification during fetch operations. Tests have been added to confirm functionality in the scenarios mentioned above. Reviewed-by: Patrick Steinhardt Signed-off-by: Xing Xin --- bundle-uri.c | 2 +- t/t5558-clone-bundle-uri.sh | 35 ++++++++++++++++++++++++++++++++++- t/t5607-clone-bundle.sh | 33 +++++++++++++++++++++++++++++++++ transport.c | 2 +- 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/bundle-uri.c b/bundle-uri.c index 65666a11d9c..e7ebac6ce57 100644 --- a/bundle-uri.c +++ b/bundle-uri.c @@ -373,7 +373,7 @@ static int unbundle_from_file(struct repository *r, const char *file) * the prerequisite commits. */ if ((result = unbundle(r, &header, bundle_fd, NULL, - VERIFY_BUNDLE_QUIET))) + VERIFY_BUNDLE_QUIET | VERIFY_BUNDLE_FSCK_FOLLOW_FETCH))) return 1; /* diff --git a/t/t5558-clone-bundle-uri.sh b/t/t5558-clone-bundle-uri.sh index 8f4f802e4f1..48be1b18802 100755 --- a/t/t5558-clone-bundle-uri.sh +++ b/t/t5558-clone-bundle-uri.sh @@ -30,7 +30,21 @@ test_expect_success 'create bundle' ' git bundle create B.bundle topic && # Create a bundle with reference pointing to non-existent object. - sed "s/$(git rev-parse A)/$(git rev-parse B)/" bad-header.bundle + sed "s/$(git rev-parse A)/$(git rev-parse B)/" bad-header.bundle && + + cat >data <<-EOF && + tree $(git rev-parse HEAD^{tree}) + parent $(git rev-parse HEAD) + author A U Thor + committer A U Thor + + commit: this is a commit with bad emails + + EOF + git hash-object --literally -t commit -w --stdin commit && + git branch bad $(cat commit) && + git bundle create bad-object.bundle bad && + git update-ref -d refs/heads/bad ) ' @@ -52,6 +66,25 @@ test_expect_success 'clone with bundle that has bad header' ' ! grep "refs/bundles/" refs ' +test_expect_success 'clone with bundle that has bad object' ' + # Unbundle succeeds if no fsckObjects confugured. + git clone --bundle-uri="clone-from/bad-object.bundle" \ + clone-from clone-bad-object-no-fsck && + git -C clone-bad-object-no-fsck for-each-ref --format="%(refname)" >refs && + grep "refs/bundles/" refs >actual && + cat >expect <<-\EOF && + refs/bundles/bad + EOF + test_cmp expect actual && + + # Unbundle fails with fsckObjects set true, but clone can still proceed. + git -c fetch.fsckObjects=true clone --bundle-uri="clone-from/bad-object.bundle" \ + clone-from clone-bad-object-fsck 2>err && + test_grep "missingEmail" err && + git -C clone-bad-object-fsck for-each-ref --format="%(refname)" >refs && + ! grep "refs/bundles/" refs +' + test_expect_success 'clone with path bundle and non-default hash' ' test_when_finished "rm -rf clone-path-non-default-hash" && GIT_DEFAULT_HASH=sha256 git clone --bundle-uri="clone-from/B.bundle" \ diff --git a/t/t5607-clone-bundle.sh b/t/t5607-clone-bundle.sh index 0d1e92d9963..5182efc0b45 100755 --- a/t/t5607-clone-bundle.sh +++ b/t/t5607-clone-bundle.sh @@ -138,6 +138,39 @@ test_expect_success 'fetch SHA-1 from bundle' ' git fetch --no-tags foo/tip.bundle "$(cat hash)" ' +test_expect_success 'clone bundle with different fsckObjects configurations' ' + test_create_repo bundle-fsck && + ( + cd bundle-fsck && + test_commit first && + cat >data <<-EOF && + tree $(git rev-parse HEAD^{tree}) + parent $(git rev-parse HEAD) + author A U Thor + committer A U Thor + + commit: this is a commit with bad emails + + EOF + git hash-object --literally -t commit -w --stdin commit && + git branch bad $(cat commit) && + git bundle create bad.bundle bad + ) && + + git clone bundle-fsck/bad.bundle bundle-no-fsck && + + git -c fetch.fsckObjects=false -c transfer.fsckObjects=true \ + clone bundle-fsck/bad.bundle bundle-fetch-no-fsck && + + test_must_fail git -c fetch.fsckObjects=true \ + clone bundle-fsck/bad.bundle bundle-fetch-fsck 2>err && + test_grep "missingEmail" err && + + test_must_fail git -c transfer.fsckObjects=true \ + clone bundle-fsck/bad.bundle bundle-transfer-fsck 2>err && + test_grep "missingEmail" err +' + test_expect_success 'git bundle uses expected default format' ' git bundle create bundle HEAD^.. && cat >expect <<-EOF && diff --git a/transport.c b/transport.c index 0ad04b77fd2..6cd5683bb45 100644 --- a/transport.c +++ b/transport.c @@ -184,7 +184,7 @@ static int fetch_refs_from_bundle(struct transport *transport, if (!data->get_refs_from_bundle_called) get_refs_from_bundle_inner(transport); ret = unbundle(the_repository, &data->header, data->fd, - &extra_index_pack_args, 0); + &extra_index_pack_args, VERIFY_BUNDLE_FSCK_FOLLOW_FETCH); transport->hash_algo = data->header.hash_algo; return ret; }