diff --git a/.gitignore b/.gitignore index c5ca0d0108dc8b94b0cb933cd7b182c546d3a11f..6c7ac37cc92d61fb2346419615b51820b4ec2ed3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ *.out *.fdb_latexmk *.ps +scripts/vc.tex +vc.tex diff --git a/.latexmkrc b/.latexmkrc new file mode 100644 index 0000000000000000000000000000000000000000..10bc733fe0e85c90ba9361682f07c373b9201c0c --- /dev/null +++ b/.latexmkrc @@ -0,0 +1,6 @@ +$latex = 'make vc.tex; latex %O %S'; +$pdflatex = 'make vc.tex; pdflatex %O %S'; +$xetex = 'make vc.tex; xetex %O %S'; +$xelatex = 'make vc.tex; xelatex %O %S'; +$luatex = 'make vc.tex; luatex %O %S'; +$lualatex = 'make vc.tex; lualatex %O %S'; diff --git a/Makefile b/Makefile index 790bd5897f5facf72ab3655c50a0c2deb2dbfef3..6704432ebcc5e5a102275e045d1cad9ebbfa402d 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,8 @@ clean: $(addsuffix .fls,$(JOBNAMES)) \ $(addsuffix .log,$(JOBNAMES)) \ $(addsuffix .out,$(JOBNAMES)) \ - $(addsuffix .toc,$(JOBNAMES)) + $(addsuffix .toc,$(JOBNAMES)) \ + vc.tex mrproper: clean rm -f $(PDFS) @@ -43,7 +44,10 @@ mrproper: clean preview: $(latexmk) -pvc $(LATESTJOB).tex -%.pdf: %.tex +vc.tex: .git/index .git/HEAD scripts/vc scripts/vc-git.awk + cd scripts; sh ./vc -m && mv vc.tex .. + +%.pdf: %.tex vc.tex $(latexmk) $(if $(PVC),-pvc,-pvc-) "$<" # vim: ft=make ts=8 noet diff --git a/scripts/vc b/scripts/vc new file mode 100755 index 0000000000000000000000000000000000000000..8e1988edbfec0072835fee0a267a063d9b5f9286 --- /dev/null +++ b/scripts/vc @@ -0,0 +1,41 @@ +#!/bin/sh +# This is file 'vc' from the vc bundle for TeX. +# The original file can be found at CTAN:support/vc. +# This file is Public Domain. + +# Parse command line options +full=0 +mod=0 +while [ -n "$(echo $1 | grep '-')" ]; do + case $1 in + -f ) full=1 ;; + -m ) mod=1 ;; + * ) echo 'usage: vc [-f] [-m]' + exit 1 + esac + shift +done + +# Query all info from git log +logformat="" +logformat="${logformat}Hash: %H%n" +logformat="${logformat}AbrHash: %h%n" +logformat="${logformat}ParentHashes: %P%n" +logformat="${logformat}AbrParentHashes: %p%n" +logformat="${logformat}AuthorName: %an%n" +logformat="${logformat}AuthorEmail: %ae%n" +logformat="${logformat}AuthorDate: %ai%n" +logformat="${logformat}CommitterName: %cn%n" +logformat="${logformat}CommitterEmail: %ce%n" +logformat="${logformat}CommitterDate: %ci%n" +LC_ALL=C +git --no-pager log -1 HEAD --pretty=format:"$logformat" \ + | gawk -v script=log -v full=$full -f vc-git.awk \ + > vc.tex + +# Query modification status of the working copy +if [ "$mod" = 1 ]; then + git status --porcelain=v1 \ + | gawk -v script=status -f vc-git.awk \ + >> vc.tex +fi diff --git a/scripts/vc-git.awk b/scripts/vc-git.awk new file mode 100644 index 0000000000000000000000000000000000000000..b80fced7c3ec71c99f8059887d69c16ed4b9ebcf --- /dev/null +++ b/scripts/vc-git.awk @@ -0,0 +1,83 @@ +# This is file 'vc-git.awk' from the vc bundle for TeX. +# The original file can be found at CTAN:support/vc. +# This file is Public Domain. +BEGIN { + modified = 0 +} + +### Process output of "git log". +script=="log" && /^Hash:/ { Hash = substr($0, 2+match($0, ":")) } +script=="log" && /^AbrHash:/ { AbrHash = substr($0, 2+match($0, ":")) } +script=="log" && /^ParentHashes:/ { ParentHashes = substr($0, 2+match($0, ":")) } +script=="log" && /^AbrParentHashes:/ { AbrParentHashes = substr($0, 2+match($0, ":")) } +script=="log" && /^AuthorName:/ { AuthorName = substr($0, 2+match($0, ":")) } +script=="log" && /^AuthorEmail:/ { AuthorEmail = substr($0, 2+match($0, ":")) } +script=="log" && /^AuthorDate:/ { AuthorDate = substr($0, 2+match($0, ":")) } +script=="log" && /^CommitterName:/ { CommitterName = substr($0, 2+match($0, ":")) } +script=="log" && /^CommitterEmail:/ { CommitterEmail = substr($0, 2+match($0, ":")) } +script=="log" && /^CommitterDate:/ { CommitterDate = substr($0, 2+match($0, ":")) } + +### Process output of "git status". +### Changed index? +script=="status" && /^[mMADRCU] / { modified = 1 } +### Unstaged modifications? +script=="status" && /^ [mMADRCU]/ { modified = 1 } +### Unresolved merge conflicts? +script=="status" && /^[mMADRCU][mMADRCU]/ { modified = 1 } + +END { + ### Process output of "git log". + if (script=="log") { + ### Format dates + LongDate = substr(AuthorDate, 1, 25) + DateRAW = substr(LongDate, 1, 10) + DateISO = DateRAW + DateTEX = DateISO + gsub("-", "/", DateTEX) + Time = substr(LongDate, 12, 14) + + print "%%% This file has been generated by the vc bundle for TeX." + print "%%% Do not edit this file!" + print "%%%" + + print "%%% Define Git specific macros." + print "\\gdef\\GITHash{" Hash "}%" + print "\\gdef\\GITAbrHash{" AbrHash "}%" + print "\\gdef\\GITParentHashes{" ParentHashes "}%" + print "\\gdef\\GITAbrParentHashes{" AbrParentHashes "}%" + print "\\gdef\\GITAuthorName{" AuthorName "}%" + print "\\gdef\\GITAuthorEmail{" AuthorEmail "}%" + print "\\gdef\\GITAuthorDate{" AuthorDate "}%" + print "\\gdef\\GITCommitterName{" CommitterName "}%" + print "\\gdef\\GITCommitterEmail{" CommitterEmail "}%" + print "\\gdef\\GITCommitterDate{" CommitterDate "}%" + + print "%%% Define generic version control macros." + print "\\gdef\\VCRevision{\\GITAbrHash}%" + print "\\gdef\\VCAuthor{\\GITAuthorName}%" + print "\\gdef\\VCDateRAW{" DateRAW "}%" + print "\\gdef\\VCDateISO{" DateISO "}%" + print "\\gdef\\VCDateTEX{" DateTEX "}%" + print "\\gdef\\VCTime{" Time "}%" + print "%%% Assume clean working copy." + print "\\gdef\\VCModified{0}%" + print "\\gdef\\VCRevisionMod{\\VCRevision}%" + } + + ### Process output of "git status". + if (script=="status") { + print "%%% Is working copy modified?" + print "\\gdef\\VCModified{" modified "}%" + if (modified==0) { + print "\\gdef\\VCModifiedText{}%" + print "\\gdef\\VCRevisionMod{\\VCRevision}%" + } else { + print "\\gdef\\VCModifiedText{\\textcolor{red}{mit lokalen Änderungen}}%" + print "\\gdef\\VCRevisionMod{\\VCRevision~\\VCModifiedText}%" + } + # footnote without a number: + print "\\gdef\\VCfootnote{\\begingroup\\def\\thefootnote{}\\footnote{%" + print "Erstellt aus \\url{https://github.com/stratum0/dokumente/blob/\\GITAbrHash/\\jobname.tex} \\VCModifiedText%" + print "}\\addtocounter{footnote}{-1}\\endgroup}%" + } +}