%\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 \~} % %\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} % %\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} % % \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} % % \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} % % \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} % % \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} % % \end{macrocode} %\fi %\Finale \endinput