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
 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"