ffizer 1.7.1

ffizer is a files and folders initializer / generator. It creates or updates any kind (or part) of project from template(s)
Documentation
# see https://crates.io/crates/cargo-make
[env]
RUST_TEST_THREADS = "1"
CARGO_MAKE_TEST_COVERAGE_BINARY_FILTER = "cli-[a-z0-9]*$\\|makers-[a-z0-9]*$\\|${CARGO_MAKE_TEST_COVERAGE_DEFAULT_BINARY_FILTER}"
# TARGET is  {arch}-{vendor}-{sys}-{abi} the output of rustc --print target-list
TARGET = { source = "${CARGO_MAKE_RUST_TARGET_ARCH}-${CARGO_MAKE_RUST_TARGET_VENDOR}-${CARGO_MAKE_RUST_TARGET_OS}-${CARGO_MAKE_RUST_TARGET_ENV}", mapping = { x86_64-apple-macos- = "x86_64-apple-darwin" }}
LIBZ_SYS_STATIC = "1"
PKG_CONFIG_ALLOW_CROSS = "1"
# see https://github.com/naftulikay/rust-openssl-static-example
OPENSSL_STATIC = "1"
# OPENSSL_LIB_DIR="/usr/lib64"
# OPENSSL_INCLUDE_DIR="/usr/include/openssl"

[init]
mac_alias = "init_mac"

[init_mac.env]
# workaround for "____chkstk_darwin ... which was built for Mac OS X 10.15 /usr/lib/libSystem.B.dylib"
# see https://github.com/sharkdp/bat/issues/680
# if DevelopmentTools.clang_build_version >= 1010
CFLAGS = "$CFLAGS -fno-stack-check"
RUSTFLAGS = "-Clink-args=-Wl,-bind_at_load"

[tasks.dist_env.env]
DIST_VERSION = "${CARGO_MAKE_CRATE_VERSION}"
DIST_NAME = "${CARGO_MAKE_CRATE_NAME}_${DIST_VERSION}-${TARGET}"
DIST_EXT = { source = "${CARGO_MAKE_RUST_TARGET_OS}", default_value = "tar.gz", mapping = { windows = "zip" }}
DIST_PATH ="target/dist/${DIST_NAME}"
GITHUB_RELEASE_VERSION = "v0.7.2"
GITHUB_RELEASE_PATH = { source = "${CARGO_MAKE_RUST_TARGET_OS}", mapping = { linux = "target/bin/linux/amd64", macos = "target/bin/darwin/amd64", windows = "target/bin/windows/amd64" }}
# provide by environment
# GITHUB_TOKEN =
# GITHUB_REPOSITORY =

[tasks.debug]
dependencies = ["dist_env"]
script_runner = "@shell"
script = [
  '''
  echo "PROFILE=${PROFILE}"
  echo "FILE=${GITHUB_RELEASE_PATH_REV}${DIST_PATH}.${DIST_EXT}"
  echo "TARGET=${TARGET}"
  echo "DIST_VERSION=${DIST_VERSION}"
  echo "TAG=${TAG}"
  echo "GITHUB_REPOSITORY=${GITHUB_REPOSITORY}"
  echo "GITHUB_REF=${GITHUB_REF}"
  echo ${CARGO_MAKE_PROFILE} : ${DIST_PATH} : ${GITHUB_RELEASE_PATH} : ${platform}
  '''
]

[tasks.zip-release-ci-flow]
description = "Compiles the binary in release mode and zips it up"
category = "CI"
condition = { env_set = ["TARGET"] }
dependencies = [
  # "clean",
  "dist_env",
  "build-release-for-target",
  "zip-release-binary-for-target"
]

[tasks.build-release-for-target]
description = "Makes a release build for a given target"
condition = { env_set = [ "TARGET" ] }
command = "cargo"
args = [
  "build",
  "--release",
  "--all-features",
  "--target",
  "${TARGET}"
]

