# https://goreleaser.com
project_name: gotosocial
version: 2

# https://goreleaser.com/customization/hooks/
before:
  hooks:
  # generate the swagger.yaml file using go-swagger and bundle it into the assets directory
  - swagger generate spec --scan-models --exclude-deps -o web/assets/swagger.yaml
  - sed -i "s/REPLACE_ME/{{ incpatch .Version }}/" web/assets/swagger.yaml
  # Install web deps + bundle web assets
  - yarn --cwd ./web/source install
  - yarn --cwd ./web/source ts-patch install # https://typia.io/docs/setup/#manual-setup
  - yarn --cwd ./web/source build

# https://goreleaser.com/customization/build/
builds:
  # DEFAULT WASM SQLITE BINARY BUILDS
  -
    id: gotosocial
    main: ./cmd/gotosocial
    binary: gotosocial
    ldflags:
      - -s
      - -w
      - -extldflags
      - -static
      - -X main.Version={{.Version}}
    tags:
      - netgo
      - osusergo
      - static_build
      - kvformat
      - timetzdata
      - >-
        {{ if and (index .Env "DEBUG") (.Env.DEBUG) }}debugenv{{ end }}
    env:
      - CGO_ENABLED=0
    goos:
      - linux
      - freebsd
    goarch:
      - 386
      - amd64
      - arm
      - arm64
    goarm:
      - 6
      - 7
    ignore:
      # Build FreeBSD
      # only for amd64.
      - goos: freebsd
        goarch: arm64
      - goos: freebsd
        goarch: arm
      - goos: freebsd
        goarch: 386
    mod_timestamp: "{{ .CommitTimestamp }}"
  # MODERNC SQLITE BINARY BUILDS
  -
    id: gotosocial_moderncsqlite
    main: ./cmd/gotosocial
    binary: gotosocial
    ldflags:
      - -s
      - -w
      - -extldflags
      - -static
      - -X main.Version={{.Version}}
    tags:
      - netgo
      - osusergo
      - static_build
      - kvformat
      - timetzdata
      - >-
        {{ if and (index .Env "DEBUG") (.Env.DEBUG) }}debugenv{{ end }}
      - moderncsqlite3
    env:
      - CGO_ENABLED=0
    goos:
      - linux
      - freebsd
    goarch:
      - 386
      - amd64
      - arm
      - arm64
    goarm:
      - 6
      - 7
    ignore:
      # Build FreeBSD
      # only for amd64.
      - goos: freebsd
        goarch: arm64
      - goos: freebsd
        goarch: arm
      - goos: freebsd
        goarch: 386
    mod_timestamp: "{{ .CommitTimestamp }}"

