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 . */ 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) }