fix: not flaky catalogue generate

See toolshed/abra#464
This commit is contained in:
2025-01-05 11:57:51 +01:00
parent 2bc77de751
commit 4923984e84
10 changed files with 159 additions and 76 deletions

View File

@ -233,16 +233,18 @@ func GetRecipesLocal() ([]string, error) {
return recipes, nil
}
func GetRecipeFeaturesAndCategory(r Recipe) (Features, string, error) {
feat := Features{}
func GetRecipeFeaturesAndCategory(r Recipe) (Features, string, []string, error) {
var (
category string
warnMsgs []string
feat = Features{}
)
var category string
log.Debugf("attempting to open %s for recipe metadata parsing", r.ReadmePath)
log.Debugf("%s: attempt recipe metadata parse", r.ReadmePath)
readmeFS, err := ioutil.ReadFile(r.ReadmePath)
if err != nil {
return feat, category, err
return feat, category, warnMsgs, err
}
readmeMetadata, err := GetStringInBetween( // Find text between delimiters
@ -251,7 +253,7 @@ func GetRecipeFeaturesAndCategory(r Recipe) (Features, string, error) {
"<!-- metadata -->", "<!-- endmetadata -->",
)
if err != nil {
return feat, category, err
return feat, category, warnMsgs, err
}
readmeLines := strings.Split( // Array item from lines
@ -295,20 +297,25 @@ func GetRecipeFeaturesAndCategory(r Recipe) (Features, string, error) {
)
}
if strings.Contains(val, "**Image**") {
imageMetadata, err := GetImageMetadata(strings.TrimSpace(
imageMetadata, warnings, err := GetImageMetadata(strings.TrimSpace(
strings.TrimPrefix(val, "* **Image**:"),
), r.Name)
if err != nil {
continue
}
if len(warnings) > 0 {
warnMsgs = append(warnMsgs, warnings...)
}
feat.Image = imageMetadata
}
}
return feat, category, nil
return feat, category, warnMsgs, nil
}
func GetImageMetadata(imageRowString, recipeName string) (Image, error) {
func GetImageMetadata(imageRowString, recipeName string) (Image, []string, error) {
var warnMsgs []string
img := Image{}
imgFields := strings.Split(imageRowString, ",")
@ -319,11 +326,18 @@ func GetImageMetadata(imageRowString, recipeName string) (Image, error) {
if len(imgFields) < 3 {
if imageRowString != "" {
log.Warnf("%s image meta has incorrect format: %s", recipeName, imageRowString)
warnMsgs = append(
warnMsgs,
fmt.Sprintf("%s: image meta has incorrect format: %s", recipeName, imageRowString),
)
} else {
log.Warnf("%s image meta is empty?", recipeName)
warnMsgs = append(
warnMsgs,
fmt.Sprintf("%s: image meta is empty?", recipeName),
)
}
return img, nil
return img, warnMsgs, nil
}
img.Rating = imgFields[1]
@ -333,17 +347,17 @@ func GetImageMetadata(imageRowString, recipeName string) (Image, error) {
imageName, err := GetStringInBetween(recipeName, imgString, "[", "]")
if err != nil {
log.Fatal(err)
return img, warnMsgs, err
}
img.Image = strings.ReplaceAll(imageName, "`", "")
imageURL, err := GetStringInBetween(recipeName, imgString, "(", ")")
if err != nil {
log.Fatal(err)
return img, warnMsgs, err
}
img.URL = imageURL
return img, nil
return img, warnMsgs, nil
}
// GetStringInBetween returns empty string if no start or end string found
@ -534,11 +548,11 @@ type InternalTracker struct {
type RepoCatalogue map[string]RepoMeta
// ReadReposMetadata retrieves coop-cloud/... repo metadata from Gitea.
func ReadReposMetadata() (RepoCatalogue, error) {
func ReadReposMetadata(debug bool) (RepoCatalogue, error) {
reposMeta := make(RepoCatalogue)
pageIdx := 1
bar := formatter.CreateProgressbar(-1, "retrieving recipe repos list from git.coopcloud.tech...")
bar := formatter.CreateProgressbar(-1, "collecting recipe listing")
for {
var reposList []RepoMeta
@ -551,19 +565,32 @@ func ReadReposMetadata() (RepoCatalogue, error) {
}
if len(reposList) == 0 {
bar.Add(1)
if !debug {
bar.Add(1)
}
break
}
for idx, repo := range reposList {
// NOTE(d1): the "example" recipe is a temporary special case
// https://git.coopcloud.tech/toolshed/organising/issues/666
if repo.Name == "example" {
continue
}
reposMeta[repo.Name] = reposList[idx]
}
pageIdx++
bar.Add(1)
if !debug {
bar.Add(1)
}
}
fmt.Println() // newline for spinner
if err := bar.Close(); err != nil {
return reposMeta, err
}
return reposMeta, nil
}
@ -625,7 +652,7 @@ func GetRecipeCatalogueVersions(recipeName string, catl RecipeCatalogue) ([]stri
}
// UpdateRepositories clones and updates all recipe repositories locally.
func UpdateRepositories(repos RepoCatalogue, recipeName string) error {
func UpdateRepositories(repos RepoCatalogue, recipeName string, debug bool) error {
var barLength int
if recipeName != "" {
barLength = 1
@ -633,9 +660,9 @@ func UpdateRepositories(repos RepoCatalogue, recipeName string) error {
barLength = len(repos)
}
cloneLimiter := limit.New(10)
cloneLimiter := limit.New(3)
retrieveBar := formatter.CreateProgressbar(barLength, "ensuring recipes are cloned & up-to-date...")
retrieveBar := formatter.CreateProgressbar(barLength, "retrieving recipes")
ch := make(chan string, barLength)
for _, repoMeta := range repos {
go func(rm RepoMeta) {
@ -644,7 +671,9 @@ func UpdateRepositories(repos RepoCatalogue, recipeName string) error {
if recipeName != "" && recipeName != rm.Name {
ch <- rm.Name
retrieveBar.Add(1)
if !debug {
retrieveBar.Add(1)
}
return
}
@ -653,7 +682,9 @@ func UpdateRepositories(repos RepoCatalogue, recipeName string) error {
}
ch <- rm.Name
retrieveBar.Add(1)
if !debug {
retrieveBar.Add(1)
}
}(repoMeta)
}
@ -661,6 +692,10 @@ func UpdateRepositories(repos RepoCatalogue, recipeName string) error {
<-ch // wait for everything
}
if err := retrieveBar.Close(); err != nil {
return err
}
return nil
}