(src, dst string, preserve []string, info os.FileInfo, nums chan<- int64, errs chan<- error)
| 55 | } |
| 56 | |
| 57 | func copyFile(src, dst string, preserve []string, info os.FileInfo, nums chan<- int64, errs chan<- error) { |
| 58 | r, err := os.Open(src) |
| 59 | if err != nil { |
| 60 | errs <- err |
| 61 | return |
| 62 | } |
| 63 | defer r.Close() |
| 64 | |
| 65 | var dstMode os.FileMode = 0o666 |
| 66 | if slices.Contains(preserve, "mode") { |
| 67 | dstMode = info.Mode() |
| 68 | } |
| 69 | w, err := os.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, dstMode) |
| 70 | if err != nil { |
| 71 | errs <- err |
| 72 | return |
| 73 | } |
| 74 | |
| 75 | if _, err := io.Copy(NewProgressWriter(w, nums), r); err != nil { |
| 76 | errs <- err |
| 77 | w.Close() |
| 78 | if err = os.Remove(dst); err != nil { |
| 79 | errs <- err |
| 80 | } |
| 81 | return |
| 82 | } |
| 83 | |
| 84 | if err := w.Close(); err != nil { |
| 85 | errs <- err |
| 86 | if err = os.Remove(dst); err != nil { |
| 87 | errs <- err |
| 88 | } |
| 89 | return |
| 90 | } |
| 91 | |
| 92 | if slices.Contains(preserve, "timestamps") { |
| 93 | atime := times.Get(info).AccessTime() |
| 94 | mtime := info.ModTime() |
| 95 | if err := os.Chtimes(dst, atime, mtime); err != nil { |
| 96 | errs <- err |
| 97 | } |
| 98 | } |
| 99 | } |
| 100 | |
| 101 | func copyAll(srcs []string, dstDir string, preserve []string) (nums chan int64, errs chan error) { |
| 102 | nums = make(chan int64, 1024) |
no test coverage detected