From b23de9d9cb66793a853b8305edfe0dbabe0b24f0 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 5 Apr 2023 11:47:41 +0200 Subject: [PATCH] Gracefully handle files/symlinks/dirs deleted while copy Ignore not-exist errors while doing the actualy copy because files/symlinks/dirs may be deleted while reading the source directory. fixes https://github.com/otiai10/copy/issues/72 --- copy.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/copy.go b/copy.go index 60643dd..d0450e7 100644 --- a/copy.go +++ b/copy.go @@ -65,6 +65,14 @@ func copyNextOrSkip(src, dest string, info os.FileInfo, opt Options) error { // with considering existence of parent directory // and file permission. func fcopy(src, dest string, info os.FileInfo, opt Options) (err error) { + s, err := os.Open(src) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return + } + defer fclose(s, &err) if err = os.MkdirAll(filepath.Dir(dest), os.ModePerm); err != nil { return @@ -82,12 +90,6 @@ func fcopy(src, dest string, info os.FileInfo, opt Options) (err error) { } chmodfunc(&err) - s, err := os.Open(src) - if err != nil { - return - } - defer fclose(s, &err) - var buf []byte = nil var w io.Writer = f var r io.Reader = s @@ -146,6 +148,9 @@ func dcopy(srcdir, destdir string, info os.FileInfo, opt Options) (err error) { contents, err := ioutil.ReadDir(srcdir) if err != nil { + if os.IsNotExist(err) { + return nil + } return } @@ -222,6 +227,9 @@ func onsymlink(src, dest string, opt Options) error { func lcopy(src, dest string) error { src, err := os.Readlink(src) if err != nil { + if os.IsNotExist(err) { + return nil + } return err } return os.Symlink(src, dest)