% \iffalse meta-comment %/GitFileInfo=tudscr-gitinfo.dtx % % TUD-Script -- Corporate Design of Technische Universität Dresden % ---------------------------------------------------------------------------- % % Copyright (C) Falk Hanisch , 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 % % \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 % %<*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} % % \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