git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v7 03/10] fsck: support refs pointing to promisor objects

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
Dec 8, 2017, 15:27 UTC
Message-ID
<20171208152716.64232-4-git@jeffhostetler.com>
In-Reply-To
<20171208152716.64232-1-git@jeffhostetler.com>
From: Jonathan Tan <jonathantanmy@google.com>

Teach fsck to not treat refs referring to missing promisor objects as an error when extensions.partialclone is set.

For the purposes of warning about no default refs, such refs are still treated as legitimate refs.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
---
 builtin/fsck.c           |  8 ++++++++
 t/t0410-partial-clone.sh | 24 ++++++++++++++++++++++++
 2 files changed, 32 insertions(+)
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 2934299..ee937bb 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -434,6 +434,14 @@ static int fsck_handle_ref(const char *refname, const struct object_id *oid,
 
 	obj = parse_object(oid);
 	if (!obj) {
+		if (is_promisor_object(oid)) {
+			/*
+			 * Increment default_refs anyway, because this is a
+			 * valid ref.
+			 */
+			 default_refs++;
+			 return 0;
+		}
 		error("%s: invalid sha1 pointer %s", refname, oid_to_hex(oid));
 		errors_found |= ERROR_REACHABLE;
 		/* We'll continue with the rest despite the error.. */
diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh
index 3ddb3b9..bf75162 100755
--- a/t/t0410-partial-clone.sh
+++ b/t/t0410-partial-clone.sh
@@ -13,6 +13,14 @@ pack_as_from_promisor () {
 	>repo/.git/objects/pack/pack-$HASH.promisor
 }
 
+promise_and_delete () {
+	HASH=$(git -C repo rev-parse "$1") &&
+	git -C repo tag -a -m message my_annotated_tag "$HASH" &&
+	git -C repo rev-parse my_annotated_tag | pack_as_from_promisor &&
+	git -C repo tag -d my_annotated_tag &&
+	delete_object repo "$HASH"
+}
+
 test_expect_success 'missing reflog object, but promised by a commit, passes fsck' '
 	test_create_repo repo &&
 	test_commit -C repo my_commit &&
@@ -78,4 +86,20 @@ test_expect_success 'missing reflog object alone fails fsck, even with extension
 	test_must_fail git -C repo fsck
 '
 
+test_expect_success 'missing ref object, but promised, passes fsck' '
+	rm -rf repo &&
+	test_create_repo repo &&
+	test_commit -C repo my_commit &&
+
+	A=$(git -C repo commit-tree -m a HEAD^{tree}) &&
+
+	# Reference $A only from ref
+	git -C repo branch my_branch "$A" &&
+	promise_and_delete "$A" &&
+
+	git -C repo config core.repositoryformatversion 1 &&
+	git -C repo config extensions.partialclone "arbitrary string" &&
+	git -C repo fsck
+'
+
 test_done
-- 
2.9.3
Previous: Jeff HostetlerNext: Jeff Hostetler
Message 2 of 11 in “Partial clone part 2: fsck and promisors”
  1. 00/10 Partial clone part 2: fsck and promisorsJeff Hostetler, Dec 8, 2017
  2. 03/10 fsck: support refs pointing to promisor objectsJeff Hostetler, Dec 8, 2017
  3. 01/10 extension.partialclone: introduce partial clone extensionJeff Hostetler, Dec 8, 2017
  4. 06/10 index-pack: refactor writing of .keep filesJeff Hostetler, Dec 8, 2017
  5. 09/10 rev-list: support termination at promisor objectsJeff Hostetler, Dec 8, 2017
  6. 07/10 introduce fetch-object: fetch one promisor objectJeff Hostetler, Dec 8, 2017
  7. 08/10 sha1_file: support lazily fetching missing objectsJeff Hostetler, Dec 8, 2017
  8. 02/10 fsck: introduce partialclone extensionJeff Hostetler, Dec 8, 2017
  9. 04/10 fsck: support referenced promisor objectsJeff Hostetler, Dec 8, 2017
  10. 10/10 gc: do not repack promisor packfilesJeff Hostetler, Dec 8, 2017
  11. 05/10 fsck: support promisor objects as CLI argumentJeff Hostetler, Dec 8, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.