summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Symonds <dsymonds@golang.org>2009-07-08 18:31:14 -0700
committerDavid Symonds <dsymonds@golang.org>2009-07-08 18:31:14 -0700
commit29c7e1d9a080cfa1c168ac86c194e716a6e386a5 (patch)
tree814246810a4bdd2ddc4a9966b2747311ca70bef2
parent9f632c6346c40b51f478c170e0f935c464104e61 (diff)
downloadgolang-29c7e1d9a080cfa1c168ac86c194e716a6e386a5.tar.gz
archive/tar cleanups:
- rename untar{,_test}.go to reader{,_test}.go. - fix up some comments. - improve test output if it fails. R=rsc APPROVED=rsc DELTA=821 (400 added, 392 deleted, 29 changed) OCL=31376 CL=31378
-rw-r--r--src/pkg/Make.deps2
-rw-r--r--src/pkg/archive/tar/Makefile4
-rw-r--r--src/pkg/archive/tar/reader.go (renamed from src/pkg/archive/tar/untar.go)9
-rw-r--r--src/pkg/archive/tar/reader_test.go (renamed from src/pkg/archive/tar/untar_test.go)0
-rw-r--r--src/pkg/archive/tar/writer.go28
-rw-r--r--src/pkg/archive/tar/writer_test.go43
6 files changed, 47 insertions, 39 deletions
diff --git a/src/pkg/Make.deps b/src/pkg/Make.deps
index 088708fba..9144ad40d 100644
--- a/src/pkg/Make.deps
+++ b/src/pkg/Make.deps
@@ -1,4 +1,4 @@
-archive/tar.install: bufio.install bytes.install io.install os.install strconv.install
+archive/tar.install: bytes.install io.install os.install strconv.install strings.install
base64.install: bytes.install io.install os.install strconv.install
bignum.install: fmt.install
bufio.install: io.install os.install strconv.install utf8.install
diff --git a/src/pkg/archive/tar/Makefile b/src/pkg/archive/tar/Makefile
index 2689b30f6..78734ef58 100644
--- a/src/pkg/archive/tar/Makefile
+++ b/src/pkg/archive/tar/Makefile
@@ -36,7 +36,7 @@ O1=\
common.$O\
O2=\
- untar.$O\
+ reader.$O\
writer.$O\
@@ -48,7 +48,7 @@ a1: $(O1)
rm -f $(O1)
a2: $(O2)
- $(AR) grc _obj$D/tar.a untar.$O writer.$O
+ $(AR) grc _obj$D/tar.a reader.$O writer.$O
rm -f $(O2)
diff --git a/src/pkg/archive/tar/untar.go b/src/pkg/archive/tar/reader.go
index 87382d4f5..7e8f617b0 100644
--- a/src/pkg/archive/tar/untar.go
+++ b/src/pkg/archive/tar/reader.go
@@ -6,7 +6,6 @@ package tar
// TODO(dsymonds):
// - pax extensions
-// - rename this file to reader.go
import (
"archive/tar";
@@ -20,13 +19,13 @@ var (
HeaderError os.Error = os.ErrorString("invalid tar header");
)
-// A tar archive consists of a sequence of files.
// A Reader provides sequential access to the contents of a tar archive.
+// A tar archive consists of a sequence of files.
// The Next method advances to the next file in the archive (including the first),
// and then it can be treated as an io.Reader to access the file's data.
//
// Example:
-// tr := NewTarReader(r);
+// tr := tar.NewReader(r);
// for {
// hdr, err := tr.Next();
// if err != nil {
@@ -36,7 +35,7 @@ var (
// // end of tar archive
// break
// }
-// io.Copy(tr, somewhere);
+// io.Copy(tr, data);
// }
type Reader struct {
r io.Reader;
@@ -48,7 +47,7 @@ type Reader struct {
func (tr *Reader) skipUnread()
func (tr *Reader) readHeader() *Header
-// NewReader creates a new Reader reading the given io.Reader.
+// NewReader creates a new Reader reading from r.
func NewReader(r io.Reader) *Reader {
return &Reader{ r: r }
}
diff --git a/src/pkg/archive/tar/untar_test.go b/src/pkg/archive/tar/reader_test.go
index a3a02978a..a3a02978a 100644
--- a/src/pkg/archive/tar/untar_test.go
+++ b/src/pkg/archive/tar/reader_test.go
diff --git a/src/pkg/archive/tar/writer.go b/src/pkg/archive/tar/writer.go
index 57e9a4607..fbb0031fc 100644
--- a/src/pkg/archive/tar/writer.go
+++ b/src/pkg/archive/tar/writer.go
@@ -28,7 +28,7 @@ var (
// writing at most hdr.Size bytes in total.
//
// Example:
-// tw := NewTarWriter(w);
+// tw := tar.NewWriter(w);
// hdr := new(Header);
// hdr.Size = length of data in bytes;
// // populate other hdr fields as desired
@@ -112,19 +112,19 @@ func (tw *Writer) WriteHeader(hdr *Header) os.Error {
// TODO(dsymonds): handle names longer than 100 chars
nr := bytes.Copy(s.next(100), strings.Bytes(hdr.Name));
- tw.octal(s.next(8), hdr.Mode);
- tw.octal(s.next(8), hdr.Uid);
- tw.octal(s.next(8), hdr.Gid);
- tw.octal(s.next(12), hdr.Size);
- tw.octal(s.next(12), hdr.Mtime);
- s.next(8); // chksum
- s.next(1)[0] = hdr.Typeflag;
- s.next(100); // linkname
- bytes.Copy(s.next(8), strings.Bytes("ustar\x0000"));
- tw.cString(s.next(32), hdr.Uname);
- tw.cString(s.next(32), hdr.Gname);
- tw.octal(s.next(8), hdr.Devmajor);
- tw.octal(s.next(8), hdr.Devminor);
+ tw.octal(s.next(8), hdr.Mode); // 100:108
+ tw.octal(s.next(8), hdr.Uid); // 108:116
+ tw.octal(s.next(8), hdr.Gid); // 116:124
+ tw.octal(s.next(12), hdr.Size); // 124:136
+ tw.octal(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)
+ bytes.Copy(s.next(8), strings.Bytes("ustar\x0000")); // 257:265
+ tw.cString(s.next(32), hdr.Uname); // 265:297
+ tw.cString(s.next(32), hdr.Gname); // 297:329
+ tw.octal(s.next(8), hdr.Devmajor); // 329:337
+ tw.octal(s.next(8), hdr.Devminor); // 337:345
// The chksum field is terminated by a NUL and a space.
// This is different from the other octal fields.
diff --git a/src/pkg/archive/tar/writer_test.go b/src/pkg/archive/tar/writer_test.go
index 202530a0f..5ada36b53 100644
--- a/src/pkg/archive/tar/writer_test.go
+++ b/src/pkg/archive/tar/writer_test.go
@@ -62,30 +62,39 @@ var writerTests = []*writerTest{
}
// Render byte array in a two-character hexadecimal string, spaced for easy visual inspection.
-func bytestr(b []byte) string {
- s := fmt.Sprintf("(%d bytes)\n", len(b));
+func bytestr(offset int, b []byte) string {
const rowLen = 32;
+ s := fmt.Sprintf("%04x ", offset);
for i, ch := range b {
- if i % rowLen == 0 {
- // start of line: hex offset
- s += fmt.Sprintf("%04x", i);
- }
switch {
case '0' <= ch && ch <= '9', 'A' <= ch && ch <= 'Z', 'a' <= ch && ch <= 'z':
s += fmt.Sprintf(" %c", ch);
default:
s += fmt.Sprintf(" %02x", ch);
}
- if (i + 1) % rowLen == 0 {
- // end of line
- s += "\n";
- } else if (i + 1) % (rowLen / 2) == 0 {
- // extra space
- s += " ";
- }
}
- if s[len(s)-1] != '\n' {
- s += "\n"
+ return s
+}
+
+// Render a pseudo-diff between two blocks of bytes.
+func bytediff(a []byte, b []byte) string {
+ const rowLen = 32;
+ s := fmt.Sprintf("(%d bytes vs. %d bytes)\n", len(a), len(b));
+ for offset := 0; len(a) + len(b) > 0; offset += rowLen {
+ na, nb := rowLen, rowLen;
+ if na > len(a) {
+ na = len(a);
+ }
+ if nb > len(b) {
+ nb = len(b);
+ }
+ sa := bytestr(offset, a[0:na]);
+ sb := bytestr(offset, b[0:nb]);
+ if sa != sb {
+ s += fmt.Sprintf("-%v\n+%v\n", sa, sb);
+ }
+ a = a[na:len(a)];
+ b = b[nb:len(b)];
}
return s
}
@@ -115,8 +124,8 @@ testLoop:
actual := buf.Data();
if !bytes.Equal(expected, actual) {
- t.Errorf("test %d: Incorrect result:\n%v\nwant:\n%v",
- i, bytestr(actual), bytestr(expected));
+ t.Errorf("test %d: Incorrect result: (-=expected, +=actual)\n%v",
+ i, bytediff(expected, actual));
}
}
}