%\iffalse
% gitfile-info.dtx generated using makedtx version 0.94b (c) Nicola Talbot
% Command line args:
%   -date "2019-08-21:13:19:44 -- Version 0.5"
%   -codetitle "Code"
%   -src "(.*)\.sty=>\1.sty"
%   -src "gfi-run.py=>gfi-run.py"
%   -src "post-commit.py=>post-commit.py"
%   -src "post-merge.py=>post-merge.py"
%   -src "gitfile-info.gfi=>gitfile-info.gfi"
%   -macrocode "gfi-run.py"
%   -macrocode "post-commit.py"
%   -macrocode "post-merge.py"
%   -macrocode "gitfile-info.gfi"
%   -doc "../dokumentation.tex"
%   -author "André Hilbig, mail@andrehilbig.de"
%   -comment "gitfile-info.gfi"
%   -comment "gfi-run.py"
%   -comment "post-commit.py"
%   -comment "post-merge.py"
%   -setambles "gitfile-info.gfi=>\nopreamble\nopostamble"
%   -setambles "gfi-run.py=>\nopreamble\nopostamble"
%   -setambles "post-commit.py=>\nopreamble\nopostamble"
%   -setambles "post-merge.py=>\nopreamble\nopostamble"
%   gitfile-info
% Created on 2019-08-21:13:19:44 -- Version 0.5/8/21 13:19
%\fi
%\iffalse
%<*package>
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%</package>
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2019-08-21:13:19:44 -- Version 0.5 André Hilbig, mail@andrehilbig.de, all rights reserved.
% \fi
% \iffalse
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english,ngerman]{babel}
\usepackage{xparse,xargs}
\usepackage{newfloat}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\definecolor{blau}{rgb}{0,0,0.75}         
\definecolor{orange}{rgb}{0.8,0.3,0} 

