@@ -25,7 +25,7 @@ use crate::{
2525 } ,
2626 mount:: mount_composefs_at,
2727 splitstream:: { DigestMap , SplitStreamReader , SplitStreamWriter } ,
28- util:: { proc_self_fd, replace_symlinkat, Sha256Digest } ,
28+ util:: { filter_errno , proc_self_fd, replace_symlinkat, Sha256Digest } ,
2929} ;
3030
3131/// Call openat() on the named subdirectory of "dirfd", possibly creating it first.
@@ -490,15 +490,31 @@ impl<ObjectID: FsVerityHashValue> Repository<ObjectID> {
490490 fn gc_category ( & self , category : & str ) -> Result < HashSet < ObjectID > > {
491491 let mut objects = HashSet :: new ( ) ;
492492
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+ } ;
494504
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+ }
502518
503519 for item in Dir :: read_from ( & category_fd) ? {
504520 let entry = item?;
0 commit comments