sort static tags by desc time
This commit is contained in:
parent
40fd4646ce
commit
a9e4924228
1 changed files with 96 additions and 18 deletions
114
cmd/static.go
114
cmd/static.go
|
@ -10,7 +10,9 @@ import (
|
|||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"gocloud.dev/blob"
|
||||
|
@ -39,11 +41,6 @@ type RegistryPlatform struct {
|
|||
OS string `json:"os"`
|
||||
}
|
||||
|
||||
type Manifest struct {
|
||||
Name string `json:"name"`
|
||||
Tags []string `json:"tags"`
|
||||
}
|
||||
|
||||
//---
|
||||
//--- Collect data on the filesystem
|
||||
type Platform struct {
|
||||
|
@ -137,13 +134,6 @@ func NewArtifact(nametag, path string) (Artifact, error) {
|
|||
return ar, nil
|
||||
}
|
||||
|
||||
func (a *Artifact) UpdateManifest() Manifest {
|
||||
return Manifest{
|
||||
Name: a.Name,
|
||||
Tags: []string{a.Tag}, //@FIXME we must fetch the other tags of the repo
|
||||
}
|
||||
}
|
||||
|
||||
func (a *Artifact) BuildTag() Tag {
|
||||
t := Tag{Flavors: []Flavor{}}
|
||||
for _, p := range a.Platforms {
|
||||
|
@ -186,20 +176,100 @@ func (a *Artifact) Upload(buck *blob.Bucket) error {
|
|||
return err
|
||||
}
|
||||
fmt.Printf("tag -> %s\n", remoteTagPath)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Update manifest
|
||||
manifest := a.UpdateManifest()
|
||||
mjson, err := json.Marshal(manifest)
|
||||
//--- Manage uploaded artifacts, list them, etc.
|
||||
type ArtifactDescriptor struct {
|
||||
Tag string
|
||||
Date time.Time
|
||||
}
|
||||
type ArtifactManager struct {
|
||||
name string
|
||||
buck *blob.Bucket
|
||||
artifacts []ArtifactDescriptor
|
||||
}
|
||||
|
||||
func NewArtifactManager(buck *blob.Bucket, name string) *ArtifactManager {
|
||||
return &ArtifactManager{
|
||||
buck: buck,
|
||||
name: name,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func (am *ArtifactManager) Scan() error {
|
||||
iter := am.buck.List(&blob.ListOptions{
|
||||
Prefix: fmt.Sprintf("df-dist-v1/%s/", am.name),
|
||||
Delimiter: "/",
|
||||
})
|
||||
|
||||
for {
|
||||
obj, err := iter.Next(context.Background())
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if obj.IsDir {
|
||||
continue
|
||||
}
|
||||
ksplit := strings.Split(obj.Key, "/")
|
||||
if len(ksplit) < 1 {
|
||||
return errors.New(fmt.Sprintf("Invalid key name %s", obj.Key))
|
||||
}
|
||||
fname := ksplit[len(ksplit)-1]
|
||||
|
||||
ad := ArtifactDescriptor {
|
||||
Tag: fname,
|
||||
Date: obj.ModTime,
|
||||
}
|
||||
|
||||
am.artifacts = append(am.artifacts, ad)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (am *ArtifactManager) TagList() TagList {
|
||||
// Sort by date desc
|
||||
sort.Slice(am.artifacts, func(i, j int) bool {
|
||||
return am.artifacts[i].Date.After(am.artifacts[j].Date)
|
||||
})
|
||||
|
||||
// Build tagList
|
||||
tagList := TagList {
|
||||
Name: am.name,
|
||||
}
|
||||
for _, art := range am.artifacts {
|
||||
tagList.Tags = append(tagList.Tags, art.Tag)
|
||||
}
|
||||
return tagList
|
||||
}
|
||||
|
||||
|
||||
func (am *ArtifactManager) UpdateTagList() error {
|
||||
fmt.Printf("--- update taglist ---\n")
|
||||
|
||||
err := am.Scan()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
remoteManifestPath := path.Join(prefix, a.Name)
|
||||
if err := NewUploadFromByte(buck, mjson).UploadTo(remoteManifestPath); err != nil {
|
||||
tagList := am.TagList()
|
||||
fmt.Printf("computed tag list: %v\n", tagList)
|
||||
|
||||
txt, err := json.Marshal(tagList)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("manifest -> %s\n", remoteManifestPath)
|
||||
|
||||
dst := path.Join("df-dist-v1", am.name)
|
||||
err = NewUploadFromByte(am.buck, txt).ContentType("application/json").UploadTo(dst)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("taglist -> %s\n", dst)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -313,6 +383,14 @@ var publishCmd = &cobra.Command{
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
// update tag list
|
||||
am := NewArtifactManager(bucket, art.Name)
|
||||
err = am.UpdateTagList()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
fmt.Printf("✅ push succeeded\n")
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue