The svn-prov package

Similar documents
Martin Scharrer Version v /09/19

The svn package. Richard Lewis 25th September 2007

The onlyamsmath package

The currency package

This package allows you to add version control information as a gray watermark on each page of your document.

pgfopts LaTeX package options with pgfkeys

The currency package

The lstautogobble Package

The lips LaTeX package Chicago Manual text ellipses (Frankenstein s lips)

The hypbmsec package

The isodateo package

The svn-multi.pl Script

The filecontents package

The ushort package. Martin Väth 2013/11/26

The lips LaTeX package Chicago Manual text ellipses (Frankenstein s lips)

The totpages package

The pagenote package

The EverySel package

qstest.sty QuinScape Unit Test Package version

The jvlisting package

footnotehyper Abstract footnotehyper footnotehyper footnotehyper 1 License

{cprotect.sty} \verbatim in \macro arguments

The stdclsdv package

The tensor package for L A TEX2e

The newunicodechar package

The L A TEXgit package

The thepdfnumber package

Martin Scharrer Version v1.2a 2018/03/30. Abstract

The nbaseprt package

Version v2.01, 2000/06/29

The ted package. Manuel Pégourié-Gonnard v1.06 (2008/03/07) 1 Introduction 1. 2 Usage 1. 3 Implementation 3

The xargs package. Manuel Pégourié-Gonnard v1.1 (2008/03/22) 1 Introduction 1. 2 Usage 1

Documentation for xcomment.sty

FiNK the L A TEX2ε File Name Keeper

qstest, a L A TEX package for unit tests

A couple of things involving environments

The twoopt package. Definitions with two optional arguments. 1999/04/12, v1.3. Heiko Oberdiek 1

A Document Class and a Package for handling multi-files projects

The footbib package. Eric Domenjoud 2007/02/20. 1 General overview 1. 3 Known and potential problems 7

The alphalph package

Implementation of Forest, a pgf/tik Z-based package for drawing linguistic trees

Preparing FP7 Proposals in L A TEX with eurpoposal.cls

The mhsetup package. 1 The new internal syntax. 2 Handling optional arguments. Morten Høgholm 2007/12/03

mylatexformat Use mylatexformat to make a format based on the preamble of any LaTeX file 2011/02/12 version 3.4

The handout document class

The hanging package. Contents. 1 Introduction

Part of the adjustbox bundle. Martin Scharrer Version v /04/08. Abstract

Omit passages optionally under L A TEX. Uwe Lück 2005/04/28

Termcal.sty printing a class calendar

Advanced L A TEX course; first session

The asciilist package

Package mathcmd. F. Bosisio 1997/12/20

Termcal.sty printing a class calendar

The protecteddef package

The optparams package

European Computer Modern font with oldstyle digits

The file ltxdoc.dtx for use with L A TEX 2ε. It contains the code for ltxdoc.cls

The ifplatform package

The moderntimeline package

The komacv-lco Package

The file ltxdoc.dtx for use with L A TEX 2ε. It contains the code for ltxdoc.cls

The eolgrab package. Heiko Oberdiek <heiko.oberdiek at googl .com> 2016/05/16 v1.1

The abstract package

Purely expandable boolean expressions and switch (ε-t E X). 2010/04/15 v3.14

The BeamerSubFrame Package Reordering frames in the PDF file without reordering the source

The bigintcalc package

PixelArt A package to draw pixel-art pictures.

The BibTopicPrefix-package

logbox 2011/03/26 version 1.0

The zahl2string package

The cybercic package

The EverySel package

The chemcompounds package

L A TEX Support For T-26 Divine Font

[Software Development] Development Tools. Davide Balzarotti. Eurecom Sophia Antipolis, France

The keyval package. David Carlisle 2014/10/28

Documented Code for datatool v2.23

How to Package Your L A TEX Package

The pdfcrypt package

The fltpoint package

The eqlist package. Martin Väth 2002/08/15. Abstract

The selinput package

The mathstyle package

The adjustbox Package

The tabularx package

Documented Code For glossaries v4.35

Square cells: an array cooking lesson

Documented Code For glossaries v4.40

mfirstuc.sty v2.06: uppercasing first letter

Documented Code for datatool v2.29

Filtering TEX(t) Files by TEX

The mathstyle package. Morten Høgholm 2008/08/13 v0.86

The exam-randomizechoices package

The supertabular environment

The tabularx package

Production of solution sheets in L A TEX 2ε

The sidenotes package

The dashrule package

