name: hugo
base: core24
adopt-info: hugo
confinement: strict
title: Hugo
icon: snap/local/logo.png
summary: Fast and Flexible Static Site Generator
description: |
  Hugo is a static site generator written in Go, optimized for speed and
  designed for flexibility. With its advanced templating system and fast asset
  pipelines, Hugo renders a complete site in seconds, often less.

  Due to its flexible framework, multilingual support, and powerful taxonomy
  system, Hugo is widely used to create:
  * Corporate, government, nonprofit, education, news, event, and project sites
  * Documentation sites
  * Image portfolios
  * Landing pages
  * Business, professional, and personal blogs
  * Resumes and CVs

# Project links
issues: https://github.com/gohugoio/hugo/issues
license: "Apache-2.0"
source-code: https://github.com/gohugoio/hugo.git
website: https://gohugo.io/

platforms:
  amd64:
  arm64:

lint:
  ignore:
    - library:
        - usr/lib/**/libform.so.*
        - usr/lib/**/liblua*.so.*
        - usr/lib/**/libmenu.so.*
        - usr/lib/**/libpanel.so.*
        - usr/lib/**/libperl.so.*

# Interfaces
plugs:
  dot-aws:
    interface: personal-files
    read:
      - $HOME/.aws
  dot-azure:
    interface: personal-files
    read:
      - $HOME/.azure
  dot-cache-hugo:
    interface: personal-files
    write:
      - $HOME/.cache/hugo_cache
  dot-config-gcloud:
    interface: personal-files
    read:
      - $HOME/.config/gcloud
  etc-gitconfig:
    interface: system-files
    read:
      - /etc/gitconfig
  gitconfig:
    interface: personal-files
    read:
      - $HOME/.config/git
      - $HOME/.gitconfig
      - $HOME/.gitconfig.local
  ssh-keys:
    interface: ssh-keys

# Runtime environment
environment:
  # Ruby
  GEM_HOME: $SNAP_USER_DATA/gems
  GEM_PATH: $SNAP/usr/share/rubygems-integration/all:$SNAP/usr/lib/ruby/gems/3.2.0:$SNAP/var/lib/gems/3.2.0
  RUBYLIB: $SNAP/usr/lib/ruby/vendor_ruby/3.2.0:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/ruby/vendor_ruby/3.2.0:$SNAP/usr/lib/ruby/vendor_ruby:$SNAP/usr/lib/ruby/3.2.0:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/ruby/3.2.0

  # Node
  npm_config_cache: $SNAP_USER_DATA/.npm
  npm_config_init_module: $SNAP_USER_DATA/.npm-init.js
  npm_config_userconfig: $SNAP_USER_DATA/.npmrc

  # Other
  PYTHONHOME: /usr:$SNAP/usr
  pandoc_datadir: $SNAP/usr/share/pandoc
  GIT_EXEC_PATH: $SNAP/usr/lib/git-core
  GOCACHE: $SNAP_USER_DATA/.cache/go-build

  # Allowlist for environment variables
  # Default:                (?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG|SYSTEMDRIVE|PROGRAMDATA)$
  HUGO_SECURITY_EXEC_OSENV: (?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG|SYSTEMDRIVE|PROGRAMDATA|GIT_EXEC_PATH|LD_LIBRARY_PATH|npm_config_(cache|init_module|userconfig)|pandoc_datadir|PYTHONHOME|SNAP|GEM_HOME|GEM_PATH|RUBYLIB)$

# App definition
apps:
  hugo:
    command: bin/hugo
    completer: hugo-completion
    plugs:
      - desktop
      - dot-aws
      - dot-azure
      - dot-cache-hugo
      - dot-config-gcloud
      - etc-gitconfig
      - gitconfig
      - home
      - network-bind
      - removable-media
      - ssh-keys

# Build parts
parts:
  asciidoctor:
    plugin: nil
    stage-packages:
      - asciidoctor
      - ruby-asciidoctor
      - rubygems-integration
    override-build: |
      set -ex
      craftctl default
      # Use env ruby to ensure the snap's ruby interpreter is used
      sed -i '1s|#!/usr/bin/ruby|#!/usr/bin/env ruby|' $CRAFT_PART_INSTALL/usr/bin/asciidoctor
      # Patch rubygems to avoid flock() errors in strict confinement
      sed -i 's|!solaris_platform|win_platform|' $CRAFT_PART_INSTALL/usr/lib/ruby/vendor_ruby/rubygems.rb

  dart-sass:
    plugin: nil
    build-packages:
      - curl
    override-build: |
      set -ex
      craftctl default
      case "$CRAFT_ARCH_BUILD_FOR" in
        amd64)  arch=x64    ;;
        arm64)  arch=arm64  ;;
        *)      arch=""     ;;
      esac
      if [[ -n $arch ]]; then
        url=$(curl -s https://api.github.com/repos/sass/dart-sass/releases/latest | awk -F\" "/browser_download_url.*-linux-${arch}.tar.gz/{print \$(NF-1)}")
        curl -LO --retry-connrefused --retry 10 "${url}"
        tar xf dart-sass-*-linux-${arch}.tar.gz
        install -d $CRAFT_PART_INSTALL/bin
        cp -av dart-sass/* $CRAFT_PART_INSTALL/bin/
      fi

  git:
    plugin: nil
    stage-packages:
      - git
    prime:
      - usr/bin/git
      - usr/lib

  go:
    plugin: nil
    stage-snaps:
      - go/latest/stable
    prime:
      - bin/go
      - pkg/tool
      - -pkg/tool/*

  node:
    plugin: nil
    stage-snaps:
      - node/24/stable
    organize:
      "LICENSE": "LICENSE_NODE"
      "README.md": "README_NODE.md"

  pandoc:
    plugin: nil
    stage-packages:
      - pandoc

  rst2html:
    plugin: nil
    stage-packages:
      - python3-docutils
    override-build: |
      set -ex
      craftctl default
      sed -i "s|'/usr/share/docutils/'|os.path.expandvars('\$SNAP/usr/share/docutils/')|" $CRAFT_PART_INSTALL/usr/lib/python3/dist-packages/docutils/__init__.py
    organize:
      usr/share/docutils/scripts/python3: usr/bin

  hugo:
    plugin: nil
    source: .
    after:
      - git
      - go
    build-packages:
      - git
    override-pull: |
      craftctl default
      craftctl set version=$(git describe --tags --always --match 'v[0-9]*' | sed 's/^v//; s/-/+git/; s/-g/./')
      if grep -q 'Suffix:\s*""' common/hugo/version_current.go; then
        craftctl set grade=stable
      else
        craftctl set grade=devel
      fi
    override-build: |
      set -ex
      export GOPATH=$(realpath ../go)
      export PATH=$GOPATH/bin:$PATH
      HUGO_BUILD_TAGS="extended"

      echo "Building Hugo (extended)..."
      go build -v -ldflags "-s -w -X github.com/gohugoio/hugo/common/hugo.vendorInfo=snap:$(craftctl get version)" -tags "$HUGO_BUILD_TAGS"

      echo "Generating Shell Completion..."
      ./hugo completion bash > hugo-completion

      echo "Installing Binaries..."
      install -d $CRAFT_PART_INSTALL/bin
      cp -av hugo $CRAFT_PART_INSTALL/bin/
      mv -v hugo-completion $CRAFT_PART_INSTALL/

      echo "Stripping Binary..."
      strip --remove-section=.comment --remove-section=.note $CRAFT_PART_INSTALL/bin/hugo
