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 cmds:
31 - go install mvdan.cc/gofumpt@latest
32 - gofumpt -l -w .
33
34 lint:
35 cmds:
36 - golangci-lint run
37
38 lint:fix:
39 cmds:
40 - golangci-lint run --fix
41
42 staticcheck:
43 cmds:
44 - go install honnef.co/go/tools/cmd/staticcheck@latest
45 - staticcheck ./...
46
47 test:
48 cmds:
49 - go test -v ./...
50
51 vuln:
52 cmds:
53 - go install golang.org/x/vuln/cmd/govulncheck@latest
54 - govulncheck ./...
55
56 reuse:
57 cmds:
58 - reuse lint
59
60 release:
61 desc: Interactive release workflow
62 vars:
63 BUMP:
64 sh: gum choose "major" "minor" "patch" "prerelease"
65 CURRENT_VERSION:
66 sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
67 IS_CURRENT_PRERELEASE:
68 sh: |
69 current="{{.CURRENT_VERSION}}"
70 if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then
71 echo "yes"
72 else
73 echo "no"
74 fi
75 IS_PRERELEASE:
76 sh: |
77 if [ "{{.BUMP}}" = "prerelease" ]; then
78 echo "yes"
79 else
80 gum confirm "Create pre-release?" && echo "yes" || echo "no"
81 fi
82 PRERELEASE_SUFFIX:
83 sh: |
84 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
85 # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta)
86 echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/'
87 elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then
88 gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)"
89 fi
90 BASE_NEXT:
91 sh: |
92 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
93 # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3)
94 echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//'
95 else
96 svu {{.BUMP}}
97 fi
98 SUFFIX_VERSION:
99 sh: |
100 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
101 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
102 # Increment the current prerelease number
103 current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/')
104 echo $((current_num + 1))
105 else
106 # Find existing tags with this suffix and get the highest version number
107 highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \
108 sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \
109 sort -n | tail -1)
110 if [ -n "$highest" ]; then
111 echo $((highest + 1))
112 else
113 echo 0
114 fi
115 fi
116 fi
117 NEXT:
118 sh: |
119 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
120 echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}"
121 else
122 echo "{{.BASE_NEXT}}"
123 fi
124 prompt: "Release {{.NEXT}}?"
125 preconditions:
126 - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]'
127 msg: Not on main or dev branch
128 - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
129 msg: "Git is dirty"
130 cmds:
131 - llm-tag {{.NEXT}}
132 - git push soft {{.NEXT}}
133 - go list -m git.secluded.site/go-lunatask@{{.NEXT}} > /dev/null
134 - echo "Released {{.NEXT}} and notified module proxy"