The L A TEX3 Programming Language A syntax proposal for TEX macro programming

The kvoptions package

Transcription:

The svn-prov package Use SVN Id keywords for package, class and file header Martin Scharrer martin@scharrer-online.de Version v1.1049-2009/05/03 1 Introduction This package is directed to authors of L A TEX packages and classes which use the version control software Subversion 1 (SVN) for their source files. It introduces three macros which are Subversion variants of the standard L A TEX header macros \ProvidesPackage, \ProvidesClass and \ProvidesFile which are used to identify package, class and other files, respectively. Instead of providing the package/class/file name and date manually they are extracted from a Subversion Id keywords string which is updated automatically by every time the source file is committed to the repository. A similar package exists for RCS, the pre-predecessor of Subversion, in the pgf 2 bundle which is called pgfrcs. For further support for Subversion keywords see the author s other package svn-multi 3. 2 Usage The following macros need an Id keyword which can initially be written as $Id:$ and will be expanded by Subversion into the following format at the next commit: $Id: filename revision date time author $ e.g. for the source file of this document: $Id: svn-prov.dtx 1049 2009-05-03 00:24:49Z martin $ For this to work the Subversion property svn:keywords must be set to (at least) Id for the source file(s). e.g. using the command line: svn propset svn:keyword Id filename(s) More information about using Subversion in the L A TEX workflow can be found in the PracTEX Journal issue 2007-3 4. 1 WWW: http://subversion.tigris.org/ 2 CTAN: http://tug.ctan.org/pkg/pgf 3 CTAN: http://tug.ctan.org/pkg/svn-multi 4 URL: http://www.tug.org/pracjourn/2007-3/{skiadas-svn ziegenhagen scharrer} 1

\ProvidesPackageSVN [ file name ]{$Id:... $}[ Package Information (version, description) ] \ProvidesClassSVN [ file name ]{$Id:... $}[ Class Information (version, description) ] \ProvidesFileSVN [ file name ]{$Id:... $}[ File Information (version, description) ]. All of these macros await a valid Subversion Id keyword string as a mandatory argument. The file name and date is extracted from this string. For cases when the file source is not stored in the correct file but packed inside a different one, like a.dtx file, the correct file name can be provided by an optional argument. Because the file extension of package and class files is predefined and therefore ignored this is not needed for them when they are packed inside a corresponding.dtx file, i.e. one with the same base name. As with the standard macros mentioned above an optional argument can be given afterwards which contains additional information (date, version, description) of the package, class or file. However, the SVN macros automatically insert the date, so only a version number and a short description should be given. If this argument is not given a default information string is used which is shown below as \revinfo. Both optional arguments can include the following macros which are only valid inside them, but not afterwards: \GetFileInfoSVN* \rev File revision. \Rev File revision followed by a space. \revinfo The default information used: (SVN Rev: revision ). \filebase File base name (file name without extension). \fileext File extension (without leading dot). \filename File name. \filedate File date (in the format YYYY/MM/DD). \filerev File revision, like \rev. The star version of this macro provides the file information of the last file which called one of the \Provides...SVN macros. It is meant to be used inside a.dtx file directly after the provide macro so that the file information can be typeset inside the documentation. A normal, non-star version is not yet implemented. The provided information macros are \filebase, \fileext, \filename, \filedate, \filerev and \fileinfo. The last one contains the file description, e.g. the content of the optional argument without date and version. The other macros were already described earlier. \DefineFileInfoSVN[ name ] New in v1. 2009/05/03 Defines a set of macros which provide the information collected by a previous \Provides... macro. The macros have the form \ name @ data where name is by default the filename either with the file extension (general files) or without 2

(packages and classes). This default can be overwritten by the optional argument. The data stands for version, rev (revision), date and info (the information part without the version number). Example: Applied to the.dtx file of this very package the following macros are defined: Macro \svn-prov.dtx@version v1.1049 \svn-prov.dtx@rev 1049 Definition \svn-prov.dtx@date 2009/05/03 \svn-prov.dtx@info DTX for svn-prov.sty The style file however would get macros like \svn-prov@version. Because - is not a letter the macros can only be accessed using \csname. Therefore the optional argument [svnprov] is used to name the macros \svnprov@version etc.. 3 Examples The following examples illustrate the usage of the provided macros and how they call the equivalent standard macros internally. The example results are produced by expanding the corresponding example code while the standard provide macros are locally redefined to typeset their own name and arguments in verbatim style. This does not only simplifies the generation of this document but makes this examples also test cases which allow the package author to test the result of the defined macros. While mostly the package macro is used here the usage is identical to the class and file macros. Of course before this macros are used it must be made sure that the svn-prov package is loaded which is done by using the following code direct before them: \RequirePackage{svn-prov} Minimal usage \ ProvidesPackageSVN \ProvidesPackage{svn-prov}[2009/05/03 (SVN Rev: 1049)] \ ProvidesClassSVN 3

