summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx')
-rw-r--r--macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx359
1 files changed, 359 insertions, 0 deletions
diff --git a/macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx b/macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx
new file mode 100644
index 0000000000..de4f35647e
--- /dev/null
+++ b/macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx
@@ -0,0 +1,359 @@
+% \iffalse meta-comment
+%/GitFileInfo=tudscr-gitinfo.dtx
+%
+% TUD-Script -- Corporate Design of Technische Universität Dresden
+% ----------------------------------------------------------------------------
+%
+% Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2012-2022
+%
+% ----------------------------------------------------------------------------
+%
+% This work may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License, version 1.3c of the license. The latest
+% version of this license is in http://www.latex-project.org/lppl.txt and
+% version 1.3c or later is part of all distributions of LaTeX 2005/12/01
+% or later and of this work. This work has the LPPL maintenance status
+% "author-maintained". The current maintainer and author of this work
+% is Falk Hanisch.
+%
+% ----------------------------------------------------------------------------
+%
+% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz
+% in der Version 1.3c, verteilt und/oder verändert werden. Die aktuelle
+% Version dieser Lizenz ist http://www.latex-project.org/lppl.txt und
+% Version 1.3c oder später ist Teil aller Verteilungen von LaTeX 2005/12/01
+% oder später und dieses Werks. Dieses Werk hat den LPPL-Verwaltungs-Status
+% "author-maintained", wird somit allein durch den Autor verwaltet. Der
+% aktuelle Verwalter und Autor dieses Werkes ist Falk Hanisch.
+%
+% ----------------------------------------------------------------------------
+%
+% \fi
+%
+% \iffalse comment
+% Nicht verwirren lassen! In dieser Datei steht ein Teil der Dokumentation und
+% des Codes vor dem Treiber. Das ist notwendig, weil der Teil des Codes bereits
+% am Anfang des Treibers selbst benötigt wird. Genauer gesagt handelt es sich
+% dabei um den Teil zur Versionsangbabe.
+% \fi
+%
+% \selectlanguage{ngerman}
+%
+%
+%
+% \section{Versionsinformationen aus dem GitHub-Repository}
+%
+% Um sich das ganze Aktualisieren von irgendwelchen Versionangaben zu sparen,
+% werden diese einfach aus dem GitHub-Repository übernommen. Hierfür ist ein
+% externer Aufruf von \file{git~log} notwendig, die Informationen werden dabei
+% in die Datei \file{\GitContainerFile} (\cs{GitContainerFile})
+% geschrieben und entweder während des Durchlaufs mit \app{docstrip} oder aber
+% beim Erzeugen der Doku mithilfe des Paketes \pkg{tudscr-gitinfo} ausgelesen.
+%
+% \subsection{GitHub-Versionsinformationen für \app{docstrip}}
+%
+% \begin{macro}{\GitFileInfo}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% \begin{macro}{\GitContainerFile}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% \begin{macro}{\InputGitContainer}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% In \cs{GitContainerFile} wird der Name der Datei gespeichert, welche die
+% Versionsinformationen für alle Quelldateien enthält. Diese definiert für alle
+% relevanten Dateien Makros in der Form
+% |\|\meta{Dateiname}|-ver{|\meta{Datum}| |\meta{Zeit}| |\meta{Hash}|}|. Diese
+% Datei wird eingebunden, falls vorhanden sowie der Befehl \cs{GitFileInfo} für
+% das Hinzufügen der Versionsinformationen für das Erzeugen der Zieldateien mit
+% \app{docstrip} definiert.
+% \begin{macrocode}
+\def\GitContainerFile{tudscr-gitinfo-ver.aux}
+%<*!package>
+\begingroup
+ \catcode`\@11\relax%
+ \ifx\documentclass\undefined%
+ \ifx\@@input\undefined\global\let\@@input\input\fi%
+ \newread\@inputcheck%
+ \immediate\openin\@inputcheck=\GitContainerFile\relax%
+ \ifeof\@inputcheck%
+ \global\let\InputGitContainer\relax%
+ \else%
+ \gdef\InputGitContainer{\@@input\GitContainerFile\relax}%
+ \fi%
+ \closein\@inputcheck%
+ \gdef\GitFileInfo#1{%
+ \MetaPrefix\MetaPrefix\space From File:\space#1\space%
+ \expandafter\ifx\csname#1-ver\endcsname\relax%
+ (no git version info was found)%
+ \else%
+ \csname#1-ver\endcsname%
+ \fi%
+ }%
+ \aftergroup\InputGitContainer%
+ \fi%
+\endgroup
+\let\InputGitContainer\undefined
+%</!package>
+% \end{macrocode}
+% \end{macro}^^A \InputGitContainer
+% \end{macro}^^A \GitContainerFile
+% \end{macro}^^A \GitFileInfo
+%
+% \iffalse ins:batch + dtx:driver
+%<*ins>
+\ifx\documentclass\undefined
+ \input docstrip.tex
+ \ifToplevel{\batchinput{tudscr.ins}}
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+%</ins>
+%<*dtx>
+\ProvidesFile{tudscr-gitinfo.dtx}[2022/08/09]
+\RequirePackage{tudscr-gitinfo}
+\documentclass[english,ngerman,xindy]{tudscrdoc}
+\iftutex
+ \usepackage{fontspec}
+\else
+ \usepackage[T1]{fontenc}
+ \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
+\fi
+\usepackage{babel}
+\usepackage{tudscrfonts}
+\usepackage[babel]{microtype}
+
+\GitHubBase{\TUDScriptRepository}
+\begin{document}
+ \author{Falk Hanisch\TUDScriptContactTitle}
+ \maketitle
+ \tableofcontents
+ \DocInput{\filename}
+\end{document}
+%</dtx>
+% \fi
+%
+% \iffalse comment
+% Der Rest wird nicht mehr vom Treiber benötigt.
+% \fi
+%
+% \subsection{GitHub-Versionsinformationen für das Paket \pkg{tudscr-gitinfo}}
+%
+% Gleich zu Beginn werden die Versionsinformationen geladen, wenn dies nicht
+% schon passiert ist und diese vorhanden sind.
+%^^A https://www.juandebravo.com/2017/12/02/git-filter-smudge-and-clean/
+%^^A https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#filters_b
+%^^A file:///C:/Program%20Files/Git/mingw64/share/doc/git-doc/gitattributes.html
+% \begin{macrocode}
+\ProvidesPackage{tudscr-gitinfo}[%
+%!TUD@Version
+ package (obtaining git version)%
+]
+\ifcsname ver@\GitContainerFile\endcsname\else
+ \InputIfFileExists{\GitContainerFile}{}{}%
+\fi
+% \end{macrocode}
+% \begin{macro}{\GetFileInfo}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% \begin{macro}{\tud@GetFileInfo}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% \begin{macro}{\tud@@GetFileInfo}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% \begin{macro}{\tud@git@file@list}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% Der Befehl \cs{GetFileInfo} hat das gleiche Ziel wie der gleichnamige Befehl
+% aus dem Paket \pkg{doc}. Allerdings werden vorliegende Versionsinformationen
+% aus einem GitHub-Repository bevorzugt geladen. Das Lesen der Informationen,
+% welche mit \cs{ProvidesFile} gegeben werden können, wird lediglich als
+% Rückfallebene verwendet. Das angegebene Argument wird für den Dateinamen der
+% Quelldatei genutzt, wobei bei einer fehlenden Dateiendung \file{dtx}-Dateien
+% gegenüber \file{tex}-Dateien bevorzugt werden.
+% \begin{macrocode}
+\def\GetFileInfo{\tud@GetFileInfo}
+\newcommand*\tud@git@file@list{}
+\newcommand*\tud@GetFileInfo[1]{%
+ \filename@parse{#1}%
+ \ifx\filename@ext\relax%
+ \edef\filename{\filename@area\filename@base.dtx}%
+ \expandafter\IfFileExists\expandafter{\filename}{}{%
+ \edef\filename{\filename@area\filename@base.tex}%
+ }%
+ \else%
+ \edef\filename{#1}%
+ \fi%
+% \end{macrocode}
+% Mit dem Dateinamen werden über \cs{tud@git@log} Versionsinformation aus einem
+% GitHub-Repository abgerufen und verwendet (falls vorhanden). Der dazugehörige
+% Dateiname wird der Liste \cs{tud@git@file@list} hinzugefügt.
+% \begin{macrocode}
+ \expandafter\tud@git@log\expandafter{\filename}%
+ \ifcsname\filename-ver\endcsname%
+ \def\@tempa##1 ##2 ##3\@nil{%
+ \def\filedate{##1}%
+ \let\fileversion\@empty%
+ \def\filerevision{##3}%
+ }%
+ \edef\@tempb{\csname\filename-ver\endcsname}%
+ \expandafter\@tempa\@tempb\@nil%
+ \let\fileinfo\@empty%
+ \edef\tud@git@file@list{\tud@git@file@list,\filename}%
+ \else%
+% \end{macrocode}
+% Andernfalls wird eine Warnung erzeugt und auf das durch \pkg{doc} definierte
+% Verhalten von \cs{GetFileInfo} zurückgeschaltet.
+% \begin{macrocode}
+ \PackageWarningNoLine{tudscr-gitinfo}{No git info found for \filename}%
+ \expandafter\tud@@GetFileInfo\expandafter{\filename}%
+ \fi%
+}
+\newcommand*\tud@@GetFileInfo[1]{%
+ \@ifundefined{filedate}{\def\filedate{?}}{}%
+ \@ifundefined{fileversion}{\def\fileversion{?}}{}%
+ \@ifundefined{filerevision}{\let\filerevision\@empty}{}%
+ \@ifundefined{fileinfo}{\let\fileinfo\@empty}{}%
+% \end{macrocode}
+% Verbesserte Variante, um nicht \cs{relax?} in die Felder zu schreiben.
+% \begin{macrocode}
+ \ifcsname ver@\filename\endcsname%
+ \def\@tempa##1 ##2 ##3\relax##4\relax{%
+ \def\@tempb####1\relax?####2\@nil{\edef\@tempc{####1}}%
+ \@tempb##1\relax?\@nil%
+ \ifx\@tempc\@empty\else%
+ \let\filedate\@tempc%
+ \@tempb##2\relax?\@nil%
+ \ifx\@tempc\@empty\else%
+ \let\fileversion\@tempc%
+ \@tempb##3\relax?\@nil%
+ \ifx\@tempc\@empty\else%
+ \let\fileinfo\@tempc%
+ \fi%
+ \fi%
+ \fi%
+ }%
+ \edef\@tempb{\csname ver@#1\endcsname}%
+ \expandafter\@tempa\@tempb\relax? ? \relax\relax%
+ \fi%
+}
+% \end{macrocode}
+% Hiermit wird der Befehl \cs{GetFileInfo} ggf. wieder überschrieben.
+% \begin{macrocode}
+\RequirePackage{scrlfile}[%
+%!TUD@KOMAVersion
+]
+\AfterPackage*{doc}{\def\GetFileInfo{\tud@GetFileInfo}}
+% \end{macrocode}
+% \end{macro}^^A \tud@git@file@list
+% \end{macro}^^A \tud@@GetFileInfo
+% \end{macro}^^A \tud@GetFileInfo
+% \end{macro}^^A \GetFileInfo
+% \begin{macro}{\tud@git@log}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% \begin{macro}{\tud@git@@log}
+% \changes{v2.06o}{2022/08/09}{neu}^^A
+% Der Befehl \cs{tud@git@log} definiert für die im Argument angegebene Datei
+% das Makro |\|\meta{Dateiname}|-ver| mit den Versionsinformationen, welche mit
+% \cs{tud@git@@log} ausgelesen wurden.
+% \begin{macrocode}
+\RequirePackage{pdftexcmds}
+\newcommand*\tud@git@log[1]{%
+ \ifnum\pdf@shellescape=\@ne%
+ \begingroup%
+ \endlinechar=\m@ne%
+ \everyeof{\noexpand}%
+ \edef\@tempa{\tud@git@@log{#1}}%
+ \ifx\@tempa\@empty\else%
+ \edef\@tempa{%
+ \unexpanded{\expandafter\gdef\csname #1-ver\endcsname}{\@tempa}%
+ }%
+ \@tempa%
+ \fi%
+ \endgroup%
+ \fi%
+}
+% \end{macrocode}
+% Der Befehl \cs{tud@git@@log} startet den Aufruf von \file{git~log} mit den
+% notwendigen Formatierungsoptionen.
+% \begin{macrocode}
+\begingroup
+\@makeother\|
+\newcommand*\tud@git@@log[1]{}
+\xdef\tud@git@@log#1{%
+ \noexpand\@@input|"git log -1 %
+ --format='\@percentchar ad \@percentchar h' %
+ --date=format:'\@percentchar Y/\@percentchar m/\@percentchar d %
+ \@percentchar H:\@percentchar M:\@percentchar S' %
+ -- #1" %
+}
+\endgroup
+% \end{macrocode}
+% \end{macro}^^A \tud@git@@log
+% \end{macro}^^A \tud@git@log
+% Am Dokumentende wird für alle Dateien, für die eine Versionsinformation
+% gefunden werden konnte und in \cs{tud@git@file@list} gesammelt wurden, diese
+% in die externe Datei \cs{GitContainerFile} geschrieben, damit diese auch
+% ohne den abermaligen Aufruf mit dem Parameter \file{-{}-shell-escape} genutzt
+% werden können.
+% \begin{macrocode}
+\AtEndDocument{%
+ \ifnum\pdf@shellescape=\@ne%
+ \ifx\tud@git@file@list\@empty\else%
+ \edef\tud@git@file@list{\expandafter\@gobble\tud@git@file@list}%
+ \def\@tempa{%
+ \@percentchar\@percentchar\space%
+ This file was generated with `tudscr-gitinfo.sty'^^J%
+ \@percentchar\@percentchar\space%
+ It is intended to be used for generating either a documentation^^J%
+ \@percentchar\@percentchar\space%
+ with class `tudscrdoc' or installation files with `docstrip'%
+ }%
+ \chardef\reserved@c15 %
+ \ch@ck7\reserved@c\write%
+ \immediate\openout\reserved@c\GitContainerFile\relax%
+ \immediate\write\reserved@c{\@tempa}%
+ \@for\@tempa:=\tud@git@file@list\do{%
+ \edef\@tempb{%
+ \unexpanded{\expandafter\gdef\csname}%
+ \@tempa-ver%
+ \noexpand\endcsname%
+ {\csname\@tempa-ver\endcsname}%
+ }%
+ \immediate\write\reserved@c{\unexpanded\expandafter{\@tempb}}%
+ }%
+ \immediate\closeout\reserved@c%
+ \fi%
+ \fi%
+}
+% \end{macrocode}
+% Am Ende des Paketes werden die Versionsinformationen der aktuellen Datei
+% ausgelesen und anschließend mit \cs{ProvidesFile} gesetzt, wobei eine Warnung
+% erzeugt wird, wenn für die Datei schon einmal \cs{ProvidesFile} mit einer
+% anderen Angabe genutzt wurde. Die zu schreibende Angabe wird hierfür in
+% \cs{@tempa} expandiert und mit |\ ver@|\meta{Dateiname} verglichen.
+% \begin{macrocode}
+\AtEndOfPackage{%
+ \GetFileInfo{\jobname}%
+ \edef\@tempa{%
+ \filedate\space\fileversion\space%
+ \ifx\filerevision\@empty\else%
+ \filerevision\ifx\fileinfo\@empty\else\space\fi%
+ \fi%
+ \fileinfo%
+ }%
+ \ifcsname ver@\filename\endcsname%
+ \edef\@tempb{\csname ver@\filename\endcsname}%
+ \ifx\@tempb\filedate\else%
+ \PackageWarningNoLine{tudscr-gitinfo}{%
+ The obtained info for \filename\space is\MessageBreak%
+ \@tempa\MessageBreak%
+ so the current info\MessageBreak%
+ \csname ver@\filename\endcsname\MessageBreak%
+ is overwritten%
+ }%
+ \fi%
+ \fi%
+ \ProvidesFile{\filename}[\@tempa]%
+}
+% \end{macrocode}
+%
+% \PrintBackMatter
+%
+\endinput