@@ -10,65 +10,42 @@ static const char * const prune_packed_usage[] = {
10
10
11
11
static struct progress * progress ;
12
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
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 ;
18
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
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 ;
38
35
}
39
36
40
37
void prune_packed_objects (int opts )
41
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 );
48
39
if (opts & PRUNE_PACKED_VERBOSE )
49
40
progress = start_progress_delay (_ ("Removing duplicate objects" ),
50
41
256 , 95 , 2 );
51
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 );
58
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 );
70
48
stop_progress (& progress );
71
- strbuf_release (& pathname );
72
49
}
73
50
74
51
int cmd_prune_packed (int argc , const char * * argv , const char * prefix )
0 commit comments