\ProvidesClass{svn-prov}[2009/05/03 (SVN Rev: 1049)] \ ProvidesFileSVN \ProvidesFile{svn-prov.dtx}[2009/05/03 (SVN Rev: 1049)] Normal Usage \ ProvidesPackageSVN [ v 1.0 Example Description ] \ProvidesPackage{svn-prov}[2009/05/03 v1.0 Example Description] \ ProvidesClassSVN [ v 1.0 Example Description ] \ProvidesClass{svn-prov}[2009/05/03 v1.0 Example Description] \ ProvidesFileSVN [ v 1.0 Example Description ] \ProvidesFile{svn-prov.dtx}[2009/05/03 v1.0 Example Description] 4

Overwriting Name \ ProvidesPackageSVN [ othername ] [ v 1.0 Example Description ] \ProvidesPackage{othername}[2009/05/03 v1.0 Example Description] Overwriting Name including unneeded Extension \ ProvidesPackageSVN [ othername. sty ] [ v 1.0 Example Description ] \ProvidesPackage{othername}[2009/05/03 v1.0 Example Description] Overwriting Name using Macros \ ProvidesFileSVN [\ filebase. cfg ] [ v 1.0 Example Description ] \ProvidesFile{svn-prov.cfg}[2009/05/03 v1.0 Example Description] Using Macros in File Information String \ ProvidesPackageSVN [ v 1.\ Rev Example Description ] \ProvidesPackage{svn-prov}[2009/05/03 v1.1049 Example Description] 5

Adding Text to Default Information \ ProvidesPackageSVN [ v 1.\ Rev Extra Text \ revinfo ] \ProvidesPackage{svn-prov}[2009/05/03 v1.1049 Extra Text (SVN Rev: 1049)] Getting the File Information \ ProvidesPackageSVN [ v 1.\ Rev Extra Text \ revinfo ] \ GetFileInfoSVN * %... \ begin { tabular }{ l@ {\ :\ \ }l} File Name & \ filename \\ File Base Name & \ filebase \\ File Extension & \ fileext \\ File Date & \ filedate \\ File Revision & \ filerev \\ File Version & \ fileversion \\ File Info & \ fileinfo \\ \ end { tabular } results in: File Name : svn-prov.dtx File Base Name : svn-prov File Extension : dtx File Date : 2009/05/03 File Revision : 1049 File Version : v1.1049 File Info : Extra Text (SVN Rev: 1049) The correct package file extension.sty for \fileext can be forced by using [\filebase.sty] as a first optional argument. 6

4 Implementation 1 \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesClassSVN \ProvidesFileSVN \ProvidesPackageSVN \svnprov@generic Calls the generic macro with the original LaTeX macro and the string to be used as filename. 2 \def\providesclasssvn{% 3 \svnprov@generic\providesclass{\svnprov@filebase}% 4 } Calls the generic macro with the original LaTeX macro and the string to be used as filename. 5 \def\providesfilesvn{% 6 \svnprov@generic\providesfile{\svnprov@filebase.\svnprov@fileext}% 7 } Calls the generic macro with the original LaTeX macro and the string to be used as filename. 8 \def\providespackagesvn{% 9 \svnprov@generic\providespackage{\svnprov@filebase}% 10 } Stores the arguments (1: original macro, 2: file mask (full filename of only base is used?)). Then tests if a explicit file name was given as optional argument. If not the file name from the SVN Id string is used. 11 \def\svnprov@generic#1#2{% 12 \def\svnprov@ltxprov{#1}% 13 \def\svnprov@filemask{#2}% 14 \@ifnextchar{[}% 15 {\svnprov@getid}% 16 {\svnprov@getid[\svnprov@svnfilename]}% 17 } \svnprov@generic Saves first argument as filename and calls the scan macro with the second. A fall-back string is provided to avoid TEX parsing errors. 18 \def\svnprov@getid[#1]#2{% 19 \def\svnprov@filename{#1}% 20 \svnprov@scanid #2\relax $% 21 Id: unknown.xxx 0 0000-00-00 00:00:00Z user $\svnprov@endmarker 22 } \svnprov@scanid Parses the Id string and tests if it is correct (#1=empty, #8=\relax). If correct the values are stored in macros and the next macro is called. Otherwise a warning message is printed. In both cases any remaining text of the parsing procedure is gobbled before the next step. 23 \def\svnprov@scanid#1$% 24 Id: #2 #3 #4-#5-#6 #7 $#8{% 25 \def\next{% 26 \PackageWarning{svn-prov}{Did not found valid SVN Id line in file 7

