1
0
mirror of https://github.com/golang/go synced 2024-11-13 18:50:24 -07:00

archive/tar: append a slash when deriving header info from a directory

This behavior is identical to GNU tar 1.26.

R=dsymonds, dave
CC=golang-dev
https://golang.org/cl/7307101
This commit is contained in:
Christian Himpel 2013-02-13 19:23:28 +11:00 committed by David Symonds
parent 4101469ccc
commit 96082a6953
2 changed files with 27 additions and 2 deletions

View File

@ -79,6 +79,7 @@ const (
// FileInfoHeader creates a partially-populated Header from fi. // FileInfoHeader creates a partially-populated Header from fi.
// If fi describes a symlink, FileInfoHeader records link as the link target. // If fi describes a symlink, FileInfoHeader records link as the link target.
// If fi describes a directory, a slash is appended to the name.
func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) { func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) {
if fi == nil { if fi == nil {
return nil, errors.New("tar: FileInfo is nil") return nil, errors.New("tar: FileInfo is nil")
@ -96,6 +97,7 @@ func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) {
case fi.IsDir(): case fi.IsDir():
h.Typeflag = TypeDir h.Typeflag = TypeDir
h.Mode |= c_ISDIR h.Mode |= c_ISDIR
h.Name += "/"
case fi.Mode()&os.ModeSymlink != 0: case fi.Mode()&os.ModeSymlink != 0:
h.Typeflag = TypeSymlink h.Typeflag = TypeSymlink
h.Mode |= c_ISLNK h.Mode |= c_ISLNK

View File

@ -14,13 +14,13 @@ import (
) )
func TestFileInfoHeader(t *testing.T) { func TestFileInfoHeader(t *testing.T) {
fi, err := os.Lstat("testdata/small.txt") fi, err := os.Stat("testdata/small.txt")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
h, err := FileInfoHeader(fi, "") h, err := FileInfoHeader(fi, "")
if err != nil { if err != nil {
t.Fatalf("on small.txt: %v", err) t.Fatalf("FileInfoHeader: %v", err)
} }
if g, e := h.Name, "small.txt"; g != e { if g, e := h.Name, "small.txt"; g != e {
t.Errorf("Name = %q; want %q", g, e) t.Errorf("Name = %q; want %q", g, e)
@ -36,6 +36,29 @@ func TestFileInfoHeader(t *testing.T) {
} }
} }
func TestFileInfoHeaderDir(t *testing.T) {
fi, err := os.Stat("testdata")
if err != nil {
t.Fatal(err)
}
h, err := FileInfoHeader(fi, "")
if err != nil {
t.Fatalf("FileInfoHeader: %v", err)
}
if g, e := h.Name, "testdata/"; g != e {
t.Errorf("Name = %q; want %q", g, e)
}
if g, e := h.Mode, int64(fi.Mode().Perm())|c_ISDIR; g != e {
t.Errorf("Mode = %#o; want %#o", g, e)
}
if g, e := h.Size, int64(0); g != e {
t.Errorf("Size = %v; want %v", g, e)
}
if g, e := h.ModTime, fi.ModTime(); !g.Equal(e) {
t.Errorf("ModTime = %v; want %v", g, e)
}
}
func TestFileInfoHeaderSymlink(t *testing.T) { func TestFileInfoHeaderSymlink(t *testing.T) {
h, err := FileInfoHeader(symlink{}, "some-target") h, err := FileInfoHeader(symlink{}, "some-target")
if err != nil { if err != nil {