% \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