\begin{filecontents}{gitfile-info.bib}
	@electronic{gitpython,
		editor     = "gitpython-developers",
		month      = {Jun},
		year       = "2016",
		title      = "GitPython",
		subtitle	 = "GitPython is a python library used to interact with Git repositories",
		url        = {https://github.com/gitpython-developers/GitPython},
		urldate    = {2016-06-23},
	}
	@electronic{datenumber,
		author     = "J{\"o}rg-Michael Schr{\"o}der",
		month      = {Aug},
		year       = "2001",
		title      = "The datenumber.sty package v0.02",
		url        = {http://www.ctan.org/pkg/datenumber},
		urldate    = {2016-06-27},
	}
	@electronic{svninfo,
		author     = "Achim Brucker",
		month      = {Mar},
		year       = "2010",
		title      = "The svninfo package",
		url        = {http://www.ctan.org/pkg/svninfo},
		urldate    = {2016-06-27},
	}
	@electronic{gitinfo2,
		author     = "Brent Longborough",
		month      = {Nov},
		year       = "2015",
		title      = "gitinfo2.sty",
		subtitle   = "A package for accessing metadata from the git dvcs",
		url        = {http://www.ctan.org/pkg/gitinfo2},
		urldate    = {2016-06-27},
	}
\end{filecontents}
\usepackage[%
	backend=biber,
	sortlocale=de_DE,
	style=authoryear,
	bibencoding=UTF8,
	block=space,
	autocite=inline,
	language=ngerman,
]{biblatex}
\addglobalbib{gitfile-info.bib}
\renewcommand*{\mkbibnamefamily}{\textsc}

\DeclareCiteCommand{\citeauthorfull}
  {%
		\boolfalse{citetracker}%
		\boolfalse{pagetracker}%
		\usebibmacro{prenote}}
  {\ifciteindex%
     {\indexnames{labelname}}
     {}%
		 \printnames[first-last]{author}}
  {\multicitedelim}
  {\usebibmacro{postnote}}


\usepackage{hyperref}
\hypersetup{%
pdftitle = {\LaTeX-package for reading git commit info for specific files}
 pdfsubject = {}, %
 pdfkeywords = {LaTeX,CTAN,git,fileinfo,version,control}, %
 pdfauthor = {Andr\'e Hilbig}, %
 colorlinks = true, %
 hypertexnames = true, %
 linkcolor=blau, %
 filecolor=orange, %
 citecolor=blau, %
 menucolor=orange, %
 urlcolor=orange, %
 breaklinks=true %
}

\usepackage{graphics,graphicx,textcomp}
\usepackage{placeins,float,caption,prettyref}
\usepackage{pdfpages,listings,xspace}
\usepackage{amssymb,multicol,pdflscape}
\usepackage[german=guillemets]{csquotes}
\newrefformat{sec}{Abschnitt\,\ref{#1}, S.\,\pageref{#1}}
\newrefformat{paket}{Paket~\ref{#1}, S.\,\pageref{#1}}
\newrefformat{klasse}{Klasse~\ref{#1}, S.\,\pageref{#1}}
\newrefformat{fig}{Abb.\,\ref{#1}}
\newrefformat{tab}{Tab.\,\ref{#1}}
\newcommand{\refMacro}[1]{Makro \texttt{\textbackslash#1}, S.\,\pageref{#1}}
\DisableCrossrefs
\makeatletter
\makeatother
\lstset{  %
  language=[LaTeX]TeX,                 
  basicstyle=\small,            
  numbers=left,                    
  numberstyle=\footnotesize,           
  stepnumber=1,                    
  numbersep=5pt,                   
  backgroundcolor=\color{Peach!30!white},       
  showspaces=false,                
  showstringspaces=false,          
  showtabs=false,                  
  frame=single,
  tabsize=2,                       
  resetmargins=true,
  captionpos=b,                    
  title={},  
	caption={},	
  breaklines=true,
  breakautoindent=true,
  prebreak=\mbox{ $\curvearrowright$},
  postbreak=\mbox{$\rightsquigarrow$ },
  linewidth=\columnwidth,
  breakatwhitespace=true,         
  numberstyle=\tiny\color{gray},         
  keywordstyle=\color{OliveGreen}\textbf,           
  commentstyle=\color{gray}\itshape,        
  stringstyle=\color{orange},          
  morekeywords={
		minisec, subsection, glqq, grqq, euro, href,
		gfiGetAuthorName, gfiGetAuthorMail, gfiGetCommit, gfiGetCommitAbr,
		gfiGetDate, gfiGetMin, gfiGetHour, gfiGetDay, gfiGetMonth,
		gfiGetYear, gfiInfo,
  },
	literate=%
	{Ö}{{\"O}}1
	{Ä}{{\"A}}1
	{Ü}{{\"U}}1
	{ß}{\ss}2
	{ü}{{\"u}}1
	{ä}{{\"a}}1
	{ö}{{\"o}}1
	{»}{{\frqq}}4
	{«}{{\flqq}}4	
	{~}{$\sim$}1	
}
\newcommand{\wM}[1]{\texttt{\textbackslash#1}}

\xspaceaddexceptions{\guillemotright,\guillemotleft}

\usepackage{gitfile-info}
\usepackage{scrpage2}
\pagestyle{scrheadings}
\ifoot{Commit: \gfiGetCommitAbr}
\ofoot{\thepage}
\ihead{\gfiGetAuthorName}
\ohead{Stand: \gfiGetDate}

\CheckSum{122}

\makeatletter
\newcommand{\@subtitleA}{}
\newcommand{\@subtitleB}{}
\newcommand{\subtitle}[2]{%
	\renewcommand{\@subtitleA}{#1}
	\renewcommand{\@subtitleB}{#2}
}
\renewcommand\@maketitle{%
\hfil
\begin{minipage}{0.8\textwidth}
	\centering
	\vskip 2em
	\let\footnote\thanks 
	{\LARGE \@title \par }
	\vskip 1.5em
	{\Large \@subtitleA \par }
	\vskip 1.5em
	{\Large \@subtitleB \par }
	\vskip 1.5em
	{\large \@author \par}
\end{minipage}
\hfil
\vskip 1em \par
}
\makeatother

\begin{document}
\DocInput{gitfile-info.dtx}
\end{document}
%</driver>
%\fi
%	\title{\textbf{Gitfile-Info}}
%	\subtitle{%
%		\LaTeX-Paket zum Auslesen von git Ver"-sions"-in"-for"-ma"-tion"-en für eine
%		Datei
%	}{%
%	 \LaTeX-package for reading git commit info for a specific file%
%	}
%	\author{Andr\'e Hilbig\\	\href{mailto:mail@andrehilbig.de}{mail@andrehilbig.de} --
%		\href{http://ahil.eu/gfi}{ahil.eu/gfi}}
%	\date{\gfiGetDay.\gfiGetMonth.\gfiGetYear}
%	\maketitle
%
%	\begin{abstract}
%		 \foreignlanguage{english}{
%			 If you are using git to control versions of \LaTeX-files, you may want to show yourself or
%			 other users or devs the current version of the file, information about the author and last
%			 edited date. All packages for git known make that kind of information available for the whole
%			 repository. But sometimes you have a lot of files within the same repository in different
%			 versions, from different authors etc. Perhaps you also split up a big project in small files
%			 and want to show within the document who had edited what. This package gives you the
%			 opportunity to do so.
%			}
%
%			Wenn Versionen von \LaTeX-Dateien mit git kontrolliert werden, dann kommt es vor, dass für
%			einen selbst, andere Nutzern oder Entwickler der aktuelle Entwicklungsstand der Datei,
%			Hinweise zum Autor und dem Datum der letzten Bearbeitung im PDF gezeigt werden sollen. Mir
%			bekannte Pakete können zwar den Stand des Repositories auslesen, jedoch nicht für eine
%			bestimmte Datei unterscheiden. Allerdings wird manchmal mit vielen Dateien in einem Repository
%			gearbeitet, die jeweils in verschiedenen Versionen vorliegen. Möglicherweise soll auch ein
%			großes Projekt in mehrere \TeX-Dateien aufgeteilt werden. Dann soll dennoch für jede einzelne
%			Datei die Versionsinfo angezeigt werden können. Dieses Paket soll diese Funktionalität
%			liefern.
%	\end{abstract}
%	\begin{multicols}{2}
%	 \tableofcontents
%	\end{multicols}
%
%	\section{Änderungen}
%			\begin{description}
%				\item[v0.1] Intialisierung und erste Veröffentlichung
%				\item[v0.2] Dokumentation auf CTAN inkludiert
%				\item[v0.3] Pfad der Scripte in texlive in der Dokumentation aktualisiert -- Pythonscripte
%					erzwingen Py3 und geben Fehler bei falscher Lokalisierung aus.
%			\end{description}
%
%	\section{Installation}
%		\subsection{Systemanforderungen}
%			Um die Informationen über einzelne Dateien aus dem git auszulesen, müssen entsprechende
%			Scripte bzw. Hooks innerhalb des Repositories platziert werden. Damit eine möglichst breite
%			Nutzbarkeit möglich ist, habe ich mich dazu entschieden mit Python und der
%			gitpython-Bibliothek zu arbeiten.
%
%			\begin{itemize}
%				\item Python>=3
%				\item gitpython: \fullcite{gitpython}
%
%					(kann über \verb|pip| installiert werden)
%			\end{itemize}
%
%			\textbf{Hinweis:} Die Scripte werden in erster Linie für Unix-basierte Betriebssysteme
%			geschrieben. Support für andere Systeme kann und möchte ich nicht leisten.
%
%		\subsection{Automatische Installation}
%			Das Paket ist über \verb|CTAN| verfügbar und kann so mit dem \verb|tlmgr| bzw. der
%			Paketverwaltung des Betriebssystems\footnote{Leider halten viele Distributionen ihre
%				\LaTeX-Installationen nicht aktuell. Daher wird empfohlen die direkten Quellen, etwa von
%				|texlive|, zu verwenden.} abgerufen	werden.
%
%		\subsection{Manuelle Installation}
%			Falls eine automatisierte Installation nicht möglich ist, können die Pakete auch manuell
%			installiert werden. Es wird jedoch empfohlen, eine aktuelle Distribution zu verwenden, etwa
%			\verb|texlive2016|. Für Versionen davor kann keine Kompatibilität gewährleistet werden. Zur
%			Installation werden die Dateien \verb|gitfile-info.ins| und \verb|gitfile-info.dtx| benötigt.
%		
%			\begin{itemize}
%				\item Erzeugung der Paketdateien und Dokumentation
%					
%					\begin{lstlisting}[gobble=12,numbers=none,language=bash,%
%						linewidth=0.7\textwidth,resetmargins=false]
%						latex gitfile-info.ins
%						latexmk -pdf gitfile-info.dtx
%					\end{lstlisting}
%				\item Die erzeugte Paketdatei (*.sty) muss in einem für \TeX\ lesbarem Verzeichnis platziert
%					werden. Für eine lokale Installation bietet sich dafür 
%					
%					\verb|~/texmf/tex/latex/gitfile-info/|
%				 
%					an.
%				\item Außerdem werden die drei Python-Scripte 
%					
%					\verb|gfi-run.py|, \verb|post-commit.py| und \verb|post-merge.py| 
%					
%					erstellt. Diese Dateien müssen im Repository platziert werden
%					(vgl. \prettyref{sec:installation-git}).
%			\end{itemize}
%
%		\subsection{Einrichtung des Repositories}\label{sec:installation-git}
%			Die beiden Scripte \verb|post-commit.py| und \verb|post-merge.py| müssen innerhalb des Repositories im
%			Verzeichnis \verb|.git/hooks| als ausführbare Dateien unter den Namen \verb|post-commit| bzw.
%			\verb|post-merge| platziert werden.
%			\begin{description}
%				\item[\verb|post-commit|] wird bei jedem Commit ausgeführt (nachdem der Commit vollständig
%					beendet ist) und schreibt für die veränderten \TeX-Dateien Änderungen in eine Hilfsdatei.
%				\item[\verb|post-merge|] wird nach jedem merge (erfolgreich und nicht erfolgreich --
%					explizit auch nach einem pull) ausgeführt, um Veränderungen in die Hilfsdatei einzutragen.
%			\end{description}
%
%			Außerdem sollte das Script \verb|gfi-run.py| möglichst für jeden Nutzer im Repository ausführbar
%			platziert werden. Wird das Script ohne Parameter ausgeführt, liest es sämtliche unter
%			Versionsverwaltung stehende Dateien aus und erstellt die passenden Hilfsdateien. Wird dem
%			Script eine \TeX-Datei (inkl. Endung) übergeben, wird die Hilfsdatei für diese spezielle Datei
%			neu erstellt.
%			\begin{lstlisting}[gobble=10,numbers=none,language=bash,%
%				linewidth=0.7\textwidth,resetmargins=false]
%					# alle *.tex-Dateien aktualisieren
%					python gfi-run.py
%					# eine spezielle *.tex-Datei aktualisieren
%					python gfi-run.py datei.tex
%			\end{lstlisting}
%
%			Die Scripte sollten in einer Standard \texttt{texlive}"~Installation unter dem Pfad
%			\verb|…/texmf-dist/doc/support/gitfile-info/| gefunden werden können. Bei einer manuellen
%			Installation sollten die Scripte mit erstellt worden sein.
%
%			\textbf{Hinweis:} Die drei Dateien sollten Nutzern zur Verfügung gestellt werden.
%			Typischerweise sind sie nach einem Clone nicht im Baum enthalten. Jeder Nutzer muss sich die
%			Hooks selbstständig einrichten -- außer es werden entsprechende Konfigurationen festgelegt.
%
%			Außerdem muss in der \verb|*.gitignore| der Filter \verb|*.gfi| festgelegt werden, da die
%			Hilfsdateien in \textbf {keinem} Fall unter Versionsverwaltung stehen dürfen. Daher muss ein
%			Nutzer nach einem \textit{frischen} Clone das Script \verb|gfi-run.py| aufrufen, um alle
%			Hilfsdateien lokal zu erstellen.
%
%	\section{Funktionsweise}
%		\subsection{Vorüberlegungen}
%			Zunächst stand die Überlegung im Raum, Meta-Daten ähnlich wie beim Paket \verb|svninfo|
%			\autocite[vgl.][]{svninfo} direkt in die betreffenden \TeX-Dateien einzutragen. Dadurch wird
%			jedoch der Arbeitsstand verändert und der eingetragene Commit ist nicht mehr aktuell. Es
%			müsste ein erneuter Commit erfolgen usw. Hier gäbe es die Möglichkeit, automatisierte Commits
%			zu erstellen. Diese würden jedoch das Repository aufblähen.
%
%			Daher entschied ich mich dafür, die passenden Meta-Daten in eine Hilfsdatei (\verb|*.gfi|)
%			einzutragen. Hier können per simplem \LaTeX-Befehl Metadaten eingegeben werden. Das bereits
%			bestehende Paket gitinfo2 \autocite[vgl.][]{gitinfo2} konnte nicht benutzt werden, da es das
%			gesamte Repository ausliest und nicht zwischen einzelnen Dateien unterscheidet.
%
%		\subsection{Umsetzung}
%			Bei jedem Commit oder Pull gehen die Scripte alle geänderten \TeX-Dateien durch und
%			aktualisieren die entsprechenden Hilfsdateien. Hier werden \textbf{nur} Dateien mit der Endung
%			\verb|*.tex| berücksichtigt! Bei Problemen kann das Script \verb|gfi-run.py| per Hand aufgerufen
%			werden, um eine Aktualisierung zu erzwingen (vgl. \prettyref{sec:installation-git}).
%
%
%	\section{Nutzung des Pakets}
%		Alle Makros geben immer die Versionsinformationen für die \textit{aktuelle} Datei zurück, sofern
%		diese geeignet geladen wurde (vgl. \prettyref{sec:nutzung-include}). Das Paket wird dazu in der
%		Präambel des Dokumentes geladen.
%		\begin{lstlisting}[gobble=8,numbers=none,%
%			linewidth=0.7\textwidth,resetmargins=false]
%				\usepackage{gitfile-info}
%		\end{lstlisting}
%		Weitere Optionen müssen nicht angegeben werden. Sofern notwendige Hilfsdateien mit der Endung
%		\verb|*.gfi| noch nicht vorhanden sind, werden alle Makros mit Standardwerten belegt und eine
%		Warnung ausgegeben.
%
%		\subsection{Auslesen der Metadaten}
%		\DescribeMacro{\gfiGet}
%		Über die \verb|\gfiGet*|-Makros können die Metadaten aus dem Repository ausgelesen werden.
%
%		\begin{description}
%			\item[\wM{gfiGetDay}] gibt den Tag der letzten Änderung als zweistellige Ziffer zurück.
%			\item[\wM{gfiGetMonth}] gibt den Monat der letzten Änderung als zweistellige Ziffer zurück.
%			\item[\wM{gfiGetYear}] gibt das Jahr der letzten Änderung als zweistellige Ziffer zurück.
%			\item[\wM{gfiGetHour}] gibt die Stunde	der letzten Änderung als zweistellige Ziffer zurück.
%			\item[\wM{gfiGetMin}] gibt die Minute der letzten Änderung als zweistellige Ziffer
%				zurück.
%			\item[\wM{gfiGetDate}] gibt das volle Datum der letzten Änderung mit Uhrzeit im Format
%				\verb|dd. Monat yyyy HH:MM| zurück\footnote{Das Format wird durch die Scripte vorgegeben und muss in
%				diesen ggfs. angepasst werden, sofern eine Lokalisierung gewünscht ist (vgl.
%				\prettyref{sec:implementierung-scripte})}
%			\item[\wM{gfiGetAuthorName}] gibt den Namen des Autors der letzten Änderung zurück.
%			\item[\wM{gfiGetAuthorMail}] gibt die E-Mailadresse des Autors der letzten Änderung zurück.
%			\item[\wM{gfiGetCommit}] gibt den Hash des letzten Commits zurück.
%			\item[\wM{gfiGetCommitAbr}] gibt die Kurzform des letzten Commits zurück.
%		\end{description}
%
%		Ergänzend sei auf das Paket datenumber \autocite[vgl.][]{datenumber} verwiesen. Damit ist es
%		möglich obige Makros für Tag, Monat und Jahr zwischen lokalisierten Monatsbezeichnungen usw. zu
%		konvertieren. 
%
%		\subsection{Versionsinfo}
%		\DescribeMacro{\gfiInfo}
%		Sofern eine kleine Zusammenfassung der aktuellen Datei gezeigt werden soll, kann dazu das Makro
%
%		|\gfiInfo|\oarg{Hashlänge}\oarg{Datumsformat}\oarg{Autorformat}\oarg{tcolorbox}\\
%		benutzt werden. Sofern alle optionalen Argumente leer gelassen werden, wird der lange Hash, das
%		Standard \wM{gfiGetDate} und der Name des Autors als Hyperlink auf die E-Mailadresse in einer
%		|tcolorbox| mit dem Namen |gfiInfoBox| ausgegeben.
%
%		\gfiInfo
%
%		\begin{description}
%			\item[Hashlänge] kann durch Angabe von |abr| als verkürzter Hash ausgegeben werden. Standard:
%				lang.
%			\item[Datumsformat, Autorformat] können jeweils beliebige \TeX-Befehle enthalten. Standard:
%				langes Datum und Name als Hyperlink.
%			\item[tcolorbox] kann einer beliebigen über |\newtcolorbox{}| eingeführten tcolorbox
%				entsprechen. Standard: |gfiInfoBox|.
%		\end{description}
%
%		\DescribeMacro{gfiInfoBox}
%		Durch Verwendung der definierten Box \verb|gfiInfoBox| können auch beliebige andere
%		Zusammenstellungen erstellt werden.
%
%		\begin{lstlisting}[gobble=6,]
%			\begin{gfiInfoBox}
%				\vspace{1mm}
%				Die letzte Änderung wurde durch den Autor \gfiGetAuthorName\
%				(\href{mailto:\gfiGetAuthorMail}{\gfiGetAuthorMail}) am 
%				\gfiGetDay.\gfiGetMonth.\gfiGetYear\ um
%				\gfiGetHour:\gfiGetMin\,Uhr commited.	Die letzte Änderung 
%				hat den Commit \gfiGetCommitAbr.
%				\vspace{1mm}
%			\end{gfiInfoBox}
%		\end{lstlisting}
%
%		\begin{gfiInfoBox}
%			\vspace{1mm}
%			Die letzte Änderung wurde durch den Autor \gfiGetAuthorName\
%			(\href{mailto:\gfiGetAuthorMail}{\gfiGetAuthorMail}) am \gfiGetDay.\gfiGetMonth.\gfiGetYear\ um
%			\gfiGetHour:\gfiGetMin\,Uhr commited.	Die letzte Änderung hat den Commit \gfiGetCommitAbr.
%			\vspace{1mm}
%		\end{gfiInfoBox}
%
%		\subsection{Laden weiterer \TeX-Dateien}\label{sec:nutzung-include}
%		Ähnlich wie im Paket \verb|svninfo| \autocite[vgl.][]{svninfo} soll auch die Aufsplittung eines
%		größeren Projekts in mehrere Teildateien mit den entsprechenden Versionen der einzelnen Dateien
%		auslesbar sein. Dafür müssen diese Dateien ebenfalls die Endung \verb|*.tex| haben, um von den
%		Scripten erkannt zu werden.
%
%		\DescribeMacro{gfiInclude}
%		\DescribeMacro{gfiInput}
%		Im Hauptdokument werden die Metadaten automatisch beim Beginn geladen. Sofern eine weitere Datei
%		per \wM{include} oder \wM{input} geladen werden soll, müssen dafür die Befehle
%
%		|\gfiInclude|\marg{Datei} bzw. |\gfiInput|\marg{Datei}\\
%		genutzt werden. Die Endung der Datei sollte dabei \textbf{nicht} mit angegeben werden. Intern
%		werden die jeweiligen Befehle zum Laden einer weiteren Datei entsprechend genutzt. Außerdem wird
%		die zugehörige Hilfsdatei eingebunden, um die notwendigen Metadaten zu erhalten. Nachdem die
%		inkludierte Datei vollständig bearbeitet wurde, werden die Metadaten der vorherigen bzw. dann
%		aktuellen Datei geladen. Es ist auch möglich, beliebige Verschachtelungen vorzunehmen.
%
%
%
%	\section{Implementierung}
%		\subsection{Paket}
%			Das Paket lädt automatisch die zugehörige Hilfsdatei eines Hauptdokuments über den
%			entsprechenden \wM{jobname}. Der Nutzer musst hierfür keine Anpassung vornehmen. Sollten
%			weitere Dokumente eingebunden werden, müssen die bereitgestellten Befehle genutzt werden,
%			sofern die zugehörigen Versioninformationen geladen werden sollen (vgl.
%			\prettyref{sec:nutzung-include}). Die Hilfsdatei trägt den selben Namen, wie die zugehörige
%			\TeX-Datei, und enthält passende Aufrufe der \wM{gfiSet*}-Makros.
%
%			\DescribeMacro{\gfiSetDate}
%			|\gfiSetDate|\marg{Tag}\marg{Monat}\marg{Jahr}\\
%			\hspace*{5em}\marg{Stunde}\marg{Minute}\marg{Lokalisierte Langfassung}\\
%			Tag, Monat, Stunde und Minute sind jeweils als zweistellige Ziffern einzulesen. Das Jahr wird
%			als vierstellige Ziffer eingelesen und in der Langassung kann beliebiger Text stehen, der
%			einer durch die Scripte lokalisierten Version entspricht. Dadurch werden die
%			\wM{gfiGet*}-Makros definiert. \wM{gfiGetDate} entspricht der Langfassung.
%
%			\DescribeMacro{\gfiSetAuthor}
%			|\gfiSetAuthor|\marg{Name}\marg{E-Mail}\\
%			Name und E-Mail sollten die zugehörigen Daten enthalten und werden mit den \wM{gfiGet*}-Makros
%			verknüpft.
%
%			\DescribeMacro{\gfiSetCommit}
%			|\gfiSetCommit|\marg{Hash}\marg{Hash-Abr}\\
%			Die volle Fassung des Commits wird im Hash, die kurze Version im Hash-Abr eingegeben und
%			entsprechend mit \wM{gfiGet*} verknüpft.
%
%		\subsection{Scripte}\label{sec:implementierung-scripte}
%			Die Scripte sind auf deutsche Monatsbezeichnungen eingestellt. Sofern hier eine andere
%			Lokalisierung gewünscht wird, muss in \textit{allen} Scripten der entsprechende Eintrag in der
%			Präambel geändert werden! Prinzipiell reicht es aus im ersten Block zu ändern, da bei einer
%			individuellen Anpassungen Fehler nicht auftreten sollten.
%			
%			\begin{lstlisting}[gobble=8,numbers=none,language=python,%
%					linewidth=0.7\textwidth,resetmargins=false]
%				try:
%						locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
%				except:
%						try:
%								locale.setlocale(locale.LC_ALL, 'de_DE')
%			\end{lstlisting}
%					
%
%			\subsubsection{gfi-run.py}
%				Das \verb|gfi-run.py| kann sowohl zur Initialisierung als auch zur erzwungenen Aktualisierung
%				aller \TeX-Dateien benutzt werden.
%				\begin{lstlisting}[gobble=12,numbers=none,language=bash,%
%					linewidth=0.7\textwidth,resetmargins=false]
%						# alle *.tex-Dateien aktualisieren
%						python gfi-run.py
%						# eine spezielle *.tex-Datei aktualisieren
%						python gfi-run.py datei.tex
%				\end{lstlisting}
%
%				Das Script sucht dabei mithilfe von \verb|git ls-files| nach allen unter Versionsverwaltung
%				stehenden Dateien und erstellt (überschreibend) aufgrund von \verb|git log| für jede Datei
%				einzeln die passende Hilfsdatei mit den Metadaten. Wird eine Datei übergeben, so wird nicht
%				geprüft, ob diese unter Verwaltung steht und eine Hilfsdatei (im Zweifel leer) erstellt.
%
%				\lstinputlisting[language=python,title=Quelltext von gfi-run.py]{gfi-run.py}
%
%			\subsubsection{post-commit.py}
%				Der \verb|post-commit|-Hook von \verb|git| wird nach jedem Commit, der erfolgreich
%				ausgeführt wurde, automatisch ausgeführt. Der Hook liest aus, welche Dateien sich verändert
%				haben und ändert für die passenden \TeX-Dateien die Hilfsdateien mit den neuen Metadaten.
%				Das Script sollte im Verzeichnis \verb|.git/hooks| ausführbar platziert werden.
%
%				\lstinputlisting[language=python,title=Quelltext von post-commit.py]{post-commit.py}
%			
%			\subsubsection{post-merge.py}
%				Der \verb|post-merge|-Hook von \verb|git| wird nach jedem Merge ausgeführt. Er wird auch bei
%				einem nicht erfolgreichen Merge aufgerufen. Explizit bedeutet dies auch, dass nach jedem
%				Pull das Script ausgeführt wird. Der Hook liest aus, welche Dateien sich verändert
%				haben und ändert für die passenden \TeX-Dateien die Hilfsdateien mit den neuen Metadaten.
%				Das Script sollte im Verzeichnis \verb|.git/hooks| ausführbar platziert werden.
%
%				\lstinputlisting[language=python,title=Quelltext von post-merge.py]{post-merge.py}
%
%	\addcontentsline{toc}{section}{Literatur}
%	\printbibliography[title=Weiterführende Quellen]
%
%
%\StopEventually{}
%\section{Code}
%\iffalse
%    \begin{macrocode}
%<*gitfile-info.sty>
%    \end{macrocode}
%\fi
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{gitfile-info}
    [2016/06/30 v0.2 read file infos of one specific tex-file]
\RequirePackage{ifthen}
\RequirePackage{currfile}
\RequirePackage{xparse}
\RequirePackage{tcolorbox}
\tcbuselibrary{fitting, skins, breakable}
\tcbset{center title,fonttitle=\bfseries\sffamily}
\RequirePackage{hyperref}
%    \end{macrocode}
%
% \begin{macro}{\gfiGetDay}
%    \begin{macrocode}
\providecommand{\gfiGetDay}{gfi day}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetMonth}
%    \begin{macrocode}
\providecommand{\gfiGetMonth}{gfi month}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetYear}
%    \begin{macrocode}
\providecommand{\gfiGetYear}{gfi year}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetHour}
%    \begin{macrocode}
\providecommand{\gfiGetHour}{gfi hour}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetMin}
%    \begin{macrocode}
\providecommand{\gfiGetMin}{gfi min}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetAuthorName}
%    \begin{macrocode}
\providecommand{\gfiGetAuthorName}{gfi author name}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetAuthorMail}
%    \begin{macrocode}
\providecommand{\gfiGetAuthorMail}{gfi author email}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetDate}
%    \begin{macrocode}
\providecommand{\gfiGetDate}{gfi date}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetCommit}
%    \begin{macrocode}
\providecommand{\gfiGetCommit}{gfi commit}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiGetCommitAbr}
%    \begin{macrocode}
\providecommand{\gfiGetCommitAbr}{gfi commit short}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiSetDate}
%    \begin{macrocode}
\providecommand{\gfiSetDate}[6]{%
	\renewcommand{\gfiGetDay}{#1}
	\renewcommand{\gfiGetMonth}{#2}
	\renewcommand{\gfiGetYear}{#3}
	\renewcommand{\gfiGetHour}{#4}
	\renewcommand{\gfiGetMin}{#5}
	\renewcommand{\gfiGetDate}{#6}
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiSetAuthor}
%    \begin{macrocode}
\providecommand{\gfiSetAuthor}[2]{%
	\renewcommand{\gfiGetAuthorName}{#1}
	\renewcommand{\gfiGetAuthorMail}{#2}
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiSetCommit}
%    \begin{macrocode}
\providecommand{\gfiSetCommit}[2]{%
	\renewcommand{\gfiGetCommit}{#1}
	\renewcommand{\gfiGetCommitAbr}{#2}
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\colorlet{colback}{yellow!20!black}
\newtcolorbox{gfiInfoBox}{%
	every box on layer 2/.style={reset},%
	breakable,%
	title=\currfilename,%
	enhanced,%
	attach boxed title to top right={%
			yshift=-2mm,%
			xshift=-3mm,%
		},%
	boxed title style={%
		drop fuzzy shadow,%
	},%
	fontupper=\small,%
	before skip=2mm,after skip=3mm,%
	boxrule=0.4pt,left=5mm,right=2mm,top=1mm,bottom=1mm,%
	colback=yellow!50,%
	colframe=yellow!20!black,%
	sharp corners,rounded corners=southeast,arc is angular,arc=3mm,%
	underlay={%
		\path[fill=colback!80!black] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
		\path[draw=black!75!white,shorten <=-0.05mm,shorten >=-0.05mm] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
		\path[fill=yellow!50!black,draw=none] (interior.south west) rectangle	node[white,rotate=90]{\footnotesize\bfseries git} ([xshift=4mm]interior.north west);
		},%
	drop fuzzy shadow,%
}
\ProvideDocumentCommand{\gfiInfo}{O{none} O{none} O{none} O{gfiInfoBox}}{%
	\begin{#4}
		\vspace{1mm}
		\textbf{Version:} \ifthenelse{\equal{#1}{none}}{\gfiGetCommit}{\gfiGetCommitAbr}\newline
		\textbf{Stand:} \ifthenelse{\equal{#2}{none}}{\gfiGetDate}{#2}\newline
		\textbf{Zuletzt bearbeitet von:}
			\ifthenelse{\equal{#3}{none}}{\href{mailto:\gfiGetAuthorMail}{\gfiGetAuthorName}}{#3}
		\vspace{1mm}
	\end{#4}
}
%    \end{macrocode}
%
% \begin{macro}{\gfiCurrentConfig}
%    \begin{macrocode}
\providecommand{\gfiCurrentConfig}{none}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiInitJob}
%    \begin{macrocode}
\providecommand{\gfiInitJob}{%
	\IfFileExists{\jobname.gfi}{%
		\input{\jobname.gfi}
	}{%
		\@latex@warning@no@line{gitfile-info: No \jobname.gfi information-file given}
		\@latex@warning@no@line{gitfile-info:	All hooks and initialization run?}
	}
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiInitInc}
%    \begin{macrocode}
\providecommand{\gfiInitInc}[1]{%
	\IfFileExists{#1.gfi}{%
		\input{#1.gfi}
	}{%
		\@latex@warning@no@line{gitfile-info: No #1.gfi information-file given}
		\@latex@warning@no@line{gitfile-info:	All hooks and initialization run?}
	}
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\AtBeginDocument{%
	\gfiInitJob
}
%    \end{macrocode}
%
% \begin{macro}{\gfiInput}
%    \begin{macrocode}
\providecommand{\gfiInput}[1]{%
	\gfiInitInc{#1}
	\input{#1}
	\gfiInitInc{\currfiledir\currfilebase}
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\gfiInclude}
%    \begin{macrocode}
\providecommand{\gfiInclude}[1]{%
	\gfiInitInc{#1}
	\include{#1}
	\gfiInitInc{\currfiledir\currfilebase}
}
%    \end{macrocode}
% \end{macro}
%
%\iffalse
%    \begin{macrocode}
%</gitfile-info.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*gfi-run.py>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- mode:python -*-
import os
import sys
import time
import codecs
from git import Repo
import locale
# Locales for date set up to de_DE
# Please edit to you needs
try:
    locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
except:
    try:
        locale.setlocale(locale.LC_ALL, 'de_DE')
    except:
        print ("Fehler: bitte prüfen Sie das Ergebnis von 'locale -d' und fügen es in das Script ein.")

# set up the git repo
# path is the current working directory
pathrepo = os.getcwd()
repo = Repo(pathrepo)
assert not repo.bare
git = repo.git
headcommit = repo.head.commit
index = repo.index

# check for specific file (else) or
# every tex file within the git
if len(sys.argv) <= 1:
    # get all the files within the git
    commFiles = git.ls_files(full_name=True).split("\n")

    # iterate through all files and read date/author/commit and
    # write in the help file
    for fl in commFiles:
        flname, flext = os.path.splitext(fl)
        if flext == '.tex':
            rawdate = int(git.log('-1', fl,
                        pretty='format:"%at"').split('"')[1])
            date = [time.strftime("%d. %B %Y %H:%M", time.localtime(rawdate)),
                    time.strftime("%d", time.localtime(rawdate)),
                    time.strftime("%m", time.localtime(rawdate)),
                    time.strftime("%Y", time.localtime(rawdate)),
                    time.strftime("%H", time.localtime(rawdate)),
                    time.strftime("%M", time.localtime(rawdate))]
            author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1],
                      git.log('-1', fl, pretty='format:"%ae"').split('"')[1]]
            commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1],
                      git.log('-1', fl, pretty='format:"%h"').split('"')[1]]
            f = codecs.open(flname+".gfi", "w", encoding="utf-8")
            f.write("% gitfile-info control file\n")
            f.write("\\gfiSetDate{" + date[1] + "}{" + date[2] + "}{" + date[3]
                    + "}{" + date[4] + "}{" + date[5] + "}{" + date[0] + "}\n")
            f.write("\\gfiSetAuthor{" + author[0] + "}{" + author[1] + "}\n")
            f.write("\\gfiSetCommit{" + commit[0] + "}{" + commit[1] + "}")
            f.close
else:
    # get the specific file, read date/author/commit and
    # write the help file
    fl = sys.argv[1]
    flname, flext = os.path.splitext(fl)
    rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1])
    date = [time.strftime("%d. %B %Y %H:%M", time.localtime(rawdate)),
            time.strftime("%d", time.localtime(rawdate)),
            time.strftime("%m", time.localtime(rawdate)),
            time.strftime("%Y", time.localtime(rawdate)),
            time.strftime("%H", time.localtime(rawdate)),
            time.strftime("%M", time.localtime(rawdate))]
    author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1],
              git.log('-1', fl, pretty='format:"%ae"').split('"')[1]]
    commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1],
              git.log('-1', fl, pretty='format:"%h"').split('"')[1]]
    f = codecs.open(flname+".gfi", "w", encoding="utf-8")
    f.write("% gitfile-info control file\n")
    f.write("\\gfiSetDate{" + date[1] + "}{" + date[2] + "}{" + date[3]
            + "}{" + date[4] + "}{" + date[5] + "}{" + date[0] + "}\n")
    f.write("\\gfiSetAuthor{" + author[0] + "}{" + author[1] + "}\n")
    f.write("\\gfiSetCommit{" + commit[0] + "}{" + commit[1] + "}")
    f.close
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</gfi-run.py>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*post-commit.py>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- mode:python -*-
import os
import time
import codecs
from git import Repo
import locale
# Locales for date set up to de_DE
# Please edit to you needs
try:
    locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
except:
    try:
        locale.setlocale(locale.LC_ALL, 'de_DE')
    except:
        print ("Fehler: bitte prüfen Sie das Ergebnis von 'locale -d' und fügen es in das Script ein.")

# set up the git repo
# path is the current working directory
pathrepo = os.getcwd()
repo = Repo(pathrepo)
assert not repo.bare
git = repo.git
headcommit = repo.head.commit
index = repo.index

# get the commited/changed files and date/author/commit
commFiles = git.diff_tree('-r', 'HEAD', no_commit_id=True,
                          name_only=True).split("\n")
date = [time.strftime("%d. %B %Y %H:%M",
                      time.localtime(headcommit.authored_date)),
        time.strftime("%d", time.localtime(headcommit.authored_date)),
        time.strftime("%m", time.localtime(headcommit.authored_date)),
        time.strftime("%Y", time.localtime(headcommit.authored_date)),
        time.strftime("%H", time.localtime(headcommit.authored_date)),
        time.strftime("%M", time.localtime(headcommit.authored_date))]
author = [headcommit.author.name, headcommit.author.email]
commit = [headcommit.hexsha, headcommit.hexsha[:6]]

# iterate through all files and write the gfi help-files
for fl in commFiles:
    flname, flext = os.path.splitext(fl)
    if flext == '.tex':
        f = codecs.open(flname+".gfi", "w", encoding="utf-8")
        f.write("% gitfile-info control file\n")
        f.write("\\gfiSetDate{" + date[1] + "}{" + date[2] + "}{" + date[3]
                + "}{" + date[4] + "}{" + date[5] + "}{" + date[0] + "}\n")
        f.write("\\gfiSetAuthor{" + author[0] + "}{" + author[1] + "}\n")
        f.write("\\gfiSetCommit{" + commit[0] + "}{" + commit[1] + "}")
        f.close
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</post-commit.py>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*post-merge.py>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- mode:python -*-
import os
import time
import codecs
from git import Repo
import locale
# Locales for date set up to de_DE
# Please edit to you needs
try:
    locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
except:
    try:
        locale.setlocale(locale.LC_ALL, 'de_DE')
    except:
        print ("Fehler: bitte prüfen Sie das Ergebnis von 'locale -d' und fügen es in das Script ein.")

# set up the git repo
# path is the current working directory
pathrepo = os.getcwd()
repo = Repo(pathrepo)
assert not repo.bare
git = repo.git
headcommit = repo.head.commit
index = repo.index

# get the commited/changed files and date/author/commit
commFiles = git.diff_tree('-r', 'ORIG_HEAD', 'HEAD',
                          no_commit_id=True, name_only=True).split("\n")

# iterate through all files and write the gfi help-files
for fl in commFiles:
    flname, flext = os.path.splitext(fl)
    if flext == '.tex':
        rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1])
        date = [time.strftime("%d. %B %Y %H:%M", time.localtime(rawdate)),
                time.strftime("%d", time.localtime(rawdate)),
                time.strftime("%m", time.localtime(rawdate)),
                time.strftime("%Y", time.localtime(rawdate)),
                time.strftime("%H", time.localtime(rawdate)),
                time.strftime("%M", time.localtime(rawdate))]
        author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1],
                  git.log('-1', fl, pretty='format:"%ae"').split('"')[1]]
        commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1],
                  git.log('-1', fl, pretty='format:"%h"').split('"')[1]]
        f = codecs.open(flname+".gfi", "w", encoding="utf-8")
        f.write("% gitfile-info control file\n")
        f.write("\\gfiSetDate{" + date[1] + "}{" + date[2] + "}{" + date[3]
                + "}{" + date[4] + "}{" + date[5] + "}{" + date[0] + "}\n")
        f.write("\\gfiSetAuthor{" + author[0] + "}{" + author[1] + "}\n")
        f.write("\\gfiSetCommit{" + commit[0] + "}{" + commit[1] + "}")
        f.close
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</post-merge.py>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*gitfile-info.gfi>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
% gitfile-info control file
\gfiSetDate{09}{04}{2019}{19}{40}{09. April 2019 19:40}
\gfiSetAuthor{André Hilbig}{mail@andrehilbig.de}
\gfiSetCommit{ac5f4546b3f9533f287c2ce27843a92e2dfa4a68}{ac5f45}%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</gitfile-info.gfi>
%    \end{macrocode}
%\fi
%\Finale
\endinput
