@@ -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.
@@ -490,15 +490,31 @@ impl<ObjectID: FsVerityHashValue> Repository<ObjectID> {
490
490
fn gc_category ( & self , category : & str ) -> Result < HashSet < ObjectID > > {
491
491
let mut objects = HashSet :: new ( ) ;
492
492
493
- let category_fd = self . openat ( category, OFlags :: RDONLY | OFlags :: DIRECTORY ) ?;
493
+ let category_fd = match filter_errno (
494
+ self . openat ( category, OFlags :: RDONLY | OFlags :: DIRECTORY ) ,
495
+ Errno :: NOENT ,
496
+ )
497
+ . context ( "Opening {category} dir in repository" ) ?
498
+ {
499
+ Some ( fd) => fd,
500
+ None => {
501
+ return Ok ( objects) ;
502
+ }
503
+ } ;
494
504
495
- let refs = openat (
496
- & category_fd,
497
- "refs" ,
498
- OFlags :: RDONLY | OFlags :: DIRECTORY ,
499
- Mode :: empty ( ) ,
500
- ) ?;
501
- Self :: walk_symlinkdir ( refs, & mut objects) ?;
505
+ if let Some ( refs) = filter_errno (
506
+ openat (
507
+ & category_fd,
508
+ "refs" ,
509
+ OFlags :: RDONLY | OFlags :: DIRECTORY ,
510
+ Mode :: empty ( ) ,
511
+ ) ,
512
+ Errno :: NOENT ,
513
+ )
514
+ . context ( "Opening {category}/refs dir in repository" ) ?
515
+ {
516
+ Self :: walk_symlinkdir ( refs, & mut objects) ?;
517
+ }
502
518
503
519
for item in Dir :: read_from ( & category_fd) ? {
504
520
let entry = item?;
0 commit comments