[tasks.zip-release-binary-for-target]
windows_alias = "zip-release-binary-for-target_windows"
description = "Zips up the release binary, README, and license(s)"
category = "Publish"
condition = { env_set = [ "TARGET" ] }
# env = { "LIBZ_SYS_STATIC" = "1", "PKG_CONFIG_ALLOW_CROSS" = "1" }
script_runner = "@shell"
script = [
  '''
  rm -Rf ${DIST_PATH}*
  mkdir -p ${DIST_PATH}
  cp target/${TARGET}/release/${CARGO_MAKE_CRATE_NAME} ${DIST_PATH}/
  strip ${DIST_PATH}/${CARGO_MAKE_CRATE_NAME}
  cp LICENSE* ${DIST_PATH}/ || echo "ignore if no LICENSE"
  # "cp README* ${DIST_PATH}/
  tar -czvf "${DIST_PATH}.${DIST_EXT}" -C "${DIST_PATH}" "${CARGO_MAKE_CRATE_NAME}"
  '''
]

[tasks.zip-release-binary-for-target_windows]
script_runner = "powershell"
script_extension = "ps1"
script = [
  '''
  Set-PSDebug -Strict # -Trace 1
  $ErrorActionPreference = "Stop"
  Remove-Item -Recurse -Force "${env:DIST_PATH}" -ErrorAction SilentlyContinue
  New-Item -ItemType directory -Path "${env:DIST_PATH}"
  Copy-Item -Path "target\\${env:TARGET}\\release\\${env:CARGO_MAKE_CRATE_NAME}.exe" -Destination "${env:DIST_PATH}"
  Copy-Item -Path "LICENSE*" -Destination "${env:DIST_PATH}"
  # Copy-Item -Path "README*" -Destination "${env:DIST_PATH}"
  Compress-Archive -Path "${env:DIST_PATH}\\*" -DestinationPath "${env:DIST_PATH}.${env:DIST_EXT}" -CompressionLevel Optimal -Force
  ''',
]

[tasks.update-changelog]
category = "Publish"
install_crate = {crate_name = "gitmoji-changelog", binary = "gitmoji-changelog", test_arg = "--help"}
script = [
  '''
  rm -Rf CHANGELOG.md
  gitmoji-changelog -r x.y.z-dev -o CHANGELOG.md .
  '''
]

[tasks.update-bom]
category = "Publish"
install_crate = { crate_name = "cargo-bom", binary = "cargo", test_arg = "bom"}
script = [
  '''
  cargo bom > BOM.txt
  '''
]

[tasks.update-book]
category = "Publish"
install_crate = {crate_name = "mdbook", binary = "mdbook", test_arg = "--help"}
script = [
  '''
  cd docs
  rm -Rf book
  mdbook build
  '''
]

[tasks.pre-publish]
dependencies = [
  "update-docs"
]

[tasks.update-docs]
env = { COMMIT_MSG = ":pencil: pre-publish update book, changelog, bom" }
run_task = "_update-docs-do"

[tasks._update-docs-do]
dependencies = [
  "update-book",
  "update-changelog",
  "update-bom",
  "git-add",
  "git-commit-message",
]

[tasks.publish]
command = "cargo"
args = ["release", "${@}"]

[tasks.github-upload-flow]
description = "Upload dist on githup release"
dependencies = [
  "dist_env",
  "github-upload",
]

[tasks.github-release-install]
linux_alias = "github-release-install_linux"
mac_alias = "github-release-install_mac"
windows_alias = "github-release-install_windows"

[tasks.github-release-install_mac]
condition = { files_not_exist = [ "${GITHUB_RELEASE_PATH}/github-release" ]}
script = [
  '''
  cd target
  echo download "https://github.com/aktau/github-release/releases/download/${GITHUB_RELEASE_VERSION}/darwin-amd64-github-release.tar.bz2"
  curl -o darwin-amd64-github-release.tar.bz2 -sS -L "https://github.com/aktau/github-release/releases/download/${GITHUB_RELEASE_VERSION}/darwin-amd64-github-release.tar.bz2"
  tar -xzvf darwin-amd64-github-release.tar.bz2
  '''
]

[tasks.github-release-install_linux]
condition = { files_not_exist = [ "${GITHUB_RELEASE_PATH}/github-release" ]}
script = [
  '''
  cd target
  echo download "https://github.com/aktau/github-release/releases/download/${GITHUB_RELEASE_VERSION}/linux-amd64-github-release.tar.bz2"
  curl -o linux-amd64-github-release.tar.bz2 -sS -L "https://github.com/aktau/github-release/releases/download/${GITHUB_RELEASE_VERSION}/linux-amd64-github-release.tar.bz2"
  tar -xjvf linux-amd64-github-release.tar.bz2
  '''
]

