Skip to content

Commit 3346ae5

Browse files
authored
Merge pull request #39 from saracen/buffer-size-zero
A buffer size of zero uses no buffer, rather than default size
2 parents c9c62b3 + 3a7293c commit 3346ae5

File tree

5 files changed

+24
-27
lines changed

5 files changed

+24
-27
lines changed

archiver.go

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ func NewArchiver(w io.Writer, chroot string, opts ...ArchiverOption) (*Archiver,
6565
a.options.method = zip.Deflate
6666
a.options.concurrency = runtime.NumCPU()
6767
a.options.stageDir = chroot
68+
a.options.bufferSize = -1
6869
for _, o := range opts {
6970
err := o(&a.options)
7071
if err != nil {

archiver_options.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66

77
var (
88
ErrMinConcurrency = errors.New("concurrency must be at least 1")
9-
ErrMinBufferSize = errors.New("buffer size option cannot be less than -1")
109
)
1110

1211
// ArchiverOption is an option used when creating an archiver.
@@ -45,13 +44,10 @@ func WithArchiverConcurrency(n int) ArchiverOption {
4544
// temporary file is written (to the stage directory) to hold the additional
4645
// data. The default is 2 mebibytes, so if concurrency is 16, 32 mebibytes of
4746
// memory will be allocated.
48-
//
49-
// If set to -1, no buffer will be used and all compressed file content will be
50-
// written to temporary files before being written back to the zip file.
5147
func WithArchiverBufferSize(n int) ArchiverOption {
5248
return func(o *archiverOptions) error {
53-
if n < -1 {
54-
return ErrMinBufferSize
49+
if n < 0 {
50+
n = 0
5551
}
5652
o.bufferSize = n
5753
return nil

archiver_test.go

+16-13
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func TestArchive(t *testing.T) {
110110

111111
tests := map[string][]ArchiverOption{
112112
"default options": nil,
113-
"no buffer": {WithArchiverBufferSize(-1)},
113+
"no buffer": {WithArchiverBufferSize(0)},
114114
"with store": {WithArchiverMethod(zip.Store)},
115115
"with concurrency 2": {WithArchiverConcurrency(2)},
116116
}
@@ -316,17 +316,20 @@ func TestArchiveWithConcurrency(t *testing.T) {
316316

317317
func TestArchiveWithBufferSize(t *testing.T) {
318318
testFiles := map[string]testFile{
319-
"foo.go": {mode: 0666},
320-
"bar.go": {mode: 0666},
319+
"foobar.go": {mode: 0666},
320+
"compressible": {mode: 0666, contents: "11111111111111111111111111111111111111111111111111"},
321+
"uncompressible": {mode: 0666, contents: "A3#bez&OqCusPr)d&D]Vot9Eo0z^5O*VZm3:sO3HptL.H-4cOv"},
322+
"empty_dir": {mode: os.ModeDir | 0777},
323+
"large_file": {mode: 0666, contents: strings.Repeat("abcdefzmkdldjsdfkjsdfsdfiqwpsdfa", 65536)},
321324
}
322325

323326
tests := []struct {
324327
buffersize int
325-
pass bool
328+
zero bool
326329
}{
327330
{-100, false},
328331
{-2, false},
329-
{-1, true},
332+
{-1, false},
330333
{0, true},
331334
{32 * 1024, true},
332335
{64 * 1024, true},
@@ -343,18 +346,18 @@ func TestArchiveWithBufferSize(t *testing.T) {
343346
defer f.Close()
344347

345348
a, err := NewArchiver(f, dir, WithArchiverBufferSize(test.buffersize))
346-
if !test.pass {
347-
require.Error(t, err)
348-
return
349-
}
350-
351349
require.NoError(t, err)
352350
require.NoError(t, a.Archive(context.Background(), files))
353351
require.NoError(t, a.Close())
354352

355-
bytes, entries := a.Written()
356-
require.EqualValues(t, 0, bytes)
357-
require.EqualValues(t, 3, entries)
353+
if !test.zero {
354+
require.Equal(t, 0, a.options.bufferSize)
355+
} else {
356+
require.Equal(t, test.buffersize, a.options.bufferSize)
357+
}
358+
359+
_, entries := a.Written()
360+
require.EqualValues(t, 6, entries)
358361

359362
testExtract(t, f.Name(), testFiles)
360363
}()

internal/filepool/filepool.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,7 @@ func New(dir string, poolSize int, bufferSize int) (*FilePool, error) {
5757
fp.files = make([]*File, poolSize)
5858
fp.limiter = make(chan int, poolSize)
5959

60-
switch bufferSize {
61-
case -1:
62-
bufferSize = 0
63-
case 0:
60+
if bufferSize < 0 {
6461
bufferSize = defaultBufferSize
6562
}
6663

internal/filepool/filepool_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestFilePoolSizes(t *testing.T) {
3131
require.NoError(t, err)
3232
defer os.RemoveAll(dir)
3333

34-
fp, err := New(dir, tc.size, -1)
34+
fp, err := New(dir, tc.size, 0)
3535
require.Equal(t, tc.err, err)
3636
if tc.err != nil {
3737
return
@@ -63,7 +63,7 @@ func TestFilePoolReset(t *testing.T) {
6363
require.NoError(t, err)
6464
defer os.RemoveAll(dir)
6565

66-
fp, err := New(dir, 16, -1)
66+
fp, err := New(dir, 16, 0)
6767
require.NoError(t, err)
6868
for i := range fp.files {
6969
file := fp.Get()
@@ -102,7 +102,7 @@ func TestFilePoolCloseError(t *testing.T) {
102102
require.NoError(t, err)
103103
defer os.RemoveAll(dir)
104104

105-
fp, err := New(dir, 16, -1)
105+
fp, err := New(dir, 16, 0)
106106
require.NoError(t, err)
107107

108108
for _, file := range fp.files {
@@ -135,7 +135,7 @@ func TestFilePoolNoErrorOnAlreadyDeleted(t *testing.T) {
135135
dir, err := ioutil.TempDir("", "fastzip-filepool")
136136
require.NoError(t, err)
137137

138-
fp, err := New(dir, 16, -1)
138+
fp, err := New(dir, 16, 0)
139139
require.NoError(t, err)
140140

141141
for range fp.files {

0 commit comments

Comments
 (0)