Ping? Can we please get this merged? It's blocking docker 0.8.1 Thanks! Paul
On Wed, Feb 19, 2014 at 11:56:10PM -0800, Johan Euphrosine wrote: > Package: golang > Version: 2:1.2-2 > Severity: wishlist > > to backport support for tar xattr from upcoming golang1.3 > --- > debian/golang-src.install | 1 + > debian/patches/add-tar-xattr-support.patch | 175 > +++++++++++++++++++++++++++++ > debian/patches/series | 1 + > debian/source/include-binaries | 1 + > debian/xattrs.tar | Bin 0 -> 5120 bytes > 5 files changed, 178 insertions(+) > create mode 100644 debian/patches/add-tar-xattr-support.patch > create mode 100644 debian/source/include-binaries > create mode 100644 debian/xattrs.tar > > diff --git a/debian/golang-src.install b/debian/golang-src.install > index f034ba5..726c5b4 100644 > --- a/debian/golang-src.install > +++ b/debian/golang-src.install > @@ -1,2 +1,3 @@ > src /usr/share/go/ > test /usr/share/go/ > +debian/xattrs.tar /usr/share/go/src/pkg/archive/tar/testdata > diff --git a/debian/patches/add-tar-xattr-support.patch > b/debian/patches/add-tar-xattr-support.patch > new file mode 100644 > index 0000000..904e011 > --- /dev/null > +++ b/debian/patches/add-tar-xattr-support.patch > @@ -0,0 +1,175 @@ > +--- a/src/pkg/archive/tar/common.go > ++++ b/src/pkg/archive/tar/common.go > +@@ -57,6 +57,7 @@ > + Devminor int64 // minor number of character or block device > + AccessTime time.Time // access time > + ChangeTime time.Time // status change time > ++ Xattrs map[string]string > + } > + > + // File name constants from the tar spec. > +@@ -189,6 +190,7 @@ > + paxSize = "size" > + paxUid = "uid" > + paxUname = "uname" > ++ paxXattr = "SCHILY.xattr." > + paxNone = "" > + ) > + > +--- a/src/pkg/archive/tar/reader.go > ++++ b/src/pkg/archive/tar/reader.go > +@@ -139,8 +139,14 @@ > + return err > + } > + hdr.Size = int64(size) > ++ default: > ++ if strings.HasPrefix(k, paxXattr) { > ++ if hdr.Xattrs == nil { > ++ hdr.Xattrs = make(map[string]string) > ++ } > ++ hdr.Xattrs[k[len(paxXattr):]] = v > ++ } > + } > +- > + } > + return nil > + } > +--- a/src/pkg/archive/tar/reader_test.go > ++++ b/src/pkg/archive/tar/reader_test.go > +@@ -161,6 +161,46 @@ > + }, > + }, > + }, > ++ { > ++ file: "testdata/xattrs.tar", > ++ headers: []*Header{ > ++ { > ++ Name: "small.txt", > ++ Mode: 0644, > ++ Uid: 1000, > ++ Gid: 10, > ++ Size: 5, > ++ ModTime: time.Unix(1386065770, 448252320), > ++ Typeflag: '0', > ++ Uname: "alex", > ++ Gname: "wheel", > ++ AccessTime: time.Unix(1389782991, 419875220), > ++ ChangeTime: time.Unix(1389782956, 794414986), > ++ Xattrs: map[string]string{ > ++ "user.key": "value", > ++ "user.key2": "value2", > ++ // Interestingly, selinux encodes the > terminating null inside the xattr > ++ "security.selinux": > "unconfined_u:object_r:default_t:s0\x00", > ++ }, > ++ }, > ++ { > ++ Name: "small2.txt", > ++ Mode: 0644, > ++ Uid: 1000, > ++ Gid: 10, > ++ Size: 11, > ++ ModTime: time.Unix(1386065770, 449252304), > ++ Typeflag: '0', > ++ Uname: "alex", > ++ Gname: "wheel", > ++ AccessTime: time.Unix(1389782991, 419875220), > ++ ChangeTime: time.Unix(1386065770, 449252304), > ++ Xattrs: map[string]string{ > ++ "security.selinux": > "unconfined_u:object_r:default_t:s0\x00", > ++ }, > ++ }, > ++ }, > ++ }, > + } > + > + func TestReader(t *testing.T) { > +@@ -180,7 +220,7 @@ > + f.Close() > + continue testLoop > + } > +- if *hdr != *header { > ++ if !reflect.DeepEqual(*hdr, *header) { > + t.Errorf("test %d, entry %d: Incorrect > header:\nhave %+v\nwant %+v", > + i, j, *hdr, *header) > + } > +@@ -253,7 +293,7 @@ > + } > + > + // check the header > +- if *hdr != *headers[nread] { > ++ if !reflect.DeepEqual(*hdr, *headers[nread]) { > + t.Errorf("Incorrect header:\nhave %+v\nwant %+v", > + *hdr, headers[nread]) > + } > +Binary files /dev/null and b/src/pkg/archive/tar/testdata/xattrs.tar differ > +--- a/src/pkg/archive/tar/writer.go > ++++ b/src/pkg/archive/tar/writer.go > +@@ -236,6 +236,12 @@ > + return tw.err > + } > + > ++ if allowPax { > ++ for k, v := range hdr.Xattrs { > ++ paxHeaders[paxXattr+k] = v > ++ } > ++ } > ++ > + if len(paxHeaders) > 0 { > + if !allowPax { > + return errInvalidHeader > +--- a/src/pkg/archive/tar/writer_test.go > ++++ b/src/pkg/archive/tar/writer_test.go > +@@ -10,6 +10,7 @@ > + "io" > + "io/ioutil" > + "os" > ++ "reflect" > + "strings" > + "testing" > + "testing/iotest" > +@@ -338,6 +339,45 @@ > + } > + } > + > ++func TestPaxXattrs(t *testing.T) { > ++ xattrs := map[string]string{ > ++ "user.key": "value", > ++ } > ++ > ++ // Create an archive with an xattr > ++ fileinfo, err := os.Stat("testdata/small.txt") > ++ if err != nil { > ++ t.Fatal(err) > ++ } > ++ hdr, err := FileInfoHeader(fileinfo, "") > ++ if err != nil { > ++ t.Fatalf("os.Stat: %v", err) > ++ } > ++ contents := "Kilts" > ++ hdr.Xattrs = xattrs > ++ var buf bytes.Buffer > ++ writer := NewWriter(&buf) > ++ if err := writer.WriteHeader(hdr); err != nil { > ++ t.Fatal(err) > ++ } > ++ if _, err = writer.Write([]byte(contents)); err != nil { > ++ t.Fatal(err) > ++ } > ++ if err := writer.Close(); err != nil { > ++ t.Fatal(err) > ++ } > ++ // Test that we can get the xattrs back out of the archive. > ++ reader := NewReader(&buf) > ++ hdr, err = reader.Next() > ++ if err != nil { > ++ t.Fatal(err) > ++ } > ++ if !reflect.DeepEqual(hdr.Xattrs, xattrs) { > ++ t.Fatalf("xattrs did not survive round trip: got %+v, want %+v", > ++ hdr.Xattrs, xattrs) > ++ } > ++} > ++ > + func TestPAXHeader(t *testing.T) { > + medName := strings.Repeat("CD", 50) > + longName := strings.Repeat("AB", 100) > diff --git a/debian/patches/series b/debian/patches/series > index 6da8b45..0a51bc1 100644 > --- a/debian/patches/series > +++ b/debian/patches/series > @@ -1 +1,2 @@ > add-src-pkg-debug-elf-testdata-hello.patch > +add-tar-xattr-support.patch > diff --git a/debian/source/include-binaries b/debian/source/include-binaries > new file mode 100644 > index 0000000..0222ae3 > --- /dev/null > +++ b/debian/source/include-binaries > @@ -0,0 +1 @@ > +debian/xattrs.tar > \ No newline at end of file > diff --git a/debian/xattrs.tar b/debian/xattrs.tar > new file mode 100644 > index > 0000000000000000000000000000000000000000..9701950edd1f0dc82858b7117136b37391be0b08 > GIT binary patch > literal 5120 > zcmeHJv2KGf5M|~o_yWg1+khiw>d;i}P^nX=$R$ooYd`|ilD{uBAv6g^kxC>6-(uu< > zHg^v_-l5r}td>fyRbC(vfcdOQq}Iq(#u+Ja9X?}Dv(|CCVoJF~09ZgF;2a!G7^%~| > zYNYoMUQ-rE=5<MfNf&^--n!;4I5LG45ME;9L@fvneeClfz=*LBI8bnFP`025LJ)!= > zMno8J0GDDfIs&<m0>KzzBJ^EKyr-Mx-NQ4gq%k=v3zee}wOxElT`HH-ei(K*xV|_} > zC{$GDvDu<R={PN`MVUrfx`|V@UX}Cg<y}Q)mCx5|BTH>oW?o>&odUrVuVHkt_w?IH > zW3PV_@V!Jxt@A^i>Yrj(>;K=H?5X8!tJS~MYVd#a^`?|QJKb&Uduf~MfN4M7$J!Lr > zF40zZMF!9x{tqJ#0F5+;{2!=)=Knre|G(mAKU`hAc#r>!#{V(9d;sW1hxVv7@B_zF > ze)#eKF~#1~>@WTI`#+&4`lkel_5U6!N8h^5vRAE8lqGgr9-Ul!p=H1_U>TS&1K)l2 > B)fNB% > > literal 0 > HcmV?d00001 > > -- > 1.9.0.rc1.175.g0b1dcb5 > -- .''`. Paul Tagliamonte <paul...@debian.org> | Proud Debian Developer : :' : 4096R / 8F04 9AD8 2C92 066C 7352 D28A 7B58 5B30 807C 2A87 `. `'` http://people.debian.org/~paultag `- http://people.debian.org/~paultag/conduct-statement.txt
signature.asc
Description: Digital signature