[tasks.github-release-install_windows]
condition = { files_not_exist = [ "${GITHUB_RELEASE_PATH}/github-release.exe" ]}
script_runner = "powershell"
script_extension = "ps1"
# see https://blog.jourdant.me/post/3-ways-to-download-files-with-powershell
script = [
  '''
  Set-PSDebug -Strict # -Trace 1
  $ErrorActionPreference = "Stop"
  $url ="https://github.com/aktau/github-release/releases/download/$env:GITHUB_RELEASE_VERSION/windows-amd64-github-release.zip"
  $output = "windows-amd64-github-release.zip"
  cd target
  [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
  echo $url
  Invoke-WebRequest -Uri $url -OutFile $output
  Expand-Archive -LiteralPath $output -Destination . -Force
  '''
]

[tasks.check_GITHUB_REPOSITORY]
condition = { env_not_set = [ "GITHUB_REPOSITORY" ] }
script_runner = "@shell"
script = ['''echo "env variable GITHUB_REPOSITORY is not set"''']

[tasks.check_GITHUB_TOKEN]
condition = { env_not_set = [ "GITHUB_TOKEN" ] }
script_runner = "@shell"
script = ['''echo "env variable GITHUB_TOKEN is not set"''']

[tasks.github-upload]
windows_alias = "github-upload_windows"
# github-release use env variable GITHUB_TOKEN, GITHUB_REPO, GITHUB_USER
condition = { env_set = [ "GITHUB_RELEASE_PATH", "GITHUB_REPOSITORY", "GITHUB_TOKEN", "DIST_NAME", "DIST_PATH", "DIST_EXT"] }
script_runner = "@shell"
script= [
  '''
  export GITHUB_USER=$(dirname $GITHUB_REPOSITORY)
  export GITHUB_REPO=$(basename $GITHUB_REPOSITORY)
  ${GITHUB_RELEASE_PATH}/github-release release --tag "${DIST_VERSION}" || echo "ignore error"
  ${GITHUB_RELEASE_PATH}/github-release upload --tag "${DIST_VERSION}" --name "${DIST_NAME}.${DIST_EXT}" --file "${DIST_PATH}.${DIST_EXT}"
  '''
]
dependencies = [
  "check_GITHUB_REPOSITORY",
  "check_GITHUB_TOKEN",
  "github-release-install",
]

[tasks.github-upload_windows]
# github-release use env variable GITHUB_TOKEN, GITHUB_REPO, GITHUB_USER
condition = { env_set = [ "GITHUB_RELEASE_PATH", "GITHUB_REPOSITORY", "GITHUB_TOKEN", "DIST_NAME", "DIST_PATH", "DIST_EXT"] }
script_runner = "powershell"
script_extension = "ps1"
script = [
  # multi-line command with \ at EOL doesn't work on windows
  '''
  Set-PSDebug -Strict # -Trace 1
  $ErrorActionPreference = "Stop"
  $env:GITHUB_USER,$env:GITHUB_REPO=$($env:GITHUB_REPOSITORY).split("/")
  & "${env:GITHUB_RELEASE_PATH}\\github-release.exe" release --tag "$env:DIST_VERSION"
  & "${env:GITHUB_RELEASE_PATH}\\github-release.exe" upload --tag "$env:DIST_VERSION" --name ($env:DIST_NAME + '.' + $env:DIST_EXT) --file ($env:DIST_PATH + '.' + $env:DIST_EXT)
  '''
]
dependencies = [
  "check_GITHUB_REPOSITORY",
  "check_GITHUB_TOKEN",
  "github-release-install",
]

[tasks.snapcraft-push]
# to create SNAPCRAFT_TOKEN `snapcraft export-login --snaps $SNAP_NAME --channels edge,beta,candidate -`
condition = { platforms = ["linux"], env_set = [ "SNAPCRAFT_TOKEN", "SNAPCRAFT_CHANNEL"] }
script_runner = "bash"
script = [
  '''
  lsb_release -a
  sudo snap install snapcraft --classic
  # sudo snap install multipass --classic --beta
  sudo chown root:root /
  hash -r
  echo "${SNAPCRAFT_TOKEN}" | snapcraft login --with -
  # multipass can not run on ubuntu-18.04 vm of github action
  sudo snapcraft --destructive-mode
  sudo snapcraft push --release ${SNAPCRAFT_CHANNEL} *.snap
  sudo rm -f *.snap
  '''
]