@@ -25,7 +25,7 @@ use crate::{
25
25
} ,
26
26
mount:: mount_composefs_at,
27
27
splitstream:: { DigestMap , SplitStreamReader , SplitStreamWriter } ,
28
- util:: { proc_self_fd, replace_symlinkat, Sha256Digest } ,
28
+ util:: { filter_errno , proc_self_fd, replace_symlinkat, Sha256Digest } ,
29
29
} ;
30
30
31
31
/// Call openat() on the named subdirectory of "dirfd", possibly creating it first.
@@ -491,15 +491,31 @@ impl<ObjectID: FsVerityHashValue> Repository<ObjectID> {
491
491
fn gc_category ( & self , category : & str ) -> Result < HashSet < ObjectID > > {
492
492
let mut objects = HashSet :: new ( ) ;
493
493
494
- let category_fd = self . openat ( category, OFlags :: RDONLY | OFlags :: DIRECTORY ) ?;
494
+ let category_fd = match filter_errno (
495
+ self . openat ( category, OFlags :: RDONLY | OFlags :: DIRECTORY ) ,
496
+ Errno :: NOENT ,
497
+ )
498
+ . context ( "Opening {category} dir in repository" ) ?
499
+ {
500
+ Some ( fd) => fd,
501
+ None => {
502
+ return Ok ( objects) ;
503
+ }
504
+ } ;
495
505
496
- let refs = openat (
497
- & category_fd,
498
- "refs" ,
499
- OFlags :: RDONLY | OFlags :: DIRECTORY ,
500
- Mode :: empty ( ) ,
501
- ) ?;
502
- Self :: walk_symlinkdir ( refs, & mut objects) ?;
506
+ if let Some ( refs) = filter_errno (
507
+ openat (
508
+ & category_fd,
509
+ "refs" ,
510
+ OFlags :: RDONLY | OFlags :: DIRECTORY ,
511
+ Mode :: empty ( ) ,
512
+ ) ,
513
+ Errno :: NOENT ,
514
+ )
515
+ . context ( "Opening {category}/refs dir in repository" ) ?
516
+ {
517
+ Self :: walk_symlinkdir ( refs, & mut objects) ?;
518
+ }
503
519
504
520
for item in Dir :: read_from ( & category_fd) ? {
505
521
let entry = item?;
0 commit comments