1
0

provide fallback upload-spec

just in case
This commit is contained in:
Konstantin Demin 2024-02-26 19:07:23 +03:00
parent 19d2dcd19b
commit 1f8607b0a7
Signed by: krd
GPG Key ID: 1F33CB0BA4731BC6
3 changed files with 161 additions and 18 deletions

View File

@ -19,8 +19,10 @@ type Plugin struct {
AuthHeader string
AuthValue string
UploadSpecs map[string]UploadSpec
Uploads []UploadRule
UploadSpecs map[string]UploadSpec
UploadSpecFallback bool
Uploads []UploadRule
}
func main() {

115
upload-spec-fallback.go Normal file
View File

@ -0,0 +1,115 @@
package main
import (
"github.com/rs/zerolog/log"
)
var (
// keep map keys sorted
fallbackUploadSpec = map[string]UploadSpec{
"maven2": {
MultipleUpload: true,
ComponentFields: []UploadField{
{
Name: "groupId",
Type: String,
},
{
Name: "artifactId",
Type: String,
},
{
Name: "version",
Type: String,
},
{
Name: "generate-pom",
Type: Boolean,
Optional: true,
},
{
Name: "packaging",
Type: String,
Optional: true,
},
},
AssetFields: []UploadField{
{
Name: "extension",
Type: String,
},
{
Name: "classifier",
Type: String,
Optional: true,
},
},
},
"r": {
AssetFields: []UploadField{
{
Name: "pathId",
Type: String,
},
},
},
"raw": {
MultipleUpload: true,
ComponentFields: []UploadField{
{
Name: "directory",
Type: String,
},
},
AssetFields: []UploadField{
{
Name: "filename",
Type: String,
},
},
},
"yum": {
ComponentFields: []UploadField{
{
Name: "directory",
Type: String,
Optional: true,
},
},
AssetFields: []UploadField{
{
Name: "filename",
Type: String,
},
},
},
}
// keep array values sorted
fallbackSimpleSpecs = []string{
"apt",
"docker",
"helm",
"npm",
"nuget",
"pypi",
"rubygems",
}
)
func prepareFallbackUploadSpec() {
for _, t := range fallbackSimpleSpecs {
_, seen := fallbackUploadSpec[t]
if seen {
log.Warn().Msgf("fallback upload-spec for %q is already present!", t)
continue
}
fallbackUploadSpec[t] = UploadSpec{}
}
for t, spec := range fallbackUploadSpec {
spec.Format = t
}
}

View File

@ -46,25 +46,51 @@ func (p *Plugin) getUploadSpecs(ctx context.Context) error {
defer res.Body.Close()
err = GenericResponseHandler(res)
}
if err != nil {
log.Error().Msg("unable to retrieve upload specs")
return err
for {
if err != nil {
p.UploadSpecFallback = true
log.Error().Msg("unable to retrieve upload-specs")
break
}
var rawspecs []UploadSpec
dec := json.NewDecoder(res.Body)
err = dec.Decode(&rawspecs)
if err != nil {
p.UploadSpecFallback = true
log.Error().Msg("unable to decode information for upload-specs")
break
}
if len(rawspecs) == 0 {
p.UploadSpecFallback = true
log.Error().Msg("empty upload-specs")
break
}
p.UploadSpecs = make(map[string]UploadSpec)
for _, s := range rawspecs {
p.UploadSpecs[s.Format] = s
}
//lint:ignore SA4004 this is correct
break
}
var rawspecs []UploadSpec
dec := json.NewDecoder(res.Body)
err = dec.Decode(&rawspecs)
if err != nil {
log.Error().Msg("unable to decode information for upload specs")
return err
}
if len(rawspecs) == 0 {
log.Error().Msg("empty upload specs")
return &ErrEmpty{}
if p.UploadSpecFallback {
log.Warn().Msg("using fallback upload-specs")
prepareFallbackUploadSpec()
p.UploadSpecs = fallbackUploadSpec
}
p.UploadSpecs = make(map[string]UploadSpec)
for _, s := range rawspecs {
keys := make([]string, 0, len(p.UploadSpecs))
for k := range p.UploadSpecs {
keys = append(keys, k)
}
// refill UploadSpecs
for _, k := range keys {
s := p.UploadSpecs[k]
s.AllFieldNames = make(map[string]bool)
var seen bool
for _, f := range s.ComponentFields {
@ -82,7 +108,7 @@ func (p *Plugin) getUploadSpecs(ctx context.Context) error {
s.AllFieldNames[f.Name] = true
}
p.UploadSpecs[s.Format] = s
p.UploadSpecs[k] = s
}
return nil