-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
copy.go
69 lines (59 loc) · 1.31 KB
/
copy.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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package vault
import "github.com/pkg/errors"
// Copy data from a vault.Store to another vault.Store.
// It copies raw data, it doesn't need to be unlocked.
func Copy(from Store, to Store, opt ...CopyOption) ([]string, error) {
opts := newCopyOptions(opt...)
entries, err := from.List(nil)
if err != nil {
return nil, err
}
added := []string{}
for _, entry := range entries {
path, b := entry.Path, entry.Data
data, err := to.Get(path)
if err != nil {
return nil, err
}
if data != nil {
if opts.SkipExisting {
continue
} else {
return nil, errors.Errorf("failed to copy: already exists %s", path)
}
}
if !opts.DryRun {
if err := to.Set(path, b); err != nil {
return nil, err
}
}
added = append(added, path)
}
return added, nil
}
// CopyOption ...
type CopyOption func(*CopyOptions)
// CopyOptions ...
type CopyOptions struct {
SkipExisting bool
DryRun bool
}
func newCopyOptions(opts ...CopyOption) CopyOptions {
var options CopyOptions
for _, o := range opts {
o(&options)
}
return options
}
// SkipExisting to skip existing entries, otherwise error.
func SkipExisting() CopyOption {
return func(o *CopyOptions) {
o.SkipExisting = true
}
}
// DryRun to pretend to copy.
func DryRun() CopyOption {
return func(o *CopyOptions) {
o.DryRun = true
}
}