Skip to content

Commit

Permalink
Merge pull request #14 from otiai10/feature/error-reporting
Browse files Browse the repository at this point in the history
Feature/error reporting
  • Loading branch information
otiai10 committed Feb 14, 2020
2 parents c068572 + 9b34c52 commit f71bf16
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions copy.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func copy(src, dest string, info os.FileInfo) error {
// fcopy is for just a file,
// with considering existence of parent directory
// and file permission.
func fcopy(src, dest string, info os.FileInfo) error {
func fcopy(src, dest string, info os.FileInfo) (err error) {

if err := os.MkdirAll(filepath.Dir(dest), os.ModePerm); err != nil {
return err
Expand All @@ -49,7 +49,7 @@ func fcopy(src, dest string, info os.FileInfo) error {
if err != nil {
return err
}
defer f.Close()
defer fclose(f, &err)

if err = os.Chmod(f.Name(), info.Mode()); err != nil {
return err
Expand All @@ -59,7 +59,7 @@ func fcopy(src, dest string, info os.FileInfo) error {
if err != nil {
return err
}
defer s.Close()
defer fclose(s, &err)

_, err = io.Copy(f, s)
return err
Expand All @@ -68,7 +68,7 @@ func fcopy(src, dest string, info os.FileInfo) error {
// dcopy is for a directory,
// with scanning contents inside the directory
// and pass everything to "copy" recursively.
func dcopy(srcdir, destdir string, info os.FileInfo) error {
func dcopy(srcdir, destdir string, info os.FileInfo) (err error) {

originalMode := info.Mode()

Expand All @@ -77,7 +77,7 @@ func dcopy(srcdir, destdir string, info os.FileInfo) error {
return err
}
// Recover dir mode with original one.
defer os.Chmod(destdir, originalMode)
defer chmod(destdir, originalMode, &err)

contents, err := ioutil.ReadDir(srcdir)
if err != nil {
Expand All @@ -104,3 +104,19 @@ func lcopy(src, dest string, info os.FileInfo) error {
}
return os.Symlink(src, dest)
}

// fclose ANYHOW closes file,
// with asiging error occured BUT respecting the error already reported.
func fclose(f *os.File, reported *error) {
if err := f.Close(); *reported == nil {
*reported = err
}
}

// chmod ANYHOW changes file mode,
// with asiging error occured BUT respecting the error already reported.
func chmod(dir string, mode os.FileMode, reported *error) {
if err := os.Chmod(dir, mode); *reported == nil {
*reported = err
}
}

0 comments on commit f71bf16

Please sign in to comment.