pull in xattr archive/tar from upstream
This commit is contained in:
		
							parent
							
								
									77cba216ba
								
							
						
					
					
						commit
						1318683961
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,3 +1,4 @@
 | 
			
		||||
/go1.1.1.src.tar.gz
 | 
			
		||||
/go1.1.2.src.tar.gz
 | 
			
		||||
/go1.2.src.tar.gz
 | 
			
		||||
/golang-19087:a15f344a9efa-xattrs.tar
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										197
									
								
								golang-1.2-archive_tar-xattr.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								golang-1.2-archive_tar-xattr.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,197 @@
 | 
			
		||||
# HG changeset patch
 | 
			
		||||
# User Alexander Larsson <alexander.larsson@gmail.com>
 | 
			
		||||
# Date 1392282510 -39600
 | 
			
		||||
# Node ID a15f344a9efa35ef168c8feaa92a15a1cdc93db5
 | 
			
		||||
# Parent  1a32fe60e0798d82bbff6c945001c7f0ba8de5ea
 | 
			
		||||
archive/tar: support extended attributes
 | 
			
		||||
 | 
			
		||||
This adds support for archives with the SCHILY.xattr field in the
 | 
			
		||||
pax header. This is what gnu tar and star generate.
 | 
			
		||||
Fixes issue 7154.
 | 
			
		||||
 | 
			
		||||
LGTM=dsymonds
 | 
			
		||||
R=golang-codereviews, gobot, dsymonds
 | 
			
		||||
CC=golang-codereviews
 | 
			
		||||
https://codereview.appspot.com/54570043
 | 
			
		||||
 | 
			
		||||
Committer: David Symonds <dsymonds@golang.org>
 | 
			
		||||
 | 
			
		||||
diff -r 1a32fe60e079 -r a15f344a9efa src/pkg/archive/tar/common.go
 | 
			
		||||
--- a/src/pkg/archive/tar/common.go	Thu Feb 13 03:09:03 2014 -0500
 | 
			
		||||
+++ b/src/pkg/archive/tar/common.go	Thu Feb 13 20:08:30 2014 +1100
 | 
			
		||||
@@ -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     = ""
 | 
			
		||||
 )
 | 
			
		||||
 
 | 
			
		||||
diff -r 1a32fe60e079 -r a15f344a9efa src/pkg/archive/tar/reader.go
 | 
			
		||||
--- a/src/pkg/archive/tar/reader.go	Thu Feb 13 03:09:03 2014 -0500
 | 
			
		||||
+++ b/src/pkg/archive/tar/reader.go	Thu Feb 13 20:08:30 2014 +1100
 | 
			
		||||
@@ -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
 | 
			
		||||
 }
 | 
			
		||||
diff -r 1a32fe60e079 -r a15f344a9efa src/pkg/archive/tar/reader_test.go
 | 
			
		||||
--- a/src/pkg/archive/tar/reader_test.go	Thu Feb 13 03:09:03 2014 -0500
 | 
			
		||||
+++ b/src/pkg/archive/tar/reader_test.go	Thu Feb 13 20:08:30 2014 +1100
 | 
			
		||||
@@ -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])
 | 
			
		||||
 		}
 | 
			
		||||
diff -r 1a32fe60e079 -r a15f344a9efa src/pkg/archive/tar/writer.go
 | 
			
		||||
--- a/src/pkg/archive/tar/writer.go	Thu Feb 13 03:09:03 2014 -0500
 | 
			
		||||
+++ b/src/pkg/archive/tar/writer.go	Thu Feb 13 20:08:30 2014 +1100
 | 
			
		||||
@@ -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
 | 
			
		||||
diff -r 1a32fe60e079 -r a15f344a9efa src/pkg/archive/tar/writer_test.go
 | 
			
		||||
--- a/src/pkg/archive/tar/writer_test.go	Thu Feb 13 03:09:03 2014 -0500
 | 
			
		||||
+++ b/src/pkg/archive/tar/writer_test.go	Thu Feb 13 20:08:30 2014 +1100
 | 
			
		||||
@@ -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)
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
Index: go/src/pkg/os/os_test.go
 | 
			
		||||
===================================================================
 | 
			
		||||
--- go.orig/src/pkg/os/os_test.go
 | 
			
		||||
+++ go/src/pkg/os/os_test.go
 | 
			
		||||
