From: Jeff King <peff@peff.net>
To: "Toralf Förster" <toralf.foerster@gmx.de>
Cc: git@vger.kernel.org
Subject: Re: Feature request : "git fsck" should show the percentage of completeness in step "Checking connectivity:"
Date: Mon, 2 Jul 2018 17:41:03 -0400 [thread overview]
Message-ID: <20180702214103.GA26121@sigill.intra.peff.net> (raw)
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;
}
prev parent reply other threads:[~2018-07-02 21:41 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-01 16:21 Feature request : "git fsck" should show the percentage of completeness in step "Checking connectivity:" Toralf Förster
2018-07-02 19:59 ` Stefan Beller
2018-07-02 21:41 ` Jeff King [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180702214103.GA26121@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=toralf.foerster@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).