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

[PATCH 1/2] fsck: HEAD is part of refs

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 30, 2009, 09:12 UTC
Message-ID
<7veiylb1in.fsf_-_@gitster.siamese.dyndns.org>
In-Reply-To
<alpine.LFD.2.00.0901291512260.3054@localhost.localdomain>

By default we looked at all refs but not HEAD. The only thing that made fsck not lose sight of comments that are only reachable from a detached HEAD was the reflog for the HEAD.

This fixes it, with a new test.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 * This is unrelated to Peter's "missing blob", but should be an obviously
   right thing to do. 
 builtin-fsck.c  |   13 ++++++++-----
 t/t1450-fsck.sh |   18 ++++++++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)
 create mode 100755 t/t1450-fsck.sh
diff --git a/builtin-fsck.c b/builtin-fsck.c
index aecc828..2cfff43 100644
--- a/builtin-fsck.c
+++ b/builtin-fsck.c
@@ -23,6 +23,7 @@ static int check_full;
 static int check_strict;
 static int keep_cache_objects;
 static unsigned char head_sha1[20];
+static const char *head_points_at;
 static int errors_found;
 static int write_lost_and_found;
 static int verbose;
@@ -473,6 +474,8 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int f
 
 static void get_default_heads(void)
 {
+	if (head_points_at && !is_null_sha1(head_sha1))
+		fsck_handle_ref("HEAD", head_sha1, 0, NULL);
 	for_each_ref(fsck_handle_ref, NULL);
 	if (include_reflogs)
 		for_each_reflog(fsck_handle_reflog, NULL);
@@ -512,14 +515,13 @@ static void fsck_object_dir(const char *path)
 
 static int fsck_head_link(void)
 {
-	unsigned char sha1[20];
 	int flag;
 	int null_is_error = 0;
-	const char *head_points_at = resolve_ref("HEAD", sha1, 0, &flag);
 
 	if (verbose)
 		fprintf(stderr, "Checking HEAD link\n");
 
+	head_points_at = resolve_ref("HEAD", head_sha1, 0, &flag);
 	if (!head_points_at)
 		return error("Invalid HEAD");
 	if (!strcmp(head_points_at, "HEAD"))
@@ -528,7 +530,7 @@ static int fsck_head_link(void)
 	else if (prefixcmp(head_points_at, "refs/heads/"))
 		return error("HEAD points to something strange (%s)",
 			     head_points_at);
-	if (is_null_sha1(sha1)) {
+	if (is_null_sha1(head_sha1)) {
 		if (null_is_error)
 			return error("HEAD: detached HEAD points at nothing");
 		fprintf(stderr, "notice: HEAD points to an unborn branch (%s)\n",
@@ -624,8 +626,9 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 	heads = 0;
 	for (i = 0; i < argc; i++) {
 		const char *arg = argv[i];
-		if (!get_sha1(arg, head_sha1)) {
-			struct object *obj = lookup_object(head_sha1);
+		unsigned char sha1[20];
+		if (!get_sha1(arg, sha1)) {
+			struct object *obj = lookup_object(sha1);
 
 			/* Error is printed by lookup_object(). */
 			if (!obj)
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
new file mode 100755
index 0000000..5166566
--- /dev/null
+++ b/t/t1450-fsck.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+test_description='git fsck random collection of tests'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+	test_commit A &&
+	git checkout HEAD^0 &&
+	test_commit B &&
+	git reflog expire --expire=now --all
+'
+
+test_expect_success 'HEAD is part of refs' '
+	test 0 = $(git fsck | wc -l)
+'
+
+test_done
-- 
1.6.1.2.312.g5be3c
Previous: Linus TorvaldsNext: Johannes Sixt
Message 19 of 25 in “Something weird is happening...”
  1. H. Peter AnvinJan 29, 2009
  2. Junio C HamanoJan 29, 2009
  3. Sverre RabbelierJan 29, 2009
  4. Junio C HamanoFeb 1, 2009
  5. Ingo MolnarJan 29, 2009
  6. Ingo MolnarJan 29, 2009
  7. Junio C HamanoJan 29, 2009
  8. H. Peter AnvinJan 29, 2009
  9. Ingo MolnarJan 29, 2009
  10. Ingo MolnarJan 29, 2009
  11. H. Peter AnvinJan 29, 2009
  12. Ingo MolnarJan 29, 2009
  13. René ScharfeJan 29, 2009
  14. Daniel BarkalowJan 29, 2009
  15. merge: fix out-of-bounds memory accessRené Scharfe, Jan 31, 2009
  16. H. Peter AnvinJan 29, 2009
  17. Junio C HamanoJan 29, 2009
  18. Linus TorvaldsJan 29, 2009
  19. 1/2 fsck: HEAD is part of refsJunio C Hamano, Jan 30, 2009
  20. Johannes SixtJan 30, 2009
  21. Junio C HamanoFeb 1, 2009
  22. Johannes SchindelinJan 30, 2009
  23. Nanako ShiraishiJan 31, 2009
  24. Junio C HamanoFeb 1, 2009
  25. 2/2 fsck: check loose objects from alternate object stores by defaultJunio C Hamano, Jan 30, 2009

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.