Home

gitpecker @551ed52edc36612da8a63e65cf776afd2d730f53 - refs - log -
-
https://git.jolheiser.com/gitpecker.git
Woodpecker addon for generic git forge and OIDC
gitpecker / cmd / gitpeckerhook / main.go
- raw -
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package main

import (
	"encoding/json"
	"flag"
	"os"
	"path/filepath"
	"strings"
)

func maine() error {
	fs := flag.NewFlagSet("gitpeckerhook", flag.ExitOnError)
	domainFlag := fs.String("domain", "", "Woodpecker domain (e.g. https://ci.example.com)")
	fs.StringVar(domainFlag, "d", *domainFlag, "--domain")
	cacheFlag := fs.String("cache", ".cache.json", "Path to JSON cache file")
	fs.StringVar(cacheFlag, "c", *cacheFlag, "--cache")
	tokenFlag := fs.String("token", "", "Woodpecker API token")
	fs.StringVar(tokenFlag, "t", *tokenFlag, "--token")
	tokenFileFlag := fs.String("token-file", "", "Path to a file containing a Woodpecker API token")
	fs.StringVar(tokenFileFlag, "T", *tokenFileFlag, "--token-file")
	if err := fs.Parse(os.Args[1:]); err != nil {
		return err
	}

	token := *tokenFlag
	if *tokenFileFlag != "" {
		data, err := os.ReadFile(*tokenFileFlag)
		if err != nil {
			return err
		}
		token = strings.TrimSpace(string(data))
	}

	pwd, err := os.Getwd()
	if err != nil {
		return err
	}

	repo := filepath.Base(pwd)
	repo = strings.TrimSuffix(repo, ".git")

	cache, err := ensureCache(*cacheFlag)
	if err != nil {
		return err
	}

	client := client{domain: *domainFlag, token: token}

	if _, ok := cache[repo]; !ok {
		id, err := client.lookupRepo(repo)
		if err != nil {
			return err
		}
		cache[repo] = id
		fi, err := os.Open(*cacheFlag)
		if err != nil {
			return err
		}
		defer fi.Close()
		if err := json.NewEncoder(fi).Encode(cache); err != nil {
			return err
		}
	}

	return client.triggerPipeline(cache[repo])
}

func ensureCache(cachePath string) (map[string]int, error) {
	var c map[string]int

	_, err := os.Stat(cachePath)
	if err != nil {
		if err := os.MkdirAll(filepath.Dir(cachePath), os.ModePerm); err != nil {
			return c, err
		}
		fi, err := os.Create(cachePath)
		if err != nil {
			return c, err
		}
		fi.WriteString("{}")
		fi.Close()
	}

	fi, err := os.Open(cachePath)
	if err != nil {
		return c, err
	}
	defer fi.Close()

	return c, json.NewDecoder(fi).Decode(&c)
}

func main() {
	if err := maine(); err != nil {
		panic(err)
	}
}