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:fix
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 desc: Lint licenses and copyright headers
58 cmds:
59 - reuse lint
60
61 build:
62 cmds:
63 - go build -o lune -ldflags "-s -w -X main.version={{.VERSION}}"
64 generates:
65 - lune
66
67 install:
68 cmds:
69 - go install -ldflags "-s -w -X main.version={{.VERSION}}"
70
71 run:
72 cmds:
73 - go run -ldflags "-s -w -X main.version={{.VERSION}}" . {{.CLI_ARGS}}
74
75 pack:
76 desc: Pack lune with UPX
77 cmds:
78 - upx --best -qo lune.min lune
79 - mv lune.min lune
80 sources:
81 - lune
82
83 clean:
84 desc: Remove build artifacts
85 cmds:
86 - rm -rf lune dist/
87
88 clean-all:
89 desc: Remove build artifacts and config.toml
90 cmds:
91 - rm -rf lune config.toml
92
93 release:build:
94 desc: Cross-compile for all release targets
95 vars:
96 TARGETS: >-
97 linux/amd64
98 linux/arm64
99 darwin/amd64
100 darwin/arm64
101 windows/amd64
102 freebsd/amd64
103 cmds:
104 - rm -rf dist
105 - mkdir -p dist
106 - for: {var: TARGETS, split: " "}
107 cmd: |
108 os=$(echo {{.ITEM}} | cut -d/ -f1)
109 arch=$(echo {{.ITEM}} | cut -d/ -f2)
110 ext=""; if [ "$os" = "windows" ]; then ext=".exe"; fi
111 echo "Building ${os}/${arch}..."
112 GOOS=${os} GOARCH=${arch} go build \
113 -o "dist/lune-{{.VERSION}}-${os}-${arch}${ext}" \
114 -ldflags "-s -w -X main.version={{.VERSION}}"
115
116 release:pack:
117 desc: Compress release binaries with UPX where supported
118 vars:
119 # UPX 5.x dropped macOS support; windows/amd64 is PE32 only and
120 # freebsd/amd64 is ELF32 only, so only Linux targets are packed.
121 PACK_TARGETS: >-
122 linux-amd64
123 linux-arm64
124 cmds:
125 - for: {var: PACK_TARGETS, split: " "}
126 cmd: |
127 bin="dist/lune-{{.VERSION}}-{{.ITEM}}"
128 if [ -f "$bin" ]; then
129 echo "Packing {{.ITEM}}..."
130 upx -q "$bin"
131 fi
132
133 release:upload:
134 desc: Upload release artifacts
135 cmds:
136 - fish -c 'release upload lune {{.VERSION}} --latest dist/*'
137
138 release:all:
139 desc: Tag, build, pack, and upload a release
140 cmds:
141 - task release
142 - task release:build
143 - task release:pack
144 - task release:upload
145
146 release:
147 desc: Interactive release workflow
148 vars:
149 BUMP:
150 sh: gum choose "major" "minor" "patch" "prerelease"
151 CURRENT_VERSION:
152 sh: git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
153 IS_CURRENT_PRERELEASE:
154 sh: |
155 current="{{.CURRENT_VERSION}}"
156 if echo "$current" | grep -qE '\-[a-zA-Z]+\.[0-9]+$'; then
157 echo "yes"
158 else
159 echo "no"
160 fi
161 IS_PRERELEASE:
162 sh: |
163 if [ "{{.BUMP}}" = "prerelease" ]; then
164 echo "yes"
165 else
166 gum confirm "Create pre-release?" && echo "yes" || echo "no"
167 fi
168 PRERELEASE_SUFFIX:
169 sh: |
170 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
171 # Extract suffix from current version (e.g., v1.2.3-beta.0 -> beta)
172 echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-([a-zA-Z]+)\.[0-9]+$/\1/'
173 elif [ "{{.IS_PRERELEASE}}" = "yes" ]; then
174 gum input --placeholder "Enter pre-release suffix (e.g., beta, rc)"
175 fi
176 BASE_NEXT:
177 sh: |
178 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
179 # Extract base version from current prerelease (e.g., v1.2.3-beta.0 -> v1.2.3)
180 echo "{{.CURRENT_VERSION}}" | sed -E 's/-[a-zA-Z]+\.[0-9]+$//'
181 else
182 svu {{.BUMP}}
183 fi
184 SUFFIX_VERSION:
185 sh: |
186 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
187 if [ "{{.BUMP}}" = "prerelease" ] && [ "{{.IS_CURRENT_PRERELEASE}}" = "yes" ]; then
188 # Increment the current prerelease number
189 current_num=$(echo "{{.CURRENT_VERSION}}" | sed -E 's/.*-[a-zA-Z]+\.([0-9]+)$/\1/')
190 echo $((current_num + 1))
191 else
192 # Find existing tags with this suffix and get the highest version number
193 highest=$(git tag -l "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.*" | \
194 sed 's/.*-{{.PRERELEASE_SUFFIX}}\.//' | \
195 sort -n | tail -1)
196 if [ -n "$highest" ]; then
197 echo $((highest + 1))
198 else
199 echo 0
200 fi
201 fi
202 fi
203 NEXT:
204 sh: |
205 if [ "{{.IS_PRERELEASE}}" = "yes" ] && [ -n "{{.PRERELEASE_SUFFIX}}" ]; then
206 echo "{{.BASE_NEXT}}-{{.PRERELEASE_SUFFIX}}.{{.SUFFIX_VERSION}}"
207 else
208 echo "{{.BASE_NEXT}}"
209 fi
210 prompt: "Release {{.NEXT}}?"
211 preconditions:
212 - sh: '[ $(git symbolic-ref --short HEAD) = "main" ] || [ $(git symbolic-ref --short HEAD) = "dev" ]'
213 msg: Not on main or dev branch
214 - sh: "[ $(git status --porcelain=2 | wc -l) = 0 ]"
215 msg: "Git is dirty"
216 cmds:
217 - llm-tag {{.NEXT}}
218 - git push soft {{.NEXT}}
219 - go list -m git.secluded.site/lune@{{.NEXT}} > /dev/null
220 - echo "Released {{.NEXT}} and notified module proxy"