The cp command must call Close() on files, and does not pass on Mac

Path operations needed to be with filepath, not path (for cross
platform compat), and TMPDIR is not guaranteed to have a trailing slash.
This commit is contained in:
Clayton Coleman 2017-11-03 22:19:10 -04:00
parent d837a6a2ea
commit d3790db03a
No known key found for this signature in database
GPG Key ID: 3D16906B4F1C5CB3
2 changed files with 38 additions and 32 deletions

View File

@ -301,10 +301,12 @@ func recursiveTar(srcBase, srcFile, destBase, destFile string, tw *tar.Writer) e
if err != nil { if err != nil {
return err return err
} }
defer f.Close() defer f.Close()
_, err = io.Copy(tw, f)
return err if _, err := io.Copy(tw, f); err != nil {
return err
}
return f.Close()
} }
return nil return nil
} }
@ -330,7 +332,6 @@ func untarAll(reader io.Reader, destFile, prefix string) error {
return err return err
} }
if header.FileInfo().IsDir() { if header.FileInfo().IsDir() {
if err := os.MkdirAll(outFileName, 0755); err != nil { if err := os.MkdirAll(outFileName, 0755); err != nil {
return err return err
} }
@ -359,7 +360,12 @@ func untarAll(reader io.Reader, destFile, prefix string) error {
return err return err
} }
defer outFile.Close() defer outFile.Close()
io.Copy(outFile, tarReader) if _, err := io.Copy(outFile, tarReader); err != nil {
return err
}
if err := outFile.Close(); err != nil {
return err
}
} }
} }

View File

@ -109,8 +109,8 @@ func TestGetPrefix(t *testing.T) {
} }
func TestTarUntar(t *testing.T) { func TestTarUntar(t *testing.T) {
dir, err := ioutil.TempDir(os.TempDir(), "input") dir, err := ioutil.TempDir("", "input")
dir2, err2 := ioutil.TempDir(os.TempDir(), "output") dir2, err2 := ioutil.TempDir("", "output")
if err != nil || err2 != nil { if err != nil || err2 != nil {
t.Errorf("unexpected error: %v | %v", err, err2) t.Errorf("unexpected error: %v | %v", err, err2)
t.FailNow() t.FailNow()
@ -160,74 +160,74 @@ func TestTarUntar(t *testing.T) {
for _, file := range files { for _, file := range files {
filepath := path.Join(dir, file.name) filepath := path.Join(dir, file.name)
if err := os.MkdirAll(path.Dir(filepath), 0755); err != nil { if err := os.MkdirAll(path.Dir(filepath), 0755); err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
t.FailNow()
} }
if file.fileType == RegularFile { if file.fileType == RegularFile {
f, err := os.Create(filepath) f, err := os.Create(filepath)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
t.FailNow()
} }
defer f.Close() defer f.Close()
if _, err := io.Copy(f, bytes.NewBuffer([]byte(file.data))); err != nil { if _, err := io.Copy(f, bytes.NewBuffer([]byte(file.data))); err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
t.FailNow() }
if err := f.Close(); err != nil {
t.Fatal(err)
} }
} else if file.fileType == SymLink { } else if file.fileType == SymLink {
err := os.Symlink(file.data, filepath) err := os.Symlink(file.data, filepath)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
t.FailNow()
} }
} else { } else {
t.Errorf("unexpected file type: %v", file) t.Fatalf("unexpected file type: %v", file)
t.FailNow()
} }
} }
writer := &bytes.Buffer{} writer := &bytes.Buffer{}
if err := makeTar(dir, dir, writer); err != nil { if err := makeTar(dir, dir, writer); err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
reader := bytes.NewBuffer(writer.Bytes()) reader := bytes.NewBuffer(writer.Bytes())
if err := untarAll(reader, dir2, ""); err != nil { if err := untarAll(reader, dir2, ""); err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
t.FailNow()
} }
for _, file := range files { for _, file := range files {
absPath := dir2 + strings.TrimPrefix(dir, os.TempDir()) absPath := filepath.Join(dir2, strings.TrimPrefix(dir, os.TempDir()))
filepath := path.Join(absPath, file.name) filePath := filepath.Join(absPath, file.name)
if file.fileType == RegularFile { if file.fileType == RegularFile {
f, err := os.Open(filepath) f, err := os.Open(filePath)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
defer f.Close() defer f.Close()
buff := &bytes.Buffer{} buff := &bytes.Buffer{}
io.Copy(buff, f) if _, err := io.Copy(buff, f); err != nil {
t.Fatal(err)
}
if err := f.Close(); err != nil {
t.Fatal(err)
}
if file.data != string(buff.Bytes()) { if file.data != string(buff.Bytes()) {
t.Errorf("expected: %s, saw: %s", file.data, string(buff.Bytes())) t.Fatalf("expected: %s, saw: %s", file.data, string(buff.Bytes()))
} }
} else if file.fileType == SymLink { } else if file.fileType == SymLink {
dest, err := os.Readlink(filepath) dest, err := os.Readlink(filePath)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
if file.data != dest { if file.data != dest {
t.Errorf("expected: %s, saw: %s", file.data, dest) t.Fatalf("expected: %s, saw: %s", file.data, dest)
} }
} else { } else {
t.Errorf("unexpected file type: %v", file) t.Fatalf("unexpected file type: %v", file)
t.FailNow()
} }
} }
} }