# https://goreleaser.com/customization/docker/
dockers:
  # DEFAULT WASM SQLITE DOCKER BUILDS
  -
    use: buildx
    goos: linux
    goarch: amd64
    id: amd64
    ids:
    - gotosocial
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-amd64"
    - "superseriousbusiness/{{ .ProjectName }}:latest-amd64"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-amd64{{ end }}"
    build_flag_templates:
    - "--platform=linux/amd64"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal
  -
    use: buildx
    goos: linux
    goarch: arm64
    id: arm64v8
    ids:
    - gotosocial
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-arm64v8"
    - "superseriousbusiness/{{ .ProjectName }}:latest-arm64v8"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-arm64v8{{ end }}"
    build_flag_templates:
    - "--platform=linux/arm64/v8"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal
  -
    use: buildx
    goos: linux
    goarch: arm
    goarm: 6
    id: armv6
    ids:
    - gotosocial
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv6"
    - "superseriousbusiness/{{ .ProjectName }}:latest-armv6"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-armv6{{ end }}"
    build_flag_templates:
    - "--platform=linux/arm/v6"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal
  -
    use: buildx
    goos: linux
    goarch: arm
    goarm: 7
    id: armv7
    ids:
    - gotosocial
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7"
    - "superseriousbusiness/{{ .ProjectName }}:latest-armv7"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-armv7{{ end }}"
    build_flag_templates:
    - "--platform=linux/arm/v7"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal
  # MODERNC SQLITE DOCKER BUILDS
  -
    use: buildx
    goos: linux
    goarch: amd64
    id: amd64-moderncsqlite
    ids:
    - gotosocial_moderncsqlite
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-amd64-moderncsqlite"
    - "superseriousbusiness/{{ .ProjectName }}:latest-amd64-moderncsqlite"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-amd64-moderncsqlite{{ end }}"
    build_flag_templates:
    - "--platform=linux/amd64"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal
  -
    use: buildx
    goos: linux
    goarch: arm64
    id: arm64v8-moderncsqlite
    ids:
    - gotosocial_moderncsqlite
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-arm64v8-moderncsqlite"
    - "superseriousbusiness/{{ .ProjectName }}:latest-arm64v8-moderncsqlite"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-arm64v8-moderncsqlite{{ end }}"
    build_flag_templates:
    - "--platform=linux/arm64/v8"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal
  -
    use: buildx
    goos: linux
    goarch: arm
    goarm: 6
    id: armv6-moderncsqlite
    ids:
    - gotosocial_moderncsqlite
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv6-moderncsqlite"
    - "superseriousbusiness/{{ .ProjectName }}:latest-armv6-moderncsqlite"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-armv6-moderncsqlite{{ end }}"
    build_flag_templates:
    - "--platform=linux/arm/v6"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal
  -
    use: buildx
    goos: linux
    goarch: arm
    goarm: 7
    id: armv7-moderncsqlite
    ids:
    - gotosocial_moderncsqlite
    image_templates:
    - "superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7-moderncsqlite"
    - "superseriousbusiness/{{ .ProjectName }}:latest-armv7-moderncsqlite"
    - "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-armv7-moderncsqlite{{ end }}"
    build_flag_templates:
    - "--platform=linux/arm/v7"
    - "--label=org.opencontainers.image.created={{.Date}}"
    - "--label=org.opencontainers.image.title={{.ProjectName}}"
    - "--label=org.opencontainers.image.revision={{.FullCommit}}"
    - "--label=org.opencontainers.image.version={{.Version}}"
    extra_files:
    - web
    - go.mod
    - go.sum
    - cmd
    - internal

# https://goreleaser.com/customization/docker_manifest/
docker_manifests:
  # DEFAULT WASM SQLITE BUILDS
  - name_template: superseriousbusiness/{{ .ProjectName }}:{{ .Version }}
    image_templates:
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-amd64
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-arm64v8
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv6
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7
  - name_template: superseriousbusiness/{{ .ProjectName }}:latest
    image_templates:
    - superseriousbusiness/{{ .ProjectName }}:latest-amd64
    - superseriousbusiness/{{ .ProjectName }}:latest-arm64v8
    - superseriousbusiness/{{ .ProjectName }}:latest-armv6
    - superseriousbusiness/{{ .ProjectName }}:latest-armv7
  - name_template: "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot{{ end }}"
    image_templates:
    - superseriousbusiness/{{ .ProjectName }}:snapshot-amd64
    - superseriousbusiness/{{ .ProjectName }}:snapshot-arm64v8
    - superseriousbusiness/{{ .ProjectName }}:snapshot-armv6
    - superseriousbusiness/{{ .ProjectName }}:snapshot-armv7
  # MODERNC SQLITE BUILDS
  - name_template: superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-moderncsqlite
    image_templates:
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-amd64-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-arm64v8-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv6-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:{{ .Version }}-armv7-moderncsqlite
  - name_template: superseriousbusiness/{{ .ProjectName }}:latest-moderncsqlite
    image_templates:
    - superseriousbusiness/{{ .ProjectName }}:latest-amd64-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:latest-arm64v8-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:latest-armv6-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:latest-armv7-moderncsqlite
  - name_template: "{{ if .IsSnapshot }}superseriousbusiness/{{ .ProjectName }}:snapshot-moderncsqlite{{ end }}"
    image_templates:
    - superseriousbusiness/{{ .ProjectName }}:snapshot-amd64-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:snapshot-arm64v8-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:snapshot-armv6-moderncsqlite
    - superseriousbusiness/{{ .ProjectName }}:snapshot-armv7-moderncsqlite

