]> Cypherpunks repositories - gostls13.git/commitdiff
archive/zip: add Writer.Flush
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 1 Sep 2014 04:32:13 +0000 (21:32 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 1 Sep 2014 04:32:13 +0000 (21:32 -0700)
This is needed for callers to be able to keep track of the
writing position within a zip file. Otherwise it's not
possible to compute the size of headers, and the TOC isn't
written until the very end.

LGTM=adg
R=adg
CC=golang-codereviews
https://golang.org/cl/134210043

src/pkg/archive/zip/writer.go
src/pkg/archive/zip/writer_test.go

index 6c9800a78f7fae2f9eaa8734f0dada11de5e960c..170beec0eec3fe8a76c96f8f8752afd7d3c6ee8e 100644 (file)
@@ -34,6 +34,12 @@ func NewWriter(w io.Writer) *Writer {
        return &Writer{cw: &countWriter{w: bufio.NewWriter(w)}}
 }
 
+// Flush flushes any buffered data to the underlying writer.
+// Calling Flush is not normally necessary; calling Close is sufficient.
+func (w *Writer) Flush() error {
+       return w.cw.w.(*bufio.Writer).Flush()
+}
+
 // Close finishes writing the zip file by writing the central directory.
 // It does not (and can not) close the underlying writer.
 func (w *Writer) Close() error {
index 4bfa87080906e1d8176de54947a0efea2e701dce..184a7d96a7f2bb331d35a77932de8e4189dd38a5 100644 (file)
@@ -6,6 +6,7 @@ package zip
 
 import (
        "bytes"
+       "io"
        "io/ioutil"
        "math/rand"
        "os"
@@ -86,6 +87,24 @@ func TestWriter(t *testing.T) {
        }
 }
 
+func TestWriterFlush(t *testing.T) {
+       var buf bytes.Buffer
+       w := NewWriter(struct{ io.Writer }{&buf})
+       _, err := w.Create("foo")
+       if err != nil {
+               t.Fatal(err)
+       }
+       if buf.Len() > 0 {
+               t.Fatalf("Unexpected %d bytes already in buffer", buf.Len())
+       }
+       if err := w.Flush(); err != nil {
+               t.Fatal(err)
+       }
+       if buf.Len() == 0 {
+               t.Fatal("No bytes written after Flush")
+       }
+}
+
 func testCreate(t *testing.T, w *Writer, wt *WriteTest) {
        header := &FileHeader{
                Name:   wt.Name,