diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
| commit | 7b15ed9ef455b6b66c6b376898a88aef5d6a9970 (patch) | |
| tree | 3ef530baa80cdf29436ba981f5783be6b4d2202b /src/pkg/archive | |
| parent | 50104cc32a498f7517a51c8dc93106c51c7a54b4 (diff) | |
| download | golang-7b15ed9ef455b6b66c6b376898a88aef5d6a9970.tar.gz | |
Imported Upstream version 2011.04.13upstream/2011.04.13
Diffstat (limited to 'src/pkg/archive')
| -rw-r--r-- | src/pkg/archive/tar/reader.go | 10 | ||||
| -rw-r--r-- | src/pkg/archive/tar/reader_test.go | 8 | ||||
| -rw-r--r-- | src/pkg/archive/tar/writer_test.go | 3 | ||||
| -rw-r--r-- | src/pkg/archive/zip/reader.go | 61 | ||||
| -rw-r--r-- | src/pkg/archive/zip/reader_test.go | 6 |
5 files changed, 57 insertions, 31 deletions
diff --git a/src/pkg/archive/tar/reader.go b/src/pkg/archive/tar/reader.go index 35a15f74b..0cfdf355d 100644 --- a/src/pkg/archive/tar/reader.go +++ b/src/pkg/archive/tar/reader.go @@ -27,13 +27,13 @@ var ( // tr := tar.NewReader(r) // for { // hdr, err := tr.Next() -// if err != nil { -// // handle error -// } -// if hdr == nil { +// if err == os.EOF { // // end of tar archive // break // } +// if err != nil { +// // handle error +// } // io.Copy(data, tr) // } type Reader struct { @@ -95,7 +95,7 @@ func (tr *Reader) skipUnread() { nr := tr.nb + tr.pad // number of bytes to skip tr.nb, tr.pad = 0, 0 if sr, ok := tr.r.(io.Seeker); ok { - if _, err := sr.Seek(nr, 1); err == nil { + if _, err := sr.Seek(nr, os.SEEK_CUR); err == nil { return } } diff --git a/src/pkg/archive/tar/reader_test.go b/src/pkg/archive/tar/reader_test.go index aa4c797fb..32fc8f915 100644 --- a/src/pkg/archive/tar/reader_test.go +++ b/src/pkg/archive/tar/reader_test.go @@ -113,7 +113,7 @@ var untarTests = []*untarTest{ func TestReader(t *testing.T) { testLoop: for i, test := range untarTests { - f, err := os.Open(test.file, os.O_RDONLY, 0444) + f, err := os.Open(test.file) if err != nil { t.Errorf("test %d: Unexpected error: %v", i, err) continue @@ -143,7 +143,7 @@ testLoop: } func TestPartialRead(t *testing.T) { - f, err := os.Open("testdata/gnu.tar", os.O_RDONLY, 0444) + f, err := os.Open("testdata/gnu.tar") if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -181,7 +181,7 @@ func TestPartialRead(t *testing.T) { func TestIncrementalRead(t *testing.T) { test := gnuTarTest - f, err := os.Open(test.file, os.O_RDONLY, 0444) + f, err := os.Open(test.file) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -235,7 +235,7 @@ func TestIncrementalRead(t *testing.T) { func TestNonSeekable(t *testing.T) { test := gnuTarTest - f, err := os.Open(test.file, os.O_RDONLY, 0444) + f, err := os.Open(test.file) if err != nil { t.Fatalf("Unexpected error: %v", err) } diff --git a/src/pkg/archive/tar/writer_test.go b/src/pkg/archive/tar/writer_test.go index 48b891140..838cb7e1f 100644 --- a/src/pkg/archive/tar/writer_test.go +++ b/src/pkg/archive/tar/writer_test.go @@ -150,5 +150,8 @@ testLoop: t.Errorf("test %d: Incorrect result: (-=expected, +=actual)\n%v", i, bytediff(expected, actual)) } + if testing.Short() { // The second test is expensive. + break + } } } diff --git a/src/pkg/archive/zip/reader.go b/src/pkg/archive/zip/reader.go index d8d9bba60..0391d6441 100644 --- a/src/pkg/archive/zip/reader.go +++ b/src/pkg/archive/zip/reader.go @@ -19,6 +19,7 @@ import ( "hash/crc32" "encoding/binary" "io" + "io/ioutil" "os" ) @@ -34,6 +35,11 @@ type Reader struct { Comment string } +type ReadCloser struct { + f *os.File + Reader +} + type File struct { FileHeader zipr io.ReaderAt @@ -46,43 +52,60 @@ func (f *File) hasDataDescriptor() bool { return f.Flags&0x8 != 0 } -// OpenReader will open the Zip file specified by name and return a Reader. -func OpenReader(name string) (*Reader, os.Error) { - f, err := os.Open(name, os.O_RDONLY, 0644) +// OpenReader will open the Zip file specified by name and return a ReaderCloser. +func OpenReader(name string) (*ReadCloser, os.Error) { + f, err := os.Open(name) if err != nil { return nil, err } fi, err := f.Stat() if err != nil { + f.Close() return nil, err } - return NewReader(f, fi.Size) + r := new(ReadCloser) + if err := r.init(f, fi.Size); err != nil { + f.Close() + return nil, err + } + return r, nil } // NewReader returns a new Reader reading from r, which is assumed to // have the given size in bytes. func NewReader(r io.ReaderAt, size int64) (*Reader, os.Error) { - end, err := readDirectoryEnd(r, size) - if err != nil { + zr := new(Reader) + if err := zr.init(r, size); err != nil { return nil, err } - z := &Reader{ - r: r, - File: make([]*File, end.directoryRecords), - Comment: end.comment, + return zr, nil +} + +func (z *Reader) init(r io.ReaderAt, size int64) os.Error { + end, err := readDirectoryEnd(r, size) + if err != nil { + return err } + z.r = r + z.File = make([]*File, end.directoryRecords) + z.Comment = end.comment rs := io.NewSectionReader(r, 0, size) - if _, err = rs.Seek(int64(end.directoryOffset), 0); err != nil { - return nil, err + if _, err = rs.Seek(int64(end.directoryOffset), os.SEEK_SET); err != nil { + return err } buf := bufio.NewReader(rs) for i := range z.File { z.File[i] = &File{zipr: r, zipsize: size} if err := readDirectoryHeader(z.File[i], buf); err != nil { - return nil, err + return err } } - return z, nil + return nil +} + +// Close closes the Zip file, rendering it unusable for I/O. +func (rc *ReadCloser) Close() os.Error { + return rc.f.Close() } // Open returns a ReadCloser that provides access to the File's contents. @@ -93,7 +116,7 @@ func (f *File) Open() (rc io.ReadCloser, err os.Error) { if err = readFileHeader(f, r); err != nil { return } - if f.bodyOffset, err = r.Seek(0, 1); err != nil { + if f.bodyOffset, err = r.Seek(0, os.SEEK_CUR); err != nil { return } } @@ -109,7 +132,7 @@ func (f *File) Open() (rc io.ReadCloser, err os.Error) { r := io.NewSectionReader(f.zipr, off+f.bodyOffset, size) switch f.Method { case 0: // store (no compression) - rc = nopCloser{r} + rc = ioutil.NopCloser(r) case 8: // DEFLATE rc = flate.NewReader(r) default: @@ -147,12 +170,6 @@ func (r *checksumReader) Read(b []byte) (n int, err os.Error) { func (r *checksumReader) Close() os.Error { return r.rc.Close() } -type nopCloser struct { - io.Reader -} - -func (f nopCloser) Close() os.Error { return nil } - func readFileHeader(f *File, r io.Reader) (err os.Error) { defer func() { if rerr, ok := recover().(os.Error); ok { diff --git a/src/pkg/archive/zip/reader_test.go b/src/pkg/archive/zip/reader_test.go index 72e8cccfd..c72cd9a23 100644 --- a/src/pkg/archive/zip/reader_test.go +++ b/src/pkg/archive/zip/reader_test.go @@ -76,6 +76,12 @@ func readTestZip(t *testing.T, zt ZipTest) { return } + // bail if file is not zip + if err == FormatError { + return + } + defer z.Close() + // bail here if no Files expected to be tested // (there may actually be files in the zip, but we don't care) if zt.File == nil { |
