|
|
@ -11,22 +11,24 @@ set -euo pipefail
|
|
|
|
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
usage() {
|
|
|
|
cat <<EOF
|
|
|
|
cat <<EOF
|
|
|
|
Usage: $(basename "${BASH_SOURCE[0]}") [arg1]
|
|
|
|
Usage: $(basename "${BASH_SOURCE[0]}") <flags> job.Rnw
|
|
|
|
|
|
|
|
|
|
|
|
Compiles Rnw documents with knitr and latexmk. This is a highly customised script.
|
|
|
|
Compiles R Sweave documents using knitr and LaTeXMK.
|
|
|
|
Takes zero or one arguments. The argument must be a filename with the extension "Rnw".
|
|
|
|
Filename extension must be .Rnw.
|
|
|
|
|
|
|
|
|
|
|
|
If an argument is supplied, the document in question is compiled.
|
|
|
|
Available flags:
|
|
|
|
If no arguments are supplied, a menu is displayed offering a choice of auxiliary tasks.
|
|
|
|
+ --help --> display this usage guide
|
|
|
|
|
|
|
|
+ --no-alert --> disable gotify alert (--silent also works)
|
|
|
|
|
|
|
|
+ --menu --> enter "menu" mode where auxiliary commands can be run (--aux)
|
|
|
|
|
|
|
|
|
|
|
|
This script treats certain filenames in a special manner:
|
|
|
|
This script treats certain filenames in a special manner:
|
|
|
|
+ "thesis" --> triggers a chain of special commands, see source code.
|
|
|
|
+ "thesis" --> triggers a chain of special commands, see source code.
|
|
|
|
|
|
|
|
|
|
|
|
In addition, the internal execution of this script is modified by the existence of
|
|
|
|
In addition, the internal execution of this script is modified by the existence of
|
|
|
|
certain files in the working directory:
|
|
|
|
certain files in the working directory:
|
|
|
|
+ .knitme --> use knitr::knit() instead of pgfSweave().
|
|
|
|
+ ./.knitme --> use knitr::knit() instead of pgfSweave().
|
|
|
|
+ .latexmkrc --> apply RC file to latexmk command.
|
|
|
|
+ ./.latexmkrc --> apply RC file to latexmk command.
|
|
|
|
+ vc --> run vc script (integrates git with LaTeX, deprecated by gitinfo2, kept for backwards support).
|
|
|
|
+ ./vc --> run vc script (integrates git with LaTeX, deprecated by gitinfo2, kept for backwards support).
|
|
|
|
|
|
|
|
|
|
|
|
EOF
|
|
|
|
EOF
|
|
|
|
exit
|
|
|
|
exit
|
|
|
@ -35,35 +37,12 @@ EOF
|
|
|
|
# keep track of runtime of entire script
|
|
|
|
# keep track of runtime of entire script
|
|
|
|
starttime=$(date +%s)
|
|
|
|
starttime=$(date +%s)
|
|
|
|
|
|
|
|
|
|
|
|
# in future, consider integrating this color setup with ~/.local/bin/echo-colours.sh
|
|
|
|
# load colours (this script depends on colours being defined!)
|
|
|
|
setup_colors() {
|
|
|
|
# TO-DO: to make this dependency non-critical, consider making all invocations of colour
|
|
|
|
if [[ -t 2 ]] && [[ -z "${NO_COLOR-}" ]] && [[ "${TERM-}" != "dumb" ]]; then
|
|
|
|
# optional (depending on whether colours.sh was found, or a CLI flag perhaps)
|
|
|
|
NOFORMAT='\033[0m'
|
|
|
|
if [ -f "/home/taha/.local/bin/echo-colours.sh" ]; then
|
|
|
|
# text color
|
|
|
|
. "/home/taha/.local/bin/echo-colours.sh"
|
|
|
|
Black='\033[0;30m' Red='\033[0;31m' Green='\033[0;32m' Yellow='\033[0;33m' Blue='\033[0;34m' Purple='\033[0;35m' Cyan='\033[0;36m' White='\033[0;37m'
|
|
|
|
fi
|
|
|
|
# bold text and color
|
|
|
|
|
|
|
|
BBlack='\033[1;30m' BRed='\033[1;31m' BGreen='\033[1;32m' BYellow='\033[1;33m' BBlue='\033[1;34m' BPurple='\033[1;35m' BCyan='\033[1;36m' BWhite='\033[1;37m'
|
|
|
|
|
|
|
|
# underline and color
|
|
|
|
|
|
|
|
UBlack='\033[4;30m' URed='\033[4;31m' UGreen='\033[4;32m' UYellow='\033[4;33m' UBlue='\033[4;34m' UPurple='\033[4;35m' UCyan='\033[4;36m' UWhite='\033[4;37m'
|
|
|
|
|
|
|
|
# text on background color
|
|
|
|
|
|
|
|
On_Black='\033[40m' On_Red='\033[41m' On_Green='\033[42m' On_Yellow='\033[43m' On_Blue='\033[44m' On_Purple='\033[45m' On_Cyan='\033[46m' On_White='\033[47m'
|
|
|
|
|
|
|
|
# high intensity color
|
|
|
|
|
|
|
|
IBlack='\033[0;90m' IRed='\033[0;91m' IGreen='\033[0;92m' IYellow='\033[0;93m' IBlue='\033[0;94m' IPurple='\033[0;95m' ICyan='\033[0;96m' IWhite='\033[0;97m'
|
|
|
|
|
|
|
|
# bold high intensity color
|
|
|
|
|
|
|
|
BIBlack='\033[1;90m' BIRed='\033[1;91m' BIGreen='\033[1;92m' BIYellow='\033[1;93m' BIBlue='\033[1;94m' BIPurple='\033[1;95m' BICyan='\033[1;96m' BIWhite='\033[1;97m'
|
|
|
|
|
|
|
|
# text on high intensity background color
|
|
|
|
|
|
|
|
On_IBlack='\033[0;100m' On_IRed='\033[0;101m' On_IGreen='\033[0;102m' On_IYellow='\033[0;103m' On_IBlue='\033[0;104m' On_IPurple='\033[0;105m' On_ICyan='\033[0;106m' On_IWhite='\033[0;107m'
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
NOFORMAT=''
|
|
|
|
|
|
|
|
Black='' Red='' Green='' Yellow='' Blue='' Purple='' Cyan='' White=''
|
|
|
|
|
|
|
|
BBlack='' BRed='' BGreen='' BYellow='' BBlue='' BPurple='' BCyan='' BWhite=''
|
|
|
|
|
|
|
|
UBlack='' URed='' UGreen='' UYellow='' UBlue='' UPurple='' UCyan='' UWhite=''
|
|
|
|
|
|
|
|
On_Black='' On_Red='' On_Green='' On_Yellow='' On_Blue='' On_Purple='' On_Cyan='' On_White=''
|
|
|
|
|
|
|
|
IBlack='' IRed='' IGreen='' IYellow='' IBlue='' IPurple='' ICyan='' IWhite=''
|
|
|
|
|
|
|
|
BIBlack='' BIRed='' BIGreen='' BIYellow='' BIBlue='' BIPurple='' BICyan='' BIWhite=''
|
|
|
|
|
|
|
|
On_IBlack='' On_IRed='' On_IGreen='' On_IYellow='' On_IBlue='' On_IPurple='' On_ICyan='' On_IWhite=''
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
msg() {
|
|
|
|
msg() {
|
|
|
|
echo >&2 -e "${1-}"
|
|
|
|
echo >&2 -e "${1-}"
|
|
|
@ -71,7 +50,7 @@ msg() {
|
|
|
|
|
|
|
|
|
|
|
|
# examples:
|
|
|
|
# examples:
|
|
|
|
# die "Some message (exiting with status 1)"
|
|
|
|
# die "Some message (exiting with status 1)"
|
|
|
|
# die "Some message (exiting with status -->)" 0
|
|
|
|
# die "Some message (exiting with status -->)" 0 # this is not working
|
|
|
|
die() {
|
|
|
|
die() {
|
|
|
|
local msg=$1
|
|
|
|
local msg=$1
|
|
|
|
local code=${2-1} # default exit status 1
|
|
|
|
local code=${2-1} # default exit status 1
|
|
|
@ -85,28 +64,30 @@ parse_params() {
|
|
|
|
case "${1-}" in
|
|
|
|
case "${1-}" in
|
|
|
|
-h | --help) usage ;;
|
|
|
|
-h | --help) usage ;;
|
|
|
|
-v | --verbose) set -x ;;
|
|
|
|
-v | --verbose) set -x ;;
|
|
|
|
--no-color) NO_COLOR=1 ;;
|
|
|
|
--aux | --menu) show_menu=true ;;
|
|
|
|
|
|
|
|
--no-alert | --silent) disable_alert=true ;;
|
|
|
|
-?*) die "Unknown option: $1" ;;
|
|
|
|
-?*) die "Unknown option: $1" ;;
|
|
|
|
*) break ;;
|
|
|
|
*) break ;;
|
|
|
|
esac
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
args=("$@")
|
|
|
|
args=("$@")
|
|
|
|
|
|
|
|
|
|
|
|
# Check number of arguments
|
|
|
|
# If no args were given, show aux menu mode
|
|
|
|
# this script can be run with one argument is process mode or with zero arguments in post-processing mode
|
|
|
|
# note that flags don't count as args, so as long as no jobname was given
|
|
|
|
[[ ${#args[@]} -gt 1 ]] && die "More than one argument not supported"
|
|
|
|
# (irrespective of provided flags), aux menu will be entered
|
|
|
|
# we use maintrack variable to keep track of whether auxiliary menu should be entered
|
|
|
|
[[ ${#args[@]} -eq 0 ]] && show_menu=true
|
|
|
|
[[ ${#args[@]} -eq 1 ]] && maintrack=true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
maintrack=false # I'm not really happy with this variable *name*
|
|
|
|
show_menu=false
|
|
|
|
|
|
|
|
# gotify alert is enabled by default (assuming the job takes longer than X seconds)
|
|
|
|
|
|
|
|
disable_alert=false
|
|
|
|
parse_params "$@"
|
|
|
|
parse_params "$@"
|
|
|
|
setup_colors
|
|
|
|
# setup_colors
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clear
|
|
|
|
clear
|
|
|
@ -180,7 +161,7 @@ aux_xdy="*.xdy" # glossaries (xindy)
|
|
|
|
auxfiles="${aux_acn} ${aux_acr} ${aux_alg} ${aux_aux} ${aux_bbl} ${aux_blg} ${aux_dep} ${aux_dpth} ${aux_fdb} ${aux_fig} ${aux_fls} ${aux_glg} ${aux_glo} ${aux_gls} ${aux_ist} ${aux_lob} ${aux_lof} ${aux_log} ${aux_lol} ${aux_lor} ${aux_los} ${aux_lot} ${aux_maf} ${aux_out} ${aux_lox} ${aux_make} ${aux_map} ${aux_mtc} ${aux_run} ${aux_slg} ${aux_slo} ${aux_sls} ${aux_tikz} ${aux_tdo} ${aux_toc} ${aux_xdy}"
|
|
|
|
auxfiles="${aux_acn} ${aux_acr} ${aux_alg} ${aux_aux} ${aux_bbl} ${aux_blg} ${aux_dep} ${aux_dpth} ${aux_fdb} ${aux_fig} ${aux_fls} ${aux_glg} ${aux_glo} ${aux_gls} ${aux_ist} ${aux_lob} ${aux_lof} ${aux_log} ${aux_lol} ${aux_lor} ${aux_los} ${aux_lot} ${aux_maf} ${aux_out} ${aux_lox} ${aux_make} ${aux_map} ${aux_mtc} ${aux_run} ${aux_slg} ${aux_slo} ${aux_sls} ${aux_tikz} ${aux_tdo} ${aux_toc} ${aux_xdy}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if $maintrack; then
|
|
|
|
if [[ $show_menu == "false" ]]; then
|
|
|
|
# Check if the argument contains a filetype
|
|
|
|
# Check if the argument contains a filetype
|
|
|
|
# (assumes a complete filename was passed)
|
|
|
|
# (assumes a complete filename was passed)
|
|
|
|
jobfilename=${args[0]}
|
|
|
|
jobfilename=${args[0]}
|
|
|
@ -238,9 +219,9 @@ if $maintrack; then
|
|
|
|
assetpathtarget="$assetpathtarget/${asset_array[1]}"
|
|
|
|
assetpathtarget="$assetpathtarget/${asset_array[1]}"
|
|
|
|
# also redefine $asset so we keep only the asset path
|
|
|
|
# also redefine $asset so we keep only the asset path
|
|
|
|
asset="${asset_array[0]}"
|
|
|
|
asset="${asset_array[0]}"
|
|
|
|
# create the local subdir inside assets/<current/
|
|
|
|
# create the local subdir inside assets/<current/
|
|
|
|
mkdir -p "$assetpathtarget" # -p suppresses error if dir already exists
|
|
|
|
mkdir -p "$assetpathtarget" # -p suppresses error if dir already exists
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
msg "<thesis> Copying $asset to $assetpathtarget"
|
|
|
|
msg "<thesis> Copying $asset to $assetpathtarget"
|
|
|
|
# cp but don't overwrite existing files
|
|
|
|
# cp but don't overwrite existing files
|
|
|
|
cp --preserve=timestamps --no-clobber --recursive $asset $assetpathtarget
|
|
|
|
cp --preserve=timestamps --no-clobber --recursive $asset $assetpathtarget
|
|
|
@ -267,7 +248,7 @@ if $maintrack; then
|
|
|
|
photoslastrun="$path_thesis/assets/photos/.lowres/lastrun"
|
|
|
|
photoslastrun="$path_thesis/assets/photos/.lowres/lastrun"
|
|
|
|
if [ ! -f "$photoslastrun" ]; then
|
|
|
|
if [ ! -f "$photoslastrun" ]; then
|
|
|
|
# if, for some reason, the lastrun file does not exist
|
|
|
|
# if, for some reason, the lastrun file does not exist
|
|
|
|
# copy over everything and then create the file
|
|
|
|
# copy over everything and then create the file
|
|
|
|
# (except for the .lowres tree itself, and any assets.external files)
|
|
|
|
# (except for the .lowres tree itself, and any assets.external files)
|
|
|
|
rsync -av "$path_thesis/assets/photos/" "$path_thesis/assets/photos/.lowres/" --exclude ".lowres/" --exclude "assets.external"
|
|
|
|
rsync -av "$path_thesis/assets/photos/" "$path_thesis/assets/photos/.lowres/" --exclude ".lowres/" --exclude "assets.external"
|
|
|
|
touch "$photoslastrun"
|
|
|
|
touch "$photoslastrun"
|
|
|
@ -346,13 +327,13 @@ if $maintrack; then
|
|
|
|
# Run pdflatex, bibtex, and company
|
|
|
|
# Run pdflatex, bibtex, and company
|
|
|
|
# Leaving this if-else for historical reasons, and also to print the message
|
|
|
|
# Leaving this if-else for historical reasons, and also to print the message
|
|
|
|
if $ltxmkrc; then
|
|
|
|
if $ltxmkrc; then
|
|
|
|
msg "${On_Cyan}<cheRTeX> Calling LaTeXMK, detected .latemxkrc file${NOFORMAT}"
|
|
|
|
msg "${On_Cyan}<cheRTeX> Calling LaTeXMK, detected .latemxkrc file${Color_Off}"
|
|
|
|
simpledelay.sh 2
|
|
|
|
simpledelay.sh 2
|
|
|
|
# note: latexmk does not need us to invoke "-r .latexmkrc", it finds and uses
|
|
|
|
# note: latexmk does not need us to invoke "-r .latexmkrc", it finds and uses
|
|
|
|
# the RC file automatically (as evidenced by latexmk's output)
|
|
|
|
# the RC file automatically (as evidenced by latexmk's output)
|
|
|
|
latexmk -pdf -bibtex $jobname
|
|
|
|
latexmk -pdf -bibtex $jobname
|
|
|
|
else
|
|
|
|
else
|
|
|
|
msg "${On_Cyan}<cheRTeX> Calling LaTeXMK${NOFORMAT}"
|
|
|
|
msg "${On_Cyan}<cheRTeX> Calling LaTeXMK${Color_Off}"
|
|
|
|
simpledelay.sh 2
|
|
|
|
simpledelay.sh 2
|
|
|
|
latexmk -pdf -bibtex $jobname
|
|
|
|
latexmk -pdf -bibtex $jobname
|
|
|
|
fi
|
|
|
|
fi
|
|
|
@ -435,7 +416,7 @@ else
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
die "All done. Exiting..." 0
|
|
|
|
die "All done. Exiting..."
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -451,7 +432,7 @@ runtime=$(( $endtime - $starttime ))
|
|
|
|
|
|
|
|
|
|
|
|
# send push message to Gotify server
|
|
|
|
# send push message to Gotify server
|
|
|
|
# if runtime is longer than X minutes (suitable limit perhaps 3 min)
|
|
|
|
# if runtime is longer than X minutes (suitable limit perhaps 3 min)
|
|
|
|
if (( $runtime > 70 )); then
|
|
|
|
if (( $runtime > 180 )) && [[ $disable_alert == "false" ]]; then
|
|
|
|
# POST request to Gotify server works without needing Gotify CLI on this box
|
|
|
|
# POST request to Gotify server works without needing Gotify CLI on this box
|
|
|
|
# NOTE, multi-line bash command fails if interrupted by comment lines!
|
|
|
|
# NOTE, multi-line bash command fails if interrupted by comment lines!
|
|
|
|
# Hide CURL response (-o /dev/null) and progress bar (--silent)
|
|
|
|
# Hide CURL response (-o /dev/null) and progress bar (--silent)
|
|
|
@ -465,16 +446,16 @@ if (( $runtime > 70 )); then
|
|
|
|
msg "Push notification sent to Gotify"
|
|
|
|
msg "Push notification sent to Gotify"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
msg "${On_Cyan}-------------------------------------${NOFORMAT}"
|
|
|
|
msg "${On_Cyan}-------------------------------------${Color_Off}"
|
|
|
|
# the padding for runtime makes the formatting work
|
|
|
|
# the padding for runtime makes the formatting work
|
|
|
|
# three digits for seconds is enough for just above 15 minutes
|
|
|
|
# three digits for seconds is enough for just above 15 minutes
|
|
|
|
printf "${On_Cyan}=== chertex.sh completed in %03d s ===${NOFORMAT}\n" $runtime 1>&2
|
|
|
|
printf "${On_Cyan}=== chertex.sh completed in %03d s ===${Color_Off}\n" $runtime 1>&2
|
|
|
|
if [[ $cetcest == "CET" ]]; then
|
|
|
|
if [[ $cetcest == "CET" ]]; then
|
|
|
|
msg "${On_Cyan}=== $(date) ===${NOFORMAT}"
|
|
|
|
msg "${On_Cyan}=== $(date) ===${Color_Off}"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
msg "${On_Cyan}=== $(date) ===${NOFORMAT}"
|
|
|
|
msg "${On_Cyan}=== $(date) ===${Color_Off}"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
msg "${On_Cyan}-------------------------------------${NOFORMAT}"
|
|
|
|
msg "${On_Cyan}-------------------------------------${Color_Off}"
|
|
|
|
simpledelay.sh 3
|
|
|
|
simpledelay.sh 3
|
|
|
|
|
|
|
|
|
|
|
|
exit 0
|
|
|
|
exit 0
|
|
|
|