@@ -842,7 +842,7 @@ func run(t *testing.T, cmd []string) str
 | 
			
		||||
 	if err != nil {
 | 
			
		||||
 		t.Fatal(err)
 | 
			
		||||
 	}
 | 
			
		||||
-	p, err := StartProcess("/bin/hostname", []string{"hostname"}, &ProcAttr{Files: []*File{nil, w, Stderr}})
 | 
			
		||||
+	p, err := StartProcess("/usr/bin/hostname", []string{"hostname"}, &ProcAttr{Files: []*File{nil, w, Stderr}})
 | 
			
		||||
 	if err != nil {
 | 
			
		||||
 		t.Fatal(err)
 | 
			
		||||
 	}
 | 
			
		||||
							
								
								
									
										20
									
								
								golang.spec
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								golang.spec
									
									
									
									
									
								
							@ -25,7 +25,7 @@
 | 
			
		||||
 | 
			
		||||
Name:           golang
 | 
			
		||||
Version:        1.2
 | 
			
		||||
Release:        5%{?dist}
 | 
			
		||||
Release:        6%{?dist}
 | 
			
		||||
Summary:        The Go Programming Language
 | 
			
		||||
 | 
			
		||||
License:        BSD
 | 
			
		||||
@ -61,6 +61,11 @@ Patch2:         golang-1.2-remove-ECC-p224.patch
 | 
			
		||||
# http://code.google.com/p/go/issues/detail?id=6522
 | 
			
		||||
Patch3:         ./golang-1.2-skipCpuProfileTest.patch
 | 
			
		||||
 | 
			
		||||
# Pull in new archive/tar upstream patch to support xattrs for
 | 
			
		||||
# docker-0.8.1
 | 
			
		||||
# https://code.google.com/p/go/source/detail?r=a15f344a9efa
 | 
			
		||||
Patch4:         golang-1.2-archive_tar-xattr.patch
 | 
			
		||||
 | 
			
		||||
# Having documentation separate was broken
 | 
			
		||||
Obsoletes:      %{name}-docs < 1.1-4
 | 
			
		||||
 | 
			
		||||
@ -72,6 +77,10 @@ ExclusiveArch:  %{ix86} x86_64 %{arm}
 | 
			
		||||
Source100:      golang-gdbinit
 | 
			
		||||
Source101:      golang-prelink.conf
 | 
			
		||||
 | 
			
		||||
# Patch4 - pull in new archive/tar upstream patch, this file is part
 | 
			
		||||
#          of the upstream merge and is used for test cases.
 | 
			
		||||
Source400:      golang-19087:a15f344a9efa-xattrs.tar
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
%{summary}.
 | 
			
		||||
 | 
			
		||||
@ -135,6 +144,8 @@ end
 | 
			
		||||
%prep
 | 
			
		||||
%setup -q -n go
 | 
			
		||||
 | 
			
		||||
cp %SOURCE400 src/pkg/archive/tar/testdata/xattrs.tar
 | 
			
		||||
 | 
			
		||||
# increase verbosity of build
 | 
			
		||||
%patch0 -p1
 | 
			
		||||
 | 
			
		||||
@ -144,6 +155,9 @@ end
 | 
			
		||||
# skip flaky test
 | 
			
		||||
%patch3 -p1
 | 
			
		||||
 | 
			
		||||
# new archive/tar implementation from upstream
 | 
			
		||||
%patch4 -p1
 | 
			
		||||
 | 
			
		||||
# create a [dirty] gcc wrapper to allow us to build with our own flags
 | 
			
		||||
# (dirty because it is spoofing 'gcc' since CC value is stored in the go tool)
 | 
			
		||||
# TODO: remove this and just set CFLAGS/LDFLAGS once upstream supports it
 | 
			
		||||
@ -295,6 +309,10 @@ cp -av %{SOURCE101} $RPM_BUILD_ROOT%{_sysconfdir}/prelink.conf.d/golang.conf
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* Wed Feb 19 2014 Adam Miller <maxamillion@fedoraproject.org> 1.2-6
 | 
			
		||||
- pull in upstream archive/tar implementation that supports xattr for
 | 
			
		||||
  docker 0.8.1
 | 
			
		||||
 | 
			
		||||
* Tue Feb 18 2014 Vincent Batts <vbatts@redhat.com> 1.2-5
 | 
			
		||||
- provide 'go', so users can yum install 'go'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user