#! /usr/bin/env bash
set -e
# Wiki pages to update
wikiPageManual='Manual'
wikiPageDownloads='Downloads'
# Function to update a wiki page, if it has changed
function updatePage() {
local pageName newContents mimeType
local oldContents
pageName="$1"
newContents="$2"
mimeType="$3"
if [ -z "${mimeType}" ]; then
mimeType='text/x-fossil-wiki'
fi
oldContents="$(fossil wiki export "${pageName}" 2>/dev/null)" || oldContents=''
if [ "${oldContents}" != "${newContents}" ]; then
echo "${newContents}" | fossil wiki commit --mimetype "${mimeType}" "${pageName}" >/dev/null 2>/dev/null || \
echo "${newContents}" | fossil wiki create --mimetype "${mimeType}" "${pageName}" || return 1
fi
return 0
}
# Generate the new downloads page
function generateDownloads() {
local version tarball sha256 manualPDF
version="$1"
tarball="$2"
sha256="$3"
manualPDF="$4"
if [ -z "${version}" -o -z "${tarball}" ]; then
return 0
fi
echo 'Tcl Nano'
echo '========'
echo ''
echo "Current release: **${version}**"
echo ''
echo " - [Manual](/uv/${manualPDF})"
echo ' - Downloads:'
echo " - [Source](/uv/${tarball}) <small>(SHA2-256: ${sha256})</small>"
echo ''
echo "Older releases may be found in the [archives](/uvlist)."
return 0
}
# Determine if a Fossil UV file exists
function fossilUVExists() {
local file
file="$1"
if fossil uv cat "${file}" 2>/dev/null | grep '^' >/dev/null; then
return 0
fi
return 1
}
# Ensure we are operating in the root of the checkout
cd "$(dirname "${BASH_SOURCE[0]}")/.."
# Update the repository
fossil sync
fossil uv sync
# Determine latest release
tclNanoReleaseVersion="$(fossil uv ls | sed 's/^releases\/tcl-nano-\(.*\)\.tar\.gz/\1/;t;d' | sort --version-sort | tail -n 1)"
tclNanoReleaseManualPDF="manuals/tcl-nano-${tclNanoReleaseVersion}.pdf"
tclNanoReleaseTarball="releases/tcl-nano-${tclNanoReleaseVersion}.tar.gz"
tclNanoReleaseDate="$(fossil uv cat "${tclNanoReleaseTarball}" 2>/dev/null | gzip -dc 2>/dev/null | tar -tvf - 2>/dev/null | awk '{ print $4 }')"
tclNanoReleaseTarballSHA256="$(fossil uv cat "${tclNanoReleaseTarball}" 2>/dev/null | openssl dgst -sha256 | sed 's/.*= *//')"
# Determine current development version
tclNanoDevelopmentVersion="$(awk '/^AC_INIT\(/{ sub(/^AC_INIT\([^,]*, */, ""); sub(/[,\)].*$/, ""); print; }' < configure.ac)"
tclNanoDevelopmentDate="$(date +%d-%b-%Y)"
# Generate the new manual page entry for the development version
developmentManPage="$(
sed "s/@@VERS@@/${tclNanoDevelopmentVersion}/g;s/@@SHORT_DATE@@/${tclNanoDevelopmentDate}/g" nano.man | \
/home/rkeene/devel/tcl-nano/build/work/pkgs/mandoc-1.14.2/INST/bin/mandoc -Thtml -Ofragment | \
sed 's/<div[^>]*> <\/div>//g;s@\[@\[@g;s@\]@\]@g'
)"
updatePage "${wikiPageManual}" "${developmentManPage}"
# Generate a PDF manual page for the release version, if it does not already exist
if ! fossilUVExists "${tclNanoReleaseManualPDF}"; then
tclNanoReleaseManualPDFTmp="$(mktemp -u)"
fossil uv cat "${tclNanoReleaseTarball}" 2>/dev/null | gzip -dc 2>/dev/null | tar --wildcards -xOf - '*/nano.man' | groff -mandoc -Tpdf > "${tclNanoReleaseManualPDFTmp}"
fossil uv add "${tclNanoReleaseManualPDFTmp}" --as "${tclNanoReleaseManualPDF}"
rm -f "${tclNanoReleaseManualPDFTmp}"
fi
# Generate the new download page entry
downloadsPage="$(generateDownloads "${tclNanoReleaseVersion}" "${tclNanoReleaseTarball}" "${tclNanoReleaseTarballSHA256}" "${tclNanoReleaseManualPDF}")"
updatePage "${wikiPageDownloads}" "${downloadsPage}" 'markdown'
# Push changes if any have been made
fossil sync
fossil uv sync
exit 0