-
-
Notifications
You must be signed in to change notification settings - Fork 182
/
snapshot.go
49 lines (43 loc) · 937 Bytes
/
snapshot.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package snapshot
import (
"io/fs"
"os"
"path/filepath"
"github.com/livebud/bud/internal/dirhash"
"github.com/livebud/bud/internal/targz"
)
func cachePath(key string) (string, error) {
dir := filepath.Join(os.TempDir(), "bud", "snapshot")
if err := os.MkdirAll(dir, 0755); err != nil {
return "", err
}
return filepath.Join(dir, key+".tar.gz"), nil
}
// Hash a filesystem
func Hash(fsys fs.FS) (string, error) {
return dirhash.Hash(fsys)
}
// Backup a filesystem
func Backup(hash string, fsys fs.FS) error {
path, err := cachePath(hash)
if err != nil {
return err
}
data, err := targz.Zip(fsys)
if err != nil {
return err
}
return os.WriteFile(path, data, 0644)
}
// Restore a filesystem from a hash
func Restore(hash string) (fs.FS, error) {
path, err := cachePath(hash)
if err != nil {
return nil, err
}
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
return targz.Unzip(data)
}