Taskfile.yaml

  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"