diff --git a/changelog/unreleased/pull-5054 b/changelog/unreleased/pull-5054 index 7b5291e2d..6efd5882c 100644 --- a/changelog/unreleased/pull-5054 +++ b/changelog/unreleased/pull-5054 @@ -1,10 +1,7 @@ -Enhancement: Add `--compress` flag to `dump` command to compress archive +Enhancement: Compress ZIP archives created by `dump` command -Restic did not compress the archives that was created by using the -`dump` command. It now allows to save some disk space when exporting -archives by adding a `--compress` flag. The DEFLATE algorithm is used -for "zip" archives, and the gzip algorithm for "tar" archives, -resulting in a .tar.gz or .tgz file. Not compressing the archive -is still the default. +Restic did not compress the archives that were created by using +the `dump` command. It now saves some disk space when exporting +archives using the DEFLATE algorithm for "zip" archives. https://github.com/restic/restic/pull/5054 diff --git a/cmd/restic/cmd_dump.go b/cmd/restic/cmd_dump.go index 23c502635..6b7f8d012 100644 --- a/cmd/restic/cmd_dump.go +++ b/cmd/restic/cmd_dump.go @@ -50,9 +50,8 @@ Exit status is 12 if the password is incorrect. // DumpOptions collects all options for the dump command. type DumpOptions struct { restic.SnapshotFilter - Archive string - Target string - Compress bool + Archive string + Target string } var dumpOptions DumpOptions @@ -64,7 +63,6 @@ func init() { initSingleSnapshotFilter(flags, &dumpOptions.SnapshotFilter) flags.StringVarP(&dumpOptions.Archive, "archive", "a", "tar", "set archive `format` as \"tar\" or \"zip\"") flags.StringVarP(&dumpOptions.Target, "target", "t", "", "write the output to target `path`") - flags.BoolVarP(&dumpOptions.Compress, "compress", "c", false, "compress archive contents. When enabled, the DEFLATE algorithm is applied for \"zip\" archives, and the gzip algorithm for \"tar\" archives, resulting in a .tar.gz or .tgz file. (default: false)") } func splitPath(p string) []string { @@ -189,7 +187,7 @@ func runDump(ctx context.Context, opts DumpOptions, gopts GlobalOptions, args [] canWriteArchiveFunc = func() error { return nil } } - d := dump.New(opts.Archive, opts.Compress, repo, outputFileWriter) + d := dump.New(opts.Archive, repo, outputFileWriter) err = printFromTree(ctx, tree, repo, "/", splittedPath, d, canWriteArchiveFunc) if err != nil { return errors.Fatalf("cannot dump file: %v", err) diff --git a/internal/dump/common.go b/internal/dump/common.go index 619e946e9..4bc404fe0 100644 --- a/internal/dump/common.go +++ b/internal/dump/common.go @@ -15,20 +15,18 @@ import ( // A Dumper writes trees and files from a repository to a Writer // in an archive format. type Dumper struct { - cache *bloblru.Cache - format string - repo restic.Loader - w io.Writer - compress bool + cache *bloblru.Cache + format string + repo restic.Loader + w io.Writer } -func New(format string, compress bool, repo restic.Loader, w io.Writer) *Dumper { +func New(format string, repo restic.Loader, w io.Writer) *Dumper { return &Dumper{ - cache: bloblru.New(64 << 20), - format: format, - repo: repo, - w: w, - compress: compress, + cache: bloblru.New(64 << 20), + format: format, + repo: repo, + w: w, } } diff --git a/internal/dump/common_test.go b/internal/dump/common_test.go index f581e31cb..afd19df63 100644 --- a/internal/dump/common_test.go +++ b/internal/dump/common_test.go @@ -23,7 +23,7 @@ func prepareTempdirRepoSrc(t testing.TB, src archiver.TestDir) (string, restic.R type CheckDump func(t *testing.T, testDir string, testDump *bytes.Buffer) error -func WriteTest(t *testing.T, format string, compress bool, cd CheckDump) { +func WriteTest(t *testing.T, format string, cd CheckDump) { tests := []struct { name string args archiver.TestDir @@ -85,7 +85,7 @@ func WriteTest(t *testing.T, format string, compress bool, cd CheckDump) { rtest.OK(t, err) dst := &bytes.Buffer{} - d := New(format, compress, repo, dst) + d := New(format, repo, dst) if err := d.DumpTree(ctx, tree, tt.target); err != nil { t.Fatalf("Dumper.Run error = %v", err) } diff --git a/internal/dump/tar.go b/internal/dump/tar.go index 0358fba5d..c5933d4f8 100644 --- a/internal/dump/tar.go +++ b/internal/dump/tar.go @@ -2,7 +2,6 @@ package dump import ( "archive/tar" - "compress/gzip" "context" "fmt" "os" @@ -14,22 +13,12 @@ import ( ) func (d *Dumper) dumpTar(ctx context.Context, ch <-chan *restic.Node) (err error) { - outer := d.w - - if d.compress { - outer = gzip.NewWriter(outer) - } - w := tar.NewWriter(outer) + w := tar.NewWriter(d.w) defer func() { if err == nil { err = w.Close() err = errors.Wrap(err, "Close") - - if gz, ok := outer.(*gzip.Writer); ok { - err = gz.Close() - err = errors.Wrap(err, "Close") - } } }() diff --git a/internal/dump/tar_test.go b/internal/dump/tar_test.go index ae575efad..cb3cb08c4 100644 --- a/internal/dump/tar_test.go +++ b/internal/dump/tar_test.go @@ -18,8 +18,7 @@ import ( ) func TestWriteTar(t *testing.T) { - WriteTest(t, "tar", false, checkTar) - WriteTest(t, "tar", true, checkTar) + WriteTest(t, "tar", checkTar) } func checkTar(t *testing.T, testDir string, srcTar *bytes.Buffer) error { diff --git a/internal/dump/zip.go b/internal/dump/zip.go index 0d210eaa1..6041c5187 100644 --- a/internal/dump/zip.go +++ b/internal/dump/zip.go @@ -39,10 +39,7 @@ func (d *Dumper) dumpNodeZip(ctx context.Context, node *restic.Node, zw *zip.Wri Modified: node.ModTime, } header.SetMode(node.Mode) - - if d.compress { - header.Method = zip.Deflate - } + header.Method = zip.Deflate if node.Type == restic.NodeTypeDir { header.Name += "/" diff --git a/internal/dump/zip_test.go b/internal/dump/zip_test.go index ab955858c..6f5f60f54 100644 --- a/internal/dump/zip_test.go +++ b/internal/dump/zip_test.go @@ -12,8 +12,7 @@ import ( ) func TestWriteZip(t *testing.T) { - WriteTest(t, "zip", true, checkZip) - WriteTest(t, "zip", false, checkZip) + WriteTest(t, "zip", checkZip) } func readZipFile(f *zip.File) ([]byte, error) {