forked from helm/chartmuseum
-
Notifications
You must be signed in to change notification settings - Fork 0
/
storage.go
88 lines (79 loc) · 1.93 KB
/
storage.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package storage
import (
"fmt"
"path/filepath"
"strings"
"time"
)
type (
// Object is a generic representation of a storage object
Object struct {
Path string
Content []byte
LastModified time.Time
}
// ObjectSliceDiff provides information on what has changed since last calling ListObjects
ObjectSliceDiff struct {
Change bool
Removed []Object
Added []Object
Updated []Object
}
// Backend is a generic interface for storage backends
Backend interface {
ListObjects() ([]Object, error)
GetObject(path string) (Object, error)
PutObject(path string, content []byte) error
DeleteObject(path string) error
}
)
// HasExtension determines whether or not an object contains a file extension
func (object Object) HasExtension(extension string) bool {
return filepath.Ext(object.Path) == fmt.Sprintf(".%s", extension)
}
// GetObjectSliceDiff takes two objects slices and returns an ObjectSliceDiff
func GetObjectSliceDiff(os1 []Object, os2 []Object) ObjectSliceDiff {
var diff ObjectSliceDiff
for _, o1 := range os1 {
found := false
for _, o2 := range os2 {
if o1.Path == o2.Path {
found = true
if o1.LastModified != o2.LastModified {
diff.Updated = append(diff.Updated, o2)
}
break
}
}
if !found {
diff.Removed = append(diff.Removed, o1)
}
}
for _, o2 := range os2 {
found := false
for _, o1 := range os1 {
if o2.Path == o1.Path {
found = true
break
}
}
if !found {
diff.Added = append(diff.Added, o2)
}
}
diff.Change = len(diff.Removed)+len(diff.Added)+len(diff.Updated) > 0
return diff
}
func cleanPrefix(prefix string) string {
return strings.Trim(prefix, "/")
}
func removePrefixFromObjectPath(prefix string, path string) string {
if prefix == "" {
return path
}
path = strings.Replace(path, fmt.Sprintf("%s/", prefix), "", 1)
return path
}
func objectPathIsInvalid(path string) bool {
return strings.Contains(path, "/") || path == ""
}