11package main
22
33import (
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
97105func 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