generate-resources.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  4. REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
  5. SERVICE_DIR="${REPO_ROOT}/service"
  6. VERSIONINFO_JSON="${SCRIPT_DIR}/versioninfo.json"
  7. ICON_PATH="${SCRIPT_DIR}/OliveTin.ico"
  8. MANIFEST_PATH="${SCRIPT_DIR}/OliveTin.exe.manifest"
  9. GOVERSIONINFO_VERSION="${GOVERSIONINFO_VERSION:-v1.5.0}"
  10. usage() {
  11. cat <<EOF
  12. Usage: $(basename "$0") [version]
  13. Generate Windows resource (.syso) files for embedding in OliveTin.exe.
  14. version Release version (e.g. 3.0.0 or v3.0.0). Defaults to VERSION env,
  15. then the latest git tag, then 0.0.0.
  16. EOF
  17. }
  18. normalize_windows_version() {
  19. local raw="${1#v}"
  20. raw="${raw%%-*}"
  21. if [[ ! "${raw}" =~ ^[0-9]+(\.[0-9]+){0,3}$ ]]; then
  22. echo "0.0.0.0"
  23. return
  24. fi
  25. local -a parts=()
  26. IFS='.' read -r -a parts <<<"${raw}"
  27. local major="${parts[0]:-0}"
  28. local minor="${parts[1]:-0}"
  29. local patch="${parts[2]:-0}"
  30. local build="${parts[3]:-0}"
  31. printf '%s.%s.%s.%s' "${major}" "${minor}" "${patch}" "${build}"
  32. }
  33. resolve_version() {
  34. if [[ $# -gt 0 && -n "${1:-}" ]]; then
  35. echo "${1}"
  36. return
  37. fi
  38. if [[ -n "${VERSION:-}" ]]; then
  39. echo "${VERSION}"
  40. return
  41. fi
  42. if git -C "${REPO_ROOT}" describe --tags --abbrev=0 >/dev/null 2>&1; then
  43. git -C "${REPO_ROOT}" describe --tags --abbrev=0
  44. return
  45. fi
  46. echo "0.0.0"
  47. }
  48. if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  49. usage
  50. exit 0
  51. fi
  52. if [[ ! -f "${VERSIONINFO_JSON}" ]]; then
  53. echo "versioninfo.json not found: ${VERSIONINFO_JSON}" >&2
  54. exit 1
  55. fi
  56. if [[ ! -f "${ICON_PATH}" ]]; then
  57. echo "icon not found: ${ICON_PATH}" >&2
  58. exit 1
  59. fi
  60. WINDOWS_VERSION="$(normalize_windows_version "$(resolve_version "${1:-}")")"
  61. echo "Generating Windows resources for version ${WINDOWS_VERSION}"
  62. TOOL_BIN="$(mktemp -d)/bin"
  63. export GOBIN="${TOOL_BIN}"
  64. go install "github.com/josephspurrier/goversioninfo/cmd/goversioninfo@${GOVERSIONINFO_VERSION}"
  65. WORK_DIR="$(mktemp -d)"
  66. trap 'rm -rf "${WORK_DIR}" "${TOOL_BIN%/*}"' EXIT
  67. (
  68. cd "${WORK_DIR}"
  69. "${TOOL_BIN}/goversioninfo" \
  70. -64 \
  71. -platform-specific \
  72. -icon="${ICON_PATH}" \
  73. -manifest="${MANIFEST_PATH}" \
  74. -file-version="${WINDOWS_VERSION}" \
  75. -product-version="${WINDOWS_VERSION}" \
  76. "${VERSIONINFO_JSON}"
  77. )
  78. rm -f "${SERVICE_DIR}"/resource_windows_*.syso
  79. mv "${WORK_DIR}"/resource_windows_*.syso "${SERVICE_DIR}/"
  80. if ! compgen -G "${SERVICE_DIR}/resource_windows_*.syso" >/dev/null; then
  81. echo "goversioninfo did not produce resource_windows_*.syso files" >&2
  82. exit 1
  83. fi
  84. echo "Wrote Windows resource files to ${SERVICE_DIR}"