@@ -365,6 +365,7 @@ def _open_local_dir_file_for_copy(
365365 ) -> int :
366366 if not _OPEN_SUPPORTS_DIR_FD or not _HAS_O_DIRECTORY :
367367 return self ._open_local_dir_file_for_copy_fallback (
368+ base_dir = base_dir ,
368369 src_root = src_root ,
369370 rel_child = rel_child ,
370371 )
@@ -539,7 +540,9 @@ def _local_dir_open_error(
539540 )
540541 return LocalDirReadError (src = src_root , cause = error )
541542
542- def _open_local_dir_file_for_copy_fallback (self , * , src_root : Path , rel_child : Path ) -> int :
543+ def _open_local_dir_file_for_copy_fallback (
544+ self , * , base_dir : Path , src_root : Path , rel_child : Path
545+ ) -> int :
543546 src = src_root / rel_child
544547 try :
545548 src_stat = src .lstat ()
@@ -564,20 +567,32 @@ def _open_local_dir_file_for_copy_fallback(self, *, src_root: Path, rel_child: P
564567 file_flags = os .O_RDONLY | getattr (os , "O_BINARY" , 0 ) | getattr (os , "O_NOFOLLOW" , 0 )
565568 try :
566569 leaf_fd = os .open (src , file_flags )
567- leaf_stat = os .fstat (leaf_fd )
568- if not stat .S_ISREG (leaf_stat .st_mode ) or not os .path .samestat (src_stat , leaf_stat ):
570+ try :
571+ self ._resolve_local_dir_src_root (base_dir )
572+ leaf_stat = os .fstat (leaf_fd )
573+ if not stat .S_ISREG (leaf_stat .st_mode ) or not os .path .samestat (src_stat , leaf_stat ):
574+ raise LocalDirReadError (
575+ src = src_root ,
576+ context = {
577+ "reason" : "path_changed_during_copy" ,
578+ "child" : rel_child .as_posix (),
579+ },
580+ )
581+ return leaf_fd
582+ except Exception :
569583 os .close (leaf_fd )
570- raise LocalDirReadError (
571- src = src_root ,
572- context = {"reason" : "path_changed_during_copy" , "child" : rel_child .as_posix ()},
573- )
574- return leaf_fd
584+ raise
575585 except FileNotFoundError :
586+ self ._resolve_local_dir_src_root (base_dir )
576587 raise LocalDirReadError (
577588 src = src_root ,
578589 context = {"reason" : "path_changed_during_copy" , "child" : rel_child .as_posix ()},
579590 ) from None
580591 except OSError as e :
592+ try :
593+ self ._resolve_local_dir_src_root (base_dir )
594+ except LocalDirReadError as root_error :
595+ raise root_error from e
581596 if e .errno == errno .ELOOP :
582597 raise LocalDirReadError (
583598 src = src_root ,
0 commit comments