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

[PATCH] fsck --lost-found: show found commits human readably

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 26, 2008, 06:45 UTC
Message-ID
<7vbq52gezo.fsf@gitster.siamese.dyndns.org>

An earlier commit fc8b5f0 (Deprecate git-lost-found, 2007-11-08) declared "lost-found" deprecated, because "fsck" learned "--lost-found" option that drops the found objects in $GIT_DIR/lost-found.

But the output from the lost-found program has been much more informative than the plain vanilla "git fsck" (or "git fsck --lost-found") output. In that sense, forcing users to use "fsck --lost-found" when they want to use "lost-found" is a regression.

This patch slightly enhances the output from "fsck --lost-found" to add oneline description at the end of the usual "dangling <type> <sha-1>" message for commit objects it found.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 * Is it just me, or were we very sloppy during 1.5.4 cycle that we are
   getting hit by regressions left and right today from that period?
   This looks bigger than it really is because most of it is about
   moving a deeply nested part of another function into a separate
   function.
   This is _not_ a 1.5.5 material, as we are not removing git-lost-found
   yet.  We might however want to revert fc8b5f0, though, until an
   enhancement along this line is in the mainline.
 builtin-fsck.c |   94 ++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 64 insertions(+), 30 deletions(-)
diff --git a/builtin-fsck.c b/builtin-fsck.c
index 78a6e1f..b57cc78 100644
--- a/builtin-fsck.c
+++ b/builtin-fsck.c
@@ -145,6 +145,68 @@ static void check_reachable_object(struct object *obj)
 	}
 }
 
+static void dangling_object(struct object *obj)
+{
+	char *filename;
+	FILE *f;
+	enum object_type type;
+	unsigned long size;
+	char *buf = NULL;
+
+	if (!write_lost_and_found)
+		goto report_and_exit;
+
+	filename = git_path("lost-found/%s/%s",
+			    obj->type == OBJ_COMMIT ? "commit" : "other",
+			    sha1_to_hex(obj->sha1));
+
+	if (safe_create_leading_directories(filename)) {
+		error("Could not create lost-found");
+		return;
+	}
+	if (!(f = fopen(filename, "w")))
+		die("Could not open %s", filename);
+	if (obj->type == OBJ_BLOB || obj->type == OBJ_COMMIT)
+		buf = read_sha1_file(obj->sha1, &type, &size);
+
+	if (obj->type == OBJ_BLOB) {
+		if (buf) {
+			fwrite(buf, size, 1, f);
+			free(buf);
+		}
+	} else
+		fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
+	fclose(f);
+
+	if (obj->type == OBJ_COMMIT) {
+		struct strbuf sb = STRBUF_INIT;
+		struct commit *commit = lookup_commit(obj->sha1);
+		int reported = 0;
+
+		if (!commit->buffer)
+			commit->buffer = buf;
+		if (commit->buffer) {
+			parse_commit(commit);
+			pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb,
+					    0, NULL, NULL, 0, 0);
+			printf("dangling commit %s (%s)\n",
+			       sha1_to_hex(obj->sha1), sb.buf);
+			reported = 1;
+		}
+		strbuf_release(&sb);
+		free(commit->buffer);
+		if (buf && commit->buffer != buf)
+			free(buf);
+		commit->buffer = NULL;
+		if (reported)
+			return;
+	}
+
+ report_and_exit:
+	printf("dangling %s %s\n", typename(obj->type),
+	       sha1_to_hex(obj->sha1));
+}
+
 /*
  * Check a single unreachable object
  */
@@ -180,36 +242,8 @@ static void check_unreachable_object(struct object *obj)
 	 * deleted a branch by mistake, this is a prime candidate to
 	 * start looking at, for example.
 	 */
-	if (!obj->used) {
-		printf("dangling %s %s\n", typename(obj->type),
-		       sha1_to_hex(obj->sha1));
-		if (write_lost_and_found) {
-			char *filename = git_path("lost-found/%s/%s",
-				obj->type == OBJ_COMMIT ? "commit" : "other",
-				sha1_to_hex(obj->sha1));
-			FILE *f;
-
-			if (safe_create_leading_directories(filename)) {
-				error("Could not create lost-found");
-				return;
-			}
-			if (!(f = fopen(filename, "w")))
-				die("Could not open %s", filename);
-			if (obj->type == OBJ_BLOB) {
-				enum object_type type;
-				unsigned long size;
-				char *buf = read_sha1_file(obj->sha1,
-						&type, &size);
-				if (buf) {
-					fwrite(buf, size, 1, f);
-					free(buf);
-				}
-			} else
-				fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
-			fclose(f);
-		}
-		return;
-	}
+	if (!obj->used)
+		dangling_object(obj);
 
 	/*
 	 * Otherwise? It's there, it's unreachable, and some other unreachable
Next: Johannes Schindelin
Message 1 of 4 in “fsck --lost-found: show found commits human readably”
  1. fsck --lost-found: show found commits human readablyJunio C Hamano, Mar 26, 2008
  2. Johannes SchindelinMar 28, 2008
  3. 1/2 fsck --lost-found: refactor handling of dangling objectsJohannes Schindelin, Mar 28, 2008
  4. 2/2 fsck --lost-found: show found commits human readablyJohannes Schindelin, Mar 28, 2008

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.