27 #2.}{}{}{}% 28 \svnprov@gobbleopt 29 }% 30 \ifx\relax#1\relax 31 \ifx\relax#8\empty 32 \def\svnprov@svnfilename{#2}% 33 \svnprov@splitfilename{#2}% 34 \def\svnprov@filerev{#3}% 35 \def\svnprov@filedate{#4/#5/#6}% 36 \def\next{\svnprov@buildstring}% 37 \fi 38 \fi 39 \expandafter\next\svnprov@gobblerest 40 }% $ \svnprov@splitfilename \svnprov@splitfilename@ Expands the argument and initialises the file base macro before it calls the next macro with the expanded argument and a dot to protect for TEX parsing errors. The \relax is used as end marker. 41 \def\svnprov@splitfilename#1{% 42 \edef\g@tempa{#1}% 43 \let\svnprov@filebase\@gobble 44 \expandafter 45 \svnprov@splitfilename@\g@tempa.\relax 46 } The second argument is tested if it is empty (end of file name reached). If not empty the first argument is concatenated to the file base macro and the macro calls itself on the second argument. This ensures correct handling of file name which contain multiple dots. If the second argument was empty it is tested if the file base name is still in its initialised state which means that there is no file extension. Then the file base is defined to the first argument and the extension as empty. Otherwise the file extension is defined to the first argument and the file base macro is unchanged because it is already correct. 47 \def\svnprov@splitfilename@#1.#2\relax{% 48 \if&#2& 49 \ifx\svnprov@filebase\@gobble 50 \gdef\svnprov@filebase{#1}% 51 \gdef\svnprov@fileext{}% 52 \else 53 \gdef\svnprov@fileext{#1}% 54 \fi 55 \let\next\relax 56 \else 57 \xdef\svnprov@filebase{\svnprov@filebase.#1}% 58 \def\next{\svnprov@splitfilename@#2\relax}% 59 \fi 60 \next 61 } 8

\svnprov@gobblerest \svnprov@endmarker \svnprov@gobbleopt Simply gobbles everything up to the next endmarker. 62 \def\svnprov@gobblerest#1\svnprov@endmarker{} This is the end marker which should never be expanded. However it gets defined and set to an unique definition which will gobble itself if ever expanded. 63 \def\svnprov@endmarker{\@gobble{svn-prov endmarker}} Gobbles an optional argument if present. 64 \newcommand*\svnprov@gobbleopt[1][]{} \svnprov@defaultdesc Default description text to be used. Does not include the file date which is prepended later. 65 \def\svnprov@defaultdesc{% 66 (SVN Rev:\space\svnprov@filerev)% 67 } \svnprov@buildstring \GetFileInfoSVN First aliases the internal macro to user-friendly names and then builds the info string. Finally the stored original LaTeX macro is called with the filename and information. 68 \newcommand*\svnprov@buildstring[1][\svnprov@defaultdesc]{% 69 \begingroup 70 \let\rev\svnprov@filerev 71 \let\filerev\svnprov@filerev 72 \def\rev{\rev\space}% 73 \let\revinfo\svnprov@defaultdesc 74 \let\filebase\svnprov@filebase 75 \let\fileext\svnprov@fileext 76 \ifx\fileversion\@undefined 77 \def\fileversion{v0.0}% 78 \fi 79 \edef\filename{\filebase.\fileext}% 80 \xdef\svnprov@filename{\svnprov@filename}% 81 \ifx\svnprov@filename\filename\else 82 \svnprov@splitfilename{\svnprov@filename}% 83 \fi 84 \let\filename\svnprov@filename 85 \xdef\svnprov@fileinfo{#1}% 86 \endgroup 87 \svnprov@ltxprov{\svnprov@filemask}[\svnprov@filedate\space\svnprov@fileinfo]% 88 } At the moment this macro must be called with a star * which indicated that the current file is to be used. Other arguments are not implemented yet. The macro provides the file information of the current file, i.e. the last file which called one of the above \Provides... macros. For this the internal macros are simply copied to user-friendly names. This macro is inspired by the macro \GetFileInfo{ file name } from the doc package. 9

