Rather than reimplementing the progress meter logic and always
showing 100 lines of output while pruning already packed objects
we now use a delayed progress meter and only show it if there are
enough objects to make us take a little while.
Most users won't see the message anymore as it usually doesn't take
very long to delete the already packed loose objects. This neatens
the output of a git-gc or git-repack execution, which is especially
important for a `git gc --auto` triggered from within another
command.
We perform the display_progress() call from within the very innermost
loop in case we spend more than 1 second within any single object
directory. This ensures that a progress_update event from the
timer will still trigger in a timely fashion and allow the user to
see the progress meter.
While I'm in here I changed the message to be more descriptive of
its actual task. "Deleting unused objects" is a little scary for
new users as they wonder where these unused objects came from and
how they should avoid them. Truth is these objects aren't unused
in the sense of what git-prune would call a dangling object, these
are used but are just duplicates of things we have already stored
in a packfile.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
On top of np/progress topic. I kicked around a few different
changes for the progress title but finally settled on this one.
Improvement suggestions welcome.
builtin-prune-packed.c | 15 +++++++++++----
1 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/builtin-prune-packed.c b/builtin-prune-packed.c
index 9777300..015c8bb 100644
--- a/builtin-prune-packed.c
+++ b/builtin-prune-packed.c
@@ -1,5 +1,6 @@
#include "builtin.h"
#include "cache.h"
+#include "progress.h"
static const char prune_packed_usage[] =
"git-prune-packed [-n] [-q]";
@@ -7,6 +8,8 @@ static const char prune_packed_usage[] =
#define DRY_RUN 01
#define VERBOSE 02
+static struct progress progress;
+
static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
{
struct dirent *de;
@@ -23,6 +26,8 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
if (!has_sha1_pack(sha1, NULL))
continue;
memcpy(pathname + len, de->d_name, 38);
+ if (opts == VERBOSE)
+ display_progress(&progress, i + 1);
if (opts & DRY_RUN)
printf("rm -f %s\n", pathname);
else if (unlink(pathname) < 0)
@@ -39,6 +44,11 @@ void prune_packed_objects(int opts)
const char *dir = get_object_directory();
int len = strlen(dir);
+ if (opts == VERBOSE)
+ start_progress_delay(&progress,
+ "Removing duplicate objects",
+ 256, 95, 2);
+
if (len > PATH_MAX - 42)
die("impossible object directory");
memcpy(pathname, dir, len);
@@ -49,16 +59,13 @@ void prune_packed_objects(int opts)
sprintf(pathname + len, "%02x/", i);
d = opendir(pathname);
- if (opts == VERBOSE && (d || i == 255))
- fprintf(stderr, "Removing unused objects %d%%...\015",
- ((i+1) * 100) / 256);
if (!d)
continue;
prune_dir(i, d, pathname, len + 3, opts);
closedir(d);
}
if (opts == VERBOSE)
- fprintf(stderr, "\nDone.\n");
+ stop_progress(&progress);
}
int cmd_prune_packed(int argc, const char **argv, const char *prefix)
--
1.5.3.4.1249.g895be
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
| Jesper Krogh | Re: Linux 2.6.26-rc4 |
| Borislav Petkov | 2.6.23-rc1: no setup signature found... |
| Dmitry Torokhov | 2.6.27-rc8+ - first impressions |
| Andi Kleen | Re: 2.6.27-rc1: critical thermal shutdown on thinkpad x60 |
git: | |
| Ken Pratt | pack operation is thrashing my server |
| Martin Langhoff | parsecvs repository moved... |
| Johan Herland | [PATCH 3/6] git-fsck: Do thorough verification of tag objects. |
| Nigel Magnay | crlf with git-svn driving me nuts... |
| Joaquin Herrero | ssh hangs from Ubunty Feisty 7.04 to OpenBSD |
| Marco Peereboom | Re: Real men don't attack straw men |
| Pieter Verberne | Remove escape characters from file |
| L. V. Lammert | Re: About Xen: maybe a reiterative question but .. |
| Krzysztof Oledzki | Error: an inet prefix is expected rather than "0/0". |
| Evgeniy Polyakov | [resend take 2 4/4] DST Makefile/Kconfig files. |
| Denys Fedoryshchenko | thousands of classes, e1000 TX unit hang |
| Bruce Allen | e1000 full-duplex TCP performance well below wire speed |
| USB statistics | 11 minutes ago | Linux kernel |
| Block Sub System query | 4 hours ago | Linux kernel |
| kernel module to intercept socket creation | 5 hours ago | Linux kernel |
| Image size changing during each build | 5 hours ago | Linux kernel |
| Soft lock bug | 10 hours ago | Linux kernel |
| sysctl - dynamic registration problem | 16 hours ago | Linux kernel |
| Question on swap as ramdisk partition | 19 hours ago | Linux kernel |
| serial driver xmit problem | 23 hours ago | Linux kernel |
| Generic Netlink subsytem | 1 day ago | Linux kernel |
| 'Report spam filter error' page broken | 1 day ago | KernelTrap Suggestions and Feedback |
