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"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gocloud.dev/blob"
|
"gocloud.dev/blob"
|
||||||
|
@ -39,11 +41,6 @@ type RegistryPlatform struct {
|
||||||
OS string `json:"os"`
|
OS string `json:"os"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Manifest struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
Tags []string `json:"tags"`
|
|
||||||
}
|
|
||||||
|
|
||||||
//---
|
//---
|
||||||
//--- Collect data on the filesystem
|
//--- Collect data on the filesystem
|
||||||
type Platform struct {
|
type Platform struct {
|
||||||
|
@ -137,13 +134,6 @@ func NewArtifact(nametag, path string) (Artifact, error) {
|
||||||
return ar, nil
|
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 {
|
func (a *Artifact) BuildTag() Tag {
|
||||||
t := Tag{Flavors: []Flavor{}}
|
t := Tag{Flavors: []Flavor{}}
|
||||||
for _, p := range a.Platforms {
|
for _, p := range a.Platforms {
|
||||||
|
@ -186,20 +176,100 @@ func (a *Artifact) Upload(buck *blob.Bucket) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Printf("tag -> %s\n", remoteTagPath)
|
fmt.Printf("tag -> %s\n", remoteTagPath)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Update manifest
|
//--- Manage uploaded artifacts, list them, etc.
|
||||||
manifest := a.UpdateManifest()
|
type ArtifactDescriptor struct {
|
||||||
mjson, err := json.Marshal(manifest)
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteManifestPath := path.Join(prefix, a.Name)
|
tagList := am.TagList()
|
||||||
if err := NewUploadFromByte(buck, mjson).UploadTo(remoteManifestPath); err != nil {
|
fmt.Printf("computed tag list: %v\n", tagList)
|
||||||
|
|
||||||
|
txt, err := json.Marshal(tagList)
|
||||||
|
if err != nil {
|
||||||
return err
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -313,6 +383,14 @@ var publishCmd = &cobra.Command{
|
||||||
os.Exit(1)
|
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")
|
fmt.Printf("✅ push succeeded\n")
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue