Doku vervollständigt, kleinere Fehler bereinigt
This commit is contained in:
		| @@ -7,29 +7,41 @@ | |||||||
| \usepackage[usenames,dvipsnames,svgnames,table]{xcolor} | \usepackage[usenames,dvipsnames,svgnames,table]{xcolor} | ||||||
| \definecolor{blau}{rgb}{0,0,0.75}          | \definecolor{blau}{rgb}{0,0,0.75}          | ||||||
| \definecolor{orange}{rgb}{0.8,0.3,0}  | \definecolor{orange}{rgb}{0.8,0.3,0}  | ||||||
| %\usepackage[% |  | ||||||
| %	backend=biber, |  | ||||||
| %	sortlocale=de_DE, |  | ||||||
| %	style=authoryear, |  | ||||||
| %	bibencoding=UTF8, |  | ||||||
| %	block=space, |  | ||||||
| %	autocite=inline, |  | ||||||
| %	language=ngerman, |  | ||||||
| %]{biblatex} |  | ||||||
| %\addglobalbib{.bib} |  | ||||||
| %\renewcommand*{\mkbibnamelast}{\textsc} |  | ||||||
|  |  | ||||||
| %\DeclareCiteCommand{\citeauthorfull} | \begin{filecontents}{gitfile-info.bib} | ||||||
| %  {% | 	@electronic{gitpython, | ||||||
| %		\boolfalse{citetracker}% | 		editor     = "gitpython-developers", | ||||||
| %		\boolfalse{pagetracker}% | 		month      = {Jun}, | ||||||
| %		\usebibmacro{prenote}} | 		year       = "2016", | ||||||
| %  {\ifciteindex% | 		title      = "GitPython", | ||||||
| %     {\indexnames{labelname}} | 		subtitle	 = "GitPython is a python library used to interact with Git repositories", | ||||||
| %     {}% | 		url        = {https://github.com/gitpython-developers/GitPython}, | ||||||
| %		 \printnames[first-last]{author}} | 		urldate    = {2016-06-23}, | ||||||
| %  {\multicitedelim} | 	} | ||||||
| %  {\usebibmacro{postnote}} | \end{filecontents} | ||||||
|  | \usepackage[% | ||||||
|  | 	backend=biber, | ||||||
|  | 	sortlocale=de_DE, | ||||||
|  | 	style=authoryear, | ||||||
|  | 	bibencoding=UTF8, | ||||||
|  | 	block=space, | ||||||
|  | 	autocite=inline, | ||||||
|  | 	language=ngerman, | ||||||
|  | ]{biblatex} | ||||||
|  | \addglobalbib{gitfile-info.bib} | ||||||
|  | \renewcommand*{\mkbibnamelast}{\textsc} | ||||||
|  |  | ||||||
|  | \DeclareCiteCommand{\citeauthorfull} | ||||||
|  |   {% | ||||||
|  | 		\boolfalse{citetracker}% | ||||||
|  | 		\boolfalse{pagetracker}% | ||||||
|  | 		\usebibmacro{prenote}} | ||||||
|  |   {\ifciteindex% | ||||||
|  |      {\indexnames{labelname}} | ||||||
|  |      {}% | ||||||
|  | 		 \printnames[first-last]{author}} | ||||||
|  |   {\multicitedelim} | ||||||
|  |   {\usebibmacro{postnote}} | ||||||
|  |  | ||||||
|  |  | ||||||
| \usepackage{hyperref} | \usepackage{hyperref} | ||||||
| @@ -58,30 +70,7 @@ pdftitle = {\LaTeX-package for reading git commit info for specific files} | |||||||
| \newrefformat{klasse}{Klasse~\ref{#1}, S.\,\pageref{#1}} | \newrefformat{klasse}{Klasse~\ref{#1}, S.\,\pageref{#1}} | ||||||
| \newrefformat{fig}{Abb.\,\ref{#1}} | \newrefformat{fig}{Abb.\,\ref{#1}} | ||||||
| \newrefformat{tab}{Tab.\,\ref{#1}} | \newrefformat{tab}{Tab.\,\ref{#1}} | ||||||
| \newrefformat{bsp}{Bsp.\,\ref{#1}, S.\,\pageref{#1}} |  | ||||||
| \newcommand{\refMacro}[1]{Makro \texttt{\textbackslash#1}, S.\,\pageref{#1}} | \newcommand{\refMacro}[1]{Makro \texttt{\textbackslash#1}, S.\,\pageref{#1}} | ||||||
| \DeclareFloatingEnvironment[name={Bsp.}, |  | ||||||
| 	listname={Beispielverzeichnis}, within=section]{example} |  | ||||||
| \floatstyle{ruled} |  | ||||||
| \restylefloat{example} |  | ||||||
| \NewDocumentEnvironment{beispiel}{o o m}{ |  | ||||||
|  \begin{example}[ht!] |  | ||||||
|  \centering |  | ||||||
|  \vspace{0.2cm} |  | ||||||
|  \IfNoValueTF{#2}{ |  | ||||||
|  	\caption{#3} |  | ||||||
|  }{ |  | ||||||
|  	\caption[#2]{#3} |  | ||||||
|  } |  | ||||||
|  }{ |  | ||||||
| 	 \IfNoValueTF{#1}{ |  | ||||||
| 	 	\label{\theexample} |  | ||||||
| 	 }{ |  | ||||||
| 	 	\label{#1} |  | ||||||
| 	 } |  | ||||||
|  \vspace{0.2cm} |  | ||||||
|  \end{example} |  | ||||||
|  } |  | ||||||
| \DisableCrossrefs | \DisableCrossrefs | ||||||
| \makeatletter | \makeatletter | ||||||
| \makeatother | \makeatother | ||||||
| @@ -111,13 +100,12 @@ pdftitle = {\LaTeX-package for reading git commit info for specific files} | |||||||
|   numberstyle=\tiny\color{gray},          |   numberstyle=\tiny\color{gray},          | ||||||
|   keywordstyle=\color{OliveGreen}\textbf,            |   keywordstyle=\color{OliveGreen}\textbf,            | ||||||
|   commentstyle=\color{gray}\itshape,         |   commentstyle=\color{gray}\itshape,         | ||||||
|   stringstyle=\color{mauve},           |   stringstyle=\color{orange},           | ||||||
|   morekeywords={ |   morekeywords={ | ||||||
| 		minisec, subsection, glqq, grqq, euro, Name, Vorname, Street, | 		minisec, subsection, glqq, grqq, euro, href, | ||||||
| 		Plz, Stadt, MeinBeruf, EMail, Tel, Mobile, Sta, GebDatum, ID, | 		gfiGetAuthorName, gfiGetAuthorMail, gfiGetCommit, gfiGetCommitAbr, | ||||||
| 		Anhang, includepdf, includepdfmerge, cventry, cvlistitem, | 		gfiGetDate, gfiGetMin, gfiGetHour, gfiGetDay, gfiGetMonth, | ||||||
| 		cvlanguage, definecolor, maketitle, makePerson, cp, ln, mkdir, | 		gfiGetYear, gfiInfo, | ||||||
| 		todayOrt, todayDatum,	 |  | ||||||
|   }, |   }, | ||||||
| 	literate=% | 	literate=% | ||||||
| 	{Ö}{{\"O}}1 | 	{Ö}{{\"O}}1 | ||||||
| @@ -131,16 +119,338 @@ pdftitle = {\LaTeX-package for reading git commit info for specific files} | |||||||
| 	{«}{{\flqq}}4	 | 	{«}{{\flqq}}4	 | ||||||
| 	{~}{$\sim$}1	 | 	{~}{$\sim$}1	 | ||||||
| } | } | ||||||
|  | \newcommand{\wM}[1]{\texttt{\textbackslash#1}} | ||||||
|  |  | ||||||
| \xspaceaddexceptions{\guillemotright,\guillemotleft} | \xspaceaddexceptions{\guillemotright,\guillemotleft} | ||||||
|  |  | ||||||
|  | \usepackage{gitfile-info} | ||||||
|  | \usepackage{scrpage2} | ||||||
|  | \pagestyle{scrheadings} | ||||||
|  | \ifoot{Commit: \gfiGetCommitAbr} | ||||||
|  | \ofoot{\thepage} | ||||||
|  | \ihead{\gfiGetAuthorName} | ||||||
|  | \ohead{Stand: \gfiGetDate} | ||||||
|  |  | ||||||
| \CheckSum{0} | \CheckSum{0} | ||||||
|  |  | ||||||
| \author{André Hilbig} |  | ||||||
|  |  | ||||||
| \begin{document} | \begin{document} | ||||||
| 	\title{Gitfile-Info} | 	\title{Gitfile-Info\newline\newline | ||||||
| 	%\clearpage | 		\LaTeX-Paket zum Auslesen von git Ver"-sions"-in"-for"-ma"-tion"-en für eine | ||||||
| 	%\addcontentsline{toc}{section}{Literatur} | 		Datei\newline\newline | ||||||
| 	%\printbibliography | 	 \LaTeX-package for reading git commit info for specific files	 | ||||||
|  | 	} | ||||||
|  | 	\author{Andr\'e Hilbig -- \href{mailto:mail@andrehilbig.de}{mail@andrehilbig.de}} | ||||||
|  | 	\date{\today} | ||||||
|  | 	\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, anderen Nutzern oder Entwicklern 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 verschiedene 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] Veröffentlichung | ||||||
|  | 			\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 Paket- und Klassendateien  | ||||||
|  | 					 | ||||||
|  | 					\begin{lstlisting}[gobble=12,numbers=none,language=bash,% | ||||||
|  | 						linewidth=0.7\textwidth,resetmargins=false] | ||||||
|  | 						latex 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/bewerbung/| | ||||||
|  | 				  | ||||||
|  | 					an. | ||||||
|  | 				\item Außerdem werden die drei Python-Scripte  | ||||||
|  | 					 | ||||||
|  | 					\verb|gfi-run|, \verb|post-commit| und \verb|post-merge|  | ||||||
|  | 					 | ||||||
|  | 					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 Hooks \verb|post-commit| und \verb|post-merge| müssen innerhalb des Repositories im | ||||||
|  | 			Verzeichnis \verb|.git/hooks| als ausführbare Dateien 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| 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 | ||||||
|  | 					# eine spezielle *.tex-Datei aktualisieren | ||||||
|  | 					python gfi-run datei.tex | ||||||
|  | 			\end{lstlisting} | ||||||
|  |  | ||||||
|  | 			\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| 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| 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. | ||||||
|  |  | ||||||
|  | 		\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| 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} | ||||||
|  |  | ||||||
|  | 		\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| 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 sollen, 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 in 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 des \wM{gfiSet*}-Makros. | ||||||
|  |  | ||||||
|  | 			\DescribeMacro{\gfiSetDate} | ||||||
|  | 			|\gfiSetDate|\marg{Tag}\marg{Monat}\marg{Jahr}\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. Entsprechend werden dadurch 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! | ||||||
|  | 			 | ||||||
|  | 			\begin{lstlisting}[gobble=8,numbers=none,language=python,% | ||||||
|  | 					linewidth=0.7\textwidth,resetmargins=false] | ||||||
|  | 				locale.setlocale(locale.LC_ALL, 'de_DE') | ||||||
|  | 			\end{lstlisting} | ||||||
|  | 					 | ||||||
|  |  | ||||||
|  | 			\subsubsection{gfi-run} | ||||||
|  | 				Das \verb|gfi-run| 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 | ||||||
|  | 						# eine spezielle *.tex-Datei aktualisieren | ||||||
|  | 						python gfi-run 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]{gfi-run} | ||||||
|  |  | ||||||
|  | 			\subsubsection{post-commit} | ||||||
|  | 				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]{post-commit} | ||||||
|  | 			 | ||||||
|  | 			\subsubsection{post-merge} | ||||||
|  | 				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]{post-merge} | ||||||
|  |  | ||||||
|  | 	\clearpage | ||||||
|  | 	\addcontentsline{toc}{section}{Literatur} | ||||||
|  | 	\printbibliography | ||||||
| \end{document} | \end{document} | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								gfi-run
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								gfi-run
									
									
									
									
									
								
							| @@ -18,20 +18,19 @@ index = repo.index | |||||||
|  |  | ||||||
| if len(sys.argv) <= 1: | if len(sys.argv) <= 1: | ||||||
|     commFiles = git.ls_files(full_name=True).split("\n") |     commFiles = git.ls_files(full_name=True).split("\n") | ||||||
|     #commit = git.log('-1', format='%h').rstrip() |     #commit = git.log('-1', format='%h').rstriMin | ||||||
|  |  | ||||||
|     #cmt = subprocess.check_output('git log -1 --format="%s" ', shell=True).decode("utf-8").rstrip() |     #cmt = subprocess.check_output('git log -1 --format="%s" ', shell=True).decode("utf-8").rstrip() | ||||||
|  |  | ||||||
|     for fl in commFiles: |     for fl in commFiles: | ||||||
|         flname, flext = os.path.splitext(fl) |         flname, flext = os.path.splitext(fl) | ||||||
|         if flext == '.tex': |         if flext == '.tex': | ||||||
|             rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1]) |             rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1]) | ||||||
|             date = [time.strftime("%d. %B %Y %H:%M", time.gmtime(rawdate)), |             date = [time.strftime("%d. %B %Y %H:%M", time.localtime(rawdate)), | ||||||
|                     time.strftime("%d", time.gmtime(rawdate)), |                     time.strftime("%d", time.localtime(rawdate)), | ||||||
|                     time.strftime("%m", time.gmtime(rawdate)), |                     time.strftime("%m", time.localtime(rawdate)), | ||||||
|                     time.strftime("%Y", time.gmtime(rawdate)), |                     time.strftime("%Y", time.localtime(rawdate)), | ||||||
|                     time.strftime("%H", time.gmtime(rawdate)), |                     time.strftime("%H", time.localtime(rawdate)), | ||||||
|                     time.strftime("%M", time.gmtime(rawdate))] |                     time.strftime("%M", time.localtime(rawdate))] | ||||||
|             author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1], |             author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1], | ||||||
|                     git.log('-1', fl, pretty='format:"%ae"').split('"')[1]] |                     git.log('-1', fl, pretty='format:"%ae"').split('"')[1]] | ||||||
|             commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1], |             commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1], | ||||||
| @@ -48,12 +47,12 @@ else: | |||||||
|     fl = sys.argv[1] |     fl = sys.argv[1] | ||||||
|     flname, flext = os.path.splitext(fl) |     flname, flext = os.path.splitext(fl) | ||||||
|     rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1]) |     rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1]) | ||||||
|     date = [time.strftime("%d. %B %Y %H:%M", time.gmtime(rawdate)), |     date = [time.strftime("%d. %B %Y %H:%M", time.localtime(rawdate)), | ||||||
|             time.strftime("%d", time.gmtime(rawdate)), |             time.strftime("%d", time.localtime(rawdate)), | ||||||
|             time.strftime("%m", time.gmtime(rawdate)), |             time.strftime("%m", time.localtime(rawdate)), | ||||||
|             time.strftime("%Y", time.gmtime(rawdate)), |             time.strftime("%Y", time.localtime(rawdate)), | ||||||
|             time.strftime("%H", time.gmtime(rawdate)), |             time.strftime("%H", time.localtime(rawdate)), | ||||||
|             time.strftime("%M", time.gmtime(rawdate))] |             time.strftime("%M", time.localtime(rawdate))] | ||||||
|     author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1], |     author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1], | ||||||
|               git.log('-1', fl, pretty='format:"%ae"').split('"')[1]] |               git.log('-1', fl, pretty='format:"%ae"').split('"')[1]] | ||||||
|     commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1], |     commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1], | ||||||
|   | |||||||
| @@ -25,8 +25,8 @@ | |||||||
| 	\renewcommand{\gfiGetDay}{#1} | 	\renewcommand{\gfiGetDay}{#1} | ||||||
| 	\renewcommand{\gfiGetMonth}{#2} | 	\renewcommand{\gfiGetMonth}{#2} | ||||||
| 	\renewcommand{\gfiGetYear}{#3} | 	\renewcommand{\gfiGetYear}{#3} | ||||||
| 	\renewcommand{\gfiGetMin}{#4} | 	\renewcommand{\gfiGetHour}{#4} | ||||||
| 	\renewcommand{\gfiGetHour}{#5} | 	\renewcommand{\gfiGetMin}{#5} | ||||||
| 	\renewcommand{\gfiGetDate}{#6} | 	\renewcommand{\gfiGetDate}{#6} | ||||||
| } | } | ||||||
| \providecommand{\gfiSetAuthor}[2]{% | \providecommand{\gfiSetAuthor}[2]{% | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								post-commit
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								post-commit
									
									
									
									
									
								
							| @@ -17,12 +17,12 @@ headcommit = repo.head.commit | |||||||
| index = repo.index | index = repo.index | ||||||
|  |  | ||||||
| commFiles = git.diff_tree('-r', 'HEAD', no_commit_id=True, name_only=True).split("\n") | commFiles = git.diff_tree('-r', 'HEAD', no_commit_id=True, name_only=True).split("\n") | ||||||
| date = [time.strftime("%d. %B %Y %H:%M", time.gmtime(headcommit.authored_date)), | date = [time.strftime("%d. %B %Y %H:%M", time.localtime(headcommit.authored_date)), | ||||||
|         time.strftime("%d", time.gmtime(headcommit.authored_date)), |         time.strftime("%d", time.localtime(headcommit.authored_date)), | ||||||
|         time.strftime("%m", time.gmtime(headcommit.authored_date)), |         time.strftime("%m", time.localtime(headcommit.authored_date)), | ||||||
|         time.strftime("%Y", time.gmtime(headcommit.authored_date)), |         time.strftime("%Y", time.localtime(headcommit.authored_date)), | ||||||
|         time.strftime("%H", time.gmtime(headcommit.authored_date)), |         time.strftime("%H", time.localtime(headcommit.authored_date)), | ||||||
|         time.strftime("%M", time.gmtime(headcommit.authored_date))] |         time.strftime("%M", time.localtime(headcommit.authored_date))] | ||||||
| author = [headcommit.author.name, headcommit.author.email] | author = [headcommit.author.name, headcommit.author.email] | ||||||
| commit = [headcommit.hexsha, headcommit.hexsha[:6]] | commit = [headcommit.hexsha, headcommit.hexsha[:6]] | ||||||
| #commit = git.log('-1', format='%h').rstrip() | #commit = git.log('-1', format='%h').rstrip() | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								post-merge
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								post-merge
									
									
									
									
									
								
							| @@ -24,12 +24,12 @@ for fl in commFiles: | |||||||
|     flname, flext = os.path.splitext(fl) |     flname, flext = os.path.splitext(fl) | ||||||
|     if flext == '.tex': |     if flext == '.tex': | ||||||
|         rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1]) |         rawdate = int(git.log('-1', fl, pretty='format:"%at"').split('"')[1]) | ||||||
|         date = [time.strftime("%d. %B %Y %H:%M", time.gmtime(rawdate)), |         date = [time.strftime("%d. %B %Y %H:%M", time.localtime(rawdate)), | ||||||
|                 time.strftime("%d", time.gmtime(rawdate)), |                 time.strftime("%d", time.localtime(rawdate)), | ||||||
|                 time.strftime("%m", time.gmtime(rawdate)), |                 time.strftime("%m", time.localtime(rawdate)), | ||||||
|                 time.strftime("%Y", time.gmtime(rawdate)), |                 time.strftime("%Y", time.localtime(rawdate)), | ||||||
|                 time.strftime("%H", time.gmtime(rawdate)), |                 time.strftime("%H", time.localtime(rawdate)), | ||||||
|                 time.strftime("%M", time.gmtime(rawdate))] |                 time.strftime("%M", time.localtime(rawdate))] | ||||||
|         author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1], |         author = [git.log('-1', fl, pretty='format:"%an"').split('"')[1], | ||||||
|                   git.log('-1', fl, pretty='format:"%ae"').split('"')[1]] |                   git.log('-1', fl, pretty='format:"%ae"').split('"')[1]] | ||||||
|         commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1], |         commit = [git.log('-1', fl, pretty='format:"%H"').split('"')[1], | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user