Skip to content

Commit

Permalink
Teach prune-packed to use the standard progress meter
Browse files Browse the repository at this point in the history
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.  "Removing 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>
  • Loading branch information
Shawn O. Pearce committed Oct 19, 2007
1 parent 9c60a96 commit b5d72f0
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions builtin-prune-packed.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
#include "builtin.h"
#include "cache.h"
#include "progress.h"

static const char prune_packed_usage[] =
"git-prune-packed [-n] [-q]";

#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;
Expand All @@ -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)
Expand All @@ -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);
Expand All @@ -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)
Expand Down

0 comments on commit b5d72f0

Please sign in to comment.