package healthcheck import ( "fmt" "log" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" ) func catTags(all []string) (out string) { out = "" for _, str := range all { out += str + " " } return out } func getTagsFromRepo(repoPath string) ([]string, error) { repo, err := git.PlainOpen(repoPath) if err != nil { return nil, fmt.Errorf("Cannot open repo: %v", err) } refs, err := repo.Tags() if err != nil { return nil, fmt.Errorf("Cannot get tags: %v", err) } var tags []string err = refs.ForEach(func(ref *plumbing.Reference) error { tags = append(tags, ref.Name().Short()) return nil }) if err != nil { return nil, fmt.Errorf("Error while iterating tags: %v", err) } return tags, nil } func CheckReleases(repoPath string, category string, n int) (jsonOut CheckStage) { jsonOut = CheckStage{ Name: "ReleaseCheck", StdOut: "Checking release tag: ", ExitCode: 0, StdErr: "", } tags, err := getTagsFromRepo(repoPath) if err != nil { log.Fatalf("Error in getting tags: %v", err) } var prefix string switch category { case "exam": prefix = "e" case "project": prefix = "p" case "homework": prefix = "h" default: prefix = "a" } target := prefix + fmt.Sprintf("%d", n) found := false for _, tag := range tags { if tag == target { found = true break } } if !found { tagList := catTags(tags) jsonOut.ExitCode = 107 jsonOut.StdOut = "Failed" jsonOut.StdErr = fmt.Sprintf("wrong release tag '%s', please use one of %s aborting", target, tagList) return jsonOut } jsonOut.StdOut += "OK" jsonOut.ExitCode = 0 jsonOut.StdErr = "Fine" return jsonOut }