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

Re: Feature request : "git fsck" should show the percentage of completeness in step "Checking connectivity:"

From
Jeff King <peff@peff.net>
Date
Jul 2, 2018, 21:41 UTC
Message-ID
<20180702214103.GA26121@sigill.intra.peff.net>
In-Reply-To
<3d6b38a8-7dbe-0633-5c54-603161ee3fd4@gmx.de>
On Sun, Jul 01, 2018 at 06:21:40PM +0200, Toralf Förster wrote:
> as "git fsck" does it already for "Checking objects:"
> 
> Is this a valid feature request?

It's actually hard to do accurately. We don't know how many objects are reachable until we traverse the graph...which is exactly what the "checking connectivity" operation is doing.

The operation is bounded by the total number of objects in the repository. We may have duplicates (in multiple packs, or loose/packed), and objects which aren't reachable at all. But we could make that a guess, and just "jump" to 100% at the end.

The code might look something like the patch below. I'm not sure if it's a good idea or not (I mostly copied the counting from builtin/count-objects.c; it might be nice to factor that out).

-Peff
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 3ad4f160f9..52e79aed76 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -192,17 +192,49 @@ static int traverse_one_object(struct object *obj)
 	return result;
 }
 
+static int count_loose(const struct object_id *oid, const char *path,
+		       void *data)
+{
+	unsigned int *nr = data;
+	nr++;
+	return 0;
+}
+
+static unsigned object_max(void)
+{
+	unsigned max = 0;
+	struct packed_git *p;
+
+	for_each_loose_object(count_loose, &max, 0);
+
+	for (p = get_packed_git(the_repository); p; p = p->next) {
+		if (open_pack_index(p))
+			continue;
+		max += p->num_objects;
+	}
+
+	return max;
+}
+
 static int traverse_reachable(void)
 {
 	struct progress *progress = NULL;
 	unsigned int nr = 0;
 	int result = 0;
-	if (show_progress)
-		progress = start_delayed_progress(_("Checking connectivity"), 0);
+	unsigned int max = 0;
+
+	if (show_progress) {
+		max = object_max();
+		progress = start_delayed_progress(_("Checking connectivity"),
+						  max);
+	}
+
 	while (pending.nr) {
 		result |= traverse_one_object(object_array_pop(&pending));
 		display_progress(progress, ++nr);
 	}
+
+	display_progress(progress, max);
 	stop_progress(&progress);
 	return !!result;
 }
Previous: Stefan Beller
Message 3 of 3 in “Feature request : "git fsck" should show the percentage of completeness in step "Checking connectivity:"”
  1. Toralf FörsterJul 1, 2018
  2. Stefan BellerJul 2, 2018
  3. Jeff KingJul 2, 2018

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.