diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 02e38ec..a235f9e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -27,7 +27,7 @@ jobs: strip_v: false - name: "create tikz-trackschematic package" - run: ./create-release.sh -v ${{ steps.tag.outputs.tag }} + run: ./build.sh --batch-mode --release ${{ steps.tag.outputs.tag }} - name: "create release" id: create_release diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index d2cf946..63ffefa 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -37,7 +37,7 @@ jobs: packages-path: ${{ github.workspace }}/.github/tex/packages.test.txt - name: "install tikz-trackschematic" - run: ./dev-install.sh -b + run: ./build.sh --batch-mode --local-dev-install - name: "test tikz-trackschematic" - run: cd test && ./testing.sh + run: ./build.sh --test --verbose diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..01815cf --- /dev/null +++ b/build.sh @@ -0,0 +1,667 @@ +#!/usr/bin/env sh + +# Copyright (c) 2018 - 2022, Martin Scheidt (ISC license) +# Permission to use, copy, modify, and/or distribute this file for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +# +# Variables in upper case, e.g.: $VARIABLE +# Functions in lower case as action with underscore, e.g.: do_something +# +# Halt on error +set -e + +## -- print usage +print_usage() { +cat << EOF +Usage: ./build.sh [OPTIONS] +install, test or release a package for tikz-trackschematic + + -h, --help Display help + + -v, --verbose Run script in verbose mode. + + -b, --batch-mode Run script with no interaction. + + -l, --local-dev-install Install as dev-package in local TeX Live environment + + -t, --test Tests the current src/ against the test/ + + -r, --release VERSION Creates a .zip with the release for given VERSION + Semantic Versioning with leading 'v', e.g: v1.0.0 + +EOF +} + +## -- processes getopts + +VERBOSE=0 +BATCHMODE=0 +INSTALL=0 +TESTING=0 +RELEASE=0 + +process_arguments() { + while true; do + if [ -z "$1" ]; then + break; + fi + case $1 in + -h|--help) + print_usage + exit 0 + ;; + -v|--verbose) + VERBOSE=1 + ;; + -b|--batch-mode) + BATCHMODE=1 + ;; + -l|--local-dev-install) + INSTALL=1 + ;; + -t|--test) + TESTING=1 + ;; + -r|--release) + RELEASE=1 + shift + VERSION_STR=$1 + ;; + *) + print_usage + exit 1 + ;; + esac + shift + done +} + +## -- colors +RED="\033[0;31m" +GREEN="\033[0;32m" +COLOR_RESET="\033[0;m" + +## -- cross platform helpers + +if [ "`echo -n`" = "-n" ]; then + n=""; c="\c" +else + n="-n"; c="" +fi + +# https://stackoverflow.com/questions/2320564/sed-i-command-for-in-place-editing-to-work-with-both-gnu-sed-and-bsd-osx +sedi () { + sed --version >/dev/null 2>&1 && sed -i -- "$@" || sed -i "" "$@" +} + +## -- commands + +check_path() { + if [ ! -d ../tikz-trackschematic ]; then + echo "${RED}Please run this script from inside the project folder!${COLOR_RESET}" + exit 1 + fi +} + +check_zip() { + # check for zip + STATUS=0 + command -v zip >/dev/null 2>&1 || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "zip found" + fi + return 0 + fi + + echo "Program 'zip' not found." + echo "Be sure to have zip installed!" + exit 1 +} + +check_version_number() { + while [[ ! "$VERSION_STR" =~ ^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)?$ ]]; do + if [ "$BATCHMODE" = 0 ]; then + echo "${RED}Your version '$VERSION_STR' has not the correct format!${COLOR_RESET}" + echo $n "Please specify as Semantic Versioning ( e.g. v1.0.0 ): $c" + read VERSION_STR + else + echo "${RED}Your version '$VERSION_STR' has not the correct format!${COLOR_RESET}" + echo "Please use Semantic Versioning with leading 'v'" + exit 1 + fi + done + # remove leading 'v' + VERSION_NUM=$(echo $VERSION_STR | cut -c 2-) +} + +check_versionhistory() { + # check if $VERSION is present in doc/versionhistory.tex + STATUS=0 + grep -qs "vhEntry{$VERSION_NUM" doc/versionhistory.tex || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "Version $VERSION_NUM is present in versionhistory.tex." + fi + return 0 + fi + + echo "Version $VERSION_NUM not found in versionhistory.tex." + echo "Be sure to edit versionhistory.tex and specify current version!" + exit 1 +} + +check_changelog() { + # check if $VERSION is present in CHANGELOG.md + STATUS=0 + grep -qs "Version \[$VERSION_NUM\]" CHANGELOG.md || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "Version $VERSION_NUM is present in CHANGELOG.md." + fi + return 0 + fi + + echo "Version $VERSION_NUM not found in CHANGELOG.md." + echo "Be sure to edit CHANGELOG.md and specify current version!" + exit 1 +} + +check_date() { + ## extract DATE from versionhistory.tex and CHANGELOG.md + LINE_1=$(grep "vhEntry{$VERSION_NUM" doc/versionhistory.tex) + LINE_2=$(grep "Version \[$VERSION_NUM\]" CHANGELOG.md) + DATEISO_1=$(echo $LINE_1 | egrep -o '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])') + DATEISO_2=$(echo $LINE_2 | egrep -o '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])') + + if [ $DATEISO_1 = $DATEISO_2 ]; then + # DATE=$(date "+%Y-%m-%d") + DATE="$DATEISO_1" + if [ $VERBOSE = 1 ]; then + echo "The date $DATE was extracted from versionhistory.tex and CHANGELOG.md." + fi + return 0 + fi + + echo "The date in versionhistory.tex and CHANGELOG.md did not match." + echo "Be sure to edit versionhistory.tex or CHANGELOG.md and modifiy the date!" + exit 1 +} + +check_url1() { + ## extract urls from CHANGELOG.md + STATUS=0 + LINE=$(grep "\[$VERSION_NUM\]: https://" CHANGELOG.md) + echo $LINE | grep -qs "...$VERSION_STR" || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "Version $VERSION_NUM URL is present in CHANGELOG.md." + fi + return 0 + fi + + echo "Version $VERSION_NUM URL was not found in CHANGELOG.md." + echo "Be sure to edit CHANGELOG.md and specify a URL for the current version!" + exit 1 +} + +check_url2() { + ## extract urls from CHANGELOG.md + STATUS=0 + LINE=$(grep "\[Unreleased\]: https://" CHANGELOG.md) + echo $LINE | grep -qs "/$VERSION_STR..." || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "The URL for [Unreleased] was also updated in CHANGELOG.md! Thx!" + fi + return 0 + fi + + echo "WARNING: URL for [Unreleased] in CHANGELOG.md does not reflect the current version $VERSION_NUM." + echo "WARNING: Be sure to edit CHANGELOG.md and specify current version!" + + if [ "$BATCHMODE" -eq 0 ]; then + echo "Do you wish to continue without updated URL for [Unreleased]?" + echo $n "(y/n) $c" + while true; do + read -p "" answer + case $answer in + [Yy]* ) break;; + [Nn]* ) exit 1;; + * ) echo "Please answer yes or no.";; + esac + done + else + echo "ERROR: Aborting in batch mode!" + exit 1 + fi +} + +create_release() { + if [ $BATCHMODE = 0 ]; then + echo "" + echo "Do you wish to create a release for the version $VERSION_NUM?" + echo $n "(y/n) $c" + while true; do + read -p "" answer + case $answer in + [Yy]* ) break;; + [Nn]* ) exit 1;; + * ) echo "Please answer yes or no.";; + esac + done + fi + + ## create backup-file und update VERSIONDATE in tikz-trackschematic.sty + sed -i".backup" -e"s/%\[VERSIONDATE/\[$DATE $VERSION_STR/g" src/tikz-trackschematic.sty + sedi "/%%\[SCRIPT\]/d" src/tikz-trackschematic.sty + if [ $VERBOSE = 1 ]; then + echo "Updated version in src/tikz-trackschematic.sty" + fi + + ## -- create zip-archive + # create temporary folder + TMP=$RELEASE + mkdir -p $TMP + + # copy README, CHANGELOG, LICENSE and CITATION + cp README.md $TMP/README.md + cp CHANGELOG.md $TMP/CHANGELOG.md + cp LICENSE $TMP/LICENSE + cp CITATION.cff $TMP/CITATION.cff + + # copy and rename documentation + cp doc/tikz-trackschematic-documentation.sty $TMP/ + cp doc/manual.pdf $TMP/tikz-trackschematic.pdf + cp doc/manual.tex $TMP/tikz-trackschematic.tex + cp doc/snippets.pdf $TMP/tikz-trackschematic-snippets.pdf + cp doc/snippets.tex $TMP/tikz-trackschematic-snippets.tex + cp doc/symbology-table.pdf $TMP/tikz-trackschematic-symbology-table.pdf + cp doc/symbology-table.tex $TMP/tikz-trackschematic-symbology-table.tex + mkdir $TMP/tikz-trackschematic-examples + mkdir $TMP/tikz-trackschematic-snippets + cp -R doc/examples/* $TMP/tikz-trackschematic-examples/ + cp -R doc/snippets/* $TMP/tikz-trackschematic-snippets/ + if [ $VERBOSE = 1 ]; then + echo "copied documentation" + fi + + # copy src-files + for SRC in src/*; do + EXT=${SRC##*.} + # do not copy backup created by sed + if [ $EXT != "backup" ]; then + cp $SRC $TMP/ + fi + done + if [ $VERBOSE = 1 ]; then + echo "copied src-files" + fi + + # zip package + if [ $VERBOSE = 1 ]; then + zip -r $RELEASE.zip $TMP/* + echo "compressed the release in $RELEASE.zip" + else + zip -r $RELEASE.zip $TMP/* >/dev/null 2>&1 + fi + + ## -- cleanup + # remove TMP-folder + rm -rf $TMP + # undo changes to tikz-trackschematic.sty by sed + mv src/tikz-trackschematic.sty.backup src/tikz-trackschematic.sty + if [ $VERBOSE = 1 ]; then + echo "clean up done!" + fi +} + +create_release_notes() { + if [ $BATCHMODE = 0 ]; then + echo "" + echo "Do you wish to create a release notes for the version $VERSION_NUM?" + echo $n "(y/n) $c" + while true; do + read -p "" answer + case $answer in + [Yy]* ) break;; + [Nn]* ) exit 1;; + * ) echo "Please answer yes or no.";; + esac + done + fi + ## -- create release note as excerpt from CHANGELOG.md + # determine beginning and end in CHANGELOG.md + TOP=$(grep -n "Version \[$VERSION_NUM\]" CHANGELOG.md | cut -d: -f1) + awk "NR>$TOP" CHANGELOG.md > release-note-tmp.md + BOTTOM=$(grep -n -m 1 "## Version" release-note-tmp.md | cut -d: -f1) + BOTTOM=$(( $TOP + $BOTTOM )) + BOTTOM=$(( $BOTTOM - 2 )) + TOP=$(( $TOP + 1 )) + # extract the excerpt + awk "NR>$TOP&&NR<$BOTTOM" CHANGELOG.md > release-note-$VERSION_STR.md + sedi "s/###/##/g" release-note-$VERSION_STR.md + + + ## -- cleanup + # remove TMP-file + rm release-note-tmp.md +} + +check_sudo() { + # checks if sudo is available + rootrun="" + # If we are root, we do note require sudo + if [ "$EUID" = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "you are root" + fi + return 0 + fi + + if sudo -v >/dev/null 2>&1; then + if [ $VERBOSE = 1 ]; then + echo "sudo ok" + fi + rootrun="sudo" + else + echo "sudo failed" + # Check if user is root (might be unnecessary) + if ! [ $(id -u) = 0 ]; then + echo "This script must be run as root" 1>&2 + exit 1 + fi + fi +} + +check_texlive() { + # check for kpsewhich (and mktexlsr) + STATUS=0 + command -v kpsewhich >/dev/null 2>&1 || STATUS=1 + command -v mktexlsr >/dev/null 2>&1 || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "kpsewhich and mktexlsr found" + fi + TEXMFLOCAL=$(kpsewhich --var-value TEXMFLOCAL) + return 0 + fi + + echo "Program 'kpsewhich' not found." + echo "Be sure to use texlive or mactex!" + exit 1 +} + +check_pdflatex() { + # check for pdflatex + STATUS=0 + command -v pdflatex >/dev/null 2>&1 || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "pdflatex found" + fi + return 0 + fi + + echo "Program 'pdflatex' not found." + echo "Be sure to have texlive or mactex installed!" + exit 1 +} + +check_trackschematic() { + # check for tikz-trackschematic + STATUS=0 + TEXMFLOCAL=$(kpsewhich --var-value TEXMFLOCAL) + DEVDIR="tex/latex/local/tikz-trackschematic-dev" + + ls $TEXMFLOCAL/$DEVDIR/tikz-trackschematic-dev.sty >> /dev/null 2>&1 || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "tikz-trackschematic-dev found" + fi + return 0 + fi + + echo "Library 'tikz-trackschematic-dev' not found." + echo "Be sure to have tikz-trackschematic-dev installed!" + exit 1 +} + +check_imagemagick() { + # check for ImageMagick/compare + STATUS=0 + command -v compare >/dev/null 2>&1 || STATUS=1 + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "compare found" + fi + return 0 + fi + + echo "Program 'compare' not found." + echo "Be sure to have ImageMagick installed!" + exit 1 +} + +run_test_cases() { + + cd test/ + TESTDIR="../test" + + mkdir -p .tex + STATUS=0 + + # Start with an empty List: + FAILED="" + + if [ $VERBOSE = 1 ]; then + echo "===========" + echo "Comparison of the expected appearance with the freshly created." + echo "-----------" + fi + + for TEST in `ls $TESTDIR/*.tex`; do + # setup + FILE=$(basename "$TEST") # remove path + NAME=${FILE%.*} # remove extension + ADD_TO_LIST=0 + # + if [ $VERBOSE = 1 ]; then + echo "$NAME test:" + fi + # + # + ## TeX build + # + exit_code_pdflatex=0 + pdflatex -output-directory=.tex -interaction=batchmode -halt-on-error ${NAME}.tex >> /dev/null 2>&1 || exit_code_pdflatex=1 + # understanding TeX statistics: + # -> https://tex.stackexchange.com/questions/26208/components-of-latexs-memory-usage + # TOP=$(grep -n "Here is how much of TeX's memory you used:" .tex/${NAME}.log | cut -d: -f1) + # BOTTOM=$(($(grep -n "stack positions out of" .tex/${NAME}.log | cut -d: -f1) + 1)) + # awk "NR>$TOP&&NR<$BOTTOM" .tex/${NAME}.log > .tex/${NAME}.statistics.log + memory_usage=$(grep "words of memory out of" .tex/${NAME}.log | cut -d " " -f2) + memory_usage=$(($memory_usage/1000)) + if [ $exit_code_pdflatex = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo $n " - ${GREEN}build succesful${COLOR_RESET}: $c" + echo "${memory_usage}k of memory used." + # cat .tex/${NAME}.statistics.log + fi + else + STATUS=1 + ADD_TO_LIST=1 + if [ $VERBOSE = 1 ]; then + echo " - ${RED}build failed${COLOR_RESET}." + fi + fi + # + # + ## compare images with following compare metrics + # AE: absolute error count, number of different pixels (-fuzz affected) + # DSSIM: structural dissimilarity index + # FUZZ: mean color distance + # MAE: mean absolute error (normalized), average channel error distance + # MEPP: mean error per pixel (normalized mean error, normalized peak error) + # MSE: mean error squared, average of the channel error squared + # NCC: normalized cross correlation + # PAE: peak absolute (normalized peak absolute) + # PHASH: perceptual hash for the sRGB and HCLp colorspaces. + # PSNR: peak signal to noise ratio + # RMSE: root mean squared (normalized root mean squared) + # SSIM: structural similarity index + # + EXIT_CODE=0 + compare -metric RMSE -colorspace RGB .tex/${NAME}.pdf ${NAME}_expected.pdf NULL: >> /dev/null 2>&1 || EXIT_CODE=1 + if [ $EXIT_CODE = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo " - ${GREEN}comparison succesful${COLOR_RESET}." + fi + else + STATUS=1 + ADD_TO_LIST=1 + if [ $VERBOSE = 1 ]; then + echo " - ${RED}comparison failed${COLOR_RESET}." + fi + fi + ## if a test failed add to list + if [ $ADD_TO_LIST = 1 ]; then + if [ -z "$FAILED" ]; then + # first item + FAILED="$NAME" + else + FAILED="$FAILED, $NAME" + fi + fi + done + + if [ $STATUS = 0 ]; then + if [ $VERBOSE = 1 ]; then + echo "-----------" + echo "${GREEN}All tests passed!${COLOR_RESET}" + fi + exit 0 + else + if [ $VERBOSE = 1 ]; then + echo "-----------" + echo "${RED}The following tests failed: ${FAILED}!${COLOR_RESET}" + else + echo "${RED}Some or all tests failed!${COLOR_RESET}" + fi + exit 1 + fi +} + +link_dev_files() { + # destination folder inside the TeX Live installation + DEVDIR="tex/latex/local/tikz-trackschematic-dev" + PROJECTDIR=$(pwd -P) + if [ $BATCHMODE = 0 ]; then + echo "" + echo "Do you wish to link this package from" + echo "$PROJECTDIR/src to" + echo "$TEXMFLOCAL/$DEVDIR?" + echo $n "(y/n) $c" + while true; do + read -p "" answer + case $answer in + [Yy]* ) break;; + [Nn]* ) exit 1;; + * ) echo "Please answer yes or no.";; + esac + done + fi + + # make sure that destination folder exists + if [ ! -d "$TEXMFLOCAL/$DEVDIR" ]; then + $rootrun mkdir -p $TEXMFLOCAL/$DEVDIR + fi + + # link every file in src/ and rename it + for SRC in src/*; do + FILE=$(basename "$SRC") # remove path + NAME=${FILE%.*} # remove extension + PREFIX=${NAME%%.*} + POSTFIX=${NAME#*.} + EXT=${SRC##*.} + + if [ "$PREFIX" = "$POSTFIX" ]; then + DST="$PREFIX-dev.$EXT" + else + DST="$PREFIX-dev.$POSTFIX.$EXT" + fi + + $rootrun ln -sfn $PROJECTDIR/$SRC $TEXMFLOCAL/$DEVDIR/$DST + + if [ $VERBOSE = 1 ]; then + echo "linked '$DST'" + fi + done + + # update TeX Live installation + TEXlsr=`which mktexlsr` + if [ $VERBOSE = 1 ]; then + $rootrun $TEXlsr + else + $rootrun $TEXlsr --quiet + fi +} + +## -- execution +## Process user arguments +process_arguments $@ + +## do what is requested +if [ $INSTALL = 1 ]; then + ## + check_path + check_texlive + check_sudo + + ## + link_dev_files + +fi + +if [ $TESTING = 1 ]; then + ## + check_path + check_pdflatex + check_trackschematic + check_imagemagick + if [ ! -d $TESTDIR ]; then + echo "${RED}Did not find test directory!${COLOR_RESET}" + exit 1 + fi + + ## + run_test_cases + +fi + +if [ $RELEASE = 1 ]; then + #### + # This script produces a .zip-file in accordance to the requirements for CTAN. + # For more information see https://ctan.org/help/upload-pkg. + #### + + ## check if version ist in the correct format + check_version_number + RELEASE="tikz-trackschematic-$VERSION_STR" + + ## check if $VERSION is present in README.md and versionhistory.tex + check_versionhistory + check_changelog + check_url1 + check_url2 + check_date + + ## check for installed software + check_zip + + ## + create_release + create_release_notes +fi + +#EOF \ No newline at end of file diff --git a/create-release.sh b/create-release.sh deleted file mode 100755 index 6e5e1ef..0000000 --- a/create-release.sh +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/env sh - -# Copyright (c) 2018 - 2022, Martin Scheidt (ISC license) -# Permission to use, copy, modify, and/or distribute this file for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -#### -# This script produces a .zip-file in accordance to the requirements for CTAN. -# For more information see https://ctan.org/help/upload-pkg. -#### - -# Halt on error -set -e - -## -- pass getopts - -usage() { echo "Usage: create-release.sh [-v version]"; } - -verbose=1 -batch_mode=0 - -while getopts ":v" opt; do - case ${opt} in - v ) batch_mode=1 - verbose=0 - ;; - \? ) usage - exit 1 - ;; - esac -done - -## -- cross platform helpers - -if [ "`echo -n`" = "-n" ]; then - n="" - c="\c" -else - n="-n" - c="" -fi - -# https://stackoverflow.com/questions/2320564/sed-i-command-for-in-place-editing-to-work-with-both-gnu-sed-and-bsd-osx -sedi () { - sed --version >/dev/null 2>&1 && sed -i -- "$@" || sed -i "" "$@" -} - -## -- get input - -if [ "$batch_mode" = 0 ]; then - echo $n "specify version ( e.g. v0.6 ): $c" - read VERSION_STR -else - VERSION_STR=$2 -fi -# remove leading character "v" -VERSION_NUM=$(echo $VERSION_STR | cut -c 2-) - -RELEASE="tikz-trackschematic-$VERSION_STR" - -## -- commands - -# check for zip -check_zip() { - status=0 - command -v zip >/dev/null 2>&1 || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "zip found" - fi - return 0 - fi - - echo "Program 'zip' not found." - echo "Be sure to have zip installed!" - exit 1 -} - -check_versionhistory() { - # check if $VERSION is present in doc/versionhistory.tex - status=0 - grep -qs "vhEntry{$VERSION_NUM" doc/versionhistory.tex || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "Version $VERSION_NUM is present in versionhistory.tex." - fi - return 0 - fi - - echo "Version $VERSION_NUM not found in versionhistory.tex." - echo "Be sure to edit versionhistory.tex and specify current version!" - exit 1 -} - -check_changelog() { - # check if $VERSION is present in CHANGELOG.md - status=0 - grep -qs "Version \[$VERSION_NUM\]" CHANGELOG.md || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "Version $VERSION_NUM is present in CHANGELOG.md." - fi - return 0 - fi - - echo "Version $VERSION_NUM not found in CHANGELOG.md." - echo "Be sure to edit CHANGELOG.md and specify current version!" - exit 1 -} - -check_date() { - ## extract DATE from versionhistory.tex and CHANGELOG.md - LINE_1=$(grep "vhEntry{$VERSION_NUM" doc/versionhistory.tex) - LINE_2=$(grep "Version \[$VERSION_NUM\]" CHANGELOG.md) - DATEISO_1=$(echo $LINE_1 | egrep -o '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])') - DATEISO_2=$(echo $LINE_2 | egrep -o '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])') - - if [ $DATEISO_1 = $DATEISO_2 ]; then - # DATE=$(date "+%Y-%m-%d") - DATE="$DATEISO_1" - if [ $verbose = 1 ]; then - echo "The date $DATE was extracted from versionhistory.tex and CHANGELOG.md." - fi - return 0 - fi - - echo "The date in versionhistory.tex and CHANGELOG.md did not match." - echo "Be sure to edit versionhistory.tex or CHANGELOG.md and modifiy the date!" - exit 1 -} - -check_url1() { - ## extract urls from CHANGELOG.md - status=0 - LINE=$(grep "\[$VERSION_NUM\]: https://" CHANGELOG.md) - echo $LINE | grep -qs "...$VERSION_STR" || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "Version $VERSION_NUM URL is present in CHANGELOG.md." - fi - return 0 - fi - - echo "Version $VERSION_NUM URL was not found in CHANGELOG.md." - echo "Be sure to edit CHANGELOG.md and specify a URL for the current version!" - exit 1 -} - -check_url2() { - ## extract urls from CHANGELOG.md - status=0 - LINE=$(grep "\[Unreleased\]: https://" CHANGELOG.md) - echo $LINE | grep -qs "/$VERSION_STR..." || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "The URL for [Unreleased] was also updated in CHANGELOG.md! Thx!" - fi - return 0 - fi - - echo "WARNING: URL for [Unreleased] in CHANGELOG.md does not reflect the current version $VERSION_NUM." - echo "WARNING: Be sure to edit CHANGELOG.md and specify current version!" - - if [ "$batch_mode" -eq 0 ]; then - echo "Do you wish to continue without updated URL for [Unreleased]?" - echo $n "(y/n) $c" - while true; do - read -p "" answer - case $answer in - [Yy]* ) break;; - [Nn]* ) exit 1;; - * ) echo "Please answer yes or no.";; - esac - done - else - echo "ERROR: Aborting in batch mode!" - exit 1 - fi -} - -## -- creating the release - -## check for installed software -check_zip - -## check if $VERSION is present in README.md and versionhistory.tex -check_versionhistory -check_changelog -check_date -check_url1 -check_url2 - -## create backup-file und update VERSIONDATE in tikz-trackschematic.sty -sed -i".backup" -e"s/%\[VERSIONDATE/\[$DATE $VERSION_STR/g" src/tikz-trackschematic.sty -sedi "/%%\[SCRIPT\]/d" src/tikz-trackschematic.sty -if [ $verbose = 1 ]; then - echo "Updated version in src/tikz-trackschematic.sty" -fi - -## -- (OPTIONAL) recompile manual.tex, examples, symboly_table and snippets.tex` - - -## -- create zip-archive -# create temporary folder -TMP=$RELEASE -mkdir -p $TMP - -# copy README and .sty-file -cp README.md $TMP/README.md -cp doc/tikz-trackschematic-documentation.sty $TMP/ - -# copy and rename documentation -cp doc/manual.pdf $TMP/tikz-trackschematic.pdf -cp doc/manual.tex $TMP/tikz-trackschematic.tex -cp doc/snippets.pdf $TMP/tikz-trackschematic-snippets.pdf -cp doc/snippets.tex $TMP/tikz-trackschematic-snippets.tex -cp doc/symbology-table.pdf $TMP/tikz-trackschematic-symbology-table.pdf -cp doc/symbology-table.tex $TMP/tikz-trackschematic-symbology-table.tex -mkdir $TMP/tikz-trackschematic-examples -mkdir $TMP/tikz-trackschematic-snippets -cp -R doc/examples/* $TMP/tikz-trackschematic-examples/ -cp -R doc/snippets/* $TMP/tikz-trackschematic-snippets/ -if [ $verbose = 1 ]; then - echo "copied documentation" -fi - -# copy src-files -for SRC in src/*; do - EXT=${SRC##*.} - # do not copy backup created by sed - if [ $EXT != "backup" ]; then - cp $SRC $TMP/ - fi -done -if [ $verbose = 1 ]; then - echo "copied src-files" -fi - -# zip package -zip -r $RELEASE.zip $TMP/* -if [ $verbose = 1 ]; then - echo "compressed the release in $RELEASE.zip" -fi - - -## -- create release note as excerpt from CHANGELOG.md -# determine beginning and end in CHANGELOG.md -TOP=$(grep -n "Version \[$VERSION_NUM\]" CHANGELOG.md | cut -d: -f1) -awk "NR>$TOP" CHANGELOG.md > release-note-tmp.md -BOTTOM=$(grep -n -m 1 "## Version" release-note-tmp.md | cut -d: -f1) -BOTTOM=$(( $TOP + $BOTTOM )) -BOTTOM=$(( $BOTTOM - 2 )) -TOP=$(( $TOP + 1 )) -# extract the excerpt -awk "NR>$TOP&&NR<$BOTTOM" CHANGELOG.md > release-note-$VERSION_STR.md -sedi "s/###/##/g" release-note-$VERSION_STR.md - - -## -- cleanup -# remove TMP-folder -rm -rf $TMP -# undo changes to tikz-trackschematic.sty by sed -mv src/tikz-trackschematic.sty.backup src/tikz-trackschematic.sty -rm release-note-tmp.md -if [ $verbose = 1 ]; then - echo "clean up done!" -fi \ No newline at end of file diff --git a/dev-install.sh b/dev-install.sh deleted file mode 100755 index 10f68cd..0000000 --- a/dev-install.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env sh - -# Copyright (c) 2018 - 2022, Martin Scheidt (ISC license) -# Permission to use, copy, modify, and/or distribute this file for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -# Halt on error -set -e - -## -- pass getopts - -usage() { echo "Usage: dev-install.sh [-q] [-b]"; } - -verbose=1 -batch_mode=0 - -while getopts ":qb" opt; do - case ${opt} in - q ) verbose=0 - ;; - b ) batch_mode=1 - # verbose=0 - ;; - \? ) usage - exit 1 - ;; - esac -done - -## -- variables - -# destination folder inside the TeX Live installation -DEVDIR="tex/latex/local/tikz-trackschematic-dev" - -## -- commands - -# check for kpsewhich (and mktexlsr) -check_texlive() { - status=0 - command -v kpsewhich >/dev/null 2>&1 || status=1 - command -v mktexlsr >/dev/null 2>&1 || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "kpsewhich and mktexlsr found" - fi - return 0 - fi - - echo "Program 'kpsewhich' not found." - echo "Be sure to use texlive or mactex!" - exit 1 -} - -# checks if sudo is available -check_sudo() { - rootrun="" - # If we are root, we do note require sudo - if [ "$EUID" = 0 ]; then - if [ $verbose = 1 ]; then - echo "you are root" - fi - return 0 - fi - - if sudo -v >/dev/null 2>&1; then - if [ $verbose = 1 ]; then - echo "sudo ok" - fi - rootrun="sudo" - else - echo "sudo failed" - # Check if user is root (might be unnecessary) - if ! [ $(id -u) = 0 ]; then - echo "This script must be run as root" 1>&2 - exit 1 - fi - fi -} - -## -- checking system - -check_texlive -check_sudo - -TEXMFLOCAL=$(kpsewhich --var-value TEXMFLOCAL) -PROJECTDIR=$(pwd -P) - -if [ "`echo -n`" = "-n" ]; then - n="" - c="\c" -else - n="-n" - c="" -fi - -if [ "$batch_mode" -eq 0 ]; then - echo "" - echo "Do you wish to link this package from" - echo "$PROJECTDIR/src to" - echo "$TEXMFLOCAL/$DEVDIR?" - echo $n "(y/n) $c" - while true; do - read -p "" answer - case $answer in - [Yy]* ) break;; - [Nn]* ) exit 1;; - * ) echo "Please answer yes or no.";; - esac - done -fi - -## -- copying files - -# make sure that destination folder exists -if [ ! -d "$TEXMFLOCAL/$DEVDIR" ]; then - $rootrun mkdir -p $TEXMFLOCAL/$DEVDIR -fi - -# copy every file in src/ and rename it -for SRC in src/*; do - FILE=$(basename "$SRC") # remove path - NAME=${FILE%.*} # remove extension - PREFIX=${NAME%%.*} - POSTFIX=${NAME#*.} - EXT=${SRC##*.} - - if [ "$PREFIX" = "$POSTFIX" ]; then - DST="$PREFIX-dev.$EXT" - else - DST="$PREFIX-dev.$POSTFIX.$EXT" - fi - - $rootrun ln -sfn $PROJECTDIR/$SRC $TEXMFLOCAL/$DEVDIR/$DST - - if [ $verbose = 1 ]; then - echo "linked '$DST'" - fi -done - -# update TeX Live installation -TEXlsr=`which mktexlsr` -if [ $verbose = 1 ]; then - $rootrun $TEXlsr -else - $rootrun $TEXlsr --quiet -fi diff --git a/test/testing.sh b/test/testing.sh deleted file mode 100755 index 3883ca3..0000000 --- a/test/testing.sh +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/env sh - -# Copyright (c) 2018 - 2022, Martin Scheidt (ISC license) -# Permission to use, copy, modify, and/or distribute this file for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -# Halt on error -set -e - -## -- pass getopts - -usage() { echo "Usage: testing.sh [-q]"; } - -verbose=1 - -while getopts ":q" opt; do - case ${opt} in - q ) verbose=0 - ;; - \? ) usage - exit 1 - ;; - esac -done - -## -- variables -# colors -Red="\033[0;31m" -Green="\033[0;32m" -Reset="\033[0;m" -# directory -TESTDIR="../test" -if [ -d ../tikz-trackschematic ]; then - cd test/ -fi - -## -- commands - -check_tex_distro() { - # check for latexmk - status=0 - command -v pdflatex >/dev/null 2>&1 || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "pdflatex found" - fi - return 0 - fi - - echo "Program 'pdflatex' not found." - echo "Be sure to have texlive or mactex installed!" - exit 1 -} - -check_trackschematic() { - # check for tikz-trackschematic - status=0 - TEXMFLOCAL=$(kpsewhich --var-value TEXMFLOCAL) - DEVDIR="tex/latex/local/tikz-trackschematic-dev" - - ls $TEXMFLOCAL/$DEVDIR/tikz-trackschematic-dev.sty >> /dev/null 2>&1 || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "tikz-trackschematic-dev found" - fi - return 0 - fi - - echo "Library 'tikz-trackschematic-dev' not found." - echo "Be sure to have tikz-trackschematic-dev installed!" - exit 1 -} - -check_imagemagick() { - # check for ImageMagick/compare - status=0 - command -v compare >/dev/null 2>&1 || status=1 - if [ $status = 0 ]; then - if [ $verbose = 1 ]; then - echo "compare found" - fi - return 0 - fi - - echo "Program 'compare' not found." - echo "Be sure to have ImageMagick installed!" - exit 1 -} - -## -- checking system - -check_tex_distro -check_trackschematic -check_imagemagick -if [ ! -d $TESTDIR ]; then - echo "${Red}Do not find test directory!${Reset}" - exit 1 -fi - -if [ "`echo -n`" = "-n" ]; then - n="" - c="\c" -else - n="-n" - c="" -fi - -## -- Testing - -mkdir -p .tex -test_status=0 -# Start with an empty List: -FAILED="" - -if [ $verbose = 1 ]; then - echo "===========" - echo "Comparison of the expected appearance with the freshly created." - echo "-----------" -fi - -for TEST in `ls $TESTDIR/*.tex`; do - # setup - FILE=$(basename "$TEST") # remove path - NAME=${FILE%.*} # remove extension - add_to_list=0 - # - if [ $verbose = 1 ]; then - echo "$NAME test:" - fi - # - # - ## TeX build - # - exit_code_pdflatex=0 - pdflatex -output-directory=.tex -interaction=batchmode -halt-on-error ${NAME}.tex >> /dev/null 2>&1 || exit_code_pdflatex=1 - # understanding TeX statistics: - # -> https://tex.stackexchange.com/questions/26208/components-of-latexs-memory-usage - # TOP=$(grep -n "Here is how much of TeX's memory you used:" .tex/${NAME}.log | cut -d: -f1) - # BOTTOM=$(($(grep -n "stack positions out of" .tex/${NAME}.log | cut -d: -f1) + 1)) - # awk "NR>$TOP&&NR<$BOTTOM" .tex/${NAME}.log > .tex/${NAME}.statistics.log - memory_usage=$(grep "words of memory out of" .tex/${NAME}.log | cut -d " " -f2) - memory_usage=$(($memory_usage/1000)) - if [ $exit_code_pdflatex = 0 ]; then - if [ $verbose = 1 ]; then - echo $n " - ${Green}build succesful${Reset}: $c" - echo "${memory_usage}k of memory used." - # cat .tex/${NAME}.statistics.log - fi - else - test_status=1 - add_to_list=1 - if [ $verbose = 1 ]; then - echo " - ${Red}build failed${Reset}." - fi - fi - # - # - ## compare images - # - # compare metrics - # AE: absolute error count, number of different pixels (-fuzz affected) - # DSSIM: structural dissimilarity index - # FUZZ: mean color distance - # MAE: mean absolute error (normalized), average channel error distance - # MEPP: mean error per pixel (normalized mean error, normalized peak error) - # MSE: mean error squared, average of the channel error squared - # NCC: normalized cross correlation - # PAE: peak absolute (normalized peak absolute) - # PHASH: perceptual hash for the sRGB and HCLp colorspaces. - # PSNR: peak signal to noise ratio - # RMSE: root mean squared (normalized root mean squared) - # SSIM: structural similarity index - # - exit_code_compare=0 - compare -metric RMSE -colorspace RGB .tex/${NAME}.pdf ${NAME}_expected.pdf NULL: >> /dev/null 2>&1 || exit_code_compare=1 - if [ $exit_code_compare = 0 ]; then - if [ $verbose = 1 ]; then - echo " - ${Green}comparison succesful${Reset}." - fi - else - test_status=1 - add_to_list=1 - if [ $verbose = 1 ]; then - echo " - ${Red}comparison failed${Reset}." - fi - fi - # - # - ## if a test failed add to list - if [ $add_to_list = 1 ]; then - if [ -z "$FAILED" ]; then - # first item - FAILED="$NAME" - else - FAILED="$FAILED, $NAME" - fi - fi -done - -## -- finishing - -if [ $test_status = 0 ]; then - if [ $verbose = 1 ]; then - echo "-----------" - echo "${Green}All tests passed!${Reset}" - fi - exit 0 -else - if [ $verbose = 1 ]; then - echo "-----------" - echo "${Red}The following tests failed: ${FAILED}!${Reset}" - else - echo "${Red}Some or all tests failed!${Reset}" - fi - exit 1 -fi - -EOF \ No newline at end of file