X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/959272ecf045739c52dcf65b1b5a4e591de9e920..f7794460e8e9e0c514b0cb01dd010b531c21169c:/lib-src/rcs2log diff --git a/lib-src/rcs2log b/lib-src/rcs2log index ffc7b54755..ff4d470a21 100755 --- a/lib-src/rcs2log +++ b/lib-src/rcs2log @@ -2,9 +2,7 @@ # RCS to ChangeLog generator -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2001, 2002, 2003, -# 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 -# Free Software Foundation, Inc. +# Copyright (C) 1992-1998, 2001-2016 Free Software Foundation, Inc. # Author: Paul Eggert @@ -22,7 +20,7 @@ # along with this program. If not, see . -Copyright='Copyright (C) 2012 Free Software Foundation, Inc. +Copyright='Copyright (C) 2016 Free Software Foundation, Inc. This program comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of this program under the terms of the GNU General Public License. @@ -132,7 +130,8 @@ do case $1 in -n) case ${2?}${3?}${4?} in *"$tab"* | *"$nl"*) - echo >&2 "$0: -n '$2' '$3' '$4': tabs, newlines not allowed" + printf '%s\n' >&2 \ + "$0: -n '$2' '$3' '$4': tabs, newlines not allowed" exit 1;; esac login=$2 @@ -142,7 +141,7 @@ do # If $2 is not tab-separated, use colon for separator. case ${2?} in *"$nl"*) - echo >&2 "$0: -u '$2': newlines not allowed" + printf '%s\n' >&2 "$0: -u '$2': newlines not allowed" exit 1;; *"$tab"*) t=$tab;; @@ -151,7 +150,7 @@ do esac case $2 in *"$t"*"$t"*"$t"*) - echo >&2 "$0: -u '$2': too many fields" + printf '%s\n' >&2 "$0: -u '$2': too many fields" exit 1;; *"$t"*"$t"*) uf="[^$t]*$t" # An unselected field, followed by a separator. @@ -163,7 +162,7 @@ do expr "X$2" : "$uf$uf$sf" `;; *) - echo >&2 "$0: -u '$2': not enough fields" + printf '%s\n' >&2 "$0: -u '$2': not enough fields" exit 1;; esac shift;; @@ -188,9 +187,9 @@ do --version) set $Id rcs2logVersion=$3 - echo >&2 "rcs2log (GNU Emacs) $rcs2logVersion$nl$Copyright" + printf '%s\n' >&2 "rcs2log (GNU Emacs) $rcs2logVersion$nl$Copyright" exit 0;; - -*) echo >&2 "Usage: $0 [OPTION]... [FILE ...]$nl$Help" + -*) printf '%s\n' >&2 "Usage: $0 [OPTION]... [FILE ...]$nl$Help" case $1 in --help) exit 0;; *) exit 1;; @@ -207,11 +206,19 @@ month_data=' m[9]="Oct"; m[10]="Nov"; m[11]="Dec" ' -logdir=$TMPDIR/rcs2log$$ -llogout=$logdir/l +if type mktemp >/dev/null 2>&1; then + logdir=`mktemp -d` +else + logdir=$TMPDIR/rcs2log$$ + (umask 077 && mkdir "$logdir") +fi || exit +case $logdir in +-*) logdir=./$logdir;; +esac trap exit 1 2 13 15 -trap "rm -fr $logdir 2>/dev/null" 0 -(umask 077 && exec mkdir $logdir) || exit +trap "rm -fr \"$logdir\" 2>/dev/null" 0 + +llogout=$logdir/l # If no rlog-format log file is given, generate one into $rlogfile. case $rlogfile in @@ -297,7 +304,8 @@ case $rlogfile in esac if test ! -d "$repository" then - echo >&2 "$0: $repository: bad repository (see CVS/Repository)" + printf '%s\n' >&2 \ + "$0: $repository: bad repository (see CVS/Repository)" exit 1 fi pository=$repository;; @@ -324,7 +332,7 @@ case $rlogfile in T?*) rlog_options=-r`expr "$CVSTAG" : 'T\(.*\)'`;; *) - echo >&2 "$0: invalid CVS/Tag"; exit 1;; + printf '%s\n' >&2 "$0: invalid CVS/Tag"; exit 1;; esac fi;; esac @@ -395,8 +403,8 @@ case $rlogfile in esac case $datearg in - ?*) $rlog $rlog_options "$datearg" ${1+"$@"} >$rlogfile;; - '') $rlog $rlog_options ${1+"$@"} >$rlogfile;; + ?*) $rlog $rlog_options "$datearg" "$@" >$rlogfile;; + '') $rlog $rlog_options "$@" >$rlogfile;; esac || exit;; esac @@ -408,7 +416,7 @@ sort $SORT_K_OPTIONS /dev/null || SORT_K_OPTIONS='+2 -4r +4 +0' # Get the full name of each author the logs mention, and set initialize_fullname -# to awk code that initializes the `fullname' awk associative array. +# to awk code that initializes the 'fullname' awk associative array. # Warning: foreign authors (i.e. not known in the passwd file) are mishandled; # you have to fix the resulting output by hand. @@ -419,10 +427,10 @@ case $loginFullnameMailaddrs in ?*) case $loginFullnameMailaddrs in *\"* | *\\*) - sed 's/["\\]/\\&/g' >$llogout <"$llogout" <$llogout || exit +esac >"$llogout" || exit output_authors='/^date: / { - if ($2 ~ /^[0-9]*[-\/][0-9][0-9][-\/][0-9][0-9]$/ && $3 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9][-+0-9:]*;$/ && $4 == "author:" && $5 ~ /^[^;]*;$/) { - print substr($5, 1, length($5)-1) + cvsformat = $5 == "author:" + if ($2 ~ /^[0-9]*[-\/][0-9][0-9][-\/][0-9][0-9]$/ && (cvsformat ? $3 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ && $4 ~ /^[-+][0-9:]*;$/ : $3 ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9][-+0-9:]*;$/)) { + author = $(5 + cvsformat) + if ($(4 + cvsformat) == "author:" && author ~ /^[^;]*;$/) { + print substr(author, 1, length(author)-1) + } } }' authors=` - $AWK "$output_authors" <"$rlogfile" | sort -u | comm -23 - $llogout + $AWK "$output_authors" <"$rlogfile" | sort -u | comm -23 - "$llogout" ` case $authors in ?*) - cat >$llogout <"$llogout" </dev/null` || { - echo >&2 "$0: cannot deduce hostname" + printf '%s\n' >&2 "$0: cannot deduce hostname" exit 1 } @@ -646,8 +658,23 @@ $AWK ' } date = newdate date } - time = substr($3, 1, length($3) - 1) - author = substr($5, 1, length($5)-1) + time = "" + for (i = 3; i <= NF; i++) { + time = time $i + if (time ~ /;$/) { + time = substr(time, 1, length(time) - 1) + break + } + } + i++ + if ($i == "author:") { + author = $(i + 1) + if (author ~ /;$/) { + author = substr(author, 1, length(author) - 1) + } + } else { + author = "" + } printf "%s%s%s%s%s%s%s%s%s%s", filename, SOH, rev, SOH, date, SOH, time, SOH, author, SOH rev = "?" next @@ -771,9 +798,8 @@ $AWK -F"$SOH" ' # Exit successfully. -exec rm -fr $logdir +exec rm -fr "$logdir" # Local Variables: # tab-width:4 # End: -