prune-packed: use for_each_loose_file_in_objdir
This saves us from manually traversing the directory structure ourselves. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Oct 15, 2014 at 18:40 UTC
0d3b729680e9cab0f567122e796dab2bc9bc8cfb
1 file changed
+23
-46
builtin/prune-packed.c
+23
-46
@@ -10,65 +10,42 @@ static const char * const prune_packed_usage[] = {
10
11
static struct progress *progress;
12
13
-static void prune_dir(int i, DIR *dir, struct strbuf *pathname, int opts)
13
+static int prune_subdir(int nr, const char *path, void *data)
14
{
15
- struct dirent *de;
16
- char hex[40];
17
- int top_len = pathname->len;
15
+ int *opts = data;
16
+ display_progress(progress, nr + 1);
17
+ if (!(*opts & PRUNE_PACKED_DRY_RUN))
18
+ rmdir(path);
19
+ return 0;
20
+}
21
+
22
+static int prune_object(const unsigned char *sha1, const char *path,
23
+ void *data)
24
+{
25
+ int *opts = data;
26
19
- sprintf(hex, "%02x", i);
20
- while ((de = readdir(dir)) != NULL) {
21
- unsigned char sha1[20];
22
- if (strlen(de->d_name) != 38)
23
- continue;
24
- memcpy(hex + 2, de->d_name, 38);
25
- if (get_sha1_hex(hex, sha1))
26
- continue;
27
- if (!has_sha1_pack(sha1))
28
- continue;
27
+ if (!has_sha1_pack(sha1))
28
+ return 0;
29
30
- strbuf_add(pathname, de->d_name, 38);
31
- if (opts & PRUNE_PACKED_DRY_RUN)
32
- printf("rm -f %s\n", pathname->buf);
33
- else
34
- unlink_or_warn(pathname->buf);
35
- display_progress(progress, i + 1);
36
- strbuf_setlen(pathname, top_len);
37
- }
30
+ if (*opts & PRUNE_PACKED_DRY_RUN)
31
+ printf("rm -f %s\n", path);
32
+ else
33
+ unlink_or_warn(path);
34
+ return 0;
35
}
36
37
void prune_packed_objects(int opts)
38
{
42
- int i;
43
- const char *dir = get_object_directory();
44
- struct strbuf pathname = STRBUF_INIT;
45
- int top_len;
46
-
47
- strbuf_addstr(&pathname, dir);
39
if (opts & PRUNE_PACKED_VERBOSE)
40
progress = start_progress_delay(_("Removing duplicate objects"),
41
256, 95, 2);
42
52
- if (pathname.len && pathname.buf[pathname.len - 1] != '/')
53
- strbuf_addch(&pathname, '/');
54
-
55
- top_len = pathname.len;
56
- for (i = 0; i < 256; i++) {
57
- DIR *d;
43
+ for_each_loose_file_in_objdir(get_object_directory(),
44
+ prune_object, NULL, prune_subdir, &opts);
45
59
- display_progress(progress, i + 1);
60
- strbuf_setlen(&pathname, top_len);
61
- strbuf_addf(&pathname, "%02x/", i);
62
- d = opendir(pathname.buf);
63
- if (!d)
64
- continue;
65
- prune_dir(i, d, &pathname, opts);
66
- closedir(d);
67
- strbuf_setlen(&pathname, top_len + 2);
68
- rmdir(pathname.buf);
69
- }
46
+ /* Ensure we show 100% before finishing progress */
47
+ display_progress(progress, 256);
48
stop_progress(&progress);
71
- strbuf_release(&pathname);
49
}
50
51
int cmd_prune_packed(int argc, const char **argv, const char *prefix)