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 badge:
52 desc: Update coverage badge
53 cmds:
54 - |
55 pct=$(go test -cover ./... 2>&1 | grep -oP 'coverage: \K[0-9.]+')
56 if [ "$pct" = "" ]; then echo "Failed to get coverage"; exit 1; fi
57 color=red; [ "$(echo "$pct >= 50" | bc)" -eq 1 ] && color=yellow
58 [ "$(echo "$pct >= 80" | bc)" -eq 1 ] && color=brightgreen
59 sed -i "s|coverage-[0-9.]*%25-[a-z]*|coverage-${pct}%25-${color}|" README.md
60 echo "Updated badge to ${pct}% (${color})"
61
62 vuln:
63 cmds:
64 - go install golang.org/x/vuln/cmd/govulncheck@latest
65 - govulncheck ./...
66
67 reuse:
68 cmds:
69 - reuse lint
70
71 release:
72 desc: Interactive release workflow
73 vars:
74 BUMP:
75 sh: gum choose "major" "minor" "patch" "prerelease"
76 CURRENT_VERSION:
77 sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
78 IS_CURRENT_PRERELEASE:
79 sh: |
80 current="{{.CURRENT_VERSION}}"
81 if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then
82 echo "yes"
83 else
84 echo "no"
85 fi
86 IS_PRERELEASE:
87 sh: |
88 if [ "{{.BUMP}}" = "prerelease" ]; then
89 echo "yes"
90 else
91 gum confirm "Create pre-release?" && echo "yes" || echo "no"
92 fi
93 PRERELEASE_SUFFIX:
94 sh: |
95 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
96 # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta)
97 echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/'
98 elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then
99 gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)"
100 fi
101 BASE_NEXT:
102 sh: |
103 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
104 # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3)
105 echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//'
106 else
107 svu {{.BUMP}}
108 fi
109 SUFFIX_VERSION:
110 sh: |
111 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
112 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
113 # Increment the current prerelease number
114 current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/')
115 echo $((current_num + 1))
116 else
117 # Find existing tags with this suffix and get the highest version number
118 highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \
119 sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \
120 sort -n | tail -1)
121 if [ -n "$highest" ]; then
122 echo $((highest + 1))
123 else
124 echo 0
125 fi
126 fi
127 fi
128 NEXT:
129 sh: |
130 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
131 echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}"
132 else
133 echo "{{.BASE_NEXT}}"
134 fi
135 prompt: "Release {{.NEXT}}?"
136 preconditions:
137 - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]'
138 msg: Not on main or dev branch
139 - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
140 msg: "Git is dirty"
141 cmds:
142 - llm-tag {{.NEXT}}
143 - git push soft {{.NEXT}}
144 - go list -m git.secluded.site/go-lunatask@{{.NEXT}} > /dev/null
145 - echo "Released {{.NEXT}} and notified module proxy"