1# SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2#
3# SPDX-License-Identifier: CC0-1.0
4
5version: "3"
6
7vars:
8 VERSION:
9 sh: git describe --tags --always 2>/dev/null || echo "v0.0.0"
10 GOOS:
11 sh: go env GOOS
12 GOARCH:
13 sh: go env GOARCH
14
15env:
16 CGO_ENABLED: 0
17
18tasks:
19 default:
20 desc: Run all checks
21 cmds:
22 - task: fmt
23 - task: lint
24 - task: staticcheck
25 - task: test
26 - task: vuln
27 - task: reuse
28
29 fmt:
30 desc: Format all Go source code
31 cmds:
32 - go install mvdan.cc/gofumpt@latest
33 - gofumpt -l -w .
34
35 lint:
36 desc: Lint Go source code
37 cmds:
38 - golangci-lint run
39
40 staticcheck:
41 desc: Perform static analysis
42 cmds:
43 - go install honnef.co/go/tools/cmd/staticcheck@latest
44 - staticcheck ./...
45
46 test:
47 desc: Run tests
48 cmds:
49 - go test -v ./...
50
51 vuln:
52 desc: Check for vulnerabilities
53 cmds:
54 - go install golang.org/x/vuln/cmd/govulncheck@latest
55 - govulncheck ./...
56
57 reuse:
58 desc: Lint licenses and copyright headers
59 cmds:
60 - reuse lint
61
62 build:
63 desc: Build formatted-commit
64 cmds:
65 - go build -o formatted-commit -ldflags "-s -w -X main.version={{.VERSION}}"
66 generates:
67 - formatted-commit
68
69 install:
70 desc: Install formatted-commit
71 cmds:
72 - go install -ldflags "-s -w -X main.version={{.VERSION}}"
73
74 run:
75 desc: Run formatted-commit
76 cmds:
77 - go run -ldflags "-s -w -X main.version={{.VERSION}}" . {{.CLI_ARGS}}
78
79 pack:
80 desc: Pack formatted-commit with UPX
81 cmds:
82 - upx --best -qo formatted-commit.min formatted-commit
83 - mv formatted-commit.min formatted-commit
84 sources:
85 - formatted-commit
86
87 clean:
88 desc: Remove build artifacts
89 cmds:
90 - rm -rf formatted-commit
91
92 clean-all:
93 desc: Remove build artifacts and config.toml
94 cmds:
95 - rm -rf formatted-commit config.toml
96
97 release:
98 desc: Interactive release workflow
99 vars:
100 BUMP:
101 sh: gum choose "major" "minor" "patch" "prerelease"
102 CURRENT_VERSION:
103 sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
104 IS_CURRENT_PRERELEASE:
105 sh: |
106 current="{{.CURRENT_VERSION}}"
107 if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then
108 echo "yes"
109 else
110 echo "no"
111 fi
112 IS_PRERELEASE:
113 sh: |
114 if [ "{{.BUMP}}" = "prerelease" ]; then
115 echo "yes"
116 else
117 gum confirm "Create pre-release?" && echo "yes" || echo "no"
118 fi
119 PRERELEASE_SUFFIX:
120 sh: |
121 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
122 # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta)
123 echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/'
124 elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then
125 gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)"
126 fi
127 BASE_NEXT:
128 sh: |
129 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
130 # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3)
131 echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//'
132 else
133 svu {{.BUMP}}
134 fi
135 SUFFIX_VERSION:
136 sh: |
137 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
138 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
139 # Increment the current prerelease number
140 current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/')
141 echo $((current_num + 1))
142 else
143 # Find existing tags with this suffix and get the highest version number
144 highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \
145 sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \
146 sort -n | tail -1)
147 if [ -n "$highest" ]; then
148 echo $((highest + 1))
149 else
150 echo 0
151 fi
152 fi
153 fi
154 NEXT:
155 sh: |
156 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
157 echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}"
158 else
159 echo "{{.BASE_NEXT}}"
160 fi
161 prompt: "Release {{.NEXT}}?"
162 preconditions:
163 - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]'
164 msg: Not on main or dev branch
165 - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
166 msg: "Git is dirty"
167 cmds:
168 - llm-tag {{.NEXT}}
169 - git push soft {{.NEXT}}
170 - go list -m git.secluded.site/formatted-commit@{{.NEXT}} > /dev/null
171 - echo "Released {{.NEXT}} and notified module proxy"