179 lines
5.3 KiB
Go
179 lines
5.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"code.gitea.io/sdk/gitea"
|
|
)
|
|
|
|
func main() {
|
|
// Créer un logger pour écrire les messages d'erreur
|
|
logFile, err := os.OpenFile("action.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
|
if err != nil {
|
|
fmt.Printf("Erreur lors de la création du fichier de log : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
defer logFile.Close()
|
|
multiWriter := io.MultiWriter(os.Stdout, logFile)
|
|
logger := log.New(multiWriter, "", log.LstdFlags)
|
|
|
|
// Récupérer les variables d'environnement
|
|
issueNumberStr := os.Getenv("ISSUE_NUMBER")
|
|
issueTitle := os.Getenv("ISSUE_TITLE")
|
|
labelsStr := os.Getenv("ISSUE_LABELS")
|
|
|
|
giteaToken := os.Getenv("GITEA_TOKEN")
|
|
giteaAPIURL := os.Getenv("GITEA_URL")
|
|
repoOwner := os.Getenv("REPO_OWNER")
|
|
repoName := os.Getenv("REPO_NAME")
|
|
|
|
if issueNumberStr == "" || issueTitle == "" || giteaToken == "" || giteaAPIURL == "" || repoOwner == "" || repoName == "" {
|
|
logger.Println("Erreur : certaines variables d'environnement sont manquantes.")
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Convertir le numéro de l'issue en int64
|
|
issueNumber, err := strconv.ParseInt(issueNumberStr, 10, 64)
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la conversion du numéro de l'issue : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Mapper les labels aux préfixes Git Flow
|
|
prefix := "feature"
|
|
if labelsStr != "" {
|
|
prefix, err = getPrefixFromLabels(labelsStr)
|
|
}
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la détermination du préfixe : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Former le nom de la branche au format "prefixe/us-numero"
|
|
branchName := fmt.Sprintf("%s/us-%d", prefix, issueNumber)
|
|
|
|
logger.Printf("Nom de la branche défini : %s\n", branchName)
|
|
|
|
// Configurer Git
|
|
logger.Println("Configuration de Git...")
|
|
err = runCommand(logger, "git", "config", "--global", "user.name", "gitea-actions")
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la configuration de Git : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
err = runCommand(logger, "git", "fetch", "origin")
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la mise a jour des references distantes")
|
|
os.Exit(1)
|
|
}
|
|
|
|
err = runCommand(logger, "git", "config", "--global", "user.email", "actions@gitea.com")
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la configuration de Git : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Vérifier si la branche existe déjà
|
|
logger.Printf("Vérification de l'existence de la branche '%s'...\n", branchName)
|
|
output, err := exec.Command("git", "ls-remote", "--heads", "origin", branchName).CombinedOutput()
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la vérification de la branche : %v\nSortie : %s\n", err, string(output))
|
|
os.Exit(1)
|
|
}
|
|
|
|
branchExists := false
|
|
if strings.TrimSpace(string(output)) != "" {
|
|
branchExists = true
|
|
}
|
|
|
|
if branchExists {
|
|
logger.Printf("La branche '%s' existe déjà. Aucune action n'a été effectuée.\n", branchName)
|
|
} else {
|
|
// Créer et pousser la branche
|
|
logger.Printf("Création de la branche '%s' à partir de 'dev'.\n", branchName)
|
|
err = runCommand(logger, "git", "checkout", "-b", branchName, "origin/develop")
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la création de la branche : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
err = runCommand(logger, "git", "push", "origin", branchName)
|
|
if err != nil {
|
|
logger.Printf("Erreur lors du push de la branche : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
logger.Printf("Branche '%s' créée et poussée avec succès.\n", branchName)
|
|
}
|
|
|
|
// Attribuer la branche à l'issue via l'API Gitea
|
|
logger.Printf("Attribution de la branche '%s' à l'issue #%d.\n", branchName, issueNumber)
|
|
|
|
// Création du client Gitea
|
|
client, err := gitea.NewClient(giteaAPIURL, gitea.SetToken(giteaToken))
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de la création du client Gitea : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Préparer les options pour éditer l'issue
|
|
editIssueOption := gitea.EditIssueOption{
|
|
Ref: &branchName,
|
|
}
|
|
|
|
// Mettre à jour l'issue avec la référence de la branche
|
|
_, _, err = client.EditIssue(repoOwner, repoName, issueNumber, editIssueOption)
|
|
if err != nil {
|
|
logger.Printf("Erreur lors de l'attribution de la branche à l'issue : %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
logger.Printf("Branche '%s' attribuée à l'issue #%d avec succès.\n", branchName, issueNumber)
|
|
}
|
|
|
|
// Fonction pour mapper les labels aux préfixes
|
|
func getPrefixFromLabels(labelsStr string) (string, error) {
|
|
// Définir la correspondance label ➔ préfixe
|
|
labelPrefixMap := map[string]string{
|
|
"enhancement": "feature",
|
|
"invalid": "bugfix",
|
|
"bug": "hotfix",
|
|
}
|
|
|
|
// Séparer les labels (supposant qu'ils sont séparés par des virgules)
|
|
labels := strings.Split(labelsStr, ",")
|
|
|
|
// Créer un mapping avec des clés en minuscules
|
|
labelPrefixMapLower := make(map[string]string)
|
|
for key, value := range labelPrefixMap {
|
|
keyLower := strings.ToLower(key)
|
|
labelPrefixMapLower[keyLower] = value
|
|
}
|
|
|
|
for _, label := range labels {
|
|
label = strings.TrimSpace(label)
|
|
labelLower := strings.ToLower(label)
|
|
fmt.Printf("Label actuel : %s", labelLower)
|
|
if prefix, exists := labelPrefixMapLower[labelLower]; exists {
|
|
return prefix, nil
|
|
}
|
|
}
|
|
|
|
return "feature", nil
|
|
}
|
|
|
|
func runCommand(logger *log.Logger, name string, arg ...string) error {
|
|
cmd := exec.Command(name, arg...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
logger.Printf("Exécution de la commande : %s %s\n", name, strings.Join(arg, " "))
|
|
return cmd.Run()
|
|
}
|