# https://taskfile.dev

version: "3"

env:
  GO111MODULE: on
  GOPROXY: https://proxy.golang.org,direct

tasks:
  dev:
    desc: Setup git hooks
    cmds:
      - git config core.hooksPath .githooks

  setup:
    desc: Install dependencies
    cmds:
      - go mod tidy

  docker:setup:
    desc: Setup Docker for multi-arch image builds
    cmds:
      - docker run --privileged --rm tonistiigi/binfmt --install all

  build:
    desc: Build the binary
    sources:
      - ./**/*.go
    generates:
      - ./nfpm
    cmds:
      - go build ./cmd/nfpm

  acceptance:windows:package:
    desc: Build packages for testing
    vars:
      SRC: "./testdata/acceptance/core.complex.yaml"
    cmds:
      - mkdir -p ./dist
      - go run ./cmd/nfpm/... pkg -f {{.SRC}} -p deb -t ./dist/foo.deb
      - go run ./cmd/nfpm/... pkg -f {{.SRC}} -p rpm -t ./dist/foo.rpm
      - go run ./cmd/nfpm/... pkg -f {{.SRC}} -p apk -t ./dist/foo.apk
      - go run ./cmd/nfpm/... pkg -f {{.SRC}} -p archlinux -t ./dist/foo.pkg.tar.zst

  acceptance:windows:install:
    desc: Install packages built with package
    cmds:
      - docker run --rm --workdir /tmp -v $PWD/dist:/tmp fedora rpm -ivh foo.rpm
      - docker run --rm --workdir /tmp -v $PWD/dist:/tmp ubuntu dpkg -i foo.deb
      - docker run --rm --workdir /tmp -v $PWD/dist:/tmp archlinux pacman --noconfirm -U foo.pkg.tar.zst
      - docker run --rm --workdir /tmp -v $PWD/dist:/tmp alpine apk add --allow-untrusted foo.apk

  acceptance:pull:
    desc: Pull acceptance test images
    vars:
      IMGS:
        sh: grep FROM ./testdata/acceptance/*.dockerfile | cut -f2 -d' ' | grep -v min | grep -v test | sort | uniq
    cmds:
      - echo "{{.IMGS}}" | while read -r img; do docker pull $img; done

  acceptance:
    desc: Run acceptance tests
    env:
      LC_ALL: C
    vars:
      TEST_OPTIONS: '{{default "" .TEST_OPTIONS}}'
      TEST_PATTERN: '{{default "." .TEST_PATTERN}}'
    cmds:
      - go test {{.TEST_OPTIONS}} -tags=acceptance -p 4 -failfast -race -coverpkg=./... -covermode=atomic -coverprofile=coverage.txt acceptance_test.go -run {{.TEST_PATTERN}} -timeout=1h

  test:
    desc: Run unit tests
    env:
      LC_ALL: C
    vars:
      TEST_OPTIONS: '{{default "" .TEST_OPTIONS}}'
      SOURCE_FILES: '{{default "./..." .SOURCE_FILES}}'
      TEST_PATTERN: '{{default "." .TEST_PATTERN}}'
    cmds:
      - go test {{.TEST_OPTIONS}} -failfast -race -coverpkg=./... -covermode=atomic -coverprofile=coverage.txt {{.SOURCE_FILES}} -run {{.TEST_PATTERN}} -timeout=5m

  cover:
    desc: Open the cover tool
    cmds:
      - go tool cover -html=coverage.txt

  fmt:
    desc: gofumpt all code
    cmds:
      - gofumpt -w -l .

  ci:
    desc: Run all CI steps
    cmds:
      - task: setup
      - task: build
      - task: test
      - task: acceptance

  default:
    desc: Runs the default tasks
    cmds:
      - task: ci

  schema:generate:
    desc: Generate JSONSchema
    cmds:
      - go run ./cmd/nfpm/ schema -o ./www/docs/static/schema.json
    sources:
      - nfpm.go
    generates:
      - ./www/docs/static/schema.json

  schema:validate:
    desc: Validate JSONSchema
    cmds:
      - jv ./www/docs/static/schema.json
    sources:
      - ./www/docs/static/schema.json

  docs:generate:
    desc: Generate docs
    cmds:
      - ./scripts/cmd_docs.sh
    sources:
      - cmd/*.go
      - files/*.go
      - ./scripts/cmd_docs.sh
      - CONTRIBUTING.md
    generates:
      - www/docs/cmd/*.md
      - www/docs/contributing.md

  docs:releases:
    desc: Generate the latest file
    cmds:
      - ./scripts/pages/releases.sh
    generates:
      - www/docs/static/latest

  docs:imgs:
    desc: Download and resize images
    cmds:
      - wget -O www/docs/static/logo.png https://github.com/goreleaser/artwork/raw/master/goreleaserfundo.png
      - wget -O www/docs/static/card.png "https://og.caarlos0.dev/**GoReleaser**%20%7C%20Deliver%20Go%20binaries%20as%20fast%20and%20easily%20as%20possible.png?theme=light&md=1&fontSize=80px&images=https://github.com/goreleaser.png"
      - wget -O www/docs/static/avatar.png https://github.com/goreleaser.png
      - convert www/docs/static/avatar.png -define icon:auto-resize=64,48,32,16 www/docs/static/favicon.ico
      - convert www/docs/static/avatar.png -resize x120 www/docs/static/apple-touch-icon.png

  docs:serve:
    desc: Start documentation server
    cmds:
      - task: docs:generate
      - "mkdocs serve -f www/mkdocs.yml -a 0.0.0.0:8000"

  docs:build:
    desc: Build docs
    cmds:
      - task: docs:generate
      - "mkdocs build -f www/mkdocs.yml"

  docs:test:
    desc: Test docs with htmltest
    cmds:
      - task: docs:build
      - "htmltest www/site -c www/htmltest.yml"

  release:
    desc: Create a new tag
    vars:
      NEXT:
        sh: svu n
    cmds:
      - git tag {{.NEXT}}
      - echo {{.NEXT}}
      - git push origin --tags

  nix:flake:update-vendor:
    desc: update default flake package vendor hash
    cmds:
      - bash ./scripts/nix-update-flake.sh
    generates:
      - flake.nix
    sources:
      - flake.lock
      - go.mod
      - go.sum
