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 {
return err
}
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
}
@ -330,7 +332,6 @@ func untarAll(reader io.Reader, destFile, prefix string) error {
return err
}
if header.FileInfo().IsDir() {
if err := os.MkdirAll(outFileName, 0755); err != nil {
return err
}
@ -359,7 +360,12 @@ func untarAll(reader io.Reader, destFile, prefix string) error {
return err
}
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) {
dir, err := ioutil.TempDir(os.TempDir(), "input")
dir2, err2 := ioutil.TempDir(os.TempDir(), "output")
dir, err := ioutil.TempDir("", "input")
dir2, err2 := ioutil.TempDir("", "output")
if err != nil || err2 != nil {
t.Errorf("unexpected error: %v | %v", err, err2)
t.FailNow()
@ -160,74 +160,74 @@ func TestTarUntar(t *testing.T) {
for _, file := range files {
filepath := path.Join(dir, file.name)
if err := os.MkdirAll(path.Dir(filepath), 0755); err != nil {
t.Errorf("unexpected error: %v", err)
t.FailNow()
t.Fatalf("unexpected error: %v", err)
}
if file.fileType == RegularFile {
f, err := os.Create(filepath)
if err != nil {
t.Errorf("unexpected error: %v", err)
t.FailNow()
t.Fatalf("unexpected error: %v", err)
}
defer f.Close()
if _, err := io.Copy(f, bytes.NewBuffer([]byte(file.data))); err != nil {
t.Errorf("unexpected error: %v", err)
t.FailNow()
t.Fatalf("unexpected error: %v", err)
}
if err := f.Close(); err != nil {
t.Fatal(err)
}
} else if file.fileType == SymLink {
err := os.Symlink(file.data, filepath)
if err != nil {
t.Errorf("unexpected error: %v", err)
t.FailNow()
t.Fatalf("unexpected error: %v", err)
}
} else {
t.Errorf("unexpected file type: %v", file)
t.FailNow()
t.Fatalf("unexpected file type: %v", file)
}
}
writer := &bytes.Buffer{}
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())
if err := untarAll(reader, dir2, ""); err != nil {
t.Errorf("unexpected error: %v", err)
t.FailNow()
t.Fatalf("unexpected error: %v", err)
}
for _, file := range files {
absPath := dir2 + strings.TrimPrefix(dir, os.TempDir())
filepath := path.Join(absPath, file.name)
absPath := filepath.Join(dir2, strings.TrimPrefix(dir, os.TempDir()))
filePath := filepath.Join(absPath, file.name)
if file.fileType == RegularFile {
f, err := os.Open(filepath)
f, err := os.Open(filePath)
if err != nil {
t.Errorf("unexpected error: %v", err)
t.Fatalf("unexpected error: %v", err)
}
defer f.Close()
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()) {
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 {
dest, err := os.Readlink(filepath)
dest, err := os.Readlink(filePath)
if err != nil {
t.Errorf("unexpected error: %v", err)
t.Fatalf("unexpected error: %v", err)
}
if file.data != dest {
t.Errorf("expected: %s, saw: %s", file.data, dest)
t.Fatalf("expected: %s, saw: %s", file.data, dest)
}
} else {
t.Errorf("unexpected file type: %v", file)
t.FailNow()
t.Fatalf("unexpected file type: %v", file)
}
}
}