# https://goreleaser.com/customization/archive/
archives:
  # DEFAULT WASM SQLITE BUILD
  -
    id: gotosocial
    builds:
      - gotosocial
    files:
    # standard release files
    - LICENSE
    - README.md
    - CHANGELOG*
    # web stuff minus source
    - web/assets
    - web/template
    # example config files
    - example/config.yaml
    - example/gotosocial.service
    name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}_{{ . }}{{ end }}{{ if not (eq .Amd64 \"v1\") }}{{ .Amd64 }}{{ end }}"
  # MODERNC SQLITE BUILD
  -
    id: gotosocial_moderncsqlite
    builds:
      - gotosocial_moderncsqlite
    files:
    # standard release files
    - LICENSE
    - README.md
    - CHANGELOG*
    # web stuff minus source
    - web/assets
    - web/template
    # example config files
    - example/config.yaml
    - example/gotosocial.service
    name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}{{ with .Mips }}_{{ . }}{{ end }}{{ if not (eq .Amd64 \"v1\") }}{{ .Amd64 }}{{ end }}_moderncsqlite"
  -
    id: web-assets
    files:
    - LICENSE
    # just the web stuff minus source
    - web/assets
    - web/template
    meta: true
    name_template: "{{ .ProjectName }}_{{ .Version }}_web-assets"

# https://goreleaser.com/customization/checksum/
checksum:
  name_template: 'checksums.txt'

# https://goreleaser.com/customization/snapshots/
snapshot:
  version_template: "{{ incpatch .Version }}-SNAPSHOT"

# https://goreleaser.com/customization/source/
source:
  enabled: true
  name_template: "{{ .ProjectName }}-{{ .Version }}-source-code"

# https://goreleaser.com/customization/release/
release:
  draft: true
  prerelease: auto
  header: |
    Here's version {{ .Version }} of GoToSocial.
    
    Please read the migration notes carefully for instructions on how to upgrade to this version.
    
    ## Release highlights
    
    - Pee pee
    - Poo poo
    - Wee wee
    
    ## Migration notes
    
    ### Upgrading
    
    To upgrade to {{ .Tag }} from a previous release:
    
    #### Binary/tar
    
    1. Stop GoToSocial.
    2. **Back up your database!** If you're running on SQLite, this is as simple as copying your `sqlite.db` file, eg., `cp sqlite.db sqlite.db.backup`.
    3. Download and untar the new release, including the web assets and html templates.
    4. Edit your config.yaml file if necessary (see below).
    5. Start GoToSocial.
    6. Wait patiently for any migrations to run, **do not interrupt migrations or you could leave your db in a broken state and will have to restore from backup**!
    7. Enjoy your updated instance.
    
    #### Docker
    
    1. Stop GoToSocial.
    2. **Back up your database!** If you're running on SQLite, this is as simple as copying your `sqlite.db` file, eg., `cp sqlite.db sqlite.db.backup`.
    3. Pull the new docker container (`superseriousbusiness/gotosocial:{{ .Version }}` or `superseriousbusiness/gotosocial:latest`)
    4. Edit your config.yaml file or environment variables if necessary (see below).
    5. Start GoToSocial.
    6. Wait patiently for any migrations to run, **do not interrupt migrations or you could leave your db in a broken state and will have to restore from backup**!
    7. Enjoy your updated instance.
    
    ### config.yaml
    
    The configuration file has changed since the previous release.
    
    - Changed `pee pee` to `poo poo`.
    - Changed `wee wee` to `more wee wee`.
    
    You can see a diff of the config file here: https://github.com/superseriousbusiness/gotosocial/compare/{{ .PreviousTag }}...{{ .Tag }}#diff-c071e03510b2c57e193a44503fd9528a785f0f411497cc75841a9f8d0b1ac622
    
    ### Database Migrations
    
    ⚠️⚠️⚠️
    
    This release may contain database migrations which will run the first time you start up this new version.
    
    Be sure not to interrupt this migration process.
    
    This will take anywhere between a couple seconds and ten minutes or more (on slower hardware).
    
    **Please be patient!**
    
    ⚠️⚠️⚠️
    
    ### Which release archive/container should I use?
    
    Tl;dr: Regardless of whether you're using SQLite or Postgres as your DB driver, you most likely you want the regular version without `moderncsqlite` in the name.
    
    However, if you're on FreeBSD, 32-bit Linux or 32-bit ARM, we recommend using the `moderncsqlite` version instead.
    
    You may need to change some configuration options too. See the table below:
    
    | OS      | Architecture            | Support level                      | Binary archive                                                                                                                                                                     | Docker                                                         |
    | ------- | ----------------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
    | Linux   | x86-64/AMD64 (64-bit)   | 🟢 Full                            | [linux_amd64.tar.gz](https://github.com/superseriousbusiness/gotosocial/releases/download/{{ .Tag }}/gotosocial_{{ .Version }}_linux_amd64.tar.gz)                                 | `superseriousbusiness/gotosocial:{{ .Version }}`               |
    | Linux   | Armv8/ARM64 (64-bit)    | 🟢 Full                            | [linux_arm64.tar.gz](https://github.com/superseriousbusiness/gotosocial/releases/download/{{ .Tag }}/gotosocial_{{ .Version }}_linux_arm64.tar.gz)                                 | `superseriousbusiness/gotosocial:{{ .Version }}`               |
    | FreeBSD | x86-64/AMD64 (64-bit)   | 🟢 Full<sup>[1](#freebsd)</sup>    | [freebsd_amd64_moderncsqlite.tar.gz](https://github.com/superseriousbusiness/gotosocial/releases/download/{{ .Tag }}/gotosocial_{{ .Version }}_freebsd_amd64_moderncsqlite.tar.gz) | None provided                                                  |
    | Linux   | x86-32/i386 (32-bit)    | 🟡 Partial<sup>[2](#32-bit)</sup>  | [linux_386_moderncsqlite.tar.gz](https://github.com/superseriousbusiness/gotosocial/releases/download/{{ .Tag }}/gotosocial_{{ .Version }}_linux_386_moderncsqlite.tar.gz)         | `superseriousbusiness/gotosocial:{{ .Version }}-moderncsqlite` |
    | Linux   | Armv7/ARM32 (32-bit)    | 🟡 Partial<sup>[2](#32-bit)</sup>  | [linux_armv7_moderncsqlite.tar.gz](https://github.com/superseriousbusiness/gotosocial/releases/download/{{ .Tag }}/gotosocial_{{ .Version }}_linux_armv7_moderncsqlite.tar.gz)     | `superseriousbusiness/gotosocial:{{ .Version }}-moderncsqlite` |
    | Linux   | Armv6/ARM32 (32-bit)    | 🟡 Partial<sup>[2](#32-bit)</sup>  | [linux_armv6_moderncsqlite.tar.gz](https://github.com/superseriousbusiness/gotosocial/releases/download/{{ .Tag }}/gotosocial_{{ .Version }}_linux_armv7_moderncsqlite.tar.gz)     | `superseriousbusiness/gotosocial:{{ .Version }}-moderncsqlite` |
    
    #### FreeBSD
    
    `moderncsqlite` version currently recommended, though you might have success with the regular WASM SQLite version.
    
    If running with regular WASM SQLite and having instability or memory issues, the following settings *may* help:
    
    ```yaml
    db-max-open-conns-multiplier: 0
    db-sqlite-journal-mode: "TRUNCATE"
    db-sqlite-synchronous: "FULL"
    ```
    
    #### 32-bit
    
    `moderncsqlite` version is needed, as performance with regular WASM SQLite is not guaranteed when running on 32-bit.
    
    Remote media processing will likely not work with reasonable performance, so you should set the following config variables to prevent download of remote media onto your instance:
    
    ```yaml
    media-remote-max-size: 0
    media-emoji-remote-max-size: 0
    ``` 

# https://goreleaser.com/customization/changelog/
changelog:
  use: github
  groups:
    - title: Features and performance
      regexp: '^.*\[(?:feature|performance).*\].*$'
      order: 0
    - title: Bug fixes
      regexp: '^.*\[bug.*\].*$'
      order: 1
    - title: Chores & version bumps
      regexp: '^.*\[chore.*\].*$'
      order: 2
    - title: Documentation
      regexp: '^.*\[doc.*\].*$'
      order: 3
    - title: Other
      order: 999