diff options
author | Norbert Preining <norbert@preining.info> | 2022-08-10 03:00:43 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-08-10 03:00:43 +0000 |
commit | 71074c48404ac3f2ded230c702fd738fc613b1f1 (patch) | |
tree | 265a50df938343cd1e1ae0a017ed1bb43d18111b /macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx | |
parent | 3265c6cdfdfcda19c6ad32ae0469761357ce65c2 (diff) |
CTAN sync 202208100300
Diffstat (limited to 'macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx')
-rw-r--r-- | macros/latex/contrib/tudscr/source/tudscr-gitinfo.dtx | 359 |
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 |