@@ -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.
@@ -491,15 +491,31 @@ impl<ObjectID: FsVerityHashValue> Repository<ObjectID> {
491491 fn gc_category ( & self , category : & str ) -> Result < HashSet < ObjectID > > {
492492 let mut objects = HashSet :: new ( ) ;
493493
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+ } ;
495505
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+ }
503519
504520 for item in Dir :: read_from ( & category_fd) ? {
505521 let entry = item?;
0 commit comments