%\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,
[email protected]"
% -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,
[email protected], 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:
[email protected]}{
[email protected]} --
% \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}{
[email protected]}
\gfiSetCommit{ac5f4546b3f9533f287c2ce27843a92e2dfa4a68}{ac5f45}% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
%</gitfile-info.gfi>
% \end{macrocode}
%\fi
%\Finale
\endinput