config now only has reference to org or prjgits and the rest is defined in the "workflow.config" in the prjgit itself. This allows the config to be updated in the project.
177 lines
4.6 KiB
Go
177 lines
4.6 KiB
Go
package common
|
|
|
|
/*
|
|
* This file is part of Autogits.
|
|
*
|
|
* Copyright © 2024 SUSE LLC
|
|
*
|
|
* Autogits is free software: you can redistribute it and/or modify it under
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 2 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* Autogits is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* Foobar. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"slices"
|
|
"strings"
|
|
)
|
|
|
|
type ConfigFile struct {
|
|
GitProjectName []string
|
|
}
|
|
|
|
func ReadConfig(reader io.Reader) (*ConfigFile, error) {
|
|
data, err := io.ReadAll(reader)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error reading config data: %w", err)
|
|
}
|
|
|
|
config := ConfigFile{}
|
|
if err := json.Unmarshal(data, &config.GitProjectName); err != nil {
|
|
return nil, fmt.Errorf("Error parsing Git Project paths: %w", err)
|
|
}
|
|
|
|
return &config, nil
|
|
}
|
|
|
|
func ReadConfigFile(filename string) (*ConfigFile, error) {
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Cannot open config file for reading. err: %w", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
return ReadConfig(file)
|
|
}
|
|
|
|
func ReadWorkflowConfig(gitea Gitea, git_project string) (*AutogitConfig, error) {
|
|
hash := strings.Split(git_project, "#")
|
|
branch := ""
|
|
if len(hash) > 1 {
|
|
branch = hash[1]
|
|
}
|
|
|
|
a := strings.Split(hash[0], "/")
|
|
prjGitRepo := DefaultGitPrj
|
|
switch len(a) {
|
|
case 1:
|
|
case 2:
|
|
prjGitRepo = a[1]
|
|
default:
|
|
return nil, fmt.Errorf("Missing org/repo in projectgit: %s", git_project)
|
|
}
|
|
|
|
data, _, err := gitea.GetRepositoryFileContent(a[0], prjGitRepo, branch, "workflow.config")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error fetching 'workflow.config': %w", err)
|
|
}
|
|
|
|
var config AutogitConfig
|
|
if err := json.Unmarshal(data, &config); err != nil {
|
|
return nil, fmt.Errorf("Error parsing config file: %w", err)
|
|
}
|
|
|
|
config.GitProjectName = a[0] + "/" + prjGitRepo
|
|
if len(branch) > 0 {
|
|
config.GitProjectName = config.GitProjectName + "#" + branch
|
|
}
|
|
if len(config.Organization) < 1 {
|
|
config.Organization = a[0]
|
|
}
|
|
log.Println(config)
|
|
return &config, nil
|
|
}
|
|
|
|
func ResolveWorkflowConfigs(gitea Gitea, config *ConfigFile) ([]*AutogitConfig, error) {
|
|
configs := make([]*AutogitConfig, 0, len(config.GitProjectName))
|
|
for _, git_project := range config.GitProjectName {
|
|
c, err := ReadWorkflowConfig(gitea, git_project)
|
|
if err != nil {
|
|
// can't sync, so ignore for now
|
|
log.Println(err)
|
|
} else {
|
|
configs = append(configs, c)
|
|
}
|
|
}
|
|
|
|
return configs, nil
|
|
}
|
|
|
|
type AutogitConfig struct {
|
|
Workflows []string // [pr, direct, test]
|
|
Organization string
|
|
GitProjectName string // Organization/GitProjectName.git is PrjGit
|
|
Branch string // branch name of PkgGit that aligns with PrjGit submodules
|
|
Reviewers []string // only used by `pr` workflow
|
|
}
|
|
|
|
type AutogitConfigs []*AutogitConfig
|
|
|
|
func (configs AutogitConfigs) GetPrjGitConfig(org, repo, branch string) *AutogitConfig {
|
|
for _, c := range configs {
|
|
if c.Organization == org && c.Branch == branch {
|
|
return c
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func ReadWorkflowConfigs(reader io.Reader) ([]*AutogitConfig, error) {
|
|
data, err := io.ReadAll(reader)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error reading config file. err: %w", err)
|
|
}
|
|
|
|
var config []*AutogitConfig
|
|
if err = json.Unmarshal(data, &config); err != nil {
|
|
return nil, fmt.Errorf("Error parsing config file. err: %w", err)
|
|
}
|
|
|
|
availableWorkflows := []string{"pr", "direct", "test"}
|
|
for _, workflow := range config {
|
|
pr := false
|
|
for _, w := range workflow.Workflows {
|
|
if w == "pr" {
|
|
pr = true
|
|
}
|
|
if !slices.Contains(availableWorkflows, w) {
|
|
return nil, fmt.Errorf(
|
|
"Invalid Workflow '%s'. Only available workflows are: %s",
|
|
w, strings.Join(availableWorkflows, " "),
|
|
)
|
|
}
|
|
}
|
|
if len(workflow.GitProjectName) == 0 {
|
|
workflow.GitProjectName = DefaultGitPrj
|
|
}
|
|
if !pr && len(workflow.Reviewers) > 0 {
|
|
log.Println(" Warning: non-PR-only workflows contains Reviewers. These are ignored in Org:", workflow.Organization)
|
|
}
|
|
}
|
|
|
|
return config, nil
|
|
}
|
|
|
|
func ReadWorkflowConfigsFile(filename string) ([]*AutogitConfig, error) {
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Cannot open config file for reading. err: %w", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
return ReadWorkflowConfigs(file)
|
|
}
|