]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: move round-trip reading into common os file
authorAlex Brainman <alex.brainman@gmail.com>
Mon, 29 Jun 2015 06:42:28 +0000 (16:42 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Tue, 30 Jun 2015 02:20:20 +0000 (02:20 +0000)
Fixes #11426

Change-Id: I77368b0e852149ed4533e139cc43887508ac7f78
Reviewed-on: https://go-review.googlesource.com/11662
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
src/archive/tar/common.go
src/archive/tar/stat_unix.go
src/archive/tar/tar_test.go

index 855e5fc4e6a850f0da63a4648589a6daec151d3a..c31df062f7ea54577bafe6eb25dfb06ef2a2a55f 100644 (file)
@@ -249,6 +249,30 @@ func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) {
        if fm&os.ModeSticky != 0 {
                h.Mode |= c_ISVTX
        }
+       // If possible, populate additional fields from OS-specific
+       // FileInfo fields.
+       if sys, ok := fi.Sys().(*Header); ok {
+               // This FileInfo came from a Header (not the OS). Use the
+               // original Header to populate all remaining fields.
+               h.Uid = sys.Uid
+               h.Gid = sys.Gid
+               h.Uname = sys.Uname
+               h.Gname = sys.Gname
+               h.AccessTime = sys.AccessTime
+               h.ChangeTime = sys.ChangeTime
+               if sys.Xattrs != nil {
+                       h.Xattrs = make(map[string]string)
+                       for k, v := range sys.Xattrs {
+                               h.Xattrs[k] = v
+                       }
+               }
+               if sys.Typeflag == TypeLink {
+                       // hard link
+                       h.Typeflag = TypeLink
+                       h.Size = 0
+                       h.Linkname = sys.Linkname
+               }
+       }
        if sysStat != nil {
                return h, sysStat(fi, h)
        }
index 24b93111dc201931240e8310bee16b984588bddc..27d112f665cb5f46adbc669d4a1fc495d4c1fe5f 100644 (file)
@@ -16,41 +16,22 @@ func init() {
 }
 
 func statUnix(fi os.FileInfo, h *Header) error {
-       switch sys := fi.Sys().(type) {
-       case *syscall.Stat_t:
-               h.Uid = int(sys.Uid)
-               h.Gid = int(sys.Gid)
-               // TODO(bradfitz): populate username & group.  os/user
-               // doesn't cache LookupId lookups, and lacks group
-               // lookup functions.
-               h.AccessTime = statAtime(sys)
-               h.ChangeTime = statCtime(sys)
-               // TODO(bradfitz): major/minor device numbers?
-               if fi.Mode().IsRegular() && sys.Nlink > 1 {
-                       h.Typeflag = TypeLink
-                       h.Size = 0
-                       // TODO(vbatts): Linkname?
-               }
-       case *Header:
-               // for the roundtrip logic
-               h.Uid = sys.Uid
-               h.Gid = sys.Gid
-               h.Uname = sys.Uname
-               h.Gname = sys.Gname
-               h.AccessTime = sys.AccessTime
-               h.ChangeTime = sys.ChangeTime
-               if sys.Xattrs != nil {
-                       h.Xattrs = make(map[string]string)
-                       for k, v := range sys.Xattrs {
-                               h.Xattrs[k] = v
-                       }
-               }
-               if sys.Typeflag == TypeLink {
-                       // hard link
-                       h.Typeflag = TypeLink
-                       h.Size = 0
-                       h.Linkname = sys.Linkname
-               }
+       sys, ok := fi.Sys().(*syscall.Stat_t)
+       if !ok {
+               return nil
+       }
+       h.Uid = int(sys.Uid)
+       h.Gid = int(sys.Gid)
+       // TODO(bradfitz): populate username & group.  os/user
+       // doesn't cache LookupId lookups, and lacks group
+       // lookup functions.
+       h.AccessTime = statAtime(sys)
+       h.ChangeTime = statCtime(sys)
+       // TODO(bradfitz): major/minor device numbers?
+       if fi.Mode().IsRegular() && sys.Nlink > 1 {
+               h.Typeflag = TypeLink
+               h.Size = 0
+               // TODO(vbatts): Linkname?
        }
        return nil
 }
index 3fdd83db3b85bbb6f9d6bd55596c64d2ceadf3cc..d63c072eb9aaa489c5ec76552db060fa50f2a3ef 100644 (file)
@@ -10,7 +10,6 @@ import (
        "os"
        "path"
        "reflect"
-       "runtime"
        "strings"
        "testing"
        "time"
@@ -136,9 +135,6 @@ type headerRoundTripTest struct {
 }
 
 func TestHeaderRoundTrip(t *testing.T) {
-       if runtime.GOOS == "windows" || runtime.GOOS == "plan9" || runtime.GOOS == "nacl" {
-               t.Skipf("skipping on %s; issue 11426", runtime.GOOS)
-       }
        golden := []headerRoundTripTest{
                // regular file.
                {