Browse code

Fix tarsum for go 1.10

Remove invalid flush commands, flush should only occur when file
has been completely written. This is already handle, remove these calls.
Ensure data gets written after EOF in correct order and before close.
Remove gname and uname from sum for hash compatibility.
Update tarsum tests for gname/uname removal.
Return valid length after eof.

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Derek McGowan authored on 2018/03/30 11:12:14
Showing 2 changed files
... ...
@@ -160,6 +160,11 @@ func (sth simpleTHash) Hash() hash.Hash { return sth.h() }
160 160
 
161 161
 func (ts *tarSum) encodeHeader(h *tar.Header) error {
162 162
 	for _, elem := range ts.headerSelector.selectHeaders(h) {
163
+		// Ignore these headers to be compatible with versions
164
+		// before go 1.10
165
+		if elem[0] == "gname" || elem[0] == "uname" {
166
+			elem[1] = ""
167
+		}
163 168
 		if _, err := ts.h.Write([]byte(elem[0] + elem[1])); err != nil {
164 169
 			return err
165 170
 		}
... ...
@@ -219,6 +224,10 @@ func (ts *tarSum) Read(buf []byte) (int, error) {
219 219
 				ts.first = false
220 220
 			}
221 221
 
222
+			if _, err := ts.tarW.Write(buf2[:n]); err != nil {
223
+				return 0, err
224
+			}
225
+
222 226
 			currentHeader, err := ts.tarR.Next()
223 227
 			if err != nil {
224 228
 				if err == io.EOF {
... ...
@@ -232,10 +241,11 @@ func (ts *tarSum) Read(buf []byte) (int, error) {
232 232
 						return 0, err
233 233
 					}
234 234
 					ts.finished = true
235
-					return n, nil
235
+					return ts.bufWriter.Read(buf)
236 236
 				}
237
-				return n, err
237
+				return 0, err
238 238
 			}
239
+
239 240
 			ts.currentFile = path.Join(".", path.Join("/", currentHeader.Name))
240 241
 			if err := ts.encodeHeader(currentHeader); err != nil {
241 242
 				return 0, err
... ...
@@ -243,10 +253,7 @@ func (ts *tarSum) Read(buf []byte) (int, error) {
243 243
 			if err := ts.tarW.WriteHeader(currentHeader); err != nil {
244 244
 				return 0, err
245 245
 			}
246
-			if _, err := ts.tarW.Write(buf2[:n]); err != nil {
247
-				return 0, err
248
-			}
249
-			ts.tarW.Flush()
246
+
250 247
 			if _, err := io.Copy(ts.writer, ts.bufTar); err != nil {
251 248
 				return 0, err
252 249
 			}
... ...
@@ -254,7 +261,7 @@ func (ts *tarSum) Read(buf []byte) (int, error) {
254 254
 
255 255
 			return ts.bufWriter.Read(buf)
256 256
 		}
257
-		return n, err
257
+		return 0, err
258 258
 	}
259 259
 
260 260
 	// Filling the hash buffer
... ...
@@ -266,7 +273,6 @@ func (ts *tarSum) Read(buf []byte) (int, error) {
266 266
 	if _, err = ts.tarW.Write(buf2[:n]); err != nil {
267 267
 		return 0, err
268 268
 	}
269
-	ts.tarW.Flush()
270 269
 
271 270
 	// Filling the output writer
272 271
 	if _, err = io.Copy(ts.writer, ts.bufTar); err != nil {
... ...
@@ -69,19 +69,19 @@ var testLayers = []testLayer{
69 69
 	{
70 70
 		// this tar has two files with the same path
71 71
 		filename: "testdata/collision/collision-0.tar",
72
-		tarsum:   "tarsum+sha256:08653904a68d3ab5c59e65ef58c49c1581caa3c34744f8d354b3f575ea04424a"},
72
+		tarsum:   "tarsum+sha256:7cabb5e9128bb4a93ff867b9464d7c66a644ae51ea2e90e6ef313f3bef93f077"},
73 73
 	{
74 74
 		// this tar has the same two files (with the same path), but reversed order. ensuring is has different hash than above
75 75
 		filename: "testdata/collision/collision-1.tar",
76
-		tarsum:   "tarsum+sha256:b51c13fbefe158b5ce420d2b930eef54c5cd55c50a2ee4abdddea8fa9f081e0d"},
76
+		tarsum:   "tarsum+sha256:805fd393cfd58900b10c5636cf9bab48b2406d9b66523122f2352620c85dc7f9"},
77 77
 	{
78 78
 		// this tar has newer of collider-0.tar, ensuring is has different hash
79 79
 		filename: "testdata/collision/collision-2.tar",
80
-		tarsum:   "tarsum+sha256:381547080919bb82691e995508ae20ed33ce0f6948d41cafbeb70ce20c73ee8e"},
80
+		tarsum:   "tarsum+sha256:85d2b8389f077659d78aca898f9e632ed9161f553f144aef100648eac540147b"},
81 81
 	{
82 82
 		// this tar has newer of collider-1.tar, ensuring is has different hash
83 83
 		filename: "testdata/collision/collision-3.tar",
84
-		tarsum:   "tarsum+sha256:f886e431c08143164a676805205979cd8fa535dfcef714db5515650eea5a7c0f"},
84
+		tarsum:   "tarsum+sha256:cbe4dee79fe979d69c16c2bccd032e3205716a562f4a3c1ca1cbeed7b256eb19"},
85 85
 	{
86 86
 		options: &sizedOptions{1, 1024 * 1024, false, false}, // a 1mb file (in memory)
87 87
 		tarsum:  "tarsum+md5:0d7529ec7a8360155b48134b8e599f53",
... ...
@@ -436,7 +436,7 @@ func TestIteration(t *testing.T) {
436 436
 			[]byte(""),
437 437
 		},
438 438
 		{
439
-			"tarsum.dev+sha256:b38166c059e11fb77bef30bf16fba7584446e80fcc156ff46d47e36c5305d8ef",
439
+			"tarsum.dev+sha256:862964db95e0fa7e42836ae4caab3576ab1df8d275720a45bdd01a5a3730cc63",
440 440
 			VersionDev,
441 441
 			&tar.Header{
442 442
 				Name:     "another.txt",
... ...
@@ -452,7 +452,7 @@ func TestIteration(t *testing.T) {
452 452
 			[]byte("test"),
453 453
 		},
454 454
 		{
455
-			"tarsum.dev+sha256:4cc2e71ac5d31833ab2be9b4f7842a14ce595ec96a37af4ed08f87bc374228cd",
455
+			"tarsum.dev+sha256:4b1ba03544b49d96a32bacc77f8113220bd2f6a77e7e6d1e7b33cd87117d88e7",
456 456
 			VersionDev,
457 457
 			&tar.Header{
458 458
 				Name:     "xattrs.txt",
... ...
@@ -470,7 +470,7 @@ func TestIteration(t *testing.T) {
470 470
 			[]byte("test"),
471 471
 		},
472 472
 		{
473
-			"tarsum.dev+sha256:65f4284fa32c0d4112dd93c3637697805866415b570587e4fd266af241503760",
473
+			"tarsum.dev+sha256:410b602c898bd4e82e800050f89848fc2cf20fd52aa59c1ce29df76b878b84a6",
474 474
 			VersionDev,
475 475
 			&tar.Header{
476 476
 				Name:     "xattrs.txt",
... ...
@@ -488,7 +488,7 @@ func TestIteration(t *testing.T) {
488 488
 			[]byte("test"),
489 489
 		},
490 490
 		{
491
-			"tarsum+sha256:c12bb6f1303a9ddbf4576c52da74973c00d14c109bcfa76b708d5da1154a07fa",
491
+			"tarsum+sha256:b1f97eab73abd7593c245e51070f9fbdb1824c6b00a0b7a3d7f0015cd05e9e86",
492 492
 			Version0,
493 493
 			&tar.Header{
494 494
 				Name:     "xattrs.txt",