]> Cypherpunks repositories - gostls13.git/commitdiff
archive/tar: when writing tar Headers write hdr.Linkname
authorMike Rosset <mike.rosset@gmail.com>
Mon, 29 Aug 2011 18:01:03 +0000 (11:01 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 29 Aug 2011 18:01:03 +0000 (11:01 -0700)
This should allow symlinks in tar files. Where previously
as far as I can see they were skipped completely.

R=golang-dev, dsymonds, rsc, bradfitz, bradfitz
CC=golang-dev, mike.rosset
https://golang.org/cl/4973044

src/pkg/archive/tar/testdata/writer.tar
src/pkg/archive/tar/writer.go
src/pkg/archive/tar/writer_test.go

index 0358f91b98b3c72134167f4917d567f53fa1b9a2..e6d816ad0775d56d09242d6f5d1dbe56af310a32 100644 (file)
Binary files a/src/pkg/archive/tar/testdata/writer.tar and b/src/pkg/archive/tar/testdata/writer.tar differ
index 8673bad316663d524be38d40068aec7880562c96..c6ce2241af03de5ae334b0deb81be0244dc01a27 100644 (file)
@@ -134,7 +134,7 @@ func (tw *Writer) WriteHeader(hdr *Header) os.Error {
        tw.numeric(s.next(12), hdr.Mtime)      // 136:148
        s.next(8)                              // chksum (148:156)
        s.next(1)[0] = hdr.Typeflag            // 156:157
-       s.next(100)                            // linkname (157:257)
+       tw.cString(s.next(100), hdr.Linkname)  // linkname (157:257)
        copy(s.next(8), []byte("ustar\x0000")) // 257:265
        tw.cString(s.next(32), hdr.Uname)      // 265:297
        tw.cString(s.next(32), hdr.Gname)      // 297:329
index 838cb7e1fefc719ac1cc5ac3e21c80e945417d6e..6cc93868820eb37386d43094cd8fabbc2df6afad 100644 (file)
@@ -24,6 +24,10 @@ type writerTest struct {
 }
 
 var writerTests = []*writerTest{
+       // The writer test file was produced with this command:
+       // tar (GNU tar) 1.26
+       //   ln -s small.txt link.txt
+       //   tar -b 1 --format=ustar -c -f writer.tar small.txt small2.txt link.txt
        &writerTest{
                file: "testdata/writer.tar",
                entries: []*writerTestEntry{
@@ -55,6 +59,21 @@ var writerTests = []*writerTest{
                                },
                                contents: "Google.com\n",
                        },
+                       &writerTestEntry{
+                               header: &Header{
+                                       Name:     "link.txt",
+                                       Mode:     0777,
+                                       Uid:      1000,
+                                       Gid:      1000,
+                                       Size:     0,
+                                       Mtime:    1314603082,
+                                       Typeflag: '2',
+                                       Linkname: "small.txt",
+                                       Uname:    "strings",
+                                       Gname:    "strings",
+                               },
+                               // no contents
+                       },
                },
        },
        // The truncated test file was produced using these commands: