]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: append a slash when deriving header info from a directory
authorChristian Himpel <chressie@googlemail.com>
Wed, 13 Feb 2013 08:23:28 +0000 (19:23 +1100)
committerDavid Symonds <dsymonds@golang.org>
Wed, 13 Feb 2013 08:23:28 +0000 (19:23 +1100)
This behavior is identical to GNU tar 1.26.

R=dsymonds, dave
CC=golang-dev
https://golang.org/cl/7307101

src/pkg/archive/tar/common.go
src/pkg/archive/tar/tar_test.go

index c71f63cebc7366b2a39464b20f9db418303bda4b..e57c16ce9536e5ebc2047481e3f4bcf1f0c61022 100644 (file)
@@ -79,6 +79,7 @@ const (
 
 // FileInfoHeader creates a partially-populated Header from fi.
 // 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) {
        if fi == 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():
                h.Typeflag = TypeDir
                h.Mode |= c_ISDIR
+               h.Name += "/"
        case fi.Mode()&os.ModeSymlink != 0:
                h.Typeflag = TypeSymlink
                h.Mode |= c_ISLNK
index 7b190b6a8b27196e1a5d009a82714064c10a12c8..0a2db14a91b5e47c9ea50470363a08033718fcef 100644 (file)
@@ -14,13 +14,13 @@ import (
 )
 
 func TestFileInfoHeader(t *testing.T) {
-       fi, err := os.Lstat("testdata/small.txt")
+       fi, err := os.Stat("testdata/small.txt")
        if err != nil {
                t.Fatal(err)
        }
        h, err := FileInfoHeader(fi, "")
        if err != nil {
-               t.Fatalf("on small.txt: %v", err)
+               t.Fatalf("FileInfoHeader: %v", err)
        }
        if g, e := h.Name, "small.txt"; 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) {
        h, err := FileInfoHeader(symlink{}, "some-target")
        if err != nil {