\DefineFileInfoSVN \svnprov@getversion 89 \def\getfileinfosvn#1{% 90 \ifx*#1\relax 91 \let\filebase\svnprov@filebase 92 \let\fileext\svnprov@fileext 93 \let\filename\svnprov@filename 94 \let\filedate\svnprov@filedate 95 \let\filerev\svnprov@filerev 96 \expandafter\svnprov@getversion 97 \svnprov@fileinfo\relax{} \relax\svnprov@endmarker 98 \let\fileversion\svnprov@fileversion 99 \let\fileinfo\svnprov@fileinfoonly 100 \else 101 \PackageError{svn-prov}{Macro \textbackslash GetFileInfoSVN without * is 102 not implemented yet.}{}{}{}% 103 \fi 104 } Defines macros in the form \ filename @ xxx, where xxx is date, version, rev(ision) and info. 105 \newcommand*\definefileinfosvn[1][\svnprov@filemask]{% 106 \expandafter\svnprov@getversion 107 \svnprov@fileinfo\relax{} \relax\svnprov@endmarker 108 \expandafter 109 \let\csname#1@date\endcsname\svnprov@filedate 110 \expandafter 111 \let\csname#1@version\endcsname\svnprov@fileversion 112 \expandafter 113 \let\csname#1@rev\endcsname\svnprov@filerev 114 \expandafter 115 \let\csname#1@info\endcsname\svnprov@fileinfoonly 116 } Splits the string at the first space into arguments #1 (version) and #2 (info). Argument #3 will be empty if there was no space in the string. 117 \def\svnprov@getversion#1 #2\relax#3\svnprov@endmarker{% 118 \if&#3&% 119 \def\svnprov@fileversion{??}% 120 \else 121 \def\svnprov@fileversion{#1}% 122 \def\svnprov@fileinfoonly{#2}% 123 \fi 124 } Finally, call the macro for this package itself. 125 \ProvidesPackageSVN{$Id: svn-prov.dtx 1049 2009-05-03 00:24:49Z martin $}% 126 [\svnprov@version\space Package Date/Version from SVN Keywords] 10

Change History v0.922 General: Initial version........ 1 v1. General: Added \DefineFileInfoSVN macro................... 1 11

Index Numbers written in italic refer to the page where the corresponding entry is described; numbers underlined refer to the code line of the definition; numbers in roman refer to the code lines where the entry is used. C \csname 109, 111, 113, 115 D \DefineFileInfoSVN. 105 E \endcsname........ 109, 111, 113, 115 F \filebase... 74, 79, 91 \filedate........ 94 \fileext.... 75, 79, 92 \fileinfo........ 99 \filename 79, 81, 84, 93 \filerev....... 71, 95 \fileversion. 76, 77, 98 G \GetFileInfoSVN... 89 N \next 25, 36, 39, 55, 58, 60 P \PackageError..... 101 \PackageWarning... 26 \ProvidesClass..... 3 \ProvidesClassSVN.. 2 \ProvidesFile...... 6 \ProvidesFileSVN... 5 \ProvidesPackage... 9 \ProvidesPackageSVN......... 8, 125 R \Rev............. 72 \rev........... 70, 72 \revinfo......... 73 S \svnprov@buildstring......... 36, 68 \svnprov@defaultdesc....... 65, 68, 73 \svnprov@endmarker.......... 21, 62, 63, 97, 107, 117 \svnprov@filebase.... 3, 6, 9, 43, 49, 50, 57, 74, 91 \svnprov@filedate.... 35, 87, 94, 109 \svnprov@fileext.... 6, 51, 53, 75, 92 \svnprov@fileinfo.... 85, 87, 97, 107 \svnprov@fileinfoonly..... 99, 115, 122 \svnprov@filemask....... 13, 87, 105 \svnprov@filename.. 19, 80 82, 84, 93 \svnprov@filerev 34, 66, 70, 71, 95, 113 \svnprov@fileversion. 98, 111, 119, 121 \svnprov@generic...... 3, 6, 9, 11, 18 \svnprov@getid 15, 16, 18 \svnprov@getversion..... 96, 106, 117 \svnprov@gobbleopt.......... 28, 64 \svnprov@gobblerest......... 39, 62 \svnprov@ltxprov 12, 87 \svnprov@scanid. 20, 23 \svnprov@splitfilename....... 33, 41, 82 \svnprov@splitfilename@......... 45, 47 \svnprov@svnfilename......... 16, 32 \svnprov@version.. 126 12