Skip to content

Commit fbd57cc

Browse files
committed
copyFile: return errors via channel
1 parent cff0f76 commit fbd57cc

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

copy.go

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"errors"
54
"fmt"
65
"io"
76
"os"
@@ -55,10 +54,11 @@ func copySize(srcs []string) (int64, error) {
5554
return total, nil
5655
}
5756

58-
func copyFile(src, dst string, preserve []string, info os.FileInfo, nums chan int64) error {
57+
func copyFile(src, dst string, preserve []string, info os.FileInfo, nums chan<- int64, errs chan<- error) {
5958
r, err := os.Open(src)
6059
if err != nil {
61-
return err
60+
errs <- err
61+
return
6262
}
6363
defer r.Close()
6464

@@ -68,30 +68,38 @@ func copyFile(src, dst string, preserve []string, info os.FileInfo, nums chan in
6868
}
6969
w, err := os.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, dstMode)
7070
if err != nil {
71-
return err
71+
errs <- err
72+
return
7273
}
7374

7475
if _, err := io.Copy(NewProgressWriter(w, nums), r); err != nil {
75-
err2 := w.Close()
76-
err3 := os.Remove(dst)
77-
return errors.Join(err, err2, err3)
76+
errs <- err
77+
w.Close()
78+
if err = os.Remove(dst); err != nil {
79+
errs <- err
80+
}
81+
return
7882
}
7983

8084
if err := w.Close(); err != nil {
81-
err2 := os.Remove(dst)
82-
return errors.Join(err, err2)
85+
errs <- err
86+
if err = os.Remove(dst); err != nil {
87+
errs <- err
88+
}
89+
return
8390
}
8491

8592
if slices.Contains(preserve, "timestamps") {
8693
atime := times.Get(info).AccessTime()
8794
mtime := info.ModTime()
8895
if err := os.Chtimes(dst, atime, mtime); err != nil {
89-
err2 := os.Remove(dst)
90-
return errors.Join(err, err2)
96+
errs <- err
97+
if err = os.Remove(dst); err != nil {
98+
errs <- err
99+
}
100+
return
91101
}
92102
}
93-
94-
return nil
95103
}
96104

97105
func copyAll(srcs []string, dstDir string, preserve []string) (nums chan int64, errs chan error) {
@@ -154,9 +162,7 @@ func copyAll(srcs []string, dstDir string, preserve []string) (nums chan int64,
154162
}
155163
nums <- info.Size()
156164
default:
157-
if err := copyFile(path, newPath, preserve, info, nums); err != nil {
158-
errs <- fmt.Errorf("copy: %w", err)
159-
}
165+
copyFile(path, newPath, preserve, info, nums, errs)
160166
}
161167
return nil
162168
})

0 commit comments

Comments
 (0)