1ca236e63SDag-Erling Smørgrav#!/bin/sh 2ca236e63SDag-Erling Smørgrav# install - install a program, script, or datafile 3b33ab329SDag-Erling Smørgrav 4b33ab329SDag-Erling Smørgravscriptversion=2004-04-01.17 5b33ab329SDag-Erling Smørgrav 6b33ab329SDag-Erling Smørgrav# This originates from X11R5 (mit/util/scripts/install.sh), which was 7b33ab329SDag-Erling Smørgrav# later released in X11R6 (xc/config/util/install.sh) with the 8b33ab329SDag-Erling Smørgrav# following copyright and license. 9ca236e63SDag-Erling Smørgrav# 10b33ab329SDag-Erling Smørgrav# Copyright (C) 1994 X Consortium 11ca236e63SDag-Erling Smørgrav# 12b33ab329SDag-Erling Smørgrav# Permission is hereby granted, free of charge, to any person obtaining a copy 13b33ab329SDag-Erling Smørgrav# of this software and associated documentation files (the "Software"), to 14b33ab329SDag-Erling Smørgrav# deal in the Software without restriction, including without limitation the 15b33ab329SDag-Erling Smørgrav# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 16b33ab329SDag-Erling Smørgrav# sell copies of the Software, and to permit persons to whom the Software is 17b33ab329SDag-Erling Smørgrav# furnished to do so, subject to the following conditions: 18b33ab329SDag-Erling Smørgrav# 19b33ab329SDag-Erling Smørgrav# The above copyright notice and this permission notice shall be included in 20b33ab329SDag-Erling Smørgrav# all copies or substantial portions of the Software. 21b33ab329SDag-Erling Smørgrav# 22b33ab329SDag-Erling Smørgrav# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23b33ab329SDag-Erling Smørgrav# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24b33ab329SDag-Erling Smørgrav# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25b33ab329SDag-Erling Smørgrav# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26b33ab329SDag-Erling Smørgrav# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 27b33ab329SDag-Erling Smørgrav# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28b33ab329SDag-Erling Smørgrav# 29b33ab329SDag-Erling Smørgrav# Except as contained in this notice, the name of the X Consortium shall not 30b33ab329SDag-Erling Smørgrav# be used in advertising or otherwise to promote the sale, use or other deal- 31b33ab329SDag-Erling Smørgrav# ings in this Software without prior written authorization from the X Consor- 32b33ab329SDag-Erling Smørgrav# tium. 33b33ab329SDag-Erling Smørgrav# 34b33ab329SDag-Erling Smørgrav# 35b33ab329SDag-Erling Smørgrav# FSF changes to this file are in the public domain. 36ca236e63SDag-Erling Smørgrav# 37ca236e63SDag-Erling Smørgrav# Calling this script install-sh is preferred over install.sh, to prevent 38ca236e63SDag-Erling Smørgrav# `make' implicit rules from creating a file called install from it 39ca236e63SDag-Erling Smørgrav# when there is no Makefile. 40ca236e63SDag-Erling Smørgrav# 41ca236e63SDag-Erling Smørgrav# This script is compatible with the BSD install script, but was written 42ca236e63SDag-Erling Smørgrav# from scratch. It can only install one file at a time, a restriction 43ca236e63SDag-Erling Smørgrav# shared with many OS's install programs. 44ca236e63SDag-Erling Smørgrav 45ca236e63SDag-Erling Smørgrav# set DOITPROG to echo to test this script 46ca236e63SDag-Erling Smørgrav 47ca236e63SDag-Erling Smørgrav# Don't use :- since 4.3BSD and earlier shells don't like it. 48ca236e63SDag-Erling Smørgravdoit="${DOITPROG-}" 49ca236e63SDag-Erling Smørgrav 50ca236e63SDag-Erling Smørgrav# put in absolute paths if you don't have them in your path; or use env. vars. 51ca236e63SDag-Erling Smørgrav 52ca236e63SDag-Erling Smørgravmvprog="${MVPROG-mv}" 53ca236e63SDag-Erling Smørgravcpprog="${CPPROG-cp}" 54ca236e63SDag-Erling Smørgravchmodprog="${CHMODPROG-chmod}" 55ca236e63SDag-Erling Smørgravchownprog="${CHOWNPROG-chown}" 56ca236e63SDag-Erling Smørgravchgrpprog="${CHGRPPROG-chgrp}" 57ca236e63SDag-Erling Smørgravstripprog="${STRIPPROG-strip}" 58ca236e63SDag-Erling Smørgravrmprog="${RMPROG-rm}" 59ca236e63SDag-Erling Smørgravmkdirprog="${MKDIRPROG-mkdir}" 60ca236e63SDag-Erling Smørgrav 61b33ab329SDag-Erling Smørgravtransformbasename= 62b33ab329SDag-Erling Smørgravtransform_arg= 63ca236e63SDag-Erling Smørgravinstcmd="$mvprog" 64ca236e63SDag-Erling Smørgravchmodcmd="$chmodprog 0755" 65b33ab329SDag-Erling Smørgravchowncmd= 66b33ab329SDag-Erling Smørgravchgrpcmd= 67b33ab329SDag-Erling Smørgravstripcmd= 68ca236e63SDag-Erling Smørgravrmcmd="$rmprog -f" 69ca236e63SDag-Erling Smørgravmvcmd="$mvprog" 70b33ab329SDag-Erling Smørgravsrc= 71b33ab329SDag-Erling Smørgravdst= 72b33ab329SDag-Erling Smørgravdir_arg= 73ca236e63SDag-Erling Smørgrav 74b33ab329SDag-Erling Smørgravusage="Usage: $0 [OPTION]... SRCFILE DSTFILE 75b33ab329SDag-Erling Smørgrav or: $0 [OPTION]... SRCFILES... DIRECTORY 76b33ab329SDag-Erling Smørgrav or: $0 -d DIRECTORIES... 77b33ab329SDag-Erling Smørgrav 78b33ab329SDag-Erling SmørgravIn the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. 79b33ab329SDag-Erling SmørgravIn the second, create the directory path DIR. 80b33ab329SDag-Erling Smørgrav 81b33ab329SDag-Erling SmørgravOptions: 82b33ab329SDag-Erling Smørgrav-b=TRANSFORMBASENAME 83b33ab329SDag-Erling Smørgrav-c copy source (using $cpprog) instead of moving (using $mvprog). 84b33ab329SDag-Erling Smørgrav-d create directories instead of installing files. 85b33ab329SDag-Erling Smørgrav-g GROUP $chgrp installed files to GROUP. 86b33ab329SDag-Erling Smørgrav-m MODE $chmod installed files to MODE. 87b33ab329SDag-Erling Smørgrav-o USER $chown installed files to USER. 88b33ab329SDag-Erling Smørgrav-s strip installed files (using $stripprog). 89b33ab329SDag-Erling Smørgrav-t=TRANSFORM 90b33ab329SDag-Erling Smørgrav--help display this help and exit. 91b33ab329SDag-Erling Smørgrav--version display version info and exit. 92b33ab329SDag-Erling Smørgrav 93b33ab329SDag-Erling SmørgravEnvironment variables override the default commands: 94b33ab329SDag-Erling Smørgrav CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG 95b33ab329SDag-Erling Smørgrav" 96b33ab329SDag-Erling Smørgrav 97b33ab329SDag-Erling Smørgravwhile test -n "$1"; do 98ca236e63SDag-Erling Smørgrav case $1 in 99b33ab329SDag-Erling Smørgrav -b=*) transformbasename=`echo $1 | sed 's/-b=//'` 100b33ab329SDag-Erling Smørgrav shift 101b33ab329SDag-Erling Smørgrav continue;; 102b33ab329SDag-Erling Smørgrav 103b33ab329SDag-Erling Smørgrav -c) instcmd=$cpprog 104ca236e63SDag-Erling Smørgrav shift 105ca236e63SDag-Erling Smørgrav continue;; 106ca236e63SDag-Erling Smørgrav 107ca236e63SDag-Erling Smørgrav -d) dir_arg=true 108ca236e63SDag-Erling Smørgrav shift 109ca236e63SDag-Erling Smørgrav continue;; 110ca236e63SDag-Erling Smørgrav 111b33ab329SDag-Erling Smørgrav -g) chgrpcmd="$chgrpprog $2" 112b33ab329SDag-Erling Smørgrav shift 113b33ab329SDag-Erling Smørgrav shift 114b33ab329SDag-Erling Smørgrav continue;; 115b33ab329SDag-Erling Smørgrav 116b33ab329SDag-Erling Smørgrav --help) echo "$usage"; exit 0;; 117b33ab329SDag-Erling Smørgrav 118ca236e63SDag-Erling Smørgrav -m) chmodcmd="$chmodprog $2" 119ca236e63SDag-Erling Smørgrav shift 120ca236e63SDag-Erling Smørgrav shift 121ca236e63SDag-Erling Smørgrav continue;; 122ca236e63SDag-Erling Smørgrav 123ca236e63SDag-Erling Smørgrav -o) chowncmd="$chownprog $2" 124ca236e63SDag-Erling Smørgrav shift 125ca236e63SDag-Erling Smørgrav shift 126ca236e63SDag-Erling Smørgrav continue;; 127ca236e63SDag-Erling Smørgrav 128b33ab329SDag-Erling Smørgrav -s) stripcmd=$stripprog 129ca236e63SDag-Erling Smørgrav shift 130ca236e63SDag-Erling Smørgrav continue;; 131ca236e63SDag-Erling Smørgrav 132ca236e63SDag-Erling Smørgrav -t=*) transformarg=`echo $1 | sed 's/-t=//'` 133ca236e63SDag-Erling Smørgrav shift 134ca236e63SDag-Erling Smørgrav continue;; 135ca236e63SDag-Erling Smørgrav 136b33ab329SDag-Erling Smørgrav --version) echo "$0 $scriptversion"; exit 0;; 137ca236e63SDag-Erling Smørgrav 138b33ab329SDag-Erling Smørgrav *) # When -d is used, all remaining arguments are directories to create. 139b33ab329SDag-Erling Smørgrav test -n "$dir_arg" && break 140b33ab329SDag-Erling Smørgrav # Otherwise, the last argument is the destination. Remove it from $@. 141b33ab329SDag-Erling Smørgrav for arg 142b33ab329SDag-Erling Smørgrav do 143b33ab329SDag-Erling Smørgrav if test -n "$dstarg"; then 144b33ab329SDag-Erling Smørgrav # $@ is not empty: it contains at least $arg. 145b33ab329SDag-Erling Smørgrav set fnord "$@" "$dstarg" 146b33ab329SDag-Erling Smørgrav shift # fnord 147ca236e63SDag-Erling Smørgrav fi 148b33ab329SDag-Erling Smørgrav shift # arg 149b33ab329SDag-Erling Smørgrav dstarg=$arg 150b33ab329SDag-Erling Smørgrav done 151b33ab329SDag-Erling Smørgrav break;; 152ca236e63SDag-Erling Smørgrav esac 153ca236e63SDag-Erling Smørgravdone 154ca236e63SDag-Erling Smørgrav 155b33ab329SDag-Erling Smørgravif test -z "$1"; then 156b33ab329SDag-Erling Smørgrav if test -z "$dir_arg"; then 157b33ab329SDag-Erling Smørgrav echo "$0: no input file specified." >&2 158ca236e63SDag-Erling Smørgrav exit 1 159b33ab329SDag-Erling Smørgrav fi 160b33ab329SDag-Erling Smørgrav # It's OK to call `install-sh -d' without argument. 161b33ab329SDag-Erling Smørgrav # This can happen when creating conditional directories. 162b33ab329SDag-Erling Smørgrav exit 0 163ca236e63SDag-Erling Smørgravfi 164ca236e63SDag-Erling Smørgrav 165b33ab329SDag-Erling Smørgravfor src 166b33ab329SDag-Erling Smørgravdo 167b33ab329SDag-Erling Smørgrav # Protect names starting with `-'. 168b33ab329SDag-Erling Smørgrav case $src in 169b33ab329SDag-Erling Smørgrav -*) src=./$src ;; 170b33ab329SDag-Erling Smørgrav esac 171b33ab329SDag-Erling Smørgrav 172b33ab329SDag-Erling Smørgrav if test -n "$dir_arg"; then 173ca236e63SDag-Erling Smørgrav dst=$src 174b33ab329SDag-Erling Smørgrav src= 175ca236e63SDag-Erling Smørgrav 176b33ab329SDag-Erling Smørgrav if test -d "$dst"; then 177ca236e63SDag-Erling Smørgrav instcmd=: 178b33ab329SDag-Erling Smørgrav chmodcmd= 179ca236e63SDag-Erling Smørgrav else 180b33ab329SDag-Erling Smørgrav instcmd=$mkdirprog 181ca236e63SDag-Erling Smørgrav fi 182ca236e63SDag-Erling Smørgrav else 183ca236e63SDag-Erling Smørgrav # Waiting for this to be detected by the "$instcmd $src $dsttmp" command 184ca236e63SDag-Erling Smørgrav # might cause directories to be created, which would be especially bad 185ca236e63SDag-Erling Smørgrav # if $src (and thus $dsttmp) contains '*'. 186b33ab329SDag-Erling Smørgrav if test ! -f "$src" && test ! -d "$src"; then 187b33ab329SDag-Erling Smørgrav echo "$0: $src does not exist." >&2 188ca236e63SDag-Erling Smørgrav exit 1 189ca236e63SDag-Erling Smørgrav fi 190ca236e63SDag-Erling Smørgrav 191b33ab329SDag-Erling Smørgrav if test -z "$dstarg"; then 192b33ab329SDag-Erling Smørgrav echo "$0: no destination specified." >&2 193ca236e63SDag-Erling Smørgrav exit 1 194ca236e63SDag-Erling Smørgrav fi 195ca236e63SDag-Erling Smørgrav 196b33ab329SDag-Erling Smørgrav dst=$dstarg 197b33ab329SDag-Erling Smørgrav # Protect names starting with `-'. 198b33ab329SDag-Erling Smørgrav case $dst in 199b33ab329SDag-Erling Smørgrav -*) dst=./$dst ;; 200b33ab329SDag-Erling Smørgrav esac 201ca236e63SDag-Erling Smørgrav 202b33ab329SDag-Erling Smørgrav # If destination is a directory, append the input filename; won't work 203b33ab329SDag-Erling Smørgrav # if double slashes aren't ignored. 204b33ab329SDag-Erling Smørgrav if test -d "$dst"; then 205b33ab329SDag-Erling Smørgrav dst=$dst/`basename "$src"` 206ca236e63SDag-Erling Smørgrav fi 207ca236e63SDag-Erling Smørgrav fi 208ca236e63SDag-Erling Smørgrav 209b33ab329SDag-Erling Smørgrav # This sed command emulates the dirname command. 210b33ab329SDag-Erling Smørgrav dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 211ca236e63SDag-Erling Smørgrav 212ca236e63SDag-Erling Smørgrav # Make sure that the destination directory exists. 213ca236e63SDag-Erling Smørgrav 214ca236e63SDag-Erling Smørgrav # Skip lots of stat calls in the usual case. 215b33ab329SDag-Erling Smørgrav if test ! -d "$dstdir"; then 216ca236e63SDag-Erling Smørgrav defaultIFS=' 217ca236e63SDag-Erling Smørgrav ' 218b33ab329SDag-Erling Smørgrav IFS="${IFS-$defaultIFS}" 219ca236e63SDag-Erling Smørgrav 220b33ab329SDag-Erling Smørgrav oIFS=$IFS 221ca236e63SDag-Erling Smørgrav # Some sh's can't handle IFS=/ for some reason. 222ca236e63SDag-Erling Smørgrav IFS='%' 223b33ab329SDag-Erling Smørgrav set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` 224b33ab329SDag-Erling Smørgrav IFS=$oIFS 225ca236e63SDag-Erling Smørgrav 226b33ab329SDag-Erling Smørgrav pathcomp= 227ca236e63SDag-Erling Smørgrav 228b33ab329SDag-Erling Smørgrav while test $# -ne 0 ; do 229b33ab329SDag-Erling Smørgrav pathcomp=$pathcomp$1 230ca236e63SDag-Erling Smørgrav shift 231b33ab329SDag-Erling Smørgrav if test ! -d "$pathcomp"; then 232b33ab329SDag-Erling Smørgrav $mkdirprog "$pathcomp" || lasterr=$? 233b33ab329SDag-Erling Smørgrav # mkdir can fail with a `File exist' error in case several 234b33ab329SDag-Erling Smørgrav # install-sh are creating the directory concurrently. This 235b33ab329SDag-Erling Smørgrav # is OK. 236b33ab329SDag-Erling Smørgrav test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } 237ca236e63SDag-Erling Smørgrav fi 238b33ab329SDag-Erling Smørgrav pathcomp=$pathcomp/ 239ca236e63SDag-Erling Smørgrav done 240ca236e63SDag-Erling Smørgrav fi 241ca236e63SDag-Erling Smørgrav 242b33ab329SDag-Erling Smørgrav if test -n "$dir_arg"; then 243b33ab329SDag-Erling Smørgrav $doit $instcmd "$dst" \ 244b33ab329SDag-Erling Smørgrav && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ 245b33ab329SDag-Erling Smørgrav && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ 246b33ab329SDag-Erling Smørgrav && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ 247b33ab329SDag-Erling Smørgrav && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } 248ca236e63SDag-Erling Smørgrav 249ca236e63SDag-Erling Smørgrav else 250ca236e63SDag-Erling Smørgrav # If we're going to rename the final executable, determine the name now. 251b33ab329SDag-Erling Smørgrav if test -z "$transformarg"; then 252b33ab329SDag-Erling Smørgrav dstfile=`basename "$dst"` 253ca236e63SDag-Erling Smørgrav else 254b33ab329SDag-Erling Smørgrav dstfile=`basename "$dst" $transformbasename \ 255b33ab329SDag-Erling Smørgrav | sed $transformarg`$transformbasename 256ca236e63SDag-Erling Smørgrav fi 257ca236e63SDag-Erling Smørgrav 258b33ab329SDag-Erling Smørgrav # don't allow the sed command to completely eliminate the filename. 259b33ab329SDag-Erling Smørgrav test -z "$dstfile" && dstfile=`basename "$dst"` 260ca236e63SDag-Erling Smørgrav 261b33ab329SDag-Erling Smørgrav # Make a couple of temp file names in the proper directory. 262b33ab329SDag-Erling Smørgrav dsttmp=$dstdir/_inst.$$_ 263b33ab329SDag-Erling Smørgrav rmtmp=$dstdir/_rm.$$_ 264ca236e63SDag-Erling Smørgrav 265b33ab329SDag-Erling Smørgrav # Trap to clean up those temp files at exit. 266b33ab329SDag-Erling Smørgrav trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 267b33ab329SDag-Erling Smørgrav trap '(exit $?); exit' 1 2 13 15 268ca236e63SDag-Erling Smørgrav 269ca236e63SDag-Erling Smørgrav # Move or copy the file name to the temp name 270b33ab329SDag-Erling Smørgrav $doit $instcmd "$src" "$dsttmp" && 271ca236e63SDag-Erling Smørgrav 272b33ab329SDag-Erling Smørgrav # and set any options; do chmod last to preserve setuid bits. 273b33ab329SDag-Erling Smørgrav # 274ca236e63SDag-Erling Smørgrav # If any of these fail, we abort the whole thing. If we want to 275ca236e63SDag-Erling Smørgrav # ignore errors from any of these, just make sure not to ignore 276ca236e63SDag-Erling Smørgrav # errors from the above "$doit $instcmd $src $dsttmp" command. 277b33ab329SDag-Erling Smørgrav # 278b33ab329SDag-Erling Smørgrav { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ 279b33ab329SDag-Erling Smørgrav && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ 280b33ab329SDag-Erling Smørgrav && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ 281b33ab329SDag-Erling Smørgrav && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && 282ca236e63SDag-Erling Smørgrav 283ca236e63SDag-Erling Smørgrav # Now rename the file to the real destination. 284b33ab329SDag-Erling Smørgrav { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ 285b33ab329SDag-Erling Smørgrav || { 286b33ab329SDag-Erling Smørgrav # The rename failed, perhaps because mv can't rename something else 287b33ab329SDag-Erling Smørgrav # to itself, or perhaps because mv is so ancient that it does not 288b33ab329SDag-Erling Smørgrav # support -f. 289ca236e63SDag-Erling Smørgrav 290b33ab329SDag-Erling Smørgrav # Now remove or move aside any old file at destination location. 291b33ab329SDag-Erling Smørgrav # We try this two ways since rm can't unlink itself on some 292b33ab329SDag-Erling Smørgrav # systems and the destination file might be busy for other 293b33ab329SDag-Erling Smørgrav # reasons. In this case, the final cleanup might fail but the new 294b33ab329SDag-Erling Smørgrav # file should still install successfully. 295b33ab329SDag-Erling Smørgrav { 296b33ab329SDag-Erling Smørgrav if test -f "$dstdir/$dstfile"; then 297b33ab329SDag-Erling Smørgrav $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ 298b33ab329SDag-Erling Smørgrav || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ 299b33ab329SDag-Erling Smørgrav || { 300b33ab329SDag-Erling Smørgrav echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 301b33ab329SDag-Erling Smørgrav (exit 1); exit 302b33ab329SDag-Erling Smørgrav } 303b33ab329SDag-Erling Smørgrav else 304b33ab329SDag-Erling Smørgrav : 305b33ab329SDag-Erling Smørgrav fi 306b33ab329SDag-Erling Smørgrav } && 307ca236e63SDag-Erling Smørgrav 308b33ab329SDag-Erling Smørgrav # Now rename the file to the real destination. 309b33ab329SDag-Erling Smørgrav $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" 310b33ab329SDag-Erling Smørgrav } 311b33ab329SDag-Erling Smørgrav } 312b33ab329SDag-Erling Smørgrav fi || { (exit 1); exit; } 313b33ab329SDag-Erling Smørgravdone 314ca236e63SDag-Erling Smørgrav 315b33ab329SDag-Erling Smørgrav# The final little trick to "correctly" pass the exit status to the exit trap. 316b33ab329SDag-Erling Smørgrav{ 317b33ab329SDag-Erling Smørgrav (exit 0); exit 318b33ab329SDag-Erling Smørgrav} 319ca236e63SDag-Erling Smørgrav 320b33ab329SDag-Erling Smørgrav# Local variables: 321b33ab329SDag-Erling Smørgrav# eval: (add-hook 'write-file-hooks 'time-stamp) 322b33ab329SDag-Erling Smørgrav# time-stamp-start: "scriptversion=" 323b33ab329SDag-Erling Smørgrav# time-stamp-format: "%:y-%02m-%02d.%02H" 324b33ab329SDag-Erling Smørgrav# time-stamp-end: "$" 325b33ab329SDag-Erling Smørgrav# End: 326