diff options
author | Viktoras Kuznecovas <viktoras@kuznecovas.net> | 2018-11-12 22:06:07 +0200 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2019-01-01 16:06:11 -0700 |
commit | 7ff15eacabd5ceafdffedb5ee20dad1b2950f49e (patch) | |
tree | 31b3b801fdf9d101e758019ca2ecd3d0c366f1b2 | |
parent | 222b13ae9181160e610fa7afa738f1900e6fa374 (diff) |
follow symlinks when archiving
-rw-r--r-- | system/backup/archive.go | 21 |
1 files changed, 20 insertions, 1 deletions
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 { |