diff options
author | Steve Manuel <nilslice@gmail.com> | 2019-01-01 17:07:04 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-01 17:07:04 -0600 |
commit | 584a06456960231eed5171948dcc604980289e42 (patch) | |
tree | eeb25f29f2de528367e6549304a7ad36a063f841 | |
parent | 222b13ae9181160e610fa7afa738f1900e6fa374 (diff) | |
parent | f91b4299660629cc3befbb1abcd80526a54abb1a (diff) |
Merge pull request #292 from ponzu-cms/ponzu-dev
backup: follow symlinks when archiving
-rw-r--r-- | system/admin/upload/backup.go | 3 | ||||
-rw-r--r-- | system/backup/archive.go | 21 | ||||
-rw-r--r-- | system/search/backup.go | 5 |
3 files changed, 27 insertions, 2 deletions
diff --git a/system/admin/upload/backup.go b/system/admin/upload/backup.go index 9dc9e31..d9bc4fb 100644 --- a/system/admin/upload/backup.go +++ b/system/admin/upload/backup.go @@ -27,6 +27,9 @@ func Backup(ctx context.Context, res http.ResponseWriter) error { } err = backup.ArchiveFS(ctx, "uploads", f) + if err != nil { + return err + } err = f.Close() if err != nil { diff --git a/system/backup/archive.go b/system/backup/archive.go index 0a8b964..c970abd 100644 --- a/system/backup/archive.go +++ b/system/backup/archive.go @@ -16,6 +16,25 @@ func ArchiveFS(ctx context.Context, basedir string, w io.Writer) error { gz := gzip.NewWriter(w) tarball := tar.NewWriter(gz) + absPath, err := filepath.Abs(basedir) + if err != nil { + return err + } + + info, err := os.Lstat(absPath) + if err != nil { + return err + } + + if info.Mode()&os.ModeSymlink == os.ModeSymlink { + // This is a symlink - we need to follow it + bdir, err := os.Readlink(absPath) + if err != nil { + return err + } + basedir = bdir + } + errChan := make(chan error, 1) walkFn := func(path string, info os.FileInfo, err error) error { if err != nil { @@ -61,7 +80,7 @@ func ArchiveFS(ctx context.Context, basedir string, w io.Writer) error { } // stop processing if we get a cancellation signal - err := filepath.Walk(basedir, func(path string, info os.FileInfo, err error) error { + err = filepath.Walk(basedir, func(path string, info os.FileInfo, err error) error { go func() { errChan <- walkFn(path, info, err) }() select { diff --git a/system/search/backup.go b/system/search/backup.go index 9223636..4017b15 100644 --- a/system/search/backup.go +++ b/system/search/backup.go @@ -26,7 +26,10 @@ func Backup(ctx context.Context, res http.ResponseWriter) error { return err } - backup.ArchiveFS(ctx, "search", f) + err = backup.ArchiveFS(ctx, "search", f) + if err != nil { + return err + } err = f.Close() if err != nil { |