-
Notifications
You must be signed in to change notification settings - Fork 3
/
list.go
63 lines (51 loc) · 1.47 KB
/
list.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
package s3
import (
"fmt"
"path/filepath"
"sort"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/ravbaker/pact-contractor/internal/speccontext"
)
func List(bucket, region, path, specTag string) error {
prefix := preparePrefix(path)
pathPattern := strings.Replace(path, ".", "/*.", 1)
client := NewClient(region)
var contracts []*s3.Object
err := client.ListObjectsPages(&s3.ListObjectsInput{
Bucket: aws.String(bucket),
Prefix: aws.String(prefix),
},
func(page *s3.ListObjectsOutput, lastPage bool) bool {
contracts = append(contracts, page.Contents...)
return len(page.Contents) == int(*page.MaxKeys)
})
if err != nil {
return err
}
sort.Slice(contracts, func(i, j int) bool {
return contracts[i].LastModified.After(*contracts[j].LastModified)
})
var matchedPattern, matched bool
for _, contract := range contracts {
matchedPattern, err = filepath.Match(pathPattern, *contract.Key)
matched, err = filepath.Match(path, *contract.Key)
if matchedPattern || matched {
fmt.Printf("%s\t%s\n", contract.LastModified, *contract.Key)
}
}
return nil
}
func preparePrefix(path string) (prefix string) {
if strings.Contains(path, "*") {
components := strings.SplitN(path, "*", 2)
prefix = components[0]
} else {
ext := filepath.Ext(path)
prefix = strings.TrimSuffix(path, ext)
}
prefix = strings.Replace(prefix, speccontext.BranchSpecTag, "", -1)
prefix = strings.TrimRight(prefix, "/")
return
}