From: tholo Date: Mon, 6 May 1996 22:50:09 +0000 (+0000) Subject: Integrate local changes to CVS; remove files no longer part of the CVS X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=9d9224ffe0062626efa3bbf3c33c0e2696ac4e28;p=openbsd Integrate local changes to CVS; remove files no longer part of the CVS distribution --- diff --git a/gnu/usr.bin/cvs/Makefile.in b/gnu/usr.bin/cvs/Makefile.in index 1a6b83b1813..a66311c9762 100644 --- a/gnu/usr.bin/cvs/Makefile.in +++ b/gnu/usr.bin/cvs/Makefile.in @@ -93,19 +93,17 @@ DISTFILES = \ BUGS MINOR-BUGS FAQ HACKING \ ChangeLog NEWS ChangeLog.zoo \ configure configure.in stamp-h.in config.h.in Makefile.in acconfig.h \ - cvs-format.el mkinstalldirs install-sh cvsinit.sh \ + cvs-format.el mkinstalldirs install-sh \ cvsnt.mak \ .cvsignore -PROGS = cvsinit - ### Subdirectories to run make in for the primary targets. # Unix source subdirs, where we'll want to run lint and etags: USOURCE_SUBDIRS = lib src # Documentation directories; special handling INSTALL_MAN=man # All other subdirs: -SUBDIRS = ${USOURCE_SUBDIRS} ${INSTALL_MAN} doc contrib examples windows-NT os2 macintosh +SUBDIRS = ${USOURCE_SUBDIRS} ${INSTALL_MAN} doc contrib tools windows-NT os2 macintosh # Only make TAGS/tags files in these directories, in this order # [Why in this order? If we didn't have to stick to this order, we # could make "TSUBDIRS = ${USOURCE_SUBDIRS}". -Karl] @@ -124,19 +122,7 @@ all install uninstall: config.h Makefile all-local install: all install-local install-info .PHONY: all-local -all-local: $(PROGS) - -cvsinit: cvsinit.sh - echo > .fname \ - cvs-`sed < $(srcdir)/src/version.c \ - -e '/version_string/!d' \ - -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ - -e q` - sed -e 's,xLIBDIRx,$(libdir)/cvs,g' \ - -e "s,xVERSIONx,`cat .fname`,g" $(srcdir)/cvsinit.sh > $@-t - rm -f .fname - mv $@-t $@ - chmod a+x $@ +all-local: .PHONY: info dvi clean-info install-info info dvi clean-info install-info: @@ -144,10 +130,7 @@ info dvi clean-info install-info: .PHONY: install-local install-local: all-local - @for prog in $(PROGS); do \ - echo Installing $$prog in $(bindir); \ - $(INSTALL) $$prog $(bindir)/$$prog ; \ - done + @: nothing to do locally .PHONY: tags tags: @@ -186,7 +169,7 @@ realclean: realclean-local .PHONY: mostlyclean-local mostlyclean-local: - rm -f *~ $(PROGS) + rm -f *~ .PHONY: clean-local clean-local: mostlyclean-local @@ -265,10 +248,12 @@ config.status: configure config.h: stamp-h -# The ./config.status --recheck line is to update config.status with -# any new #defines from config.h.in. +# This used to do a ./config.status --recheck, to update config.status with +# any new #defines from config.h.in. The problem was that the rule itself +# depends on config.status, so that the --recheck would get run several +# times, which is bad if the user was trying to specify CFLAGS manually. +# It was a big pain in the neck. stamp-h: config.h.in config.status - ./config.status --recheck CONFIG_FILES=$@ CONFIG_HEADERS=config.h ./config.status #config.h.in: stamp-h.in diff --git a/gnu/usr.bin/cvs/configure b/gnu/usr.bin/cvs/configure index 9b115c27086..3025eefa4ea 100644 --- a/gnu/usr.bin/cvs/configure +++ b/gnu/usr.bin/cvs/configure @@ -1,8 +1,8 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.7 -# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. +# Generated automatically using autoconf version 2.9 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. @@ -332,7 +332,7 @@ EOF verbose=yes ;; -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.7" + echo "configure generated by autoconf version 2.9" exit 0 ;; -with-* | --with-*) @@ -497,12 +497,9 @@ fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='echo $CPP $CPPFLAGS 1>&5; -$CPP $CPPFLAGS' -ac_compile='echo ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5; -${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' -ac_link='echo ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5; -${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. @@ -537,7 +534,6 @@ else fi done IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc" fi fi CC="$ac_cv_prog_CC" @@ -547,6 +543,55 @@ else echo "$ac_t""no" 1>&6 fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + ac_prog_rejected=no + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then @@ -557,7 +602,7 @@ else yes; #endif EOF -if ${CC-cc} -E conftest.c 2>&5 | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:606: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -610,12 +655,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:665: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -624,12 +670,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -651,7 +698,7 @@ echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for AIX""... $ac_c" 1>&6 cat > conftest.$ac_ext <&6 else cat > conftest.$ac_ext < EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:734: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -788,11 +836,11 @@ else ac_cv_c_cross=yes else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_c_cross=no else @@ -811,7 +859,7 @@ if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -887,7 +935,7 @@ else if test "$GCC" = yes; then # GCC predefines this symbol on systems where it applies. cat > conftest.$ac_ext <&2; exit 1; } else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_c_char_unsigned=yes else @@ -945,7 +993,7 @@ else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_inline=$ac_kw; break fi @@ -1238,14 +1286,15 @@ if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1298: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -1260,7 +1309,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -1278,7 +1327,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -1299,7 +1348,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -1310,7 +1359,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -eval $ac_link +{ (eval echo configure:1363: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then : else @@ -1339,11 +1388,12 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1397: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -1372,7 +1422,7 @@ if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1389,7 +1439,7 @@ wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } EOF -if eval $ac_compile; then +if { (eval echo configure:1443: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_sys_wait_h=yes else @@ -1413,7 +1463,7 @@ if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1468,7 +1518,7 @@ if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1478,7 +1528,7 @@ int t() { struct tm *tp; ; return 0; } EOF -if eval $ac_compile; then +if { (eval echo configure:1532: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_header_time=yes else @@ -1506,7 +1556,7 @@ if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_hdr> @@ -1515,7 +1565,7 @@ int t() { DIR *dirp = 0; ; return 0; } EOF -if eval $ac_compile; then +if { (eval echo configure:1569: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* eval "ac_cv_header_dirent_$ac_safe=yes" else @@ -1539,22 +1589,24 @@ done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo $ac_n "checking for -ldir""... $ac_c" 1>&6 -ac_lib_var=`echo dir | tr '.-/+' '___p'` +ac_lib_var=`echo dir_opendir | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldir $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1574,22 +1626,24 @@ fi else echo $ac_n "checking for -lx""... $ac_c" 1>&6 -ac_lib_var=`echo x | tr '.-/+' '___p'` +ac_lib_var=`echo x_opendir | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lx $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1614,7 +1668,7 @@ if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1632,7 +1686,7 @@ int t() { int i; ; return 0; } EOF -if eval $ac_compile; then +if { (eval echo configure:1690: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else @@ -1654,7 +1708,7 @@ if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF @@ -1687,7 +1741,7 @@ if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -1718,7 +1772,7 @@ if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -1749,7 +1803,7 @@ if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -1782,7 +1836,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1824,14 +1878,14 @@ fi done -for ac_func in fchmod fsync ftime mkfifo putenv setvbuf vfork vprintf ftruncate timezone getpagesize fchdir sigaction sigprocmask sigvec sigsetmask sigblock +for ac_func in fchmod fsync ftime mkfifo putenv setvbuf vfork vprintf ftruncate timezone getpagesize initgroups fchdir sigaction sigprocmask sigvec sigsetmask sigblock do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1880,7 +1934,7 @@ if eval "test \"`echo '$''{'ac_cv_func_re_exec'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_re_exec=yes" else @@ -1930,7 +1984,7 @@ if test "$cross_compiling" = yes; then ac_cv_func_utime_null=no else cat > conftest.$ac_ext < #include @@ -1941,7 +1995,7 @@ exit(!(stat ("conftestdata", &s) == 0 && utime("conftestdata", (long *)0) == 0 && t.st_mtime - s.st_mtime < 120)); } EOF -eval $ac_link +{ (eval echo configure:1999: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_func_utime_null=yes else @@ -2005,19 +2059,19 @@ else ccvs_cv_sys_working_fnmatch=no else cat > conftest.$ac_ext < int main () { - exit ((fnmatch ("a", "a", FNM_FILE_NAME) == 0 - && fnmatch ("a", "b", FNM_FILE_NAME) == FNM_NOMATCH) + exit ((fnmatch ("a", "a", FNM_PATHNAME) == 0 + && fnmatch ("a", "b", FNM_PATHNAME) == FNM_NOMATCH) ? 0 : 1); } EOF -eval $ac_link +{ (eval echo configure:2075: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ccvs_cv_sys_working_fnmatch=yes else @@ -2050,7 +2104,7 @@ else { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() @@ -2061,7 +2115,7 @@ main() exit(0); } EOF -eval $ac_link +{ (eval echo configure:2119: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_sizeof_long=`cat conftestval` else @@ -2084,7 +2138,7 @@ else { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() @@ -2095,7 +2149,7 @@ main() exit(0); } EOF -eval $ac_link +{ (eval echo configure:2153: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_sizeof_int=`cat conftestval` else @@ -2114,7 +2168,7 @@ EOF krb_h= echo $ac_n "checking for krb.h""... $ac_c" 1>&6 cat > conftest.$ac_ext < int main() { return 0; } @@ -2122,7 +2176,7 @@ int t() { int i; ; return 0; } EOF -if eval $ac_link; then +if { (eval echo configure:2180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* krb_h=yes krb_incdir= else @@ -2131,7 +2185,7 @@ else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -I$KRB4/include" cat > conftest.$ac_ext < int main() { return 0; } @@ -2139,7 +2193,7 @@ int t() { int i; ; return 0; } EOF -if eval $ac_link; then +if { (eval echo configure:2197: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* krb_h=yes krb_incdir=$KRB4/include fi @@ -2152,7 +2206,7 @@ rm -f conftest* if test -z "$krb_h"; then cat > conftest.$ac_ext < int main() { return 0; } @@ -2160,7 +2214,7 @@ int t() { int i; ; return 0; } EOF -if eval $ac_link; then +if { (eval echo configure:2218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* krb_h=yes krb_incdir= else @@ -2169,7 +2223,7 @@ else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -I$KRB4/include/kerberosIV" cat > conftest.$ac_ext < int main() { return 0; } @@ -2177,7 +2231,7 @@ int t() { int i; ; return 0; } EOF -if eval $ac_link; then +if { (eval echo configure:2235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* krb_h=yes krb_incdir=$KRB4/include/kerberosIV fi @@ -2194,22 +2248,24 @@ echo "$ac_t""$krb_h" 1>&6 if test -n "$krb_h"; then krb_lib= echo $ac_n "checking for -lkrb""... $ac_c" 1>&6 -ac_lib_var=`echo krb | tr '.-/+' '___p'` +ac_lib_var=`echo krb_printf | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lkrb $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2238,22 +2294,24 @@ EOF test -n "${krb_libdir}" && LIBS="${LIBS} -L${krb_libdir}" LIBS="${LIBS} -lkrb" echo $ac_n "checking for -ldes""... $ac_c" 1>&6 -ac_lib_var=`echo des | tr '.-/+' '___p'` +ac_lib_var=`echo des_printf | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldes $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2284,7 +2342,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -2339,7 +2397,7 @@ if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_connect=yes" else @@ -2379,22 +2437,24 @@ else case "$LIBS" in *-lnsl*) ;; *) echo $ac_n "checking for -lnsl_s""... $ac_c" 1>&6 -ac_lib_var=`echo nsl_s | tr '.-/+' '___p'` +ac_lib_var=`echo nsl_s_printf | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl_s $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2422,22 +2482,24 @@ esac case "$LIBS" in *-lnsl*) ;; *) echo $ac_n "checking for -lnsl""... $ac_c" 1>&6 -ac_lib_var=`echo nsl | tr '.-/+' '___p'` +ac_lib_var=`echo nsl_printf | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2465,22 +2527,24 @@ esac case "$LIBS" in *-lsocket*) ;; *) echo $ac_n "checking for -lsocket""... $ac_c" 1>&6 -ac_lib_var=`echo socket | tr '.-/+' '___p'` +ac_lib_var=`echo socket_connect | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2508,22 +2572,24 @@ esac case "$LIBS" in *-linet*) ;; *) echo $ac_n "checking for -linet""... $ac_c" 1>&6 -ac_lib_var=`echo inet | tr '.-/+' '___p'` +ac_lib_var=`echo inet_connect | tr '.-/+' '___p'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-linet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2556,7 +2622,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -2608,7 +2674,7 @@ if eval "test \"`echo '$''{'ac_cv_func_gethostname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_gethostname=yes" else @@ -2659,11 +2725,155 @@ cat >> confdefs.h <<\EOF #define SERVER_SUPPORT 1 EOF -# As far as I know this works on all machines which use configure (i.e. unix) -cat >> confdefs.h <<\EOF +# Define AUTH_SERVER_SUPPORT only if we could locate the crypt() function +unset ac_cv_func_crypt +echo $ac_n "checking for crypt""... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_func_crypt'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +char crypt(); + +int main() { return 0; } +int t() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_crypt) || defined (__stub___crypt) +choke me +#else +crypt(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2758: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_func_crypt=yes" +else + rm -rf conftest* + eval "ac_cv_func_crypt=no" +fi +rm -f conftest* + +fi +if eval "test \"`echo '$ac_cv_func_'crypt`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +case "$LIBS" in +*-lcrypt*) ;; +*) echo $ac_n "checking for -lcrypt""... $ac_c" 1>&6 +ac_lib_var=`echo crypt_crypt | tr '.-/+' '___p'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lcrypt $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo crypt | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi + ;; +esac +unset ac_cv_func_crypt +for ac_func in crypt +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +char $ac_func(); + +int main() { return 0; } +int t() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2848: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* + +fi +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +fi + + if test "$ac_cv_func_crypt" = yes; then + cat >> confdefs.h <<\EOF #define AUTH_SERVER_SUPPORT 1 EOF + fi fi test -f src/options.h && ( @@ -2749,7 +2959,7 @@ do echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.7" + echo "$CONFIG_STATUS generated by autoconf version 2.9" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; @@ -2761,9 +2971,9 @@ ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "Makefile lib/Makefile src/Makefile doc/Makefile \ - man/Makefile contrib/Makefile contrib/pcl-cvs/Makefile \ - examples/Makefile windows-NT/Makefile os2/Makefile \ - macintosh/Makefile stamp-h config.h src/options.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 + man/Makefile tools/Makefile tools/pcl-cvs/Makefile \ + contrib/Makefile contrib/elib/Makefile \ + windows-NT/Makefile os2/Makefile macintosh/Makefile stamp-h config.h src/options.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then @@ -2913,7 +3123,7 @@ rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF diff --git a/gnu/usr.bin/cvs/configure.in b/gnu/usr.bin/cvs/configure.in index 246c92fa29b..554a401fa6a 100644 --- a/gnu/usr.bin/cvs/configure.in +++ b/gnu/usr.bin/cvs/configure.in @@ -50,7 +50,7 @@ AC_TYPE_MODE_T AC_TYPE_SIZE_T AC_TYPE_PID_T AC_REPLACE_FUNCS(getwd mkdir rename strdup strstr dup2 strerror valloc waitpid memmove vasprintf strtoul) -AC_CHECK_FUNCS(fchmod fsync ftime mkfifo putenv setvbuf vfork vprintf ftruncate timezone getpagesize fchdir sigaction sigprocmask sigvec sigsetmask sigblock) +AC_CHECK_FUNCS(fchmod fsync ftime mkfifo putenv setvbuf vfork vprintf ftruncate timezone getpagesize initgroups fchdir sigaction sigprocmask sigvec sigsetmask sigblock) AC_CHECK_FUNC(re_exec, :, LIBOBJS="$LIBOBJS regex.o") AC_FUNC_UTIME_NULL AC_SYS_LONG_FILE_NAMES @@ -62,8 +62,8 @@ AC_CACHE_VAL(ccvs_cv_sys_working_fnmatch, int main () { - exit ((fnmatch ("a", "a", FNM_FILE_NAME) == 0 - && fnmatch ("a", "b", FNM_FILE_NAME) == FNM_NOMATCH) + exit ((fnmatch ("a", "a", FNM_PATHNAME) == 0 + && fnmatch ("a", "b", FNM_PATHNAME) == FNM_NOMATCH) ? 0 : 1); }], ccvs_cv_sys_working_fnmatch=yes, @@ -116,7 +116,7 @@ AC_MSG_RESULT($krb_h) if test -n "$krb_h"; then krb_lib= - AC_CHECK_LIB(krb,main,[krb_lib=yes krb_libdir=], + AC_CHECK_LIB(krb,printf,[krb_lib=yes krb_libdir=], [if test "$cross_compiling" != yes && test -r $KRB4/lib/libkrb.a; then krb_lib=yes krb_libdir=$KRB4/lib fi]) @@ -124,7 +124,7 @@ if test -n "$krb_h"; then AC_DEFINE(HAVE_KERBEROS) test -n "${krb_libdir}" && LIBS="${LIBS} -L${krb_libdir}" LIBS="${LIBS} -lkrb" - AC_CHECK_LIB(des,main,[LIBS="${LIBS} -ldes"]) + AC_CHECK_LIB(des,printf,[LIBS="${LIBS} -ldes"]) if test -n "$krb_incdir"; then includeopt="${includeopt} -I$krb_incdir" AC_SUBST(includeopt) @@ -141,11 +141,11 @@ unset ac_cv_func_connect AC_CHECK_FUNC(connect, :, [case "$LIBS" in *-lnsl*) ;; -*) AC_CHECK_LIB(nsl_s, main) ;; +*) AC_CHECK_LIB(nsl_s, printf) ;; esac case "$LIBS" in *-lnsl*) ;; -*) AC_CHECK_LIB(nsl, main) ;; +*) AC_CHECK_LIB(nsl, printf) ;; esac case "$LIBS" in *-lsocket*) ;; @@ -164,8 +164,18 @@ AC_CHECK_FUNC(gethostname, :, LIBOBJS="$LIBOBJS hostname.o") if test "$ac_cv_func_connect" = yes; then AC_DEFINE(CLIENT_SUPPORT) AC_DEFINE(SERVER_SUPPORT) -# As far as I know this works on all machines which use configure (i.e. unix) -AC_DEFINE(AUTH_SERVER_SUPPORT) +# Define AUTH_SERVER_SUPPORT only if we could locate the crypt() function +unset ac_cv_func_crypt +AC_CHECK_FUNC(crypt, :, +[case "$LIBS" in +*-lcrypt*) ;; +*) AC_CHECK_LIB(crypt, crypt) ;; +esac +unset ac_cv_func_crypt +AC_CHECK_FUNCS(crypt)]) + if test "$ac_cv_func_crypt" = yes; then + AC_DEFINE(AUTH_SERVER_SUPPORT) + fi fi test -f src/options.h && ( @@ -176,6 +186,6 @@ test -f src/options.h && ( ) AC_OUTPUT(Makefile lib/Makefile src/Makefile doc/Makefile \ - man/Makefile contrib/Makefile contrib/pcl-cvs/Makefile \ - examples/Makefile windows-NT/Makefile os2/Makefile \ - macintosh/Makefile stamp-h) + man/Makefile tools/Makefile tools/pcl-cvs/Makefile \ + contrib/Makefile contrib/elib/Makefile \ + windows-NT/Makefile os2/Makefile macintosh/Makefile stamp-h) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/.cvsignore b/gnu/usr.bin/cvs/contrib/pcl-cvs/.cvsignore deleted file mode 100644 index d8c4f2ace56..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/.cvsignore +++ /dev/null @@ -1,19 +0,0 @@ -Makefile -pcl-cvs.info* -pcl-cvs.aux -pcl-cvs.cp -pcl-cvs.cps -pcl-cvs.dvi -pcl-cvs.fn -pcl-cvs.fns -pcl-cvs.ky -pcl-cvs.kys -pcl-cvs.log -pcl-cvs.pg -pcl-cvs.pgs -pcl-cvs.toc -pcl-cvs.tp -pcl-cvs.tps -pcl-cvs.vr -pcl-cvs.vrs -pcl-cvs.ps diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/ChangeLog b/gnu/usr.bin/cvs/contrib/pcl-cvs/ChangeLog deleted file mode 100644 index 82261b03087..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/ChangeLog +++ /dev/null @@ -1,861 +0,0 @@ -Fri Feb 9 14:29:07 1996 Jim Blandy - - * Makefile.in (mostlyclean clean realclean): Remove 'realclean' - from this target list; it's already defined later in the file. - -Tue Jan 23 13:02:24 1996 Greg A. Woods - - * pcl-cvs.el (pcl-cvs-bugs-address): change the default address - as suggested by Per Cederqvist. - * pcl-cvs.el: removed comments refering to Signum, etc. - -Sun Jan 21 12:51:12 1996 Greg A. Woods - - * pcl-cvs.el (cvs-parse-stderr): fix typo (missing '\') that was - causing occasional un-reported, un-traced, failures that simply - said something like "RE missing '\(' or '\\('" -- hopefully this - is the last such bug! - -Tue Jan 16 13:57:16 1996 Jim Kingdon - - * Makefile.in: Rename "dist" target back to "dist-dir". The - latter is what actually gets used. - (pcl-cvs.dvi): Restore srcdir to pcl-cvs.texinfo. Fix typo - (pcl-cvs.texifo -> pcl-cvs.texinfo). - (TEXINDEX,TEX,SET_TEXINPUTS): New variables. - (.el.elc): Copy .el file to build dir so .elc file gets put there. - (dist-dir): Fix typo (cvs.info -> pcl-cvs.info). - * cookie.el: New file, copied from elib 1.0. - * README: Remove note about requiring elib; it claimed that CVS - contained a copy of elib, but it lied. - * pcl-cvs.el: Change (require 'cookie) to (load "cookie.el"). - * pcl-cvs-lucid.el: Change (require 'pcl-cvs) to (load "pcl-cvs.el"). - -Fri Jan 12 10:32:14 1996 Greg A. Woods - - * pcl-cvs.elc, pcl-cvs-lucid.elc: removed - - * pcl-cvs.el: run through the spell checker... - - noted some free variables in comments - (cvs-inhibit-copyright-message): move this above - cvs-startup-message to keep the compiler quiet - - * compile-all.el: removed (use make for dependency checking!) - - * Makefile.in: tweak various comments and echo messages... - (elcfiles): removed this target. - (.SUFFIXES, .el.elc): added support for elisp files. - (CORE): new macro -- list of files all .elc depend on [still empty] - (BATCHFLAGS): new macro -- flags to pass to emacs - (OBJDIR_DISTFILES): added ELCFILES to be shipped in distribution - - * README: fix the RCS Id. - - * INSTALL: re-copy formatted makeinfo output from pcl-cvs.info, - just to keep everything in proper synchronisation. - - * pcl-cvs.texinfo (Pcl-cvs installation): update to match Karl's - new wording from INSTALL. - -Wed Jan 10 22:04:35 1996 Karl Fogel - - * INSTALL: make first item read a little more smoothly. - - * README: note that pcl-cvs has been tested under 19.30. - -Wed Jan 10 17:59:00 1996 Greg A. Woods - - * ChangeLog.woods: these are changes integrated in from my - own pcl-cvs repository module, and based on the original PCL-CVS - Version 1.05 release. They include most, if not all, of the - changes from the Cygnus and Cyclic CVS contrib versions of - PCL-CVS (i.e. the changes noted below). - -Sat Dec 30 15:01:45 1995 Karl Fogel - - * pcl-cvs.el (cvs-changelog-ours-p): check that - `add-log-full-name' and `add-log-mailing-address' are non-nil, in - addition to checking that they are boundp. - -Thu Dec 21 16:45:48 1995 Karl Fogel - - * pcl-cvs.el (cvs-parse-stderr): ignore kerberos connection - failure, since CVS will automatically try rsh next. I think this - is okay because if a person needs to know that kerberos failed, - then chances are the rsh failed too, and *that* error message will - clue them in that something's afoot. - -Wed Nov 22 11:01:50 1995 Joshua Cowan - - * pcl-cvs.el (cvs-changelog-ours-p): use `user-full-name' if - `add-log-full-name' unbound, as not every uses the stuff in - add-log.el. Same with `add-log-mailing-address'. - (cvs-changelog-entries): change to `change-log-mode' unless - already in it. - -Sun Jul 9 20:57:11 1995 Karl Fogel - - * "/bin/rmdir" as default, not "/usr/local/bin/rmdir". - -Fri Jun 16 15:24:34 1995 Jim Kingdon (kingdon@cyclic.com) - - * pcl-cvs.elc, pcl-cvs-lucid.elc: Added. - - * Makefile.in: Rename from Makefile and set srcdir. - -Thu May 18 17:10:27 1995 Jim Blandy - - Automatically guess CVS log entries from ChangeLog contents. - * pcl-cvs.el (cvs-mode-changelog-commit): New command. - (cvs-changelog-full-paragraphs): New variable. - (cvs-changelog-name, cvs-narrow-changelog, - cvs-changelog-paragraph, cvs-changelog-subparagraph, - cvs-changelog-entry, cvs-changelog-ours-p, cvs-relative-path, - cvs-changelog-entries, cvs-changelog-insert-entries, cvs-union, - cvs-insert-changelog-entries, cvs-edit-delete-common-indentation): - New functions. - (cvs-mode-map): Bind 'C' to cvs-mode-changelog-commit. - (cvs-mode): Mention cvs-mode-changelog-commit in docstring. - - Give the info files names ending in ".info". - * Makefile (INFOFILES, install_info): Change pcl-cvs to - pcl-cvs.info. - (pcl-cvs.info): Target renamed from pcl-cvs. - (DISTFILES): pcl-cvs removed; we handle the info files explicitly - in the dist-dir target. - (dist-dir): Depend on pcl-cvs.info. Distribute pcl-cvs.info*. - * pcl-cvs.texinfo: Change @setfilename appropriately. - * INSTALL: Updated. - * .cvsignore: Correctly ignore the info files. - - * README: Note that pcl-cvs has been tested under 19.28, and that - the "cookie" naming conflict was resolved in 19.11. - - * Makefile (pcl-cvs-lucid.elc): Changed this target from - pcl-cvs-lucid.el. That's a source file, for goodness' sake! - -Tue May 9 13:56:50 1995 Jim Blandy - - * Change references to "Cygnus's remote CVS" to "Cyclic CVS". - -Wed May 3 13:55:27 1995 Jim Blandy - - * pcl-cvs.el (cvs-parse-stderr): Handle colons after both - "rcsmerge" and "warning". - -Fri Apr 28 22:38:14 1995 Jim Blandy - - * Makefile (ELFILES): Include pcl-cvs-startup.el. - (info, pcl-cvs): Call makeinfo appropriately for modern versions. - (pcl-cvs.aux): List dependency on pcl-cvs.texinfo. - (pcl-cvs.ps): New target. - (DVIPS): New variable. - (dist-dir): Renamed from dist, updated to accept DISTDIR value - passed from parent. - (DISTFILES): New varible. - (pcl-cvs.elc, pcl-cvs-lucid.elc): Add targets to elcfiles target. - -Tue Apr 25 21:33:49 1995 Jim Blandy - - * pcl-cvs.el: (cvs-parse-stderr): Recognize "conflicts" as well as - "overlaps" before "during merge." - -Thu Feb 16 12:17:20 1995 Jim Blandy - - * pcl-cvs.el (cvs-parse-stderr): Recognize "conflicts found in..." - messages attributed to "cvs server", as well as "cvs update". - -Sat Feb 4 01:47:01 1995 Jim Blandy - - * pcl-cvs.el: Deal with the 'P' action, produced by remote CVS. - (cvs-parse-stdout): Treat 'P' like 'U' --- file is updated. - -Tue Jan 31 23:31:39 1995 Jim Blandy - - * pcl-cvs.el (cvs-cvsroot-required): New variable. - (cvs-do-update): If cvs-cvsroot-required is not set, don't complain if - CVSROOT and cvs-cvsroot are both unset. - -Sun Jan 22 21:22:22 1995 Jim Blandy - - * pcl-cvs.el (cvs-parse-stderr): - Some changes for Cygnus's Remote CVS. Treat - messages like "cvs server: Updating DIRECTORY" as we treat those like - "cvs update: Updating DIRECTORY". Ignore other messages starting with - "cvs server". - - * pcl-cvs.el (cvs-parse-stderr): Re-indent. - - * .cvsignore: Add ignore list for Texinfo litter. - - * Makefile (lispdir): Set appropriately for totoro. - * pcl-cvs.el (cvs-program, cvs-diff-program, cvs-rmdir-program): Same. - -Tue Jun 1 00:00:03 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Release 1.05. (This release was promised before the end of May, - but I didn't quite make it. No, I didn't fake the date above). - -Mon May 31 01:32:25 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Removed the elib sub-directory. Users must now get the Elib - library separately. - * pcl-cvs.texinfo: Document it. - - * pcl-cvs-lucid.el: A new version, supplied by Jamie Zawinsky, - added. - - * pcl-cvs Id 68: Transform RCS keywords - * Makefile (pcl-cvs-$(VER)): Remove the $ signs in most files in - the distribution. - - * pcl-cvs Id 76: Extra " in cvs-mode-add. - * pcl-cvs.el (cvs-mode-add): Don't add the extra level of quotes - around the log message, since it doesn't work with CVS. - - * pcl-cvs Id 56: '-d ' support in pcl-cvs - * pcl-cvs.el (cvs-change-cvsroot): New function. - - * pcl-cvs Id 77: *cvs* isn't cleared properly - * pcl-cvs.el (cvs-do-update): Always erase the *cvs* buffer and - re-create the collection. - - * pcl-cvs.el (cvs-do-update): Set mode-line-process in the *cvs* - buffer. - * pcl-cvs.el (cvs-mode): Reset mode-line-process. - - * pcl-cvs Id 59: sort .cvsignore alphabetically! - * pcl-cvs.el (cvs-sort-ignore-file): New variable. - * pcl-cvs.el (cvs-mode-ignore): Use it. - * pcl-cvs.texinfo: Document it. - - * pcl-cvs Id 75: Require final newline. - * pcl-cvs.el (cvs-commit-buffer-require-final-newline): New - variable. - * pcl-cvs.el (cvs-edit-done): Use it. - * pcl-cvs.texinfo: Document it. - - * pcl-cvs Id 72: make clean deletes lucid-emacs.el - * dist-makefile (ELCFILES): Fixed a typo. - - * pcl-cvs Id 46: "cvs remove f" "touch f" "cvs update f" -> parse err. - * pcl-cvs.el (cvs-fileinfo->type): New type: REM-EXIST. - * pcl-cvs.el (cvs-shadow-entry-p): A REMOVED that follows a - REM-EXIST is a shadow. - * pcl-cvs.el (cvs-parse-stderr): Recognize the "should be removed - and is still there" message. - * pcl-cvs.el (cvs-pp): Recognize REM-EXIST. - * pcl-cvs.el (cvs-mode-undo-local-changes): Recognize and complain - about REM-EXIST. Defensive test added: complain about unknown types. - - * pcl-cvs.el (cvs-mode-add): Add an extra level of quotes around - the log message. This is apparently needed by RCVS. . - - * pcl-cvs.el (cvs-parse-stderr): Ignore output from RCVS. - -Tue Apr 27 00:48:40 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.el (cvs-startup-message): Now a defconst instead of a - defvar. - * pcl-cvs.el (cvs-mode-commit): Add a defvar for it. - - * dist-makefile (EMACS): Use $(EMACS) instead of hard-coding 'emacs'. - -Sat Apr 17 12:47:10 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Release 1.04. - - * pcl-cvs.texinfo: Updated the Contributors node. - - * pcl-cvs Id 58: Lucid GNU Emacs support - * pcl-cvs-lucid.el: New file, contributed by the people at Lucid. - * pcl-cvs.el: Autoload pcl-cvs-lucid if running in an Lucid GNU - Emacs. - * compile-all.el: (files-to-compile): Add pcl-cvs-lucid. - * dist-makefile (ELFILES, ELCFILES): Dito. - - * pcl-cvs Id 55: cvs-diff-backup swaps old and new version. - * pcl-cvs.el (cvs-diff-backup-extractor): Old version should be - first. - * pcl-cvs.el (cvs-mode-diff-backup): Call cvs-backup-diffable - correctly. - - * pcl-cvs Id 64: elib substitute - * dist-makefile (install): Warn about Elib. - * pcl-cvs.texinfo: Talk about Elib. - - * pcl-cvs Id 50: Committing the *commit* buffer twice. - * pcl-cvs.el (cvs-edit-done): Report an error if cvs-commit-list - is empty, and empty it when the commit is done. - - * pcl-cvs Id 56: '-d ' support. - * pcl-cvs.el (cvs-cvsroot): New variable. - * pcl-cvs.el (cvs-do-update, all callers of cvs-execute-list): Use - it everywhere CVS is called, to override CVSROOT. - * pcl-cvs.texinfo (Customization): Document it. - -Thu Apr 1 00:34:55 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Exit status nil - from call-process means everything was successful in some Emacs - versions. - - * pcl-cvs.el (cvs-mode-map): Bind "q" to bury-buffer. - * pcl-cvs.texinfo: Document it. - -Thu Mar 11 00:05:03 1993 Per Cederqvist (ceder@lysator.liu.se) - - * Release 1.03-Emerge (not released). - - * Makefile (pcl-cvs-$(VER)): Don't includ elib-dll-debug.el in the - distribution. (It's included as elib/dll-debug.el). - - * pcl-cvs.el (cvs-mode): Document the "e" key (cvs-mode-emerge). - -Tue Mar 9 00:02:57 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.texinfo (Emerge): New node. - - * pcl-cvs.el (cvs-kill-buffer-visiting): New function. - - * pcl-cvs.el (cvs-mode-emerge): Handle Conflict and Merged files. - - * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Handle any revision. - - * pcl-cvs.el (cvs-fileinfo-*): Store base-revision instead of - backup-file. - - * pcl-cvs.el (cvs-backup-diffable): The file is only diffable if - the backup file is readable. - - * pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-emerge instead - of cvs-mode-find-file (which is anyhow bound to "f"). - -Mon Mar 8 23:06:52 1993 Per Cederqvist (ceder@lysator.liu.se) - - * pcl-cvs.el (cvs-mode-emerge): New function. Currently only - handles emerge of Modified files. - - * pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): New function. - -Sun Jan 24 20:07:18 1993 Per Cederqvist (ceder@lysator.liu.se) - - * elib-dll-debug.el: Moved to elib. - -Mon Jan 18 00:35:59 1993 Per Cederqvist (ceder@mauritz) - - * pcl-cvs.el (cvs-do-update): Added a probably unnecessary sit-for. - - * Release 1.03-Elib-0.05.1 (not released). - - * Elib 0.05 compatibility: - * elib-dll-debug.el, pcl-cvs-buffer.el, test-dll.el: Fix the - require strings. - * pcl-cvs.el (cvs-pp): Insert the string. - - * Release 1.03-Elib-0.05 (not released). - - * elib: New directory, containing the parts of elib that are - required for pcl-cvs. Changes to the files in that directory - that are present in Elib are documented in the ChangeLog of - Elib, not here. - * Makefile (pcl-cvs-$(VER)): Copy the new dir to the distribution. - * dist-makefile (ELFILES, ELCFILES): Don't include the Elib files. - -Fri Jan 8 02:43:49 1993 Per Cederqvist (ceder@konrad) - - * pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-find-file, like - in dired. - -Sun Jan 3 23:25:13 1993 Per Cederqvist (ceder@konrad) - - * elib-dll.el, elib-node.el, cookie.el: Moved to the elib package. - Pcl-cvs now requires elib. - -Tue Dec 29 22:06:57 1992 Per Cederqvist (ceder@konrad) - - * pcl-cvs.el: Tracked the latest (last?) rename of all functions - in cookie.el. - -Thu Sep 24 00:29:16 1992 Per Cederqvist (ceder@robert) - - * pcl-cvs.texinfo (Archives): This version is not distributed with - CVS 1.3, so don't claim that it is. - -Fri Aug 21 15:17:08 1992 Per Cederqvist (ceder@maskros) - - * pcl-cvs.el (cvs-parse-stderr): Fixed two "(set head" that should - be "(setq head". - -Thu Aug 20 05:53:58 1992 Per Cederqvist (ceder@robin) - - * cookie.el: Changes to this file is documented in the ChangeLog - of elib in the future. - -Tue Aug 18 03:30:28 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el: Don't use cookie-last-tin (which no longer exists). - - * cookie.el: Use prefix cookie:: for internal functions. - - * cookie.el: (cookie:enter-after, cookie:enter-before, - cookie:nth-cookie): Implemented. - * cookie.el: No longer define (impl). - - * cookie.el: More renames: - cookie:next-cookie -> cookie:goto-next-tin - cookie:previous-cookie -> cookie:goto-previous-tin - tin-next -> cookie:next-tin - tin-previous -> cookie:previous-tin - tin-nth -> cookie:nth-tin - tin-delete -> cookie:delete-tin - cookie:collect -> cookie:collect-cookies - cookie:tin-collect -> cookie:collect-tins - (new) -> cookie:tin-collect-cookies - (new) -> cookie:tin-collect-tins - cookie:refresh -> cookie:refresh-all - tin-invalidate-tins -> cookie:invalidate-tins - -Mon Aug 17 01:39:49 1992 Per Cederqvist (ceder@robin) - - * cookie.el (cookie:set-buffer-bind-dll-let*): New macro. Used in - many places instead of cookie:set-buffer-bind-dll. - * cookie.el (cookie:set-buffer-bind-dll): Renamed the macro - cookie:set-buffer to this. - - * pcl-cvs.el (cvs-use-temp-buffer): Set default-directory. - -Sun Aug 16 20:51:30 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-add-sub): Fixed call to cvs-add-file-update-buffer. - -Sat Aug 8 20:28:21 1992 Per Cederqvist (ceder@robin) - - * Release 1.03-Cookie-II (not released). - - * pcl-cvs.el (cvs-mode-diff-cvs): Don't care about the exit status - from ``cvs diff''. - - * pcl-cvs.el (cvs-mode): Document cvs-mode-undo-local-changes. - * pcl-cvs.el (cvs-diffable): New function. - - * pcl-cvs.el: Use the new cookie package. - * pcl-cvs.el (cvs-cookie-handle): New variable. - * pcl-cvs.el (cvs-do-update): User the new cookie:create - interface, and cookie:clear if the buffer already existed. Make - the buffer read-only. - * pcl-cvs.el (cvs-mode-next-line, cvs-mode-previous-line): New - functions (used instead of cookie:next-cookie and - cookie:previous-cookie). - - * cookie.el: Major redesign. The handle that is passed to all - cookie functions is now a new datatype, and not the buffer that - the cookies resides in. This way it is possible to have more than - one set of cookies in a buffer. Things that used to be - buffer-local variables are now fields in the handle data type. - cookie-last-tin is no longer available. - * cookie.el (cookie:create): The buffer is not cleared, nor set to - be read-only. - * cookie.el (cookie:next-cookie, cookie:previous-cookie): Since - the first argument is now a handle and not a buffer, these can no - longer be called interactively. You have to write a small wrapper - about them. - * cookie.el (cookie:buffer): New function. - -Tue Aug 4 03:02:25 1992 Per Cederqvist (ceder@robert) - - * pcl-cvs.texinfo (Bugs): Renamed "Reporting bugs and ideas" to - "Bugs" and added a table of known bugs/FAQ:s. - -Mon Aug 3 00:19:39 1992 Per Cederqvist (ceder@robert) - - * pcl-cvs.el, pcl-cvs.texinfo: Big Renaming Time! - The commands that operate in the *cvs* buffer: - cvs-add-change-log-entry-other-window -> cvs-mode-add-change-log-entry-other-window - cvs-mark-all-files -> cvs-mode-mark-all-files - cvs-revert-updated-buffers -> cvs-mode-revert-updated-buffers - cvs-undo-local-changes -> cvs-mode-undo-local-changes - cvs-unmark-up -> cvs-mode-unmark-up - cvs-acknowledge -> cvs-mode-acknowledge - cvs-unmark-all-files -> cvs-mode-unmark-all-files - cvs-add -> cvs-mode-add - cvs-diff-backup -> cvs-mode-diff-backup - cvs-commit -> cvs-mode-commit - cvs-diff-cvs -> cvs-mode-diff-cvs - cvs-find-file -> cvs-mode-find-file - cvs-update-no-prompt -> cvs-mode-update-no-prompt - cvs-ignore -> cvs-mode-ignore - cvs-log -> cvs-mode-log - cvs-mark -> cvs-mode-mark - cvs-find-file-other-window -> cvs-mode-find-file-other-window - cvs-remove-file -> cvs-mode-remove-file - cvs-status -> cvs-mode-status - cvs-remove-handled -> cvs-mode-remove-handled - cvs-unmark -> cvs-mode-unmark - - * pcl-cvs.el (cvs-cvs-diff-flags): Variable deleted. - * pcl-cvs.el (cvs-diff-cvs): Use cvs-diff-flags instead. - * pcl-cvs.texinfo (Customization): Update the doc. - - * pcl-cvs.el (cvs-diff-cvs): Handle exit status 0 (no diffs), 1 - (diffs) and other (error). - * pcl-cvs.el (cvs-execute-list): Add support for this kind of - thing. - - * Revert buffers for committed files: - * pcl-cvs.el (cvs-auto-revert-after-commit): New variable. - * pcl-cvs.texinfo (Committing changes, Customization): Document - it. - * pcl-cvs.el (cvs-after-commit-function): New function. - - * pcl-cvs.el (cvs-execute-list): Return the exit status or nil. - * pcl-cvs.el (cvs-edit-done, cvs-diff-cvs, cvs-remove-file, - cvs-undo-local-changes, cvs-add, cvs-status, cvs-log): Use the - exit status to generate an error message. - - - * pcl-cvs.el (cvs-do-update): It should be "cvs -n update -l", not - "cvs -l update -n". Put the -n and/or -l in the message that is - displayed in the *cvs* buffer during the update. - -Sat Aug 1 00:55:49 1992 Per Cederqvist (ceder@robert) - - * cookie.el (cookie-sort): New function. - - * cookie.el (cookie-clear): Rewritten. No longer clears all local - variables. - -Tue Jul 28 17:21:17 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-parse-stderr): Try to handle the output from RCS - when it is compiled without DIFF3_BIN and a conflict occurs. - - * pcl-cvs.texinfo (Getting Started): Fixed typo. - - * pcl-cvs-startup.el (cvs-update-other-window): Make the autoload - be interactive. - -Mon Jul 27 19:36:40 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-revert-updated-buffers, cvs-revert-fileinfo): - New functions. - * pcl-cvs.texinfo (Reverting your buffers): Document it. - - * pcl-cvs.el (cvs-fileinfo->full-path): New function. - * pcl-cvs.el (cvs-full-path): Use it. - - * cookie.el (cookie-map, cookie-map-reverse): Better doc- - string. Removed the unused local variable 'result'. - - * compile-all.el: Renamed elib-files to files-to-compare. - * compile-all.el (compile-pcl-cvs): Bind load-path in a let - statement instead of globally. - -Thu Jul 23 19:02:41 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-do-update): Check that CVSROOT is set. - * pcl-cvs.el (cvs-diff-cvs): Check that cvs-cvs-diff-flags is a - list. - * pcl-cvs.el (cvs-diff-backup): Check that cvs-diff-flags is a - list. - -Tue Jul 21 11:27:39 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-parse-error): Make the *cvs* buffer writeable - before trying to write the email message. Require sendmail before - trying to switch to mail-mode. - - * pcl-cvs.el (cvs-do-update): Check that cvs-program exists. - - * pcl-cvs.el (cvs-skip-line): Fixed bracketing error. - -Mon Jul 20 10:31:51 1992 Per Cederqvist (ceder@robin) - - * Release 1.03. - - * pcl-cvs.el, cookie.el: Indentation fixes. - - * Makefile (pcl-cvs-$(VER)): Include NEWS in the distribution. - - * pcl-cvs.el (cvs-rm-program): Deleted. - * pcl-cvs.el (cvs-rmdir-program, cvs-lock-file): New variables. - - * Handle lock files in a nicer way: - * pcl-cvs.el (cvs-update-filter, cvs-delete-lock, - cvs-lock-file-p): New functions. - * pcl-cvs.el (cvs-do-update, cvs-sentinel): Redirect stdout to the - temporary file, not stderr. Use cvs-update-filter. - * pcl-cvs.el (cvs-parse-update): New arguments. - * pcl-cvs.el (cvs-parse-buffer): Renamed to cvs-parse-update. - * pcl-cvs.el (cvs-stderr-file): Renamed to cvs-stdout-file. - * pcl-cvs.texinfo (Miscellaneous commands, Updating the - directory): Document cvs-delete-lock. - - * pcl-cvs.el (cvs-mode): Don't reset buffer-read-only. - - * pcl-cvs.el (cvs-find-file-other-window): Don't save-some-buffers. - -Thu Jul 16 00:19:58 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el, test-cookie-el: Use the new names from cookie.el. - - * cookie.el: Big Renaming Time! - External functions: - cookie-next -> tin-next - cookie-previous -> tin-previous - cookie-nth -> tin-nth - cookie-delete -> tin-delete - cookie-filter-tins -> tin-filter - cookie-get-selection -> tin-get-selection - cookie-start-marker -> tin-start-marker - cookie-end-marker -> tin-end-marker - cookie-invalidate-tins -> tin-invalidate-tins - cookie-collect-tins -> tin-collect - cookie-collect-cookies -> cookie-collect - Internal functions: - cookie-create-tin -> cookie-create-wrapper - cookie-tin-start-marker -> cookie-wrapper-start-marker - cookie-tin-cookie-safe -> cookie-wrapper-cookie-safe - cookie-tin-cookie -> cookie-wrapper-cookie - set-cookie-tin-start-marker -> cookie-wrapper-set-start-marker - set-cookie-tin-cookie -> cookie-wrapper-set-cookie - cookie-tin-p -> cookie-wrapper-p - cookie-create-tin-and-insert -> cookie-create-wrapper-and-insert - - * pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Signal - an appropriate error message if the *cvs* buffer is empty. - - * cookie.el (cookie-create): Make the buffer read-only. - * cookie.el (cookie-create-tin-and-insert, cookie-refresh, - cookie-delete-tin-internal, cookie-refresh-tin): Bind - buffer-read-only to nil while changing the contents of - the buffer. - - * pcl-cvs.el (cvs-byte-compile-files): New function. - * pcl-cvs.texinfo (Miscellaneous commands): Document it. - - * pcl-cvs.el (cvs-diff-ignore-marks): New variable. - * pcl-cvs.el (cvs-diff-cvs, cvs-diff-backup): Don't consider - marked files to be selected if a prefix argument is given XOR the - variable cvs-diff-ignore-marks is non-nil. - * pcl-cvs.el (cvs-get-marked): New optional argument `ignore-marks'. - * pcl-cvs.texinfo (Customization, Viewing differences): Document - this behaviour. - - * pcl-cvs.el (cvs-undo-local-changes): New function. - * pcl-cvs.texinfo (Undoing changes): Document - cvs-undo-local-changes. - * pcl-cvs.el (cvs-mode-map): cvs-unmark-all-files moved from "U" - to "ESC DEL". cvs-undo-local-changes bound to "U". - * pcl-cvs.texinfo (Marking files): Document ESC DEL. - - * pcl-cvs.el (cvs-skip-line): New arguments. All callers updated. - Now calls cvs-parse-error if a parse error occurs. - * pcl-cvs.el (cvs-parse-error): New function that creates a bug - report. - * pcl-cvs.el (cvs-parse-stderr, cvs-parse-stdout): New arguments. - The only caller (cvs-parse-buffer) updated. Call cvs-parse-error - in case of parse error. - - * pcl-cvs.el (pcl-cvs-version): New variable. - - * cookie.el (cookie-create): Kill all local variables in the buffer. - -Fri Jul 10 11:17:40 1992 Per Cederqvist (ceder@robin) - - * Release 1.03beta1. - -Thu Jul 9 03:12:00 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-update-running): New variable. - * pcl-cvs.el (cvs-do-update): Use it instead of the previous local - variable cvs-process (that no longer exists). Make sure that only - one `cvs update' runs at any given moment. - * pcl-cvs.el (cvs-sentinel): Reset cvs-update-running when the - update process exits. - - * pcl-cvs.el (cvs-update): Switch to the *cvs* buffer. - * pcl-cvs.el (cvs-update-other-window): New function. - * pcl-cvs-startup.el (cvs-update-other-window): Added a autoload - for it. - * pcl-cvs.el (cvs-do-update): Don't pop up any buffer in a window - - let cvs-update or cvs-update-other-window handle that. Also - don't kill the *cvs* buffer, but rather insert a "Running cvs..." - message into it. - * pcl-cvs.el (cvs-parse-buffer): Don't change the window - configuration. - - * pcl-cvs.el (cvs-create-fileinfo, cvs-pp, cvs-fileninfo->type): - New type for a fileinfo: MESSAGE. - - * pcl-cvs.el (cvs-cvs-buffer): Deleted the variable. Use - cvs-buffer-name instead. (I no longer have any plans to allow more - than one cvs update to run at the same time - things only get - confusing). Changed all places where cvs-cvs-buffer was used. - - * pcl-cvs.el: Take care of update programs (the -u option in the - modules file): - * pcl-cvs.el (cvs-update-prog-output-skip-regexp): New variable. - * pcl-cvs.el (cvs-parse-stdout): Skip output from the update - program (using cvs-update-prog-output-skip-regexp). - * pcl-cvs.texinfo (Future enhancements): Document that the - solution is not as good as it should be. - * pcl-cvs.texinfo (Customization): Document the variable. - -Wed Jul 8 20:29:44 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-do-update): Check that this-dir really exists - and is a directory, and that this-dir/CVS exists and is a - directory. - -Tue Jul 7 01:02:24 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.texinfo (Customization): Document TMPDIR. - - * This chunk of modifications should make it possible to run - pcl-cvs on hosts that do not line-buffer stdout (such as - DECstation). They work by diverting stdout and stderr from - `cvs update' and later sorting them together. - * pcl-cvs.el (cvs-parse-stderr): Don't fail to parse conflict - data. - * pcl-cvs.el (cvs-remove-stdout-shadows, cvs-shadow-entry-p): New - functions. - * pcl-cvs.el (cvs-parse-buffer): Use it. - * pcl-cvs.el (cvs-remove-empty-directories): New function. - * pcl-cvs.el (cvs-remove-handled, cvs-parse-buffer): Use it. - * pcl-cvs.el (cvs-get-current-dir): New argument ROOT-DIR. All - calls to cvs-get-current-dir updated. - * pcl-cvs.el (cvs-do-update): Allocate a tmp file. Use cvs-shell - (typically /bin/sh) to redirect stderr from CVS to the tmp file. - * pcl-cvs.el (cvs-sentinel): Handle the tmp file. Remove it when - it is parsed. - * pcl-cvs.el (cvs-parse-buffer): New argument STDERR-BUFFER. All - calls to cvs-parse-buffer updated. Rewritten to handle the - separation of stderr and stdout. - * pcl-cvs.el (cvs-shell, cvs-stderr-file): New variables. - * pcl-cvs.el (cvs-compare-fileinfos, cvs-parse-stderr, - cvs-parse-stdout): New functions. - - * pcl-cvs.el (cvs-parse-buffer): Some modifications for output - from RCS 5.6. - -Tue Apr 7 09:11:27 1992 Per Cederqvist (ceder@leopold) - - * Release 1.02. - - * pcl-cvs.el (cvs-diff-backup, cvs-edit-done, cvs-status): Call - save-some-buffers. - - * pcl-cvs.el (cvs-diff-backup-extractor): Fixed syntax error. - - * Makefile, README, compile-all.el, dist-makefile, pcl-cvs.el, - pcl-cvs.texinfo (XXRELEASEXX): A magic string that is substituted - for the current release number when a distribution is made. - (Release 1.01 says that it is release 1.00). - - * pcl-cvs.el (cvs-find-file): Added missing pair of parenthesis. - -Mon Mar 30 14:25:26 1992 Per Cederqvist (ceder@leopold) - - * Release 1.01. - - * pcl-cvs.el (cvs-parse-buffer): The message when waiting for a - lock has been changed. - -Sun Mar 29 05:29:57 1992 Per Cederqvist (ceder@leopold) - - * Release 1.00. - - * pcl-cvs.el (cvs-do-update, cvs-sentinel, cvs-parse-buffer): - Major rewrite of buffer and window selection and handling. - The *cvs* buffer is now killed whenever a new "cvs update" is - initiated. The -update buffer is replaced with the *cvs* - buffer when the update is completed. - -Sat Mar 28 21:03:05 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-delete-unused-temporary-buffers): Fixed it. - - * pcl-cvs.el (cvs-auto-remove-handled): New variable. - * pcl-cvs.el (cvs-edit-done): Use it. - * pcl-cvs.texinfo (Customization, Removing handled entries): - Document it. - - * pcl-cvs.el (cvs-mode): Turn of the undo feature. It really - isn't useful in a cookie buffer... - - * pcl-cvs.el (cvs-edit-done): Committing a file now looks more - like diffing a file. The window handling is better. - * pcl-cvs.el (cvs-use-temp-buffer): The &optional switch is no - longer needed. - -Mon Mar 23 00:20:33 1992 Per Cederqvist (ceder@robin) - - * Release 0.97. - - * pcl-cvs.el (default-directory): Make sure it always ends in a - slash. fileinfo->dir does NOT end in a slash, and I had forgotten - to call file-name-as-directory in various places. - - * pcl-cvs.el (cvs-diff-backup-extractor): Signal an error if a - fileinfo without backup file is given. - - * pcl-cvs.el (cvs-mode): Added documentation. - - * pcl-cvs.el (cvs-execute-list): Fix the order of files in the - same directory. - - * pcl-cvs.el (cvs-log-flags, cvs-status-flags): New variables. - * pcl-cvs.el (cvs-log, cvs-status): Use them. - * pcl-cvs.texinfo (Customization): Document them. - - * pcl-cvs.el (cvs-diff-backup): Filter non-backup-diffable files - at an earlier stage, like cvs-commit does. - - * pcl-cvs.el (cvs-diff-flags): New variable. - * pcl-cvs.el (cvs-diff-backup): Use it. - * pcl-cvs.texinfo (Customization): Document it. - - * pcl-cvs.el (cvs-execute-single-file-list): Remove &rest before - last argument. No callers needed updating. - - * pcl-cvs.el (cvs-execute-list): Remove the &rest before the last - argument (constant-args). Update all callers of cvs-execute-list - to use the new calling convention. - * pcl-cvs.el (cvs-cvs-diff-flags): Now a list of strings instead - of a string. - * pcl-cvs.texinfo (Customization): Document the change to - cvs-cvs-diff-flags. - - * Release 0.96. - - * pcl-cvs.el (cvs-cvs-diff-flags): New variable. - * pcl-cvs.el (cvs-diff-cvs): Use it. - * pcl-cvs.texinfo (Customization, Viewing differences): Document it. - - * pcl-cvs.el (cvs-use-temp-buffe): Don't switch to the temporary - buffer. Use display-buffer and set-buffer instead. This way - cvs-log, cvs-status, cvs-diff-cvs and friends don't select the - temporary buffer. The cursor will remain in the *cvs* buffer. - -Sun Mar 22 21:50:18 1992 Per Cederqvist (ceder@robin) - - * pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Don't - prompt when reading in a directory in dired. - - * Makefile (pcl-cvs-$(VER)): Include pcl-cvs-startup.el in the - distribution. - - * dist-makefile (pcl-cvs.dvi): Don't fail even if texindex does - not exist. - - * pcl-cvs.texinfo (@setchapternewpage): Changed from 'off' to 'on'. - * pcl-cvs.texinfo (Variable index): Joined into function index. - * pcl-cvs.texinfo (Key index): add a description about the key. - * pcl-cvs.texinfo: Many other small changes. - -Wed Mar 18 01:58:38 1992 Per Cederqvist (ceder@leopold) - - * Use GNU General Public License version 2. - diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/INSTALL b/gnu/usr.bin/cvs/contrib/pcl-cvs/INSTALL deleted file mode 100644 index 2edbaf54f79..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/INSTALL +++ /dev/null @@ -1,94 +0,0 @@ -This text is copied from the TeXinfo manual for pcl-cvs. - -Installation of the pcl-cvs program -=================================== - - 1. Possibly edit the file `Makefile' to reflect the situation at your - site. We say "possibly" because the version of pcl-cvs included - with CVS uses a configuration mechanism integrated with the overall - mechanisms used by the CVS build and install procedures. Thus the - file `Makefile' will be generated automatically from the file - `Makefile.in', and it should not be necessary to edit it further. - - If you do have to edit the `Makefile', the only things you have to - change is the definition of `lispdir' and `infodir'. The elisp - files will be copied to `lispdir', and the info file(s) to - `infodir'. - - 2. Configure pcl-cvs.el - - There are a couple of pathnames that you have to check to make - sure that they match your system. They appear early in the file - `pcl-cvs.el'. - - *NOTE:* If your system is running emacs 18.57 or earlier you MUST - uncomment the line that says: - (setq delete-exited-processes nil) - - Setting `delete-exited-processes' to `nil' works around a bug in - emacs that causes it to dump core. The bug was fixed in emacs - 18.58. - - 3. Release 1.05 and later of pcl-cvs requires parts of the Elib - library, version 1.0 or later. Elib is available via anonymous - ftp from prep.ai.mit.edu in `pub/gnu/elib-1.0.tar.gz', and from a - lot of other sites that mirror prep. Get Elib, and install it, - before proceeding. - - *NOTE:* The version of pcl-cvs included with CVS includes a copy - of Elib in the sub-directory `elib' under the `contrib/pcl-cvs' - directory. - - 4. Type `make install' in the source directory. This will - byte-compile all `.el' files and copy the `*.elc' files into the - directory you specified in step 1. - - If you want to install the `*.el' files too, you can type `make - install-el' to do so. - - If you only want to create the compiled elisp files, but don't - want to install them, you can type `make' without parameters. - - 5. Edit the file `default.el' in your emacs lisp directory (usually - `/usr/gnu/lib/emacs/site-lisp' or something similar) and enter the - contents of the file `pcl-cvs-startup.el' into it. It contains a - couple of `auto-load's that facilitates the use of pcl-cvs. - - -Installation of the on-line manual. -=================================== - - 1. Create the info file(s) `pcl-cvs.info*' from `pcl-cvs.texinfo' by - typing `make info'. If you don't have the program `makeinfo' you - can get it by anonymous ftp from e.g. `prep.ai.mit.edu' as - `pub/gnu/texinfo-3.7.tar.gz' (there might be a newer version there - when you read this). - - 2. Install the info file(s) `pcl-cvs.info*' into your standard `info' - directory. You should be able to do this by typing `make - install-info'. - - 3. Edit the file `dir' in the `info' directory and enter one line to - contain a pointer to the info file(s) `pcl-cvs.info*'. The line - can, for instance, look like this: - - * Pcl-cvs: (pcl-cvs). An Emacs front-end to CVS. - -How to make typeset documentation from pcl-cvs.texinfo -====================================================== - - If you have TeX installed at your site, you can make a typeset manual -from `pcl-cvs.texinfo'. - - 1. Run TeX by typing ``make pcl-cvs.dvi''. You will not get the - indices unless you have the `texindex' program. - - 2. Convert the resulting device independent file `pcl-cvs.dvi' to a - form which your printer can output and print it. If you have a - postscript printer there is a program, `dvi2ps', which does. There - is also a program which comes together with TeX, `dvips', which - you can use. - - --- -#ident "@(#)cvs/contrib/pcl-cvs:$Name: $Id$" diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/Makefile.in b/gnu/usr.bin/cvs/contrib/pcl-cvs/Makefile.in deleted file mode 100644 index e8ea97ad3a0..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/Makefile.in +++ /dev/null @@ -1,223 +0,0 @@ -# -#ident "@(#)original: dist-makefile,v 1.19 1993/05/31 22:43:45 ceder Exp " -# -#ident "@(#)elisp/pcl-cvs:$Name: $:$Id: Makefile.in,v 1.1.1.3 1996/04/27 19:42:55 tholo Exp $" -# -# Makefile for pcl-cvs release 1.05-CVS-$Name: $. -# Copyright (C) 1992, 1993 Per Cederqvist -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -SHELL = /bin/sh - -#### Start of system configuration section. #### - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -# Where to put the system-wide supplementary files -libdir = $(prefix)/lib - -# Where to put the Info files -infodir = $(prefix)/info - -# Where to put the manual pages. -mandir = $(prefix)/man - -# Used to batch-byte-compile files. -EMACS = emacs -# compile with noninteractive and relatively clean environment -BATCHFLAGS = -batch -n -q - -# This is the directory in which the ELCFILES will be installed. -lispdir = $(libdir)/emacs/site-lisp - -#### End of system configuration section. #### - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -# Just in case... -SHELL = /bin/sh -@SET_MAKE@ - -DISTFILES = \ - .cvsignore ChangeLog INSTALL Makefile.in NEWS README \ - ${ELFILES} \ - pcl-cvs.texinfo texinfo.tex - -OBJDIR_DISTFILES = $(ELCFILES) pcl-cvs.aux pcl-cvs.ps - -# files that contain key macro definitions. almost everything -# depends on them because the byte-compiler inlines macro -# expansions. everything also depends on the byte compiler -# options file since this might do odd things like turn off -# certain compiler optimizations. -CORE = - -ELFILES = pcl-cvs.el pcl-cvs-lucid.el pcl-cvs-startup.el -ELCFILES = pcl-cvs.elc pcl-cvs-lucid.elc -INFOFILES = pcl-cvs.info* -TEXTMPS = pcl-cvs.aux pcl-cvs.log pcl-cvs.toc pcl-cvs.dvi pcl-cvs.cp \ - pcl-cvs.fn pcl-cvs.vr pcl-cvs.tp pcl-cvs.ky pcl-cvs.pg \ - pcl-cvs.cps pcl-cvs.fns pcl-cvs.kys pcl-cvs.pgs pcl-cvs.tps \ - pcl-cvs.vrs - -# Use cp if you don't have install. -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ - -MAKEINFO = makeinfo - -SET_TEXINPUTS = TEXINPUTS=.:$(srcdir):$$TEXINPUTS - -# Don Knuth's TeX formatter -TEX = tex - -# auxiliary program for sorting Texinfo indices -TEXINDEX = texindex - -DVIPS = dvips -DVIPSFLAGS = - -# CYGNUS LOCAL: install does not depend on info -all: $(ELCFILES) # info -.PHONY: all - -.SUFFIXES: .el .elc -# We copy the .el file to the build dir--is there a cleaner way to get -# emacs to compile the .el file from srcdir and put the .elc in the build dir? -# (that is also why we have separate rules for pcl-cvs.elc and -# pcl-cvs-lucid.elc rather than just using a .el.elc rule). -pcl-cvs.elc: pcl-cvs.el - @echo "You can probably ignore free variable and unknown function warnings..." - if test -f pcl-cvs.el; then \ - : OK, we are building in srcdir ; \ - else \ - ln $(srcdir)/pcl-cvs.el . ; \ - fi - $(EMACS) $(BATCHFLAGS) -f batch-byte-compile pcl-cvs.el -pcl-cvs-lucid.elc: pcl-cvs-lucid.el - @echo "You can probably ignore free variable and unknown function warnings..." - if test -f pcl-cvs-lucid.el; then \ - : OK, we are building in srcdir ; \ - else \ - ln $(srcdir)/pcl-cvs-lucid.el . ; \ - fi - $(EMACS) $(BATCHFLAGS) -f batch-byte-compile pcl-cvs-lucid.el - -check installcheck: - @echo "$@ not supported in this makefile..." -.PHONY: check installcheck - -# CYGNUS LOCAL: install does not depend on install-info -install: install-elc # install-info install-el - -install-el: $(ELFILES) - for i in $(ELFILES) ; do \ - $(INSTALL_DATA) $$i $(lispdir)/$$i ; \ - done - -install-elc: $(ELCFILES) - for i in $(ELCFILES) ; do \ - $(INSTALL_DATA) $$i $(lispdir)/$$i ; \ - done - -install-info: info - test -f pcl-cvs.info || cd $(srcdir); \ - for i in *.info* ; do \ - $(INSTALL_DATA) $$i $(infodir)/$$i ; \ - done - -.PHONY: install install-el install-elc install-info - -# mkinstalldirs isn't supported for CVS yet.... -installdirs: $(top_srcdir)/mkinstalldirs - $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir) $(infodir) -.PHONY: installdirs - -uninstall: - @echo "$@ not yet supported in this makefile..." -.PHONY: uninstall - -info: pcl-cvs.info -.PHONY: info - -pcl-cvs.info: pcl-cvs.texinfo - $(MAKEINFO) ${srcdir}/pcl-cvs.texinfo -o pcl-cvs.info - -dvi: pcl-cvs.dvi -.PHONY: dvi - -# this mess seems to be necessary to make the index right... -pcl-cvs.dvi pcl-cvs.aux: pcl-cvs.texinfo - $(SET_TEXINPUTS) $(TEX) $(srcdir)/pcl-cvs.texinfo - $(SET_TEXINPUTS) $(TEX) $(srcdir)/pcl-cvs.texinfo - -$(TEXINDEX) pcl-cvs.cp pcl-cvs.fn pcl-cvs.vr pcl-cvs.tp pcl-cvs.ky \ - pcl-cvs.pg - $(SET_TEXINPUTS) $(TEX) $(srcdir)/pcl-cvs.texinfo - -pcl-cvs.ps: pcl-cvs.dvi - $(DVIPS) $(DVIPSFLAGS) pcl-cvs.dvi -o pcl-cvs.ps - -mostlyclean clean: - rm -f *~ core $(ELCFILES) $(INFOFILES) $(TEXTMPS) -.PHONY: mostlyclean clean - -distclean: clean - rm -f Makefile tags TAGS -.PHONY: distclean - -realclean maintainer-clean: distclean - rm -f pcl-cvs.info* pcl-cvs.ps -.PHONY: realclean maintainer-clean - -# you can't use ctags for lisp... -tags TAGS: - etags *.el -.PHONY: tags - -ls: - @echo $(DISTFILES) -.PHONY: ls - -dist-dir: ${OBJDIR_DISTFILES} ${DISTFILES} pcl-cvs.info - mkdir ${DISTDIR} - for i in ${DISTFILES}; do \ - ln $(srcdir)/$${i} ${DISTDIR}; \ - done - ln ${OBJDIR_DISTFILES} ${DISTDIR} - if [ -f pcl-cvs.info-1 ]; \ - then ln -f pcl-cvs.info-* ${DISTDIR}; \ - else : Pacify Ultrix sh; \ - fi -.PHONY: dist-dir - -subdir = contrib/pcl-cvs -Makefile: ../../config.status Makefile.in - cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status - -# CYGNUS LOCAL: don't depend on auto-re-config -#../config.status: ../configure -# cd .. ; $(SHELL) config.status --recheck - -# CYGNUS LOCAL: don't depend on auto-re-config -#../configure: ../configure.in -# cd $(top_srcdir) ; autoconf diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/NEWS b/gnu/usr.bin/cvs/contrib/pcl-cvs/NEWS deleted file mode 100644 index d206908da19..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/NEWS +++ /dev/null @@ -1,149 +0,0 @@ -This is the NEWS file for pcl-cvs, an Emacs elisp front-end to CVS. - -User-visible changes in the un-official CVS release of pcl-cvs -from the official 1.05 release to 1.05-CVS-$Name: $: - -* Support for using ChangeLog files, including hooks to automatically - guess CVS log entries from ChangeLog contents. - -* Support for client/server CVS (versions 1.5 through 1.7 and newer). - -* New commands for tagging files and directory trees (still needs to - be made to run in the background). - -* Better support for recognizing and handling unknown directories. - -* An attempt at new ediff and emerge interfaces (still needs work!), - including attempts to make vendor-branch merging work. - -* In a possibly misguided attempt to make it easier to see the effects - of changes that affect several files, diff output is now stored in a - uniqe buffer for each file. - -* Some commands now have default flags (cvs-*-flags). - -* Proper quoting of command line arguments displayed in *cvs-tmp*. - -* More hacking with getting CVSROOT right, though probably all - pointless, since CVS should do the right thing all the time. - -* Elib is back, at least in the CVS distribution. - -* Lots of minor bug fixes, tweaks, cleanup, re-indentation, etc. - -* Some minor tweaks, fixes, re-indentation, etc., in the - documentation. - - -User-visible changes in pcl-cvs from 1.04 to 1.05: - -* Elib is no longer distributed with pcl-cvs. You must get Elib - separately, for instance from ftp.lysator.liu.se in pub/emacs. - -* The Lucid Emacs support works again. - -* A new function, cvs-change-cvsroot, can be used to interactively - switch between CVS repositories. - -* The mode line in the *cvs* buffer now indicates when a "cvs update" - is running. - -* The .cvsignore file is automatically sorted alphabetically (to - reduce the risk of conflicts when two people add different files - simultaneously). This behaviour can be turned off with - cvs-sort-ignore-file. - -* A trailing newline is always added in commit log messages. This - behaviour can be turned off with - cvs-commit-buffer-require-final-newline. - -* This version of pcl-cvs should work together with RCVS. I have not - tested this myself, though. - -* Plus some bug fixes. (Note that the version of cookie.el that is - distributed with pcl-cvs 1.04 contains errors that affects pcl-cvs. - You should get Elib 0.07). - - -User-visible changes in pcl-cvs from 1.03 to 1.04: - -* Support for Emerge. Hitting "e" on a file that is Modified, Merged - or in Conflict will start Emerge, an interactive file merger written - in Emacs Lisp. This requires Emerge version 4. Emerge is not - included in this package. If you can't find it anywhere else, you - can get in from ftp.lysator.liu.se in pub/emacs. This package makes - it a lot easier to resolve conflicts. - -* Emacs will now automatically revert your buffers when the CVS - commands pcl-cvs issues causes the file to change. This automatic - revert never occurs if the buffer contents did not agree with the - file prior to the command. - -* If you are running Lucid GNU Emacs, you will get some fonts and - mouse support. This was contributed from people at Lucid. - -* The variable cvs-cvsroot can be used to select the location if the - repository. You no longer need to exit Emacs, setenv CVSROOT, and - start a new Emacs if you work with multiple repositories. - -* The "q" key can be used to hide the *cvs* buffer. - -* The name of the commands in the *cvs* have changed. If it was called - cvs-foo, it will now be called cvs-mode-foo. See the ChangeLog - entry from Tue Aug 4 03:02:25 1992 for a complete list of changes. - -* The variable cvs-cvs-diff-flags is no longer used. Instead, - cvs-diff-flags is always used. - -* Plus a lot of bug fixes. - - -User-visible changes in pcl-cvs from 1.02 to 1.03: - -* Output from CVS to stdout and stderr is separated and parsed - independently. In that way pcl-cvs should work regardless of - whether stdout is buffered or line-buffered. Pcl-cvs should now - work with CVS 1.3 without modifications on hosts such as - DECstations. - -* Pcl-cvs now fully supports RCS version 5.6 as well as 5.5. - -* New functions: - - + cvs-undo-local-changes ("U") - Undo all your modifications - to a file and get the newest - version from the repository. - + cvs-update-other-window - Similar to cvs-update. - + cvs-byte-compile-files - Byte compile the selected files. - -* cvs-update now displays the *cvs* buffer, which initially contains a - small message ("Running `cvs update' in /foo/bar/gazonk/...") until - the update is ready. The *cvs* buffer no longer pops up when the - update is ready. It often failed to pop up, due to race conditions - that are very hard to solve (and I doubt that they were at all - solvable). - -* cvs-unmark-all-files is moved from "U" to "ESC DEL" to be - "compatible" with dired. - -* cvs-diff ("d") and cvs-diff-backup ("b") can be configured to work - on only the file the cursor is positioned on, and ignore any marked - files. A prefix argument toggles this. - -* Only one `cvs update' can be run at a time. (It was previously - possible to start more than one simultaneously, but pcl-cvs could - not really handle more than one.) - -* Some rudimentary support for programs that CVS runs at update (due - to the -u switch in the modules file). - -* Pcl-cvs now automatically generates a bug report if it can't parse - the output from CVS. - -* The *cvs* buffer is read-only. - -* Pcl-cvs now creates temporary files in $TMPDIR if that environment - variable is set (otherwise it uses /tmp). - ----End of file NEWS--- -#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: NEWS,v 1.1.1.2 1996/01/30 00:19:06 tholo Exp $" diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/README b/gnu/usr.bin/cvs/contrib/pcl-cvs/README deleted file mode 100644 index 20c11f0ffe6..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/README +++ /dev/null @@ -1,25 +0,0 @@ -This is the readme file for pcl-cvs, release 1.05-CVS-$Name: $. - -Pcl-cvs is a front-end to CVS versions 1.5 through 1.7. It integrates -the most frequently used CVS commands into an emacs interface. - -There may be some configuration that needs to be done in pcl-cvs.el to -get it to work. See the instructions in the file INSTALL. - -Full documentation is in Texinfo format in the file pcl-cvs.texinfo. To -browse this document online, or in the emacs info mode, you will need to -process this file with the makeinfo program, which can also be found on -prep.ai.mit.edu in pub/gnu. - -If you have been using a previous version of pcl-cvs (for instance the -official 1.05 release, or any previous releases) you should read through -the file NEWS to see what has changed. - -This release has been tested under, Emacs 19.28 and Emacs 19.30. - -Per Cederqvist -(updated by Jim Blandy, Greg A. Woods, Karl Fogel) - --- -#OrigId "@(#) Id: README,v 1.14 1993/05/31 22:43:36 ceder Exp " -#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: README,v 1.1.1.2 1996/01/30 00:19:08 tholo Exp $" diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.el deleted file mode 100644 index 8695f67aa11..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.el +++ /dev/null @@ -1,134 +0,0 @@ -;;; Mouse and font support for PCL-CVS 1.3 running in Lucid GNU Emacs -;; @(#) Id: pcl-cvs-lucid.el,v 1.2 1993/05/31 19:37:34 ceder Exp -;; Copyright (C) 1992-1993 Free Software Foundation, Inc. - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - - -;; This simply adds a menu of the common CVS commands to the menubar and to -;; the right mouse button. Clicking right moves point, and then pops up a -;; menu from which commands can be executed. -;; -;; This could stand to be a lot more clever: for example, the "Commit Changes" -;; command should only be active on files for which there is something to -;; commit. Also, some indication of which files the command applies to -;; (especially in the presence of multiple marked files) would be nice. -;; -;; Middle-click runs find-file. - - -;(require 'pcl-cvs) -(load "pcl-cvs.el") - -(defvar cvs-menu - '("CVS" - ["Find File" cvs-mode-find-file t] - ["Find File Other Window" cvs-mode-find-file-other-window t] - ["Interactively Merge (emerge)" cvs-mode-emerge t] - ["Diff against Repository" cvs-mode-diff-cvs t] - ["Diff against Backup Version" cvs-mode-diff-backup t] - "----" - ["Commit Changes to Repository" cvs-mode-commit t] - ["Revert File from Repository" cvs-mode-undo-local-changes t] - ["Add File to Repository" cvs-mode-add t] - ["Remove File from Repository" cvs-mode-remove-file t] - ["Ignore File" cvs-mode-ignore t] - ["Hide File" cvs-mode-acknowledge t] - ["Hide Handled Files" cvs-mode-remove-handled t] - "----" - ["Add ChangeLog Entry" cvs-mode-add-change-log-entry-other-window t] - ["Show CVS Log" cvs-mode-log t] - ["Show CVS Status" cvs-mode-status t] - "----" - ["Mark File" cvs-mode-mark t] - ["Unmark File" cvs-mode-unmark t] - ["Mark All Files" cvs-mode-mark-all-files t] - ["Unmark All Files" cvs-mode-unmark-all-files t] - "----" - ["Quit" bury-buffer t] - )) - -(defun cvs-menu (e) - (interactive "e") - (mouse-set-point e) - (beginning-of-line) - (or (looking-at "^[* ] ") (error "No CVS file line here")) - (popup-menu cvs-menu)) - -(defun cvs-mouse-find-file (e) - (interactive "e") - (mouse-set-point e) - (beginning-of-line) - (or (looking-at "^[* ] ") (error "No CVS file line here")) - (cvs-mode-find-file (point))) - -(define-key cvs-mode-map 'button3 'cvs-menu) -(define-key cvs-mode-map 'button2 'cvs-mouse-find-file) - -(make-face 'cvs-header-face) -(make-face 'cvs-filename-face) -(make-face 'cvs-status-face) - -(or (face-differs-from-default-p 'cvs-header-face) - (copy-face 'italic 'cvs-header-face)) - -(or (face-differs-from-default-p 'cvs-filename-face) - (copy-face 'bold 'cvs-filename-face)) - -(or (face-differs-from-default-p 'cvs-status-face) - (copy-face 'bold-italic 'cvs-status-face)) - - -(defun pcl-mode-motion-highlight-line (event) - (if (save-excursion - (let* ((window (event-window event)) - (buffer (and window (window-buffer window))) - (point (and buffer (event-point event)))) - (and point - (progn - (set-buffer buffer) - (goto-char point) - (beginning-of-line) - (looking-at "^[* ] "))))) - (mode-motion-highlight-line event))) - -(defconst pcl-cvs-font-lock-keywords - '(("^In directory \\(.+\\)$" 1 cvs-header-face) - ("^[* ] \\w+ +\\(ci\\)" 1 cvs-status-face) - ("^[* ] \\(Conflict\\|Merged\\)" 1 cvs-status-face) - ("^[* ] \\w+ +\\(ci +\\)?\\(.+\\)$" 2 cvs-filename-face) - ) - "Patterns to highlight in the *cvs* buffer.") - -(defun pcl-cvs-fontify () - ;; - ;; set up line highlighting - (require 'mode-motion) - (setq mode-motion-hook 'pcl-mode-motion-highlight-line) - ;; - ;; set up menubar - (if (and current-menubar (not (assoc "CVS" current-menubar))) - (progn - (set-buffer-menubar (copy-sequence current-menubar)) - (add-menu nil "CVS" (cdr cvs-menu)))) - ;; - ;; fontify mousable lines - (set (make-local-variable 'font-lock-keywords) pcl-cvs-font-lock-keywords) - (font-lock-mode 1) - ) - -(add-hook 'cvs-mode-hook 'pcl-cvs-fontify) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.elc b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.elc deleted file mode 100644 index 0d6baab7b08..00000000000 Binary files a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-lucid.elc and /dev/null differ diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-startup.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-startup.el deleted file mode 100644 index 7e0ed35145a..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs-startup.el +++ /dev/null @@ -1,17 +0,0 @@ -;;;#ident "@(#)OrigId: pcl-cvs-startup.el,v 1.4 1993/05/31 18:40:33 ceder Exp " -;;; -;;;#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs-startup.el,v 1.1.1.2 1996/01/30 00:19:13 tholo Exp $" -;;; -(autoload 'cvs-update "pcl-cvs" - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer and run cvs-mode on it. -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - t) - -(autoload 'cvs-update-other-window "pcl-cvs" - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer, display it in the other window, and run -cvs-mode on it. - -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - t) diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.aux b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.aux deleted file mode 100644 index 2ecac17b019..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.aux +++ /dev/null @@ -1,102 +0,0 @@ -'xrdef {Installation-title}{Installation} -'xrdef {Installation-pg}{1} -'xrdef {Installation-snt}{Chapter'tie1} -'xrdef {Pcl-cvs installation-title}{Installation of the pcl-cvs program} -'xrdef {Pcl-cvs installation-pg}{1} -'xrdef {Pcl-cvs installation-snt}{Section'tie1.1} -'xrdef {On-line manual installation-title}{Installation of the on-line manual.} -'xrdef {On-line manual installation-pg}{2} -'xrdef {On-line manual installation-snt}{Section'tie1.2} -'xrdef {Typeset manual installation-title}{How to make typeset documentation from pcl-cvs.texinfo} -'xrdef {Typeset manual installation-pg}{2} -'xrdef {Typeset manual installation-snt}{Section'tie1.3} -'xrdef {About pcl-cvs-title}{About pcl-cvs} -'xrdef {About pcl-cvs-pg}{3} -'xrdef {About pcl-cvs-snt}{Chapter'tie2} -'xrdef {Contributors-title}{Contributors to pcl-cvs} -'xrdef {Contributors-pg}{3} -'xrdef {Contributors-snt}{Section'tie2.1} -'xrdef {Archives-title}{Where can I get pcl-cvs?} -'xrdef {Archives-pg}{4} -'xrdef {Archives-snt}{Section'tie2.2} -'xrdef {Getting started-title}{Getting started} -'xrdef {Getting started-pg}{5} -'xrdef {Getting started-snt}{Chapter'tie3} -'xrdef {Buffer contents-title}{Buffer contents} -'xrdef {Buffer contents-pg}{7} -'xrdef {Buffer contents-snt}{Chapter'tie4} -'xrdef {File status-title}{File status} -'xrdef {File status-pg}{7} -'xrdef {File status-snt}{Section'tie4.1} -'xrdef {Selected files-title}{Selected files} -'xrdef {Selected files-pg}{8} -'xrdef {Selected files-snt}{Section'tie4.2} -'xrdef {Commands-title}{Commands} -'xrdef {Commands-pg}{10} -'xrdef {Commands-snt}{Chapter'tie5} -'xrdef {Updating the directory-title}{Updating the directory} -'xrdef {Updating the directory-pg}{10} -'xrdef {Updating the directory-snt}{Section'tie5.1} -'xrdef {Movement commands-title}{Movement Commands} -'xrdef {Movement commands-pg}{10} -'xrdef {Movement commands-snt}{Section'tie5.2} -'xrdef {Marking files-title}{Marking files} -'xrdef {Marking files-pg}{11} -'xrdef {Marking files-snt}{Section'tie5.3} -'xrdef {Committing changes-title}{Committing changes} -'xrdef {Committing changes-pg}{11} -'xrdef {Committing changes-snt}{Section'tie5.4} -'xrdef {Editing files-title}{Editing files} -'xrdef {Editing files-pg}{12} -'xrdef {Editing files-snt}{Section'tie5.5} -'xrdef {Getting info about files-title}{Getting info about files} -'xrdef {Getting info about files-pg}{12} -'xrdef {Getting info about files-snt}{Section'tie5.6} -'xrdef {Adding and removing files-title}{Adding and removing files} -'xrdef {Adding and removing files-pg}{13} -'xrdef {Adding and removing files-snt}{Section'tie5.7} -'xrdef {Undoing changes-title}{Undoing changes} -'xrdef {Undoing changes-pg}{13} -'xrdef {Undoing changes-snt}{Section'tie5.8} -'xrdef {Removing handled entries-title}{Removing handled entries} -'xrdef {Removing handled entries-pg}{14} -'xrdef {Removing handled entries-snt}{Section'tie5.9} -'xrdef {Ignoring files-title}{Ignoring files} -'xrdef {Ignoring files-pg}{14} -'xrdef {Ignoring files-snt}{Section'tie5.10} -'xrdef {Viewing differences-title}{Viewing differences} -'xrdef {Viewing differences-pg}{14} -'xrdef {Viewing differences-snt}{Section'tie5.11} -'xrdef {Invoking Ediff-title}{Running ediff} -'xrdef {Invoking Ediff-pg}{15} -'xrdef {Invoking Ediff-snt}{Section'tie5.12} -'xrdef {Invoking Emerge-title}{Running emerge} -'xrdef {Invoking Emerge-pg}{15} -'xrdef {Invoking Emerge-snt}{Section'tie5.13} -'xrdef {Reverting your buffers-title}{Reverting your buffers} -'xrdef {Reverting your buffers-pg}{16} -'xrdef {Reverting your buffers-snt}{Section'tie5.14} -'xrdef {Miscellaneous commands-title}{Miscellaneous commands} -'xrdef {Miscellaneous commands-pg}{16} -'xrdef {Miscellaneous commands-snt}{Section'tie5.15} -'xrdef {Customization-title}{Customization} -'xrdef {Customization-pg}{18} -'xrdef {Customization-snt}{Chapter'tie6} -'xrdef {Future enhancements-title}{Future enhancements} -'xrdef {Future enhancements-pg}{20} -'xrdef {Future enhancements-snt}{Chapter'tie7} -'xrdef {Bugs-title}{Bugs (known and unknown)} -'xrdef {Bugs-pg}{22} -'xrdef {Bugs-snt}{Chapter'tie8} -'xrdef {COPYING-title}{GNU GENERAL PUBLIC LICENSE} -'xrdef {COPYING-pg}{23} -'xrdef {COPYING-snt}{Appendix'tie'char65{}} -'xrdef {Function and Variable Index-title}{Function and Variable Index} -'xrdef {Function and Variable Index-pg}{24} -'xrdef {Function and Variable Index-snt}{} -'xrdef {Concept Index-title}{Concept Index} -'xrdef {Concept Index-pg}{25} -'xrdef {Concept Index-snt}{} -'xrdef {Key Index-title}{Key Index} -'xrdef {Key Index-pg}{27} -'xrdef {Key Index-snt}{} diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.el b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.el deleted file mode 100644 index 7705f08e861..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.el +++ /dev/null @@ -1,3444 +0,0 @@ -;;; -;;;#ident "@(#)OrigId: pcl-cvs.el,v 1.93 1993/05/31 22:44:00 ceder Exp " -;;; -;;;#ident "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs.el,v 1.1.1.2 1996/01/30 00:19:09 tholo Exp $" -;;; -;;; pcl-cvs.el -- A Front-end to CVS 1.3 or later. -;;; Release 1.05-CVS-$Name: $. -;;; Copyright (C) 1991, 1992, 1993 Per Cederqvist - -;;; This program is free software; you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 2 of the License, or -;;; (at your option) any later version. -;;; -;;; This program is distributed in the hope that it will be useful, -;;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with this program; if not, write to the Free Software -;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -;;; See below for installation instructions. - -;;; There is an TeXinfo file that describes this package. You should read it -;;; to get the most from this package. - -;;; Mail questions and bug reports regarding this version (as included in -;;; CVS-1.7 or newer) to the pcl-cvs support team at . - -;;; Don't try to use this with CVS 1.2 or earlier. It won't work. Get CVS 1.7 -;;; or newer. Use the version of RCS best suited for the version of CVS you're -;;; using. - -; (require 'cookie) ; from ELIB-1.0 -(load "cookie.el") -(require 'add-log) ; for all the ChangeLog goodies - -(provide 'pcl-cvs) - -;;; ------------------------------------------------------- -;;; START OF THINGS TO CHECK WHEN INSTALLING - -;; also use $GNU here, since may folks might install CVS as a GNU package -;; -(defvar local-path (cond - ((getenv "LOCAL") - (getenv "LOCAL")) - ((getenv "GNU") - (getenv "GNU")) - (t - "/usr/local")) - "*Path prefix for most locally installed things.") - -;; this isn't likely to be right all the time.... -;; -(defvar local-gnu-path (cond - ((getenv "GNU") - (getenv "GNU")) - (t - "/usr/local")) ; or "/usr/gnu"? - "*Path prefix for locally installed GNU software.") - -(defvar cvs-program (concat local-path "/bin/cvs") - "*Full path to the cvs executable.") - -;; SunOS-4.1.1_U1 has "diff.c 1.12 88/08/04 SMI; from UCB 4.6 86/04/03" -;; -(defvar cvs-diff-program (concat local-gnu-path "/bin/diff") - "*Full path to the best diff program you've got. -NOTE: there are some nasty bugs in the context diff variants of some vendor -versions, such as the one in SunOS-4.1.1_U1") - -(defvar cvs-rmdir-program "/bin/rmdir" - "*Full path to the rmdir program. Typically /bin/rmdir.") - -(defvar cvs-shell "/bin/sh" - "*Full path to a shell that can do redirection on stdout.") - -;;; Options to control various features: - -(defvar cvs-changelog-full-paragraphs t - "If non-nil, include full ChangeLog paragraphs in the CVS log. -This may be set in the ``local variables'' section of a ChangeLog, to -indicate the policy for that ChangeLog. - -A ChangeLog paragraph is a bunch of log text containing no blank lines; -a paragraph usually describes a set of changes with a single purpose, -but perhaps spanning several functions in several files. Changes in -different paragraphs are unrelated. - -You could argue that the CVS log entry for a file should contain the -full ChangeLog paragraph mentioning the change to the file, even though -it may mention other files, because that gives you the full context you -need to understand the change. This is the behaviour you get when this -variable is set to t. - -On the other hand, you could argue that the CVS log entry for a change -should contain only the text for the changes which occurred in that -file, because the CVS log is per-file. This is the behaviour you get -when this variable is set to nil.") - -(defvar cvs-cvsroot-required nil - "*Specifies whether CVS needs to be told where the repository is. - -In CVS 1.3, if your CVSROOT environment variable is not set, and you -do not set the `cvs-cvsroot' lisp variable, CVS will have no idea -where to find the repository, and refuse to run. CVS 1.4 and later -store the repository path with the working directories, so most -operations don't need to be told where the repository is. - -If you work with multiple repositories with CVS 1.4, it's probably -advisable to leave your CVSROOT environment variable unset, set this -variable to nil, and let CVS figure out where the repository is for -itself.") - -(defvar cvs-cvsroot nil - "*Specifies where the (current) cvs master repository is. -Overrides the $CVSROOT variable by sending \" -d dir\" to all cvs commands. -This switch is useful if you have multiple CVS repositories, and are not using -a modern version of CVS that stores the current repository in CVS/Root.") - -;; Uncomment the following line if you are running on 18.57 or earlier. -;(setq delete-exited-processes nil) -;; Emacs version 18.57 and earlier is likely to crash if -;; delete-exited-processes is t, since the sentinel uses lots of -;; memory, and 18.57 forgets to GCPROT a variable if -;; delete-exited-processes is t. - -;;; END OF THINGS TO CHECK WHEN INSTALLING -;;; -------------------------------------------------------- - -(defconst pcl-cvs-version "1.05-CVS-$Name: $" - "A string denoting the current release version of pcl-cvs.") - -;; You are NOT allowed to disable this message by default. However, you -;; are encouraged to inform your users that by adding -;; (setq cvs-inhibit-copyright-message t) -;; to their .emacs they can get rid of it. Just don't add that line -;; to your default.el! -(defvar cvs-inhibit-copyright-message nil - "*Non-nil means don't display a Copyright message in the ``*cvs*'' buffer.") - -(defconst cvs-startup-message - (if cvs-inhibit-copyright-message - "PCL-CVS release 1.05-CVS-$Name: $" - "PCL-CVS release 1.05 from CVS release $Name: $. -Copyright (C) 1992, 1993 Per Cederqvist -Pcl-cvs comes with absolutely no warranty; for details consult the manual. -This is free software, and you are welcome to redistribute it under certain -conditions; again, consult the TeXinfo manual for details.") - "*Startup message for CVS.") - -(defconst pcl-cvs-bugs-address "pcl-cvs-auto-bugs@cyclic.com" - "The destination address used for the default bug report form.") - -(defvar cvs-stdout-file nil - "Name of the file that holds the output that CVS sends to stdout. -This variable is buffer local.") - -(defvar cvs-lock-file nil - "Full path to a lock file that CVS is waiting for (or was waiting for).") - -(defvar cvs-bakprefix ".#" - "The prefix that CVS prepends to files when rcsmerge'ing.") - -(defvar cvs-erase-input-buffer nil - "*Non-nil if input buffers should be cleared before asking for new info.") - -(defvar cvs-auto-remove-handled nil - "*Non-nil if cvs-mode-remove-handled should be called automatically. -If this is set to any non-nil value, entries that do not need to be checked in -will be removed from the *cvs* buffer after every cvs-mode-commit command.") - -(defvar cvs-auto-remove-handled-directories nil - "*Non-nil if cvs-mode-remove-handled and cvs-update should automatically -remove empty directories. -If this is set to any non-nil value, directories that do not contain any files -to be checked in will be removed from the *cvs* buffer.") - -(defvar cvs-sort-ignore-file t - "*Non-nil if cvs-mode-ignore should sort the .cvsignore automatically.") - -(defvar cvs-auto-revert-after-commit t - "*Non-nil if committed buffers should be automatically reverted.") - -(defconst cvs-cursor-column 14 - "Column to position cursor in in cvs-mode. -Column 0 is left-most column.") - -(defvar cvs-mode-map nil - "Keymap for the cvs mode.") - -(defvar cvs-edit-mode-map nil - "Keymap for the cvs edit mode (used when editing cvs log messages).") - -(defvar cvs-buffer-name "*cvs*" - "Name of the cvs buffer.") - -(defvar cvs-commit-prompt-buffer "*cvs-commit-message*" - "Name of buffer in which the user is prompted for a log message when -committing files.") - -(defvar cvs-commit-buffer-require-final-newline t - "*t says silently put a newline at the end of commit log messages. -Non-nil but not t says ask user whether to add a newline in each such case. -nil means don't add newlines.") - -(defvar cvs-temp-buffer-name "*cvs-tmp*" - "*Name of the cvs temporary buffer. -Output from cvs is placed here by synchronous commands.") - -(defvar cvs-diff-ignore-marks nil - "*Non-nil if cvs-diff and cvs-mode-diff-backup should ignore any marked files. -Normally they run diff on the files that are marked (with cvs-mode-mark), -or the file under the cursor if no files are marked. If this variable -is set to a non-nil value they will always run diff on the file on the -current line.") - -;;; (setq cvs-status-flags '("-v")) -(defvar cvs-status-flags '("-v") - "*List of flags to pass to ``cvs status''. Default is \"-v\".") - -;;; (setq cvs-log-flags nil) -(defvar cvs-log-flags nil - "*List of flags to pass to ``cvs log''. Default is none.") - -;;; (setq cvs-tag-flags nil) -(defvar cvs-tag-flags nil - "*List of extra flags to pass to ``cvs tag''. Default is none.") - -;;; (setq cvs-rtag-flags nil) -(defvar cvs-rtag-flags nil - "*List of extra flags to pass to ``cvs rtag''. Default is none.") - -;;; (setq cvs-diff-flags '("-u")) -(defvar cvs-diff-flags '("-u") - "*List of flags to use as flags to pass to ``diff'' and ``cvs diff''. -Used by cvs-mode-diff-cvs and cvs-mode-diff-backup. Default is \"-u\". - -Set this to \"-u\" to get a Unidiff format, or \"-c\" to get context diffs.") - -;;; (setq cvs-update-optional-flags nil) -(defvar cvs-update-optional-flags nil - "*List of strings to use as optional flags to pass to ``cvs update''. Used -by cvs-do-update, called by cvs-update, cvs-update-other-window, -cvs-mode-update-no-prompt, and cvs-examine. Default is none. - -For example set this to \"-j VENDOR_PREV_RELEASE -j VENDOR_TOP_RELEASE\" to -perform an update after a new vendor release has been imported. - -To restrict the update to the current working directory, set this to \"-l\".") - -(defvar cvs-update-prog-output-skip-regexp "$" - "*A regexp that matches the end of the output from all cvs update programs. -That is, output from any programs that are run by CVS (by the flag -u in the -`modules' file - see cvs(5)) when `cvs update' is performed should terminate -with a line that this regexp matches. It is enough that some part of the line -is matched. - -The default (a single $) fits programs without output.") - -;;; -------------------------------------------------------- -;;; The variables below are used internally by pcl-cvs. You should -;;; never change them. - -(defvar cvs-buffers-to-delete nil - "List of temporary buffers that should be discarded as soon as possible. -Due to a bug in emacs 18.57 the sentinel can't discard them reliably.") - -(defvar cvs-update-running nil - "This is set to nil when no process is running, and to -the process when a cvs update process is running.") - -(defvar cvs-cookie-handle nil - "Handle for the cookie structure that is displayed in the *cvs* buffer.") - -(defvar cvs-commit-list nil - "Used internally by pcl-cvs.") - -;;; The cvs data structure: -;;; -;;; When the `cvs update' is ready we parse the output. Every file -;;; that is affected in some way is added as a cookie of fileinfo -;;; (as defined below). -;;; - -;;; cvs-fileinfo - -;;; Constructor: - -(defun cvs-create-fileinfo (type - dir - file-name - full-log) - "Create a fileinfo from all parameters. -Arguments: TYPE DIR FILE-NAME FULL-LOG. -A fileinfo is a vector with the following fields: - -[0] handled True if this file doesn't require further action. -[1] marked t/nil -[2] type One of - UPDATED - file copied from repository - PATCHED - file update with patch from repository - MODIFIED - modified by you, unchanged in - repository - ADDED - added by you, not yet committed - REMOVED - removed by you, not yet committed - CVS-REMOVED- removed, since file no longer exists - in the repository. - MERGED - successful merge - CONFLICT - conflict when merging (if pcl-cvs did it) - REM-CONFLICT-removed in repository, but altered - locally. - MOD-CONFLICT-removed locally, changed in repository. - REM-EXIST - removed locally, but still exists. - DIRCHANGE - A change of directory. - UNKNOWN - An unknown file. - UNKNOWN-DIR- An unknown directory. - MOVE-AWAY - A file that is in the way. - REPOS-MISSING- The directory has vanished from the - repository. - MESSAGE - This is a special fileinfo that is used - to display a text that should be in - full-log. -[3] dir Directory the file resides in. Should not end with slash. -[4] file-name The file name. -[5] backup-file The name of a backup file created during a merge. - Only valid for MERGED and CONFLICT files. -[6] base-revision The revision that the working file was based on. - Only valid for MERGED and CONFLICT files. -[7] head-revision The revision that the newly merged changes came from - Only valid for MERGED and CONFLICT files. -[8] backup-revision The revision of the cvs backup file (original working rev.) - Only valid for MERGED and CONFLICT files. -[9] cvs-diff-buffer A buffer that contains a 'cvs diff file'. -[10] vendor-diff-buffer A buffer that contains a 'diff base-file head-file'. -[11] backup-diff-buffer A buffer that contains a 'diff file backup-file'. -[12] full-log The output from cvs, unparsed. -[13] mod-time Modification time of file used for *-diff-buffer." - - (cons - 'CVS-FILEINFO - (vector nil nil type dir file-name nil nil nil nil nil nil nil full-log nil nil))) - -;;; Selectors: - -(defun cvs-fileinfo->handled (cvs-fileinfo) - "Get the `handled' field from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 0)) - -(defun cvs-fileinfo->marked (cvs-fileinfo) - "Check if CVS-FILEINFO is marked." - (elt (cdr cvs-fileinfo) 1)) - -(defun cvs-fileinfo->type (cvs-fileinfo) - "Get type from CVS-FILEINFO. -Type is one of UPDATED, PATCHED, MODIFIED, ADDED, REMOVED, CVS-REMOVED, MERGED, -CONFLICT, REM-CONFLICT, MOD-CONFLICT, REM-EXIST, DIRCHANGE, UNKNOWN, -UNKNOWN-DIR, MOVE-AWAY, REPOS-MISSING or MESSAGE." - (elt (cdr cvs-fileinfo) 2)) - -(defun cvs-fileinfo->dir (cvs-fileinfo) - "Get dir from CVS-FILEINFO. -The directory name does not end with a slash." - (elt (cdr cvs-fileinfo) 3)) - -(defun cvs-fileinfo->file-name (cvs-fileinfo) - "Get file-name from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 4)) - -(defun cvs-fileinfo->backup-file (cvs-fileinfo) - "Get backup-file from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 5)) - -(defun cvs-fileinfo->base-revision (cvs-fileinfo) - "Get the base revision from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 6)) - -(defun cvs-fileinfo->head-revision (cvs-fileinfo) - "Get the head revision from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 7)) - -(defun cvs-fileinfo->backup-revision (cvs-fileinfo) - "Get the backup revision from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 8)) - -(defun cvs-fileinfo->cvs-diff-buffer (cvs-fileinfo) - "Get cvs-diff-buffer from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 9)) - -(defun cvs-fileinfo->vendor-diff-buffer (cvs-fileinfo) - "Get backup-diff-buffer from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 10)) - -(defun cvs-fileinfo->backup-diff-buffer (cvs-fileinfo) - "Get backup-diff-buffer from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 11)) - -(defun cvs-fileinfo->full-log (cvs-fileinfo) - "Get full-log from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 12)) - -(defun cvs-fileinfo->mod-time (cvs-fileinfo) - "Get mod-time from CVS-FILEINFO." - (elt (cdr cvs-fileinfo) 13)) - -;;; Modifiers: - -(defun cvs-set-fileinfo->handled (cvs-fileinfo newval) - "Set handled in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 0 newval)) - -(defun cvs-set-fileinfo->marked (cvs-fileinfo newval) - "Set marked in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 1 newval)) - -(defun cvs-set-fileinfo->type (cvs-fileinfo newval) - "Set type in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 2 newval)) - -(defun cvs-set-fileinfo->dir (cvs-fileinfo newval) - "Set dir in CVS-FILEINFO to NEWVAL. -The directory should now end with a slash." - (aset (cdr cvs-fileinfo) 3 newval)) - -(defun cvs-set-fileinfo->file-name (cvs-fileinfo newval) - "Set file-name in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 4 newval)) - -(defun cvs-set-fileinfo->backup-file (cvs-fileinfo newval) - "Set backup-file in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 5 newval)) - -(defun cvs-set-fileinfo->base-revision (cvs-fileinfo newval) - "Set base-revision in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 6 newval)) - -(defun cvs-set-fileinfo->head-revision (cvs-fileinfo newval) - "Set head-revision in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 7 newval)) - -(defun cvs-set-fileinfo->backup-revision (cvs-fileinfo newval) - "Set backup-revision in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 8 newval)) - -(defun cvs-set-fileinfo->cvs-diff-buffer (cvs-fileinfo newval) - "Set cvs-diff-buffer in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 9 newval)) - -(defun cvs-set-fileinfo->vendor-diff-buffer (cvs-fileinfo newval) - "Set vendor-diff-buffer in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 10 newval)) - -(defun cvs-set-fileinfo->backup-diff-buffer (cvs-fileinfo newval) - "Set backup-diff-buffer in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 11 newval)) - -(defun cvs-set-fileinfo->full-log (cvs-fileinfo newval) - "Set full-log in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 12 newval)) - -(defun cvs-set-fileinfo->mod-time (cvs-fileinfo newval) - "Set full-log in CVS-FILEINFO to NEWVAL." - (aset (cdr cvs-fileinfo) 13 newval)) - -;;; Predicate: - -(defun cvs-fileinfo-p (object) - "Return t if OBJECT is a cvs-fileinfo." - (eq (car-safe object) 'CVS-FILEINFO)) - -;;;; End of types. - -;;---------- -(defun cvs-use-temp-buffer () - "Display a temporary buffer in another window and select it. -The selected window will not be changed. The temporary buffer will -be erased and writable." - - (let ((dir default-directory)) - (display-buffer (get-buffer-create cvs-temp-buffer-name)) - (set-buffer cvs-temp-buffer-name) - (setq buffer-read-only nil) - (setq default-directory dir) - (erase-buffer))) - -;;---------- -(defun cvs-examine (directory &optional local) - "Run a 'cvs -n update' in the current working directory. -That is, check what needs to be done, but don't change the disc. -Feed the output to a *cvs* buffer and run cvs-mode on it. -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run. -WARNING: this doesn't work very well yet...." - - ;; TODO: this should do everything cvs-update does... - ;; for example, for CONFLICT files, it should setup fileinfo appropriately - - (interactive (list (read-file-name "CVS Update (directory): " - nil default-directory nil) - current-prefix-arg)) - (cvs-do-update directory local 'noupdate)) - -;;---------- -(defun cvs-update (directory &optional local) - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer and run cvs-mode on it. -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - - (interactive (list (read-file-name "CVS Update (directory): " - nil default-directory nil) - current-prefix-arg)) - (cvs-do-update directory local nil) - (switch-to-buffer cvs-buffer-name)) - -;;---------- -(defun cvs-update-other-window (directory &optional local) - "Run a 'cvs update' in the current working directory. Feed the -output to a *cvs* buffer, display it in the other window, and run -cvs-mode on it. - -If optional prefix argument LOCAL is non-nil, 'cvs update -l' is run." - - (interactive (list (read-file-name "CVS Update other window (directory): " - nil default-directory nil) - current-prefix-arg)) - (cvs-do-update directory local nil) - (switch-to-buffer-other-window cvs-buffer-name)) - -;;---------- -(defun cvs-filter (predicate list &rest extra-args) - "Apply PREDICATE to each element on LIST. -Args: PREDICATE LIST &rest EXTRA-ARGS. - -Return a new list consisting of those elements that PREDICATE -returns non-nil for. - -If more than two arguments are given the remaining args are -passed to PREDICATE." - - ;; Avoid recursion - this should work for LONG lists also! - (let* ((head (cons 'dummy-header nil)) - (tail head)) - (while list - (if (apply predicate (car list) extra-args) - (setq tail (setcdr tail (list (car list))))) - (setq list (cdr list))) - (cdr head))) - -;;---------- -(defun cvs-mode-update-no-prompt () - "Run cvs update in current directory." - - (interactive) - (cvs-do-update default-directory nil nil)) - -;;---------- -(defun cvs-do-update (directory local dont-change-disc) - "Do a 'cvs update' in DIRECTORY. -Args: DIRECTORY LOCAL DONT-CHANGE-DISC. - -If LOCAL is non-nil 'cvs update -l' is executed. -If DONT-CHANGE-DISC is non-nil 'cvs -n update' is executed. -Both LOCAL and DONT-CHANGE-DISC may be non-nil simultaneously. - -*Note*: DONT-CHANGE-DISC does not yet work. The parser gets confused." - - (save-some-buffers) - ;; Ensure that it is safe to do an update. If not, ask user - ;; for confirmation. - (if (and (boundp 'cvs-cookie-handle) (collection-buffer cvs-cookie-handle)) - (if (collection-collect-tin - cvs-cookie-handle - '(lambda (cookie) (eq (cvs-fileinfo->type cookie) 'CONFLICT))) - (if (not - (yes-or-no-p - "Only update if conflicts have been resolved. Continue? ")) - (error "Update aborted by user request.")))) - (if (not (file-exists-p cvs-program)) - (error "%s: file not found (check setting of cvs-program)" - cvs-program)) - (let* ((this-dir (file-name-as-directory (expand-file-name directory))) - (update-buffer (generate-new-buffer - (concat " " (file-name-nondirectory - (substring this-dir 0 -1)) - "-update"))) - (temp-name (make-temp-name - (concat (file-name-as-directory - (or (getenv "TMPDIR") "/tmp")) - "pcl-cvs."))) - (args nil)) - - ;; Check that this-dir exists and is a directory that is under CVS contr. - - (if (not (file-directory-p this-dir)) - (error "%s is not a directory." this-dir)) - (if (not (file-directory-p (concat this-dir "CVS"))) - (error "%s does not contain CVS controlled files." this-dir)) - (if (file-readable-p (concat this-dir "CVS/Root")) - (save-excursion ; read CVS/Root into cvs-cvsroot - (find-file (concat this-dir "CVS/Root")) - (goto-char (point-min)) - (setq cvs-cvsroot (buffer-substring (point) - (progn (end-of-line) (point)))) - (if (not cvs-cvsroot) - (error "Invalid contents of %sCVS/Root" this-dir)) - (kill-buffer (current-buffer))) - (if (and cvs-cvsroot-required - (not (or (getenv "CVSROOT") cvs-cvsroot))) - (error "Both cvs-cvsroot and environment variable CVSROOT are unset, and no CVS/Root."))) - - ;; Check that at most one `cvs update' is run at any time. - - (if (and cvs-update-running (process-status cvs-update-running) - (or (eq (process-status cvs-update-running) 'run) - (eq (process-status cvs-update-running) 'stop))) - (error "Can't run two `cvs update' simultaneously.")) - - (if (not (listp cvs-update-optional-flags)) - (error "cvs-update-optional-flags should be set using cvs-set-update-optional-flags")) - - ;; Generate "-d /master -n update -l". - (setq args (concat (if cvs-cvsroot (concat " -d " cvs-cvsroot)) - (if dont-change-disc " -n ") - " update " - (if local " -l ") - (if cvs-update-optional-flags - (mapconcat 'identity - (copy-sequence cvs-update-optional-flags) - " ")))) - - ;; Set up the buffer that receives the stderr output from "cvs update". - (set-buffer update-buffer) - (setq default-directory this-dir) - (make-local-variable 'cvs-stdout-file) - (setq cvs-stdout-file temp-name) - - (setq cvs-update-running - (let ((process-connection-type nil)) ; Use a pipe, not a pty. - (start-process "cvs" update-buffer cvs-shell "-c" - (concat cvs-program " " args " > " temp-name)))) - - (setq mode-line-process - (concat ": " - (symbol-name (process-status cvs-update-running)))) - (set-buffer-modified-p (buffer-modified-p)) ; Update the mode line. - (set-process-sentinel cvs-update-running 'cvs-sentinel) - (set-process-filter cvs-update-running 'cvs-update-filter) - (set-marker (process-mark cvs-update-running) (point-min)) - - (save-excursion - (set-buffer (get-buffer-create cvs-buffer-name)) - (setq buffer-read-only nil) - (erase-buffer) - (cvs-mode)) - - (setq cvs-cookie-handle - (collection-create - cvs-buffer-name 'cvs-pp - cvs-startup-message ;See comment above cvs-startup-message. - "---------- End -----")) - - (cookie-enter-first - cvs-cookie-handle - (cvs-create-fileinfo - 'MESSAGE nil nil (concat "\n Running `cvs " args "' in " this-dir - "...\n"))) - - (save-excursion - (set-buffer cvs-buffer-name) - (setq mode-line-process - (concat ": " - (symbol-name (process-status cvs-update-running)))) - (set-buffer-modified-p (buffer-modified-p)) ; Update the mode line. - (setq buffer-read-only t)) - - ;; Work around a bug in emacs 18.57 and earlier. - (setq cvs-buffers-to-delete - (cvs-delete-unused-temporary-buffers cvs-buffers-to-delete))) - - ;; The following line is said to improve display updates on some - ;; emacses. It shouldn't be needed, but it does no harm. - (sit-for 0)) - -;;---------- -(defun cvs-delete-unused-temporary-buffers (list) - "Delete all buffers on LIST that is not visible. -Return a list of all buffers that still is alive." - - (cond - ((null list) nil) - ((get-buffer-window (car list)) - (cons (car list) - (cvs-delete-unused-temporary-buffers (cdr list)))) - (t - (kill-buffer (car list)) - (cvs-delete-unused-temporary-buffers (cdr list))))) - -;;---------- -(put 'cvs-mode 'mode-class 'special) - -;;---------- -(defun cvs-mode () - "\\Mode used for pcl-cvs, a front-end to CVS. - -To get to the \"*cvs*\" buffer you should use ``\\[execute-extended-command] cvs-update''. - -Full documentation is in the Texinfo file. Here are the most useful commands: - -\\[cvs-mode-previous-line] Move up. \\[cvs-mode-next-line] Move down. -\\[cvs-mode-commit] Commit file. \\[cvs-mode-update-no-prompt] Re-update directory. -\\[cvs-mode-mark] Mark file/dir. \\[cvs-mode-unmark] Unmark file/dir. -\\[cvs-mode-mark-all-files] Mark all files. \\[cvs-mode-unmark-all-files] Unmark all files. -\\[cvs-mode-find-file] Edit file/run Dired. \\[cvs-mode-find-file-other-window] Find file or run Dired in other window. -\\[cvs-mode-ignore] Add file to ./.cvsignore. \\[cvs-mode-add-change-log-entry-other-window] Write ChangeLog in other window. -\\[cvs-mode-add] Add to repository. \\[cvs-mode-remove-file] Remove file. -\\[cvs-mode-diff-cvs] Diff with base revision. \\[cvs-mode-diff-backup] Diff backup file. -\\[cvs-mode-ediff] Ediff base rev & backup. \\[cvs-mode-diff-vendor] Show merge from vendor branch. -\\[cvs-mode-emerge] Emerge base rev & backup. \\[cvs-mode-diff-backup] Diff backup file. -\\[cvs-mode-acknowledge] Delete line from buffer. \\[cvs-mode-remove-handled] Remove processed entries. -\\[cvs-mode-log] Run ``cvs log''. \\[cvs-mode-status] Run ``cvs status''. -\\[cvs-mode-tag] Run ``cvs tag''. \\[cvs-mode-rtag] Run ``cvs rtag''. -\\[cvs-mode-changelog-commit] Like \\[cvs-mode-commit], but get default log text from ChangeLog. -\\[cvs-mode-undo-local-changes] Revert the last checked in version - discard your changes to the file. - -Entry to this mode runs cvs-mode-hook. -This description is updated for release 1.05-CVS-$Name: $ of pcl-cvs. - -All bindings: -\\{cvs-mode-map}" - - (interactive) - (setq major-mode 'cvs-mode) - (setq mode-name "CVS") - (setq mode-line-process nil) -;; for older v18 emacs -;;(buffer-flush-undo (current-buffer)) - (buffer-disable-undo (current-buffer)) - (make-local-variable 'goal-column) - (setq goal-column cvs-cursor-column) - (use-local-map cvs-mode-map) - (run-hooks 'cvs-mode-hook)) - -;;---------- -(defun cvs-sentinel (proc msg) - "Sentinel for the cvs update process. -This is responsible for parsing the output from the cvs update when -it is finished." - - (cond - ((null (buffer-name (process-buffer proc))) - ;; buffer killed - (set-process-buffer proc nil)) - ((memq (process-status proc) '(signal exit)) - (let* ((obuf (current-buffer)) - (omax (point-max)) - (opoint (point))) - ;; save-excursion isn't the right thing if - ;; process-buffer is current-buffer - (unwind-protect - (progn - (set-buffer (process-buffer proc)) - (setq mode-line-process - (concat ": " - (symbol-name (process-status proc)))) - (let* ((out-file cvs-stdout-file) - (stdout-buffer (find-file-noselect out-file))) - (save-excursion - (set-buffer stdout-buffer) - (rename-buffer (concat " " - (file-name-nondirectory out-file)) t)) - (cvs-parse-update stdout-buffer (process-buffer proc)) - (setq cvs-buffers-to-delete - (cons (process-buffer proc) - (cons stdout-buffer - cvs-buffers-to-delete))) - (delete-file out-file))) - (set-buffer-modified-p (buffer-modified-p)) - (setq cvs-update-running nil)) - (if (equal obuf (process-buffer proc)) - nil - (set-buffer (process-buffer proc)) - (if (< opoint omax) - (goto-char opoint)) - (set-buffer obuf)))))) - -;;---------- -(defun cvs-update-filter (proc string) - "Filter function for pcl-cvs. -This function gets the output that CVS sends to stderr. It inserts it -into (process-buffer proc) but it also checks if CVS is waiting for a -lock file. If so, it inserts a message cookie in the *cvs* buffer." - - (let ((old-buffer (current-buffer)) - (data (match-data))) - (unwind-protect - (progn - (set-buffer (process-buffer proc)) - (save-excursion - ;; Insert the text, moving the process-marker. - (goto-char (process-mark proc)) - (insert string) - (set-marker (process-mark proc) (point)) - ;; Delete any old lock message - (if (tin-nth cvs-cookie-handle 1) - (tin-delete cvs-cookie-handle - (tin-nth cvs-cookie-handle 1))) - ;; Check if CVS is waiting for a lock. - (beginning-of-line 0) ;Move to beginning of last - ;complete line. - (cond - ((looking-at - "^cvs \\(update\\|server\\): \\[..:..:..\\] waiting for \\(.*\\)lock in \\(.*\\)$") - (setq cvs-lock-file (buffer-substring (match-beginning 3) - (match-end 3))) - (cookie-enter-last - cvs-cookie-handle - (cvs-create-fileinfo - 'MESSAGE nil nil - (concat "\tWaiting for " - (buffer-substring (match-beginning 2) - (match-end 2)) - "lock in " cvs-lock-file - ".\n\t (type M-x cvs-delete-lock to delete it)"))))))) - (store-match-data data) - (set-buffer old-buffer)))) - -;;---------- -(defun cvs-delete-lock () - "Delete the lock file that CVS is waiting for. -Note that this can be dangerous. You should only do this -if you are convinced that the process that created the lock is dead." - - (interactive) - (cond - ((not (or (file-exists-p - (concat (file-name-as-directory cvs-lock-file) "#cvs.lock")) - (cvs-filter (function cvs-lock-file-p) - (directory-files cvs-lock-file)))) - (error "No lock files found.")) - ((yes-or-no-p (concat "Really delete locks in " cvs-lock-file "? ")) - ;; Re-read the directory -- the locks might have disappeared. - (let ((locks (cvs-filter (function cvs-lock-file-p) - (directory-files cvs-lock-file)))) - (while locks - (delete-file (concat (file-name-as-directory cvs-lock-file) - (car locks))) - (setq locks (cdr locks))) - (cvs-remove-directory - (concat (file-name-as-directory cvs-lock-file) "#cvs.lock")))))) - -;;---------- -(defun cvs-remove-directory (dir) - "Remove a directory." - - (if (file-directory-p dir) - (call-process cvs-rmdir-program nil nil nil dir) - (error "Not a directory: %s" dir)) - (if (file-exists-p dir) - (error "Could not remove directory %s" dir))) - -;;---------- -(defun cvs-lock-file-p (file) - "Return true if FILE looks like a CVS lock file." - - (or - (string-match "^#cvs.tfl.[0-9]+$" file) - (string-match "^#cvs.rfl.[0-9]+$" file) - (string-match "^#cvs.wfl.[0-9]+$" file))) - -;;---------- -(defun cvs-quote-multiword-string (str) - "Return STR surrounded in single quotes if it contains whitespace." - (cond ((string-match "[ \t\n]" str) - (concat "'" str "'")) - (t - str))) - -;;---------- -;; this should be in subr.el or some similar place.... -(defun parse-string (str &optional regexp) - "Explode the string STR into a list of words ala strtok(3). Optional REGEXP -defines regexp matching word separator, which defaults to \"[ \\t\\n]+\"." - (let (str-list ; new list - str-token ; "index" of next token - (str-start 0) ; "index" of current token - (str-sep (if regexp - regexp - "[ \t\n]+"))) - (while (setq str-token (string-match str-sep str str-start)) - (setq str-list - (nconc str-list - (list (substring str str-start str-token)))) - (setq str-start (match-end 0))) - ;; tag on the remainder as the final item - (if (not (>= str-start (length str))) - (setq str-list - (nconc str-list - (list (substring str str-start))))) - str-list)) - -;;---------- -(defun cvs-make-list (str) - "Return list of words made from the string STR." - (cond ((string-match "[ \t\n]+" str) - (let ((new-str (parse-string str "[ \t\n]+"))) - ;; this is ugly, but assume if the first element is empty, there are - ;; no more elements. - (cond ((string= (car new-str) "") - nil) - (t - new-str)))) - ((string= str "") - nil) - (t - (list str)))) - -;;---------- -(defun cvs-skip-line (stdout stderr regexp &optional arg) - "Like forward-line, but check that the skipped line matches REGEXP. -Args: STDOUT STDERR REGEXP &optional ARG. - -If it doesn't match REGEXP a bug report is generated and displayed. -STDOUT and STDERR is only used to do that. - -If optional ARG, a number, is given the ARGth parenthesized expression -in the REGEXP is returned as a string. -Point should be in column 1 when this function is called." - - (cond - ((looking-at regexp) - (forward-line 1) - (if arg - (buffer-substring (match-beginning arg) - (match-end arg)))) - (t - (cvs-parse-error stdout - stderr - (if (eq (current-buffer) stdout) - 'STDOUT - 'STDERR) - (point) - regexp)))) - -;;---------- -(defun cvs-get-current-dir (root-dir dirname) - "Return current working directory, suitable for cvs-parse-update. -Args: ROOT-DIR DIRNAME. - -Concatenates ROOT-DIR and DIRNAME to form an absolute path." - - (if (string= "." dirname) - (substring root-dir 0 -1) - (concat root-dir dirname))) - -;;---------- -(defun cvs-compare-fileinfos (a b) - "Compare fileinfo A with fileinfo B and return t if A is `less'." - - (cond - ;; Sort acording to directories. - ((string< (cvs-fileinfo->dir a) (cvs-fileinfo->dir b)) t) - ((not (string= (cvs-fileinfo->dir a) (cvs-fileinfo->dir b))) nil) - ;; The DIRCHANGE entry is always first within the directory. - ((and (eq (cvs-fileinfo->type a) 'DIRCHANGE) - (not (eq (cvs-fileinfo->type b) 'DIRCHANGE))) t) - ((and (eq (cvs-fileinfo->type b) 'DIRCHANGE) - (not (eq (cvs-fileinfo->type a) 'DIRCHANGE))) nil) - ;; All files are sorted by file name. - ((string< (cvs-fileinfo->file-name a) (cvs-fileinfo->file-name b))))) - -;;---------- -(defun cvs-parse-error (stdout-buffer stderr-buffer err-buf pos &optional indicator) - "Handle a parse error when parsing the output from cvs. -Args: STDOUT-BUFFER STDERR-BUFFER ERR-BUF POS &optional INDICATOR. - -ERR-BUF should be 'STDOUT or 'STDERR." - - (setq pos (1- pos)) - (set-buffer cvs-buffer-name) - (setq buffer-read-only nil) - (erase-buffer) - (insert "To: " pcl-cvs-bugs-address "\n") - (insert "Subject: pcl-cvs release" pcl-cvs-version " parse error.\n") - (insert (concat mail-header-separator "\n")) - (insert "This bug report is automatically generated by pcl-cvs\n") - (insert "because it doesn't understand some output from CVS. Below\n") - (insert "is detailed information about the error. Please send\n") - (insert "this, together with any information you think might be\n") - (insert "useful for me to fix the bug, to the address above. But\n") - (insert "please check the \"known problems\" section of the\n") - (insert "documentation first. Note that this buffer contains\n") - (insert "information that you might consider confidential. You\n") - (insert "are encouraged to read through it before sending it.\n") - (insert "\n") - (insert "Press C-c C-c to send this email.\n\n") - (insert "Please state the version of these programs you are using:\n\n") - (insert "RCS: \ndiff: \n\n") - - (let* ((stdout (save-excursion (set-buffer stdout-buffer) (buffer-string))) - (stderr (save-excursion (set-buffer stderr-buffer) (buffer-string))) - (errstr (if (eq err-buf 'STDOUT) stdout stderr)) - (errline-end (string-match "\n" errstr pos)) - (errline (substring errstr pos errline-end))) - (insert (format "Offending line (%d chars): >" (- errline-end pos))) - (insert errline) - (insert "<\n") - (insert "Sent to " (symbol-name err-buf) " at pos " (format "%d\n" pos)) - (if indicator - (insert "Optional args: \"" indicator "\".\n")) - (insert "\nEmacs-version: " (emacs-version) "\n") - (insert "Pcl-cvs Version: " - "@(#)OrigId: pcl-cvs.el,v 1.93 1993/05/31 22:44:00 ceder Exp\n") - (insert "CVS Version: " - "@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs.el,v 1.1.1.2 1996/01/30 00:19:09 tholo Exp $\n\n") - (insert (format "--- Contents of stdout buffer (%d chars) ---\n" - (length stdout))) - (insert stdout) - (insert "--- End of stdout buffer ---\n") - (insert (format "--- Contents of stderr buffer (%d chars) ---\n" - (length stderr))) - (insert stderr) - (insert "--- End of stderr buffer ---\n") - (insert "\nEnd of bug report.\n") - (require 'sendmail) - (mail-mode) - (error "CVS parse error - please report this bug."))) - -;;---------- -(defun cvs-parse-update (stdout-buffer stderr-buffer) - "Parse the output from `cvs update'. - -Args: STDOUT-BUFFER STDERR-BUFFER. - -This functions parses the from `cvs update' (which should be -separated in its stdout- and stderr-components) and prints a -pretty representation of it in the *cvs* buffer. - -Signals an error if unexpected output was detected in the buffer." - - (let* ((head (cons 'dummy nil)) - (tail (cvs-parse-stderr stdout-buffer stderr-buffer - head default-directory)) - (root-dir default-directory)) - (cvs-parse-stdout stdout-buffer stderr-buffer tail root-dir) - (setq head (sort (cdr head) (function cvs-compare-fileinfos))) - (collection-clear cvs-cookie-handle) - (collection-append-cookies cvs-cookie-handle head) - (cvs-remove-stdout-shadows) - (if cvs-auto-remove-handled-directories - (cvs-remove-empty-directories)) - (set-buffer cvs-buffer-name) - (cvs-mode) - (goto-char (point-min)) - (tin-goto-previous cvs-cookie-handle (point-min) 1) - (setq default-directory root-dir))) - -;;---------- -(defun cvs-remove-stdout-shadows () - "Remove entries in the *cvs* buffer that comes from both stdout and stderr. -If there is two entries for a single file the second one should be -deleted. (Remember that sort uses a stable sort algorithm, so one can -be sure that the stderr entry is always first)." - - (collection-filter-tins cvs-cookie-handle - (function - (lambda (tin) - (not (cvs-shadow-entry-p tin)))))) - -;;---------- -(defun cvs-shadow-entry-p (tin) - "Return non-nil if TIN is a shadow entry. -Args: TIN. - -A TIN is a shadow entry if the previous tin contains the same file." - - (let* ((previous-tin (tin-previous cvs-cookie-handle tin)) - (curr (tin-cookie cvs-cookie-handle tin)) - (prev (and previous-tin - (tin-cookie cvs-cookie-handle previous-tin)))) - (and - prev curr - (string= (cvs-fileinfo->file-name prev) - (cvs-fileinfo->file-name curr)) - (string= (cvs-fileinfo->dir prev) - (cvs-fileinfo->dir curr)) - (or - (and (eq (cvs-fileinfo->type prev) 'CONFLICT) - (eq (cvs-fileinfo->type curr) 'CONFLICT)) - (and (eq (cvs-fileinfo->type prev) 'MERGED) - (eq (cvs-fileinfo->type curr) 'MODIFIED)) - (and (eq (cvs-fileinfo->type prev) 'REM-EXIST) - (eq (cvs-fileinfo->type curr) 'REMOVED)))))) - -;;---------- -(defun cvs-find-backup-file (filename &optional dirname) - "Look for a backup file for FILENAME, optionally in directory DIRNAME, and if -there is one, return the name of the first file found as a string." - - (if (eq dirname nil) - (setq dirname default-directory)) - (car (directory-files dirname nil (concat "^\\" cvs-bakprefix filename - "\\.")))) - -;;---------- -(defun cvs-find-backup-revision (filename) - "Take FILENAME as the name of a cvs backup file and return the revision of -that file as a string." - - (substring filename - (+ 1 (string-match "\\.\\([0-9.]+\\)$" filename)))) - -;;---------- -(defun cvs-parse-stderr (stdout-buffer stderr-buffer head dir) - "Parse the output from CVS that is written to stderr. -Args: STDOUT-BUFFER STDERR-BUFFER HEAD DIR - -STDOUT-BUFFER holds the output that cvs sent to stdout. It is only -used to create a bug report in case there is a parse error. -STDERR-BUFFER is the buffer that holds the output to parse. -HEAD is a cons-cell, the head of the list that is built. -DIR is the directory the `cvs update' was run in. - -This function returns the last cons-cell in the list that is built." - - (save-window-excursion - (set-buffer stderr-buffer) - (goto-char (point-min)) - (let ((current-dir dir) - (root-dir dir)) - - (while (< (point) (point-max)) - (cond - - ;; CVS is descending a subdirectory. - - ((looking-at - "^cvs \\(server\\|update\\): Updating \\(.*\\)$") - (setq current-dir - (cvs-get-current-dir - root-dir - (buffer-substring (match-beginning 2) (match-end 2)))) - (setcdr head (list (cvs-create-fileinfo - 'DIRCHANGE - current-dir - "." ; the old version had nil here??? - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; File removed, since it is removed (by third party) in repository. - - ((or (looking-at - "^cvs \\(update\\|server\\): warning: \\(.*\\) is not (any longer) pertinent") - (looking-at - "^cvs \\(update\\|server\\): \\(.*\\) is no longer in the repository")) - - (setcdr head (list (cvs-create-fileinfo - 'CVS-REMOVED - current-dir - (file-name-nondirectory - (buffer-substring (match-beginning 2) - (match-end 2))) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; File removed by you, but recreated by cvs. Ignored. Will say - ;; "Updated" on the next line. - - ((looking-at - "^cvs \\(update\\|server\\): warning: .* was lost$") - (forward-line 1)) - - ;; File unknown for some reason. - ;; FIXME: is it really a good idea to add this as unknown here? - - ((looking-at - "cvs \\(update\\|server\\): nothing known about \\(.*\\)$") - (let ((filename (buffer-substring (match-beginning 2) - (match-end 2)))) - (if (file-directory-p filename) - (setcdr head (list (cvs-create-fileinfo - 'UNKNOWN-DIR - current-dir - "." - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setcdr head (list (cvs-create-fileinfo - 'UNKNOWN - current-dir - (file-name-nondirectory filename) - (buffer-substring (match-beginning 0) - (match-end 0))))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; A file that has been created by you, but added to the cvs - ;; repository by another. - - ((looking-at - "^cvs \\(update\\|server\\): move away \\(.*\\); it is in the way$") - (setcdr head (list (cvs-create-fileinfo - 'MOVE-AWAY - current-dir - (file-name-nondirectory - (buffer-substring (match-beginning 2) - (match-end 2))) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; Cvs waits for a lock. Ignore. - - ((looking-at - "^cvs \\(update\\|server\\): \\[..:..:..\\] waiting for .*lock in ") - (forward-line 1)) - - ;; File removed in repository, but edited by you. - - ((looking-at - "^cvs \\(update\\|server\\): conflict: \\(.*\\) is modified but no longer in the repository$") - (setcdr head (list - (cvs-create-fileinfo - 'REM-CONFLICT - current-dir - (file-name-nondirectory - (buffer-substring (match-beginning 2) - (match-end 2))) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; File removed in repository, but edited by someone else. - - ((looking-at - "^cvs \\(update\\|server\\): conflict: removed \\(.*\\) was modified by second party") - (setcdr head - (list - (cvs-create-fileinfo - 'MOD-CONFLICT - current-dir - (buffer-substring (match-beginning 1) - (match-end 1)) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; File removed in repository, but not in local directory. - - ((looking-at - "^cvs \\(update\\|server\\): \\(.*\\) should be removed and is still there") - (setcdr head - (list - (cvs-create-fileinfo - 'REM-EXIST - current-dir - (buffer-substring (match-beginning 2) - (match-end 2)) - (buffer-substring (match-beginning 0) - (match-end 0))))) - (setq head (cdr head)) - (forward-line 1)) - - ;; Error searching for repository - - ((looking-at - "^cvs \\(update\\|server\\): in directory ") - (let ((start (point))) - (forward-line 1) - (cvs-skip-line stdout-buffer stderr-buffer - (regexp-quote "cvs [update aborted]: there is no repository ")) - (setcdr head (list (cvs-create-fileinfo - 'REPOS-MISSING - current-dir - nil - (buffer-substring start (point))))) - (setq head (cdr head)))) - - ;; Silly warning from attempted conflict resolution. Ignored. - ;; FIXME: Should it be? - ;; eg.: "cvs update: cannot find revision APC-web-update in file .cvsignore" - ;; - ((looking-at - "^cvs \\(update\\|server\\): cannot find revision \\(.*\\) in file \\(.*\\)$") - (forward-line 1) - (message "%s" (buffer-substring (match-beginning 0) (match-end 0)))) - - ;; CVS has decided to merge someone elses changes into this document. - ;; About to start an rcsmerge operation... - ;; - ((looking-at - "^RCS file: ") - - ;; skip the "RCS file:" line... - (forward-line 1) - - (let ((complex-start (point)) - base-revision ; the first revision retrieved to merge from - head-revision ; the second revision retrieved to merge from - filename ; the name of the file being merged - backup-file ; the name of the backup of the working file - backup-revision) ; the revision of the original working file - - (setq base-revision - (cvs-skip-line stdout-buffer stderr-buffer - "^retrieving revision \\(.*\\)$" - 1)) - (setq head-revision - (cvs-skip-line stdout-buffer stderr-buffer - "^retrieving revision \\(.*\\)$" - 1)) - (setq filename - (cvs-skip-line stdout-buffer stderr-buffer - "^Merging differences between [0-9.]+ and [0-9.]+ into \\(.*\\)$" - 1)) - (setq backup-file - (cvs-find-backup-file filename current-dir)) - (setq backup-revision - (cvs-find-backup-revision backup-file)) - - ;; Was there a conflict during the merge? - - (cond - - ;;;; From CVS-1.3 & RCS-5.6.0.1 with GNU-Diffutils-2.5: - ;;;; "cvs update -j OLD-REV -j NEW-REV ." - ;; - ;; RCS file: /big/web-CVS/apc/cmd/Main/logout.sh,v - ;; retrieving revision 1.1.1.1 - ;; retrieving revision 1.1.1.2 - ;; Merging differences between 1.1.1.1 and 1.1.1.2 into logout.sh - ;; rcsmerge warning: overlaps during merge - - ((looking-at - ;; Allow both RCS 5.5 and 5.6. (5.6 prints "rcs" and " warning"). - "^\\(rcs\\)?merge[:]*\\( warning\\)?: \\((overlaps\\|conflicts\\) during merge$") - - ;; Yes, this is a conflict. - (cvs-skip-line stdout-buffer stderr-buffer - "^\\(rcs\\)?merge[:]*\\( warning\\)?: \\(overlaps\\|conflicts\\) during merge$") - - ;; this line doesn't seem to appear in all cases -- perhaps only - ;; in "-j A -j B" usage, in which case this indicates ???? - (cvs-skip-line stdout-buffer stderr-buffer - "^cvs \\(update\\|server\\): conflicts found in ") - - (let ((fileinfo - (cvs-create-fileinfo - 'CONFLICT current-dir - filename - (buffer-substring complex-start (point))))) - - ;; squirrel away info about the files that were retrieved for merging - (cvs-set-fileinfo->base-revision fileinfo base-revision) - (cvs-set-fileinfo->head-revision fileinfo head-revision) - (cvs-set-fileinfo->backup-revision fileinfo backup-revision) - (cvs-set-fileinfo->backup-file fileinfo backup-file) - - (setcdr head (list fileinfo)) - (setq head (cdr head)))) - - ;; Was it a conflict, and was RCS compiled without DIFF3_BIN, in - ;; which case this is a failed conflict resolution? - - ((looking-at - ;; Allow both RCS 5.5 and 5.6. (5.6 prints "rcs" and " warning"). - "^\\(rcs\\)?merge\\( warning\\)?: overlaps or other problems during merge$") - - (cvs-skip-line stdout-buffer stderr-buffer - "^\\(rcs\\)?merge\\( warning\\)?: overlaps or other problems during merge$") - (cvs-skip-line stdout-buffer stderr-buffer - "^cvs update: could not merge ") - (cvs-skip-line stdout-buffer stderr-buffer - "^cvs update: restoring .* from backup file ") - (let ((fileinfo - (cvs-create-fileinfo - 'CONFLICT current-dir - filename - (buffer-substring complex-start (point))))) - (setcdr head (list fileinfo)) - (setq head (cdr head)))) - - ;; Not a conflict; it must be a succesful merge. - - (t - (let ((fileinfo - (cvs-create-fileinfo - 'MERGED current-dir - filename - (buffer-substring complex-start (point))))) - (cvs-set-fileinfo->base-revision fileinfo base-revision) - (cvs-set-fileinfo->head-revision fileinfo head-revision) - (cvs-set-fileinfo->backup-revision fileinfo backup-revision) - (cvs-set-fileinfo->backup-file fileinfo backup-file) - (setcdr head (list fileinfo)) - (setq head (cdr head))))))) - - ;; Error messages from CVS (incomplete) - - ((looking-at - "^cvs \\(update\\|server\\): \\(invalid option .*\\)$") - (error "Interface problem with CVS: %s" - (buffer-substring (match-beginning 2) (match-end 2)))) - - ;; network errors - - ;; Kerberos connection attempted but failed. This is not - ;; really an error, as CVS will automatically fall back to - ;; rsh. Plus it tries kerberos, if available, even when rsh - ;; is what you really wanted. - - ((looking-at - "^cvs update: kerberos connect:.*$") - (forward-line 1) - (message "Remote CVS: %s" - (buffer-substring (match-beginning 0) (match-end 0)))) - - ;; And when kerberos *does* fail, cvs prints out some stuff - ;; as it tries rsh. Ignore that stuff too. - - ((looking-at - "^cvs update: trying to start server using rsh$") - (forward-line 1)) - - ((looking-at - "^\\([^:]*\\) Connection timed out") - (error "Remote CVS: %s" - (buffer-substring (match-beginning 0) (match-end 0)))) - - ((looking-at - "^Permission denied.") - (error "Remote CVS: %s" - (buffer-substring (match-beginning 0) (match-end 0)))) - - ((looking-at - "^cvs \\[update aborted\\]: premature end of file from server") - (error "Remote CVS: %s" - (buffer-substring (match-beginning 0) (match-end 0)))) - - ;; Empty line. Probably inserted by mistake by user (or developer :-) - ;; Ignore. - - ((looking-at - "^$") - (forward-line 1)) - - ;; top-level parser (cond) default clause - - (t - (cvs-skip-line stdout-buffer stderr-buffer - "^UN-MATCHABLE-OUTPUT")))))) - - ;; cause this function to return the head of the parser output list - head) - -;;---------- -(defun cvs-parse-stdout (stdout-buffer stderr-buffer head root-dir) - "Parse the output from CVS that is written to stderr. -Args: STDOUT-BUFFER STDERR-BUFFER HEAD ROOT-DIR - -STDOUT-BUFFER is the buffer that holds the output to parse. -STDERR-BUFFER holds the output that cvs sent to stderr. It is only -used to create a bug report in case there is a parse error. - -HEAD is a cons-cell, the head of the list that is built. -ROOT-DIR is the directory the `cvs update' was run in. - -This function doesn't return anything particular." - - (save-window-excursion - (set-buffer stdout-buffer) - (goto-char (point-min)) - (while (< (point) (point-max)) - (cond - - ;; M: The file is modified by the user, and untouched in the repository. - ;; A: The file is "cvs add"ed, but not "cvs ci"ed. - ;; R: The file is "cvs remove"ed, but not "cvs ci"ed. - ;; C: Conflict (only useful if a join was done and stderr has info...) - ;; U: The file is copied from the repository. - ;; ?: Unknown file or directory. - - ((looking-at - "^\\([MARCUP?]\\) \\(.*\\)$") - (let* - ((c (char-after (match-beginning 1))) - (full-path (concat (file-name-as-directory root-dir) - (buffer-substring (match-beginning 2) - (match-end 2)))) - (isdir (file-directory-p full-path)) - (fileinfo (cvs-create-fileinfo - (cond ((eq c ?M) 'MODIFIED) - ((eq c ?A) 'ADDED) - ((eq c ?R) 'REMOVED) - ((eq c ?C) 'CONFLICT) - ((eq c ?U) 'UPDATED) - ((eq c ?P) 'PATCHED) - ((eq c ??) (if isdir - 'UNKNOWN-DIR - 'UNKNOWN))) - (substring (file-name-directory full-path) 0 -1) - (file-name-nondirectory full-path) - (buffer-substring (match-beginning 0) (match-end 0))))) - ;; Updated and Patched files require no further action. - (if (memq c '(?U ?P)) - (cvs-set-fileinfo->handled fileinfo t)) - - ;; Link this last on the list. - (setcdr head (list fileinfo)) - (setq head (cdr head)) - (forward-line 1))) - - ;; Executing a program because of the -u option in modules. - ((looking-at - "^cvs \\(update\\|server\\): Executing") - ;; Skip by any output the program may generate to stdout. - ;; Note that pcl-cvs will get seriously confused if the - ;; program prints anything to stderr. - (re-search-forward cvs-update-prog-output-skip-regexp) - (forward-line 1)) - - (t - (cvs-parse-error stdout-buffer stderr-buffer 'STDOUT (point) - "cvs-parse-stdout")))))) - -;;---------- -(defun cvs-pp (fileinfo) - "Pretty print FILEINFO. Insert a printed representation in current buffer. -For use by the cookie package." - - (let ((a (cvs-fileinfo->type fileinfo)) - (s (if (cvs-fileinfo->marked fileinfo) - "*" " ")) - (f (cvs-fileinfo->file-name fileinfo)) - (ci (if (cvs-fileinfo->handled fileinfo) - " " "ci"))) - (insert - (cond - ((eq a 'UPDATED) - (format "%s Updated %s" s f)) - ((eq a 'PATCHED) - (format "%s Patched %s" s f)) - ((eq a 'MODIFIED) - (format "%s Modified %s %s" s ci f)) - ((eq a 'MERGED) - (format "%s Merged %s %s" s ci f)) - ((eq a 'CONFLICT) - (format "%s Conflict %s" s f)) - ((eq a 'ADDED) - (format "%s Added %s %s" s ci f)) - ((eq a 'REMOVED) - (format "%s Removed %s %s" s ci f)) - ((eq a 'UNKNOWN) - (format "%s Unknown %s" s f)) - ((eq a 'UNKNOWN-DIR) - (format "%s Unknown dir %s" s f)) - ((eq a 'CVS-REMOVED) - (format "%s Removed from repository: %s" s f)) - ((eq a 'REM-CONFLICT) - (format "%s Conflict: Removed from repository, changed by you: %s" s f)) - ((eq a 'MOD-CONFLICT) - (format "%s Conflict: Removed by you, changed in repository: %s" s f)) - ((eq a 'REM-EXIST) - (format "%s Conflict: Removed by you, but still exists: %s" s f)) - ((eq a 'DIRCHANGE) - (format "\nIn directory %s:" (cvs-fileinfo->dir fileinfo))) - ((eq a 'MOVE-AWAY) - (format "%s Move away %s - it is in the way" s f)) - ((eq a 'REPOS-MISSING) - (format " This repository directory is missing! Remove this directory manually.")) - ((eq a 'MESSAGE) - (cvs-fileinfo->full-log fileinfo)) - (t - (format "%s Internal error! %s" s f)))))) - - -;;; You can define your own keymap in .emacs. pcl-cvs.el won't overwrite it. - -(if cvs-mode-map - nil - (setq cvs-mode-map (make-keymap)) - (suppress-keymap cvs-mode-map) - (define-prefix-command 'cvs-mode-map-control-c-prefix) - (define-key cvs-mode-map "\C-?" 'cvs-mode-unmark-up) - (define-key cvs-mode-map "\C-k" 'cvs-mode-acknowledge) - (define-key cvs-mode-map "\C-n" 'cvs-mode-next-line) - (define-key cvs-mode-map "\C-p" 'cvs-mode-previous-line) - ;; ^C- keys are used to set various flags to control CVS features - (define-key cvs-mode-map "\C-c" 'cvs-mode-map-control-c-prefix) - (define-key cvs-mode-map "\C-cc" 'cvs-change-cvsroot) - (define-key cvs-mode-map "\C-cd" 'cvs-set-diff-flags) - (define-key cvs-mode-map "\C-cl" 'cvs-set-log-flags) - (define-key cvs-mode-map "\C-cs" 'cvs-set-status-flags) - (define-key cvs-mode-map "\C-cu" 'cvs-set-update-optional-flags) - ;; M- keys are usually those that operate on modules - (define-key cvs-mode-map "\M-\C-?" 'cvs-mode-unmark-all-files) - (define-key cvs-mode-map "\M-C" 'cvs-mode-rcs2log) ; i.e. "Create a ChangeLog" - (define-key cvs-mode-map "\M-a" 'cvs-mode-admin) - (define-key cvs-mode-map "\M-c" 'cvs-mode-checkout) - (define-key cvs-mode-map "\M-o" 'cvs-mode-checkout-other-window) - (define-key cvs-mode-map "\M-p" 'cvs-mode-rdiff) ; i.e. "create a Patch" - (define-key cvs-mode-map "\M-r" 'cvs-mode-release) - (define-key cvs-mode-map "\M-t" 'cvs-mode-rtag) - ;; keys that operate on files - (define-key cvs-mode-map " " 'cvs-mode-next-line) - (define-key cvs-mode-map "?" 'describe-mode) - (define-key cvs-mode-map "A" 'cvs-mode-add-change-log-entry-other-window) - (define-key cvs-mode-map "B" 'cvs-mode-byte-compile-files) - (define-key cvs-mode-map "C" 'cvs-mode-changelog-commit) - (define-key cvs-mode-map "E" 'cvs-mode-emerge) - (define-key cvs-mode-map "G" 'cvs-update) - (define-key cvs-mode-map "M" 'cvs-mode-mark-all-files) - (define-key cvs-mode-map "Q" 'cvs-examine) - (define-key cvs-mode-map "R" 'cvs-mode-revert-updated-buffers) - (define-key cvs-mode-map "U" 'cvs-mode-undo-local-changes) - (define-key cvs-mode-map "a" 'cvs-mode-add) - (define-key cvs-mode-map "b" 'cvs-mode-diff-backup) - (define-key cvs-mode-map "c" 'cvs-mode-commit) - (define-key cvs-mode-map "d" 'cvs-mode-diff-cvs) - (define-key cvs-mode-map "e" 'cvs-mode-ediff) - (define-key cvs-mode-map "f" 'cvs-mode-find-file) - (define-key cvs-mode-map "g" 'cvs-mode-update-no-prompt) - (define-key cvs-mode-map "i" 'cvs-mode-ignore) - (define-key cvs-mode-map "l" 'cvs-mode-log) - (define-key cvs-mode-map "m" 'cvs-mode-mark) - (define-key cvs-mode-map "n" 'cvs-mode-next-line) - (define-key cvs-mode-map "o" 'cvs-mode-find-file-other-window) - (define-key cvs-mode-map "p" 'cvs-mode-previous-line) - (define-key cvs-mode-map "q" 'bury-buffer) - (define-key cvs-mode-map "r" 'cvs-mode-remove-file) - (define-key cvs-mode-map "s" 'cvs-mode-status) - (define-key cvs-mode-map "t" 'cvs-mode-tag) - (define-key cvs-mode-map "u" 'cvs-mode-unmark) - (define-key cvs-mode-map "v" 'cvs-mode-diff-vendor) - (define-key cvs-mode-map "x" 'cvs-mode-remove-handled)) - -;;---------- -(defun cvs-get-marked (&optional ignore-marks ignore-contents) - "Return a list of all selected tins. -Args: &optional IGNORE-MARKS IGNORE-CONTENTS. - -If there are any marked tins, and IGNORE-MARKS is nil, return them. Otherwise, -if the cursor selects a directory, return all files in it, unless there are -none, in which case just return the directory; or unless IGNORE-CONTENTS is not -nil, in which case also just return the directory. Otherwise return (a list -containing) the file the cursor points to, or an empty list if it doesn't point -to a file at all." - - (cond - ;; Any marked cookies? - ((and (not ignore-marks) - (collection-collect-tin cvs-cookie-handle 'cvs-fileinfo->marked))) - ;; Nope. - ((and (not ignore-contents) - (let ((sel (tin-locate cvs-cookie-handle (point)))) - (cond - ;; If a directory is selected, all it members are returned. - ((and sel (eq (cvs-fileinfo->type (tin-cookie cvs-cookie-handle - sel)) - 'DIRCHANGE)) - (let ((retsel - (collection-collect-tin cvs-cookie-handle - 'cvs-dir-member-p - (cvs-fileinfo->dir (tin-cookie - cvs-cookie-handle sel))))) - (if retsel - retsel - (list sel)))) - (t - (list sel)))))) - (t - (list (tin-locate cvs-cookie-handle (point)))))) - -;;---------- -(defun cvs-dir-member-p (fileinfo dir) - "Return true if FILEINFO represents a file in directory DIR." - - (and (not (eq (cvs-fileinfo->type fileinfo) 'DIRCHANGE)) - (string= (cvs-fileinfo->dir fileinfo) dir))) - -;;---------- -(defun cvs-dir-empty-p (tin) - "Return non-nil if TIN is a directory that is empty. -Args: CVS-BUF TIN." - - (and (eq (cvs-fileinfo->type (tin-cookie cvs-cookie-handle tin)) 'DIRCHANGE) - (or (not (tin-next cvs-cookie-handle tin)) - (eq (cvs-fileinfo->type - (tin-cookie cvs-cookie-handle - (tin-next cvs-cookie-handle tin))) - 'DIRCHANGE)))) - -;;---------- -(defun cvs-mode-revert-updated-buffers () - "Revert any buffers that are UPDATED, PATCHED, MERGED or CONFLICT." - - (interactive) - (cookie-map (function cvs-revert-fileinfo) cvs-cookie-handle)) - -;;---------- -(defun cvs-revert-fileinfo (fileinfo) - "Revert the buffer that holds the file in FILEINFO if it has changed, -and if the type is UPDATED, PATCHED, MERGED or CONFLICT." - - (let* ((type (cvs-fileinfo->type fileinfo)) - (file (cvs-fileinfo->full-path fileinfo)) - (buffer (get-file-buffer file))) - ;; For a revert to happen... - (cond - ((and - ;; ...the type must be one that justifies a revert... - (or (eq type 'UPDATED) - (eq type 'PATCHED) - (eq type 'MERGED) - (eq type 'CONFLICT)) - ;; ...and the user must be editing the file... - buffer) - (save-excursion - (set-buffer buffer) - (cond - ((buffer-modified-p) - (error "%s: edited since last cvs-update." - (buffer-file-name))) - ;; Go ahead and revert the file. - (t (revert-buffer 'dont-use-auto-save-file 'dont-ask)))))))) - -;;---------- -(defun cvs-mode-remove-handled () - "Remove all lines that are handled. -Empty directories are removed." - - (interactive) - ;; Pass one: remove files that are handled. - (collection-filter-cookies cvs-cookie-handle - (function - (lambda (fileinfo) - (not (cvs-fileinfo->handled fileinfo))))) - ;; Pass two: remove empty directories. - (if cvs-auto-remove-handled-directories - (cvs-remove-empty-directories))) - -;;---------- -(defun cvs-remove-empty-directories () - "Remove empty directories in the *cvs* buffer." - - (collection-filter-tins cvs-cookie-handle - (function - (lambda (tin) - (not (cvs-dir-empty-p tin)))))) - -;;---------- -(defun cvs-mode-mark (pos) - "Mark a fileinfo. -Args: POS. - -If the fileinfo is a directory, all the contents of that directory are marked -instead. A directory can never be marked. POS is a buffer position." - - (interactive "d") - (let* ((tin (tin-locate cvs-cookie-handle pos)) - (sel (tin-cookie cvs-cookie-handle tin))) - (cond - ;; Does POS point to a directory? If so, mark all files in that directory. - ((eq (cvs-fileinfo->type sel) 'DIRCHANGE) - (cookie-map - (function (lambda (f dir) - (cond - ((cvs-dir-member-p f dir) - (cvs-set-fileinfo->marked f t) - t)))) ; Tell cookie to redisplay this cookie. - cvs-cookie-handle - (cvs-fileinfo->dir sel))) - (t - (cvs-set-fileinfo->marked sel t) - (tin-invalidate cvs-cookie-handle tin) - (tin-goto-next cvs-cookie-handle pos 1))))) - -;;---------- -(defun cvs-committable (tin) - "Check if the TIN is committable. -It is committable if it - a) is not handled and - b) is either MODIFIED, ADDED, REMOVED, MERGED or CONFLICT." - - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (and (not (cvs-fileinfo->handled fileinfo)) - (or (eq type 'MODIFIED) - (eq type 'ADDED) - (eq type 'REMOVED) - (eq type 'MERGED) - (eq type 'CONFLICT))))) - -;;---------- -(defun cvs-mode-commit () - "Check in all marked files, or the current file. -The user will be asked for a log message in a buffer. -If cvs-erase-input-buffer is non-nil that buffer will be erased. -Otherwise mark and point will be set around the entire contents of the -buffer so that it is easy to kill the contents of the buffer with \\[kill-region]." - - (interactive) - (let* ((cvs-buf (current-buffer)) - (marked (cvs-filter (function cvs-committable) - (cvs-get-marked)))) - (if (null marked) - (error "Nothing to commit!") - (pop-to-buffer (get-buffer-create cvs-commit-prompt-buffer)) - (goto-char (point-min)) - - (if cvs-erase-input-buffer - (erase-buffer) - (push-mark (point-max))) - (cvs-edit-mode) - (make-local-variable 'cvs-commit-list) - (setq cvs-commit-list marked) - (message "Press C-c C-c when you are done editing.")))) - -;;---------- -(defun cvs-edit-done () - "Commit the files to the repository." - - (interactive) - (if (null cvs-commit-list) - (error "You have already committed the files")) - (if (and (> (point-max) 1) - (/= (char-after (1- (point-max))) ?\n) - (or (eq cvs-commit-buffer-require-final-newline t) - (and cvs-commit-buffer-require-final-newline - (yes-or-no-p - (format "Buffer %s does not end in newline. Add one? " - (buffer-name)))))) - (save-excursion - (goto-char (point-max)) - (insert ?\n))) - (save-some-buffers) - (let ((cc-list cvs-commit-list) - (cc-buffer (get-buffer cvs-buffer-name)) - (msg-buffer (current-buffer)) - (msg (buffer-substring (point-min) (point-max)))) - (pop-to-buffer cc-buffer) - (bury-buffer msg-buffer) - (cvs-use-temp-buffer) - (message "Committing...") - (if (cvs-execute-list cc-list cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "commit" "-m" msg) - (list "commit" "-m" msg)) - "Committing %s...") - (error "Something went wrong. Check the %s buffer carefully." - cvs-temp-buffer-name)) - ;; FIXME: don't do any of this if the commit fails. - (let ((ccl cc-list)) - (while ccl - (cvs-after-commit-function (tin-cookie cvs-cookie-handle (car ccl))) - (setq ccl (cdr ccl)))) - (apply 'tin-invalidate cvs-cookie-handle cc-list) - (set-buffer msg-buffer) - (setq cvs-commit-list nil) - (set-buffer cc-buffer) - (if cvs-auto-remove-handled - (cvs-mode-remove-handled))) - - (message "Committing... Done.")) - -;;---------- -(defun cvs-after-commit-function (fileinfo) - "Do everything that needs to be done when FILEINFO has been committed. -The fileinfo->handle is set, and if the buffer is present it is reverted." - - (cvs-set-fileinfo->handled fileinfo t) - (if cvs-auto-revert-after-commit - (let* ((file (cvs-fileinfo->full-path fileinfo)) - (buffer (get-file-buffer file))) - ;; For a revert to happen... - (if buffer - ;; ...the user must be editing the file... - (save-excursion - (set-buffer buffer) - (if (not (buffer-modified-p)) - ;; ...but it must be unmodified. - (revert-buffer 'dont-use-auto-save-file 'dont-ask))))))) - -;;---------- -(defun cvs-execute-list (tin-list program constant-args &optional message-fmt) - "Run PROGRAM on all elements on TIN-LIST. -Args: TIN-LIST PROGRAM CONSTANT-ARGS. - -The PROGRAM will be called with pwd set to the directory the files reside -in. CONSTANT-ARGS should be a list of strings. The arguments given to the -program will be CONSTANT-ARGS followed by all the files (from TIN-LIST) that -resides in that directory. If the files in TIN-LIST resides in different -directories the PROGRAM will be run once for each directory (if all files in -the same directory appears after each other). - -Any output from PROGRAM will be inserted in the current buffer. - -This function return nil if all went well, or the numerical exit status or a -signal name as a string. Note that PROGRAM might be called several times. This -will return non-nil if something goes wrong, but there is no way to know which -process that failed. - -If MESSAGE-FMT is not nil, then message is called to display progress with -MESSAGE-FMT as the string. MESSAGE-FMT should contain one %s for the arg-list -being passed to PROGRAM." - - ;; FIXME: something seems wrong with the error checking here.... - - (let ((exitstatus nil)) - (while tin-list - (let ((current-dir (cvs-fileinfo->dir (tin-cookie cvs-cookie-handle - (car tin-list)))) - arg-list - arg-str) - - ;; Collect all marked files in this directory. - - (while (and tin-list - (string= current-dir - (cvs-fileinfo->dir (tin-cookie cvs-cookie-handle - (car tin-list))))) - (setq arg-list - (cons (cvs-fileinfo->file-name - (tin-cookie cvs-cookie-handle (car tin-list))) - arg-list)) - (setq tin-list (cdr tin-list))) - - (setq arg-list (nreverse arg-list)) - - ;; Execute the command on all the files that were collected. - - (if message-fmt - (message message-fmt - (mapconcat 'cvs-quote-multiword-string - arg-list - " "))) - (setq default-directory (file-name-as-directory current-dir)) - (insert (format "=== cd %s\n" default-directory)) - (insert (format "=== %s %s\n\n" - program - (mapconcat 'cvs-quote-multiword-string - (nconc (copy-sequence constant-args) - arg-list) - " "))) - (let ((res (apply 'call-process program nil t t - (nconc (copy-sequence constant-args) arg-list)))) - ;; Remember the first, or highest, exitstatus. - (if (and (not (and (integerp res) (zerop res))) - (or (null exitstatus) - (and (integerp exitstatus) (= 1 exitstatus)))) - (setq exitstatus res))) - (goto-char (point-max)) - (if message-fmt - (message message-fmt - (mapconcat 'cvs-quote-multiword-string - (nconc (copy-sequence arg-list) '("Done.")) - " "))) - exitstatus)))) - -;;---------- -;;;; +++ not currently used! -(defun cvs-execute-single-file-list (tin-list extractor program constant-args - &optional cleanup message-fmt) - "Run PROGRAM on all elements on TIN-LIST. -Args: TIN-LIST EXTRACTOR PROGRAM CONSTANT-ARGS &optional CLEANUP. - -The PROGRAM will be called with pwd set to the directory the files -reside in. CONSTANT-ARGS is a list of strings to pass as arguments to -PROGRAM. The arguments given to the program will be CONSTANT-ARGS -followed by the list that EXTRACTOR returns. - -EXTRACTOR will be called once for each file on TIN-LIST. It is given -one argument, the cvs-fileinfo. It can return t, which means ignore -this file, or a list of arguments to send to the program. - -If CLEANUP is not nil, the filenames returned by EXTRACTOR are deleted. - -If MESSAGE-FMT is not nil, then message is called to display progress with -MESSAGE-FMT as the string. MESSAGE-FMT should contain one %s for the arg-list -being passed to PROGRAM." - - (while tin-list - (let ((current-dir (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle - (car tin-list))))) - (arg-list - (funcall extractor - (tin-cookie cvs-cookie-handle (car tin-list))))) - - ;; Execute the command unless extractor returned t. - - (if (eq arg-list t) - nil - (setq default-directory current-dir) - (insert (format "=== cd %s\n" default-directory)) - (insert (format "=== %s %s\n\n" - program - (mapconcat 'cvs-quote-multiword-string - (nconc (copy-sequence constant-args) - arg-list) - " "))) - (if message-fmt - (message message-fmt (mapconcat 'cvs-quote-multiword-string - arg-list - " "))) - (apply 'call-process program nil t t - (nconc (copy-sequence constant-args) arg-list)) - (goto-char (point-max)) - (if message-fmt - (message message-fmt (mapconcat 'cvs-quote-multiword-string - (nconc arg-list '("Done.")) - " "))) - (if cleanup - (while arg-list -;;;; (kill-buffer ?????) - (delete-file (car arg-list)) - (setq arg-list (cdr arg-list)))))) - (setq tin-list (cdr tin-list)))) - -;;---------- -(defun cvs-edit-mode () - "\\Mode for editing cvs log messages. -Commands: -\\[cvs-edit-done] checks in the file when you are ready. -This mode is based on fundamental mode." - - (interactive) - (use-local-map cvs-edit-mode-map) - (setq major-mode 'cvs-edit-mode) - (setq mode-name "CVS Log") - (auto-fill-mode 1)) - -;;---------- -(if cvs-edit-mode-map - nil - (setq cvs-edit-mode-map (make-sparse-keymap)) - (define-prefix-command 'cvs-edit-mode-control-c-prefix) - (define-key cvs-edit-mode-map "\C-c" 'cvs-edit-mode-control-c-prefix) - (define-key cvs-edit-mode-map "\C-c\C-c" 'cvs-edit-done)) - -;;---------- -(defun cvs-diffable (tins) - "Return a list of all tins on TINS that it makes sense to run -``cvs diff'' on." - - ;; +++ There is an unnecessary (nreverse) here. Get the list the - ;; other way around instead! - (let ((result nil)) - (while tins - (let ((type (cvs-fileinfo->type - (tin-cookie cvs-cookie-handle (car tins))))) - (if (or (eq type 'MODIFIED) - (eq type 'UPDATED) - (eq type 'PATCHED) - (eq type 'MERGED) - (eq type 'CONFLICT) - (eq type 'REMOVED) ;+++Does this line make sense? - (eq type 'ADDED)) ;+++Does this line make sense? - (setq result (cons (car tins) result))) - (setq tins (cdr tins)))) - (nreverse result))) - -;;---------- -(defun cvs-mode-diff-cvs (&optional ignore-marks) - "Diff the selected files against the head revisions in the repository. - -If the variable cvs-diff-ignore-marks is non-nil any marked files will not be -considered to be selected. An optional prefix argument will invert the -influence from cvs-diff-ignore-marks. - -The flags in the variable cvs-diff-flags will be passed to ``cvs diff''. - -The resulting diffs are placed in the cvs-fileinfo->cvs-diff-buffer." - - (interactive "P") - (if (not (listp cvs-diff-flags)) - (error "cvs-diff-flags should be set using cvs-set-diff-flags.")) - (save-some-buffers) - (message "cvsdiffing...") - (let ((marked-file-list (cvs-diffable - (cvs-get-marked - (or (and ignore-marks (not cvs-diff-ignore-marks)) - (and (not ignore-marks) cvs-diff-ignore-marks)))))) - (while marked-file-list - (let ((fileinfo-to-diff (tin-cookie cvs-cookie-handle - (car marked-file-list))) - (local-def-directory (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle - (car marked-file-list)))))) - (message "cvsdiffing %s..." - (cvs-fileinfo->file-name fileinfo-to-diff)) - - ;; FIXME: this seems messy to test and set buffer name at this point.... - (if (not (cvs-fileinfo->cvs-diff-buffer fileinfo-to-diff)) - (cvs-set-fileinfo->cvs-diff-buffer fileinfo-to-diff - (concat "*cvs-diff-" - (cvs-fileinfo->file-name - fileinfo-to-diff) - "-in-" - local-def-directory - "*"))) - (display-buffer (get-buffer-create - (cvs-fileinfo->cvs-diff-buffer fileinfo-to-diff))) - (set-buffer (cvs-fileinfo->cvs-diff-buffer fileinfo-to-diff)) - (setq buffer-read-only nil) - (setq default-directory local-def-directory) - (erase-buffer) - (insert (format "=== cd %s\n" default-directory)) - (insert (format "=== cvs %s\n\n" - (mapconcat 'cvs-quote-multiword-string - (nconc (if cvs-cvsroot - (list "-d" cvs-cvsroot "diff") - '("diff")) - (copy-sequence cvs-diff-flags) - (list (cvs-fileinfo->file-name - fileinfo-to-diff))) - " "))) - (if (apply 'call-process cvs-program nil t t - (nconc (if cvs-cvsroot - (list "-d" cvs-cvsroot "diff") - '("diff")) - (copy-sequence cvs-diff-flags) - (list (cvs-fileinfo->file-name fileinfo-to-diff)))) - (message "cvsdiffing %s... Done." - (cvs-fileinfo->file-name fileinfo-to-diff)) - (message "cvsdiffing %s... No differences found." - (cvs-fileinfo->file-name fileinfo-to-diff))) - (goto-char (point-max)) - (setq marked-file-list (cdr marked-file-list))))) - (message "cvsdiffing... Done.")) - -;;---------- -(defun cvs-mode-diff-backup (&optional ignore-marks) - "Diff the files against the backup file. -This command can be used on files that are marked with \"Merged\" -or \"Conflict\" in the *cvs* buffer. - -If the variable cvs-diff-ignore-marks is non-nil any marked files will -not be considered to be selected. An optional prefix argument will -invert the influence from cvs-diff-ignore-marks. - -The flags in cvs-diff-flags will be passed to ``diff''. - -The resulting diffs are placed in the cvs-fileinfo->backup-diff-buffer." - - (interactive "P") - (if (not (listp cvs-diff-flags)) - (error "cvs-diff-flags should be set using cvs-set-diff-flags.")) - (save-some-buffers) - (let ((marked-file-list (cvs-filter - (function cvs-backup-diffable) - (cvs-get-marked - (or - (and ignore-marks (not cvs-diff-ignore-marks)) - (and (not ignore-marks) cvs-diff-ignore-marks)))))) - (if (null marked-file-list) - (error "No ``Conflict'' or ``Merged'' file selected!")) - (message "backup diff...") - (while marked-file-list - (let ((fileinfo-to-diff (tin-cookie cvs-cookie-handle - (car marked-file-list))) - (local-def-directory (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle - (car marked-file-list))))) - (backup-temp-files (cvs-diff-backup-extractor - (tin-cookie cvs-cookie-handle - (car marked-file-list))))) - (message "backup diff %s..." - (cvs-fileinfo->file-name fileinfo-to-diff)) - - ;; FIXME: this seems messy to test and set buffer name at this point.... - (if (not (cvs-fileinfo->backup-diff-buffer fileinfo-to-diff)) - (cvs-set-fileinfo->backup-diff-buffer fileinfo-to-diff - (concat "*cvs-diff-" - (cvs-fileinfo->backup-file - fileinfo-to-diff) - "-to-" - (cvs-fileinfo->file-name - fileinfo-to-diff) - "-in" - local-def-directory - "*"))) - (display-buffer (get-buffer-create - (cvs-fileinfo->backup-diff-buffer fileinfo-to-diff))) - (set-buffer (cvs-fileinfo->backup-diff-buffer fileinfo-to-diff)) - (setq buffer-read-only nil) - (setq default-directory local-def-directory) - (erase-buffer) - (insert (format "=== cd %s\n" default-directory)) - (insert (format "=== %s %s\n\n" - cvs-diff-program - (mapconcat 'cvs-quote-multiword-string - (nconc (copy-sequence cvs-diff-flags) - backup-temp-files) - " "))) - (apply 'call-process cvs-diff-program nil t t - (nconc (copy-sequence cvs-diff-flags) backup-temp-files)) - (goto-char (point-max)) - (message "backup diff %s... Done." - (cvs-fileinfo->file-name fileinfo-to-diff)) - (setq marked-file-list (cdr marked-file-list))))) - (message "backup diff... Done.")) - -;;---------- -(defun cvs-mode-diff-vendor (&optional ignore-marks) - "Diff the revisions merged into the current file. I.e. show what changes -were merged in. - -This command can be used on files that are marked with \"Merged\" -or \"Conflict\" in the *cvs* buffer. - -If the variable cvs-diff-ignore-marks is non-nil any marked files will -not be considered to be selected. An optional prefix argument will -invert the influence from cvs-diff-ignore-marks. - -The flags in cvs-diff-flags will be passed to ``diff''. - -The resulting diffs are placed in the cvs-fileinfo->vendor-diff-buffer." - - (interactive "P") - (if (not (listp cvs-diff-flags)) - (error "cvs-diff-flags should be set using cvs-set-diff-flags.")) - (save-some-buffers) - (let ((marked-file-list (cvs-filter - (function cvs-vendor-diffable) - (cvs-get-marked - (or - (and ignore-marks (not cvs-diff-ignore-marks)) - (and (not ignore-marks) cvs-diff-ignore-marks)))))) - (if (null marked-file-list) - (error "No ``Conflict'' or ``Merged'' file selected!")) - (message "vendor diff...") - (while marked-file-list - (let ((fileinfo-to-diff (tin-cookie cvs-cookie-handle - (car marked-file-list))) - (local-def-directory (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle - (car marked-file-list))))) - (vendor-temp-files (cvs-diff-vendor-extractor - (tin-cookie cvs-cookie-handle - (car marked-file-list))))) - (message "vendor diff %s..." - (cvs-fileinfo->file-name fileinfo-to-diff)) - (if (not (cvs-fileinfo->vendor-diff-buffer fileinfo-to-diff)) - (cvs-set-fileinfo->vendor-diff-buffer fileinfo-to-diff - (concat "*cvs-diff-" - (cvs-fileinfo->file-name - fileinfo-to-diff) - "-of-" - (cvs-fileinfo->base-revision - fileinfo-to-diff) - "-to-" - (cvs-fileinfo->head-revision - fileinfo-to-diff) - "-in-" - local-def-directory - "*"))) - (display-buffer (get-buffer-create - (cvs-fileinfo->vendor-diff-buffer fileinfo-to-diff))) - (set-buffer (cvs-fileinfo->vendor-diff-buffer fileinfo-to-diff)) - (setq buffer-read-only nil) - (setq default-directory local-def-directory) - (erase-buffer) - (insert (format "=== cd %s\n" default-directory)) - (insert (format "=== %s %s\n\n" - cvs-diff-program - (mapconcat 'cvs-quote-multiword-string - (nconc (copy-sequence cvs-diff-flags) - vendor-temp-files) - " "))) - (apply 'call-process cvs-diff-program nil t t - (nconc (copy-sequence cvs-diff-flags) vendor-temp-files)) - (goto-char (point-max)) - (message "vendor diff %s... Done." - (cvs-fileinfo->file-name fileinfo-to-diff)) - (while vendor-temp-files - (cvs-kill-buffer-visiting (car vendor-temp-files)) - (delete-file (car vendor-temp-files)) - (setq vendor-temp-files (cdr vendor-temp-files))) - (setq marked-file-list (cdr marked-file-list))))) - (message "vendor diff... Done.")) - -;;---------- -(defun cvs-backup-diffable (tin) - "Check if the TIN is backup-diffable. -It must have a backup file to be diffable." - - (file-readable-p - (cvs-fileinfo->backup-file (tin-cookie cvs-cookie-handle tin)))) - -;;---------- -(defun cvs-vendor-diffable (tin) - "Check if the TIN is vendor-diffable. -It must have head and base revision info to be diffable." - - (and - (cvs-fileinfo->base-revision (tin-cookie cvs-cookie-handle tin)) - (cvs-fileinfo->head-revision (tin-cookie cvs-cookie-handle tin)))) - -;;---------- -(defun cvs-diff-backup-extractor (fileinfo) - "Return the filename and the name of the backup file as a list. -Signal an error if there is no backup file." - - (if (not (file-readable-p (cvs-fileinfo->backup-file fileinfo))) - (error "%s has no backup file." - (concat - (file-name-as-directory (cvs-fileinfo->dir fileinfo)) - (cvs-fileinfo->file-name fileinfo)))) - (list (cvs-fileinfo->backup-file fileinfo) - (cvs-fileinfo->file-name fileinfo))) - -;;---------- -(defun cvs-diff-vendor-extractor (fileinfo) - "Retrieve and return the filenames of the vendor branch revisions as a list. -Signal an error if there is no info for the vendor revisions." - - (list (cvs-retrieve-revision-to-tmpfile fileinfo - (cvs-fileinfo->base-revision - fileinfo)) - (cvs-retrieve-revision-to-tmpfile fileinfo - (cvs-fileinfo->head-revision - fileinfo)))) - -;;---------- -(defun cvs-mode-find-file-other-window (pos) - "Select a buffer containing the file in another window. -Args: POS." - - (interactive "d") - (let ((tin (tin-locate cvs-cookie-handle pos))) - (if tin - (let ((type (cvs-fileinfo->type (tin-cookie cvs-cookie-handle tin)))) - (cond - ((or (eq type 'REMOVED) - (eq type 'CVS-REMOVED)) - (error "Can't visit a removed file.")) - ((eq type 'DIRCHANGE) - (let ((obuf (current-buffer)) - (odir default-directory)) - (setq default-directory - (file-name-as-directory - (cvs-fileinfo->dir - (tin-cookie cvs-cookie-handle tin)))) - (dired-other-window default-directory) - (set-buffer obuf) - (setq default-directory odir))) - (t - (find-file-other-window (cvs-full-path tin))))) - (error "There is no file to find.")))) - -;;---------- -(defun cvs-fileinfo->full-path (fileinfo) - "Return the full path for the file that is described in FILEINFO." - - (concat - (file-name-as-directory - (cvs-fileinfo->dir fileinfo)) - (cvs-fileinfo->file-name fileinfo))) - -;;---------- -(defun cvs-full-path (tin) - "Return the full path for the file that is described in TIN." - - (cvs-fileinfo->full-path (tin-cookie cvs-cookie-handle tin))) - -;;---------- -(defun cvs-mode-find-file (pos) - "Select a buffer containing the file in another window. -Args: POS." - - (interactive "d") - (let* ((cvs-buf (current-buffer)) - (tin (tin-locate cvs-cookie-handle pos))) - (if tin - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond - ((or (eq type 'REMOVED) - (eq type 'CVS-REMOVED)) - (error "Can't visit a removed file.")) - ((eq type 'DIRCHANGE) - (let ((odir default-directory)) - (setq default-directory - (file-name-as-directory (cvs-fileinfo->dir fileinfo))) - (dired default-directory) - (set-buffer cvs-buf) - (setq default-directory odir))) - (t - (find-file (cvs-full-path tin))))) - (error "There is no file to find.")))) - -;;---------- -(defun cvs-mode-mark-all-files () - "Mark all files. -Directories are not marked." - - (interactive) - (cookie-map (function (lambda (cookie) - (cond - ((not (eq (cvs-fileinfo->type cookie) 'DIRCHANGE)) - (cvs-set-fileinfo->marked cookie t) - t)))) - cvs-cookie-handle)) - -;;---------- -(defun cvs-mode-unmark (pos) - "Unmark a fileinfo. -Args: POS." - - (interactive "d") - (let* ((tin (tin-locate cvs-cookie-handle pos)) - (sel (tin-cookie cvs-cookie-handle tin))) - (cond - ((eq (cvs-fileinfo->type sel) 'DIRCHANGE) - (cookie-map - (function (lambda (f dir) - (cond - ((cvs-dir-member-p f dir) - (cvs-set-fileinfo->marked f nil) - t)))) - cvs-cookie-handle - (cvs-fileinfo->dir sel))) - (t - (cvs-set-fileinfo->marked sel nil) - (tin-invalidate cvs-cookie-handle tin) - (tin-goto-next cvs-cookie-handle pos 1))))) - -;;---------- -(defun cvs-mode-unmark-all-files () - "Unmark all files. -Directories are also unmarked, but that doesn't matter, since -they should always be unmarked." - - (interactive) - (cookie-map (function (lambda (cookie) - (cvs-set-fileinfo->marked cookie nil) - t)) - cvs-cookie-handle)) - -;;---------- -(defun cvs-do-removal (tins) - "Remove files. -Args: TINS. - -TINS is a list of tins that the user wants to delete. The files are deleted. -If the type of the tin is 'UNKNOWN or 'UNKNOWN-DIR the tin is removed from the -buffer. If it is anything else the file is added to a list that should be `cvs -remove'd and the tin is changed to be of type 'REMOVED. - -Returns a list of tins files that should be `cvs remove'd." - - (cvs-use-temp-buffer) - (mapcar 'cvs-insert-full-path tins) - (cond - ((and tins (yes-or-no-p (format "Delete %d files? " (length tins)))) - (let (files-to-remove) - (while tins - (let* ((tin (car tins)) - (fileinfo (tin-cookie cvs-cookie-handle tin)) - (filepath (cvs-full-path tin)) - (type (cvs-fileinfo->type fileinfo))) - (if (or (eq type 'REMOVED) - (eq type 'CVS-REMOVED)) - nil - ;; if it doesn't exist, as a file or directory, ignore it - (cond ((file-directory-p filepath) - (call-process cvs-rmdir-program nil nil nil filepath)) - ((file-exists-p filepath) - (delete-file filepath))) - (if (or (eq type 'UNKNOWN) - (eq type 'UNKNOWN-DIR) - (eq type 'MOVE-AWAY)) - (tin-delete cvs-cookie-handle tin) - (setq files-to-remove (cons tin files-to-remove)) - (cvs-set-fileinfo->type fileinfo 'REMOVED) - (cvs-set-fileinfo->handled fileinfo nil) - (tin-invalidate cvs-cookie-handle tin)))) - (setq tins (cdr tins))) - files-to-remove)) - (t nil))) - -;;---------- -(defun cvs-mode-remove-file () - "Remove all marked files." - - (interactive) - (let ((files-to-remove (cvs-do-removal (cvs-get-marked)))) - (if (null files-to-remove) - nil - (cvs-use-temp-buffer) - (message "removing from repository...") - (if (cvs-execute-list files-to-remove cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "remove") - '("remove")) - "removing %s from repository...") - (error "CVS exited with non-zero exit status.") - (message "removing from repository... Done."))))) - -;;---------- -(defun cvs-mode-undo-local-changes () - "Undo local changes to all marked files. -The file is removed and `cvs update FILE' is run." - - (interactive) - (let ((tins-to-undo (cvs-get-marked))) - (cvs-use-temp-buffer) - (mapcar 'cvs-insert-full-path tins-to-undo) - (cond - ((and tins-to-undo (yes-or-no-p (format "Undo changes to %d files? " - (length tins-to-undo)))) - (let (files-to-update) - (while tins-to-undo - (let* ((tin (car tins-to-undo)) - (fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond - ((or - (eq type 'UPDATED) - (eq type 'PATCHED) - (eq type 'MODIFIED) - (eq type 'MERGED) - (eq type 'CONFLICT) - (eq type 'CVS-REMOVED) - (eq type 'REM-CONFLICT) - (eq type 'MOVE-AWAY) - (eq type 'REMOVED)) - (if (not (eq type 'REMOVED)) - (delete-file (cvs-full-path tin))) - (setq files-to-update (cons tin files-to-update)) - (cvs-set-fileinfo->type fileinfo 'UPDATED) - (cvs-set-fileinfo->handled fileinfo t) - (tin-invalidate cvs-cookie-handle tin)) - - ((eq type 'MOD-CONFLICT) - (error "Use cvs-mode-add instead on %s." - (cvs-fileinfo->file-name fileinfo))) - - ((eq type 'REM-CONFLICT) - (error "Can't deal with a file you have removed and recreated.")) - - ((eq type 'DIRCHANGE) - (error "Undo on directories not supported (yet).")) - - ((eq type 'ADDED) - (error "There is no old revision to get for %s" - (cvs-fileinfo->file-name fileinfo))) - (t (error "cvs-mode-undo-local-changes: can't handle an %s" - type))) - - (setq tins-to-undo (cdr tins-to-undo)))) - (cvs-use-temp-buffer) - (message "Re-getting files from repository...") - (if (cvs-execute-list files-to-update cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "update") - '("update")) - "Re-getting %s from repository...") - (error "CVS exited with non-zero exit status.") - (message "Re-getting files from repository... Done."))))))) - -;;---------- -(defun cvs-mode-acknowledge () - "Remove all marked files from the buffer." - - (interactive) - (mapcar (function (lambda (tin) - (tin-delete cvs-cookie-handle tin))) - (cvs-get-marked))) - -;;---------- -(defun cvs-mode-unmark-up (pos) - "Unmark the file on the previous line. -Takes one argument POS, a buffer position." - - (interactive "d") - (let ((tin (tin-goto-previous cvs-cookie-handle pos 1))) - (cond - (tin - (cvs-set-fileinfo->marked (tin-cookie cvs-cookie-handle tin) - nil) - (tin-invalidate cvs-cookie-handle tin))))) - -;;---------- -(defun cvs-mode-previous-line (arg) - "Go to the previous line. -If a prefix argument is given, move by that many lines." - - (interactive "p") - (tin-goto-previous cvs-cookie-handle (point) arg)) - -;;---------- -(defun cvs-mode-next-line (arg) - "Go to the next line. -If a prefix argument is given, move by that many lines." - - (interactive "p") - (tin-goto-next cvs-cookie-handle (point) arg)) - -;;---------- -(defun cvs-add-file-update-buffer (tin) - "Sub-function to cvs-mode-add. Internal use only. Update the display. Return -non-nil if `cvs add' should be called on this file. -Args: TIN. - -Returns 'DIR, 'ADD, 'ADD-DIR, or 'RESURRECT." - - (let ((fileinfo (tin-cookie cvs-cookie-handle tin))) - (cond - ((eq (cvs-fileinfo->type fileinfo) 'UNKNOWN-DIR) - (cvs-set-fileinfo->full-log fileinfo "new directory added with cvs-mode-add") - 'ADD-DIR) - ((eq (cvs-fileinfo->type fileinfo) 'UNKNOWN) - (cvs-set-fileinfo->type fileinfo 'ADDED) - (cvs-set-fileinfo->full-log fileinfo "new file added with cvs-mode-add") - (tin-invalidate cvs-cookie-handle tin) - 'ADD) - ((eq (cvs-fileinfo->type fileinfo) 'REMOVED) - (cvs-set-fileinfo->type fileinfo 'UPDATED) - (cvs-set-fileinfo->full-log fileinfo "file resurrected with cvs-mode-add") - (cvs-set-fileinfo->handled fileinfo t) - (tin-invalidate cvs-cookie-handle tin) - 'RESURRECT)))) - -;;---------- -(defun cvs-add-sub (cvs-buf candidates) - "Internal use only. -Args: CVS-BUF CANDIDATES. - -CANDIDATES is a list of tins. Updates the CVS-BUF and returns a list of lists. -The first list is unknown tins that shall be `cvs add -m msg'ed. -The second list is unknown directory tins that shall be `cvs add -m msg'ed. -The third list is removed files that shall be `cvs add'ed (resurrected)." - - (let (add add-dir resurrect) - (while candidates - (let ((type (cvs-add-file-update-buffer (car candidates)))) - (cond ((eq type 'ADD) - (setq add (cons (car candidates) add))) - ((eq type 'ADD-DIR) - (setq add-dir (cons (car candidates) add-dir))) - ((eq type 'RESURRECT) - (setq resurrect (cons (car candidates) resurrect))))) - (setq candidates (cdr candidates))) - (list add add-dir resurrect))) - -;;---------- -(defun cvs-mode-add () - "Add marked files to the cvs repository." - - (interactive) - (let* ((buf (current-buffer)) - (marked (cvs-get-marked)) - (result (cvs-add-sub buf marked)) - (added (car result)) - (newdirs (car (cdr result))) - (resurrect (car (cdr (cdr result)))) - (msg (if (or added newdirs) - (read-from-minibuffer "Enter description: ")))) - - (if (or resurrect (or added newdirs)) - (cvs-use-temp-buffer)) - - (cond (resurrect - (message "Resurrecting files from repository...") - (if (cvs-execute-list resurrect - cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "add") - '("add")) - "Resurrecting %s from repository...") - (error "CVS exited with non-zero exit status.") - (message "Resurrecting files from repository... Done.")))) - - (cond (added - (message "Adding new files to repository...") - (if (cvs-execute-list added - cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "add" "-m" msg) - (list "add" "-m" msg)) - "Adding %s to repository...") - (error "CVS exited with non-zero exit status.") - (message "Adding new files to repository... Done.")))) - - (cond (newdirs - (message "Adding new directories to repository...") - (if (cvs-execute-list newdirs - cvs-program - (if cvs-cvsroot - (list "-d" cvs-cvsroot "add" "-m" msg) - (list "add" "-m" msg)) - "Adding %s to repository...") - (error "CVS exited with non-zero exit status.") - (while newdirs - (let* ((tin (car newdirs)) - (fileinfo (tin-cookie cvs-cookie-handle tin)) - (newdir (cvs-fileinfo->file-name fileinfo))) - (cvs-set-fileinfo->dir fileinfo - (concat (cvs-fileinfo->dir fileinfo) - "/" - newdir)) - (cvs-set-fileinfo->type fileinfo 'DIRCHANGE) - (cvs-set-fileinfo->file-name fileinfo ".") - (tin-invalidate cvs-cookie-handle tin) - (setq newdirs (cdr newdirs)))) - ;; FIXME: this should really run cvs-update-no-prompt on the - ;; subdir and insert everthing in the current list. - (message "You must re-update to visit the new directories.")))))) - -;;---------- -(defun cvs-mode-ignore () - "Arrange so that CVS ignores the selected files and directories. -This command ignores files/dirs that are flagged as `Unknown'." - - (interactive) - (mapcar (function (lambda (tin) - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond ((or (eq type 'UNKNOWN) - (eq type 'UNKNOWN-DIR)) - (cvs-append-to-ignore fileinfo) - (tin-delete cvs-cookie-handle tin)))))) - (cvs-get-marked))) - -;;---------- -(defun cvs-append-to-ignore (fileinfo) - "Append the file in fileinfo to the .cvsignore file" - - (save-window-excursion - (set-buffer (find-file-noselect (concat (file-name-as-directory - (cvs-fileinfo->dir fileinfo)) - ".cvsignore"))) - (goto-char (point-max)) - (if (not (zerop (current-column))) - (insert "\n")) - (insert (cvs-fileinfo->file-name fileinfo) "\n") - (if cvs-sort-ignore-file - (sort-lines nil (point-min) (point-max))) - (save-buffer))) - -;;---------- -(defun cvs-mode-status () - "Show cvs status for all marked files." - - (interactive) - (save-some-buffers) - (if (not (listp cvs-status-flags)) - (error "cvs-status-flags should be set using cvs-set-status-flags.")) - (let ((marked (cvs-get-marked nil t))) - (cvs-use-temp-buffer) - (message "Running cvs status ...") - (if (cvs-execute-list marked - cvs-program - (append (if cvs-cvsroot (list "-d" cvs-cvsroot)) - (list "-Q" "status") - cvs-status-flags) - "Running cvs -Q status %s...") - (error "CVS exited with non-zero exit status.") - (message "Running cvs -Q status ... Done.")))) - -;;---------- -(defun cvs-mode-log () - "Display the cvs log of all selected files." - - (interactive) - (if (not (listp cvs-log-flags)) - (error "cvs-log-flags should be set using cvs-set-log-flags.")) - (let ((marked (cvs-get-marked nil t))) - (cvs-use-temp-buffer) - (message "Running cvs log ...") - (if (cvs-execute-list marked - cvs-program - (append (if cvs-cvsroot (list "-d" cvs-cvsroot)) - (list "log") - cvs-log-flags) - "Running cvs log %s...") - (error "CVS exited with non-zero exit status.") - (message "Running cvs log ... Done.")))) - -;;---------- -(defun cvs-mode-tag () - "Run 'cvs tag' on all selected files." - - (interactive) - (if (not (listp cvs-tag-flags)) - (error "cvs-tag-flags should be set using cvs-set-tag-flags.")) - (let ((marked (cvs-get-marked nil t)) - (tag-args (cvs-make-list (read-string "Tag name (and flags): ")))) - (cvs-use-temp-buffer) - (message "Running cvs tag ...") - (if (cvs-execute-list marked - cvs-program - (append (if cvs-cvsroot (list "-d" cvs-cvsroot)) - (list "tag") - cvs-tag-flags - tag-args) - "Running cvs tag %s...") - (error "CVS exited with non-zero exit status.") - (message "Running cvs tag ... Done.")))) - -;;---------- -(defun cvs-mode-rtag () - "Run 'cvs rtag' on all selected files." - - (interactive) - (if (not (listp cvs-rtag-flags)) - (error "cvs-rtag-flags should be set using cvs-set-rtag-flags.")) - (let ((marked (cvs-get-marked nil t)) - ;; FIXME: should give selection from the modules file - (module-name (read-string "Module name: ")) - ;; FIXME: should also ask for an existing tag *or* date - (rtag-args (cvs-make-list (read-string "Tag name (and flags): ")))) - (cvs-use-temp-buffer) - (message "Running cvs rtag ...") - (if (cvs-execute-list marked - cvs-program - (append (if cvs-cvsroot (list "-d" cvs-cvsroot)) - (list "rtag") - cvs-rtag-flags - rtag-args - (list module-name)) - "Running cvs rtag %s...") - (error "CVS rtag exited with non-zero exit status.") - (message "Running cvs rtag ... Done.")))) - -;;---------- -(defun cvs-mode-byte-compile-files () - "Run byte-compile-file on all selected files that end in '.el'." - - (interactive) - (let ((marked (cvs-get-marked))) - (while marked - (let ((filename (cvs-full-path (car marked)))) - (if (string-match "\\.el$" filename) - (byte-compile-file filename))) - (setq marked (cdr marked))))) - -;;---------- -(defun cvs-insert-full-path (tin) - "Insert full path to the file described in TIN in the current buffer." - - (insert (format "%s\n" (cvs-full-path tin)))) - -;;---------- -(defun cvs-mode-add-change-log-entry-other-window (pos) - "Add a ChangeLog entry in the ChangeLog of the current directory. -Args: POS." - - (interactive "d") - (let* ((cvs-buf (current-buffer)) - (odir default-directory) - (obfname buffer-file-name) - (tin (tin-locate cvs-cookie-handle pos)) - (fileinfo (tin-cookie cvs-cookie-handle tin)) - (fname (cvs-fileinfo->file-name fileinfo)) - (dname (file-name-as-directory (cvs-fileinfo->dir fileinfo)))) - (setq change-log-default-name nil) ; this rarely correct in 19.28 - (setq buffer-file-name (cond (fname - fname) - (t - nil))) - (setq default-directory (cond (dname - dname) - (t - odir))) - (add-change-log-entry-other-window) - (set-buffer cvs-buf) - (setq default-directory odir) - (setq buffer-file-name obfname))) - -;;---------- -(defun print-cvs-tin (foo) - "Debug utility." - - (let ((cookie (tin-cookie cvs-cookie-handle foo)) - (stream (get-buffer-create "pcl-cvs-debug"))) - (princ "==============\n" stream) - (princ (cvs-fileinfo->file-name cookie) stream) - (princ "\n" stream) - (princ (cvs-fileinfo->dir cookie) stream) - (princ "\n" stream) - (princ (cvs-fileinfo->full-log cookie) stream) - (princ "\n" stream) - (princ (cvs-fileinfo->marked cookie) stream) - (princ "\n" stream))) - -;;---------- -;; NOTE: the variable cvs-emerge-tmp-head-file will be "free" when compiling -(defun cvs-mode-emerge (pos) - "Emerge appropriate revisions of the selected file. -Args: POS." - - (interactive "d") - (let* ((cvs-buf (current-buffer)) - (tin (tin-locate cvs-cookie-handle pos))) - (if (boundp 'cvs-emerge-tmp-head-file) - (error "There can only be one emerge session active at a time.")) - (if tin - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond - ((eq type 'MODIFIED) ; merge repository head rev. with working file - (require 'emerge) - (setq cvs-emerge-tmp-head-file ; trick to prevent multiple runs - (cvs-retrieve-revision-to-tmpfile fileinfo)) - (unwind-protect - (if (not (emerge-files - t ; arg - (cvs-fileinfo->full-path fileinfo) ; file-A - ;; this is an un-avoidable compiler reference to a free variable - cvs-emerge-tmp-head-file ; file-B - (cvs-fileinfo->full-path fileinfo) ; file-out - nil ; start-hooks - '(lambda () ; quit-hooks - (delete-file cvs-emerge-tmp-head-file) - (makunbound 'cvs-emerge-tmp-head-file)))) - (error "Emerge session failed")))) - - ;; re-do the same merge rcsmerge supposedly just did.... - ((or (eq type 'MERGED) - (eq type 'CONFLICT)) ; merge backup-working=A, head=B, base=ancestor - (require 'emerge) - (setq cvs-emerge-tmp-head-file ; trick to prevent multiple runs - (cvs-retrieve-revision-to-tmpfile fileinfo - (cvs-fileinfo->head-revision - fileinfo))) - (let ((cvs-emerge-tmp-backup-working-file - (cvs-fileinfo->backup-file fileinfo)) - (cvs-emerge-tmp-ancestor-file - (cvs-retrieve-revision-to-tmpfile fileinfo - (cvs-fileinfo->base-revision - fileinfo)))) - (unwind-protect - (if (not (emerge-files-with-ancestor - t ; arg - cvs-emerge-tmp-backup-working-file ; file-A - ;; this is an un-avoidable compiler reference to a free variable - cvs-emerge-tmp-head-file ; file-B - cvs-emerge-tmp-ancestor-file ; file-ancestor - (cvs-fileinfo->full-path fileinfo) ; file-out - nil ; start-hooks - '(lambda () ; quit-hooks - (delete-file cvs-emerge-tmp-backup-file) - (delete-file cvs-emerge-tmp-ancestor-file) - (delete-file cvs-emerge-tmp-head-file) - (makunbound 'cvs-emerge-tmp-head-file)))) - (error "Emerge session failed"))))) - (t - (error "Can only e-merge \"Modified\", \"Merged\" or \"Conflict\" files")))) - (error "There is no file to e-merge.")))) - -;;---------- -;; NOTE: the variable ediff-version may be "free" when compiling -(defun cvs-mode-ediff (pos) - "Ediff appropriate revisions of the selected file. -Args: POS." - - (interactive "d") - (if (boundp 'cvs-ediff-tmp-head-file) - (error "There can only be one ediff session active at a time.")) - (require 'ediff) - (if (and (boundp 'ediff-version) - (>= (string-to-number ediff-version) 2.0)) ; FIXME real number? - (run-ediff-from-cvs-buffer pos) - (cvs-old-ediff-interface pos))) - -(defun cvs-old-ediff-interface (pos) - "Emerge like interface for older ediffs. -Args: POS" - - (let* ((cvs-buf (current-buffer)) - (tin (tin-locate cvs-cookie-handle pos))) - (if tin - (let* ((fileinfo (tin-cookie cvs-cookie-handle tin)) - (type (cvs-fileinfo->type fileinfo))) - (cond - ((eq type 'MODIFIED) ; diff repository head rev. with working file - ;; should this be inside the unwind-protect, and should the - ;; makeunbound be an unwindform? - (setq cvs-ediff-tmp-head-file ; trick to prevent multiple runs - (cvs-retrieve-revision-to-tmpfile fileinfo)) - (unwind-protect - (if (not (ediff-files ; check correct ordering of args - (cvs-fileinfo->full-path fileinfo) ; file-A - ;; this is an un-avoidable compiler reference to a free variable - cvs-ediff-tmp-head-file ; file-B - '(lambda () ; startup-hooks - (make-local-hook 'ediff-cleanup-hooks) - (add-hook 'ediff-cleanup-hooks - '(lambda () - (ediff-janitor) - (delete-file cvs-ediff-tmp-head-file) - (makunbound 'cvs-ediff-tmp-head-file)) - nil t)))) - (error "Ediff session failed")))) - - ;; look at the merge rcsmerge supposedly just did.... - ((or (eq type 'MERGED) - (eq type 'CONFLICT)) ; diff backup-working=A, head=B, base=ancestor - (if (not (boundp 'ediff-version)) - (error "ediff version way too old for 3-way diff")) - (if (<= (string-to-number ediff-version) 1.9) ; FIXME real number? - (error "ediff version %s too old for 3-way diff" ediff-version)) - (setq cvs-ediff-tmp-head-file ; trick to prevent multiple runs - (cvs-retrieve-revision-to-tmpfile fileinfo - (cvs-fileinfo->head-revision - fileinfo))) - (let ((cvs-ediff-tmp-backup-working-file - (cvs-fileinfo->backup-file fileinfo)) - (cvs-ediff-tmp-ancestor-file - (cvs-retrieve-revision-to-tmpfile fileinfo - (cvs-fileinfo->base-revision - fileinfo)))) - (unwind-protect - (if (not (ediff-files3 ; check correct ordering of args - cvs-ediff-tmp-backup-working-file ; file-A - ;; this is an un-avoidable compiler reference to a free variable - cvs-ediff-tmp-head-file ; file-B - cvs-ediff-tmp-ancestor-file ; file-ancestor - '(lambda () ; start-hooks - (make-local-hook 'ediff-cleanup-hooks) - (add-hook 'ediff-cleanup-hooks - '(lambda () - (ediff-janitor) - (delete-file cvs-ediff-tmp-backup-file) - (delete-file cvs-ediff-tmp-ancestor-file) - (delete-file cvs-ediff-tmp-head-file) - (makunbound 'cvs-ediff-tmp-head-file)) - nil t)))) - (error "Ediff session failed"))))) - - ((not (or (eq type 'UNKNOWN) - (eq type 'UNKNOWN-DIR))) ; i.e. UPDATED or PATCHED ???? - ;; this should really diff the current working file with the previous - ;; rev. on the current branch (i.e. not the head, since that's what - ;; the current file should be) - (setq cvs-ediff-tmp-head-file ; trick to prevent multiple runs - (cvs-retrieve-revision-to-tmpfile fileinfo - (read-string "Rev #/tag to diff against: " - (cvs-fileinfo->head-revision - fileinfo)))) - (unwind-protect - (if (not (ediff-files ; check correct ordering of args - (cvs-fileinfo->full-path fileinfo) ; file-A - ;; this is an un-avoidable compiler reference to a free variable - cvs-ediff-tmp-head-file ; file-B - '(lambda () ; startup-hooks - (make-local-hook 'ediff-cleanup-hooks) - (add-hook 'ediff-cleanup-hooks - '(lambda () - (ediff-janitor) - (delete-file cvs-ediff-tmp-head-file) - (makunbound 'cvs-ediff-tmp-head-file)) - nil t)))) - (error "Ediff session failed")))) - (t - (error "Can not ediff \"Unknown\" files")))) - (error "There is no file to ediff.")))) - -;;---------- -(defun cvs-retrieve-revision-to-tmpfile (fileinfo &optional revision) - "Retrieve the latest revision of the file in FILEINFO to a temporary file. -If second optional argument REVISION is given, retrieve that revision instead." - - (let - ((temp-name (make-temp-name - (concat (file-name-as-directory - (or (getenv "TMPDIR") "/tmp")) - "pcl-cvs." revision)))) - (cvs-kill-buffer-visiting temp-name) - (if (and revision - (stringp revision) - (not (string= revision ""))) - (message "Retrieving revision %s..." revision) - (message "Retrieving latest revision...")) - (let ((res (call-process cvs-shell nil nil nil "-c" - (concat cvs-program " update -p " - (if (and revision - (stringp revision) - (not (string= revision ""))) - (concat "-r " revision " ") - "") - (cvs-fileinfo->full-path fileinfo) - " > " temp-name)))) - (if (and res (not (and (integerp res) (zerop res)))) - (error "Something went wrong retrieving revision %s: %s" - revision res)) - - (if revision - (message "Retrieving revision %s... Done." revision) - (message "Retrieving latest revision... Done.")) - (save-excursion - (set-buffer (find-file-noselect temp-name)) - (rename-buffer (concat " " (file-name-nondirectory temp-name)) t)) - temp-name))) - -;;---------- -(defun cvs-kill-buffer-visiting (filename) - "If there is any buffer visiting FILENAME, kill it (without confirmation)." - - (let ((l (buffer-list))) - (while l - (if (string= (buffer-file-name (car l)) filename) - (kill-buffer (car l))) - (setq l (cdr l))))) - -;;---------- -(defun cvs-change-cvsroot () - "Ask for a new cvsroot." - - (interactive) - (cvs-set-cvsroot (read-file-name "New CVSROOT: " cvs-cvsroot))) - -;;---------- -(defun cvs-set-cvsroot (newroot) - "Change the cvsroot." - - (if (or (file-directory-p (expand-file-name "CVSROOT" newroot)) - (y-or-n-p (concat "Warning: no CVSROOT found inside repository." - " Change cvs-cvsroot anyhow?"))) - (setq cvs-cvsroot newroot))) - -;;---------- -(defun cvs-set-diff-flags () - "Ask for new setting of cvs-diff-flags." - - (interactive) - (let ((old-value (mapconcat 'identity - (copy-sequence cvs-diff-flags) " "))) - (setq cvs-diff-flags - (cvs-make-list (read-string "Diff flags: " old-value))))) - -;;---------- -(defun cvs-set-update-optional-flags () - "Ask for new setting of cvs-update-optional-flags." - - (interactive) - (let ((old-value (mapconcat 'identity - (copy-sequence cvs-update-optional-flags) " "))) - (setq cvs-update-optional-flags - (cvs-make-list (read-string "Update optional flags: " old-value))))) - -;;---------- -(defun cvs-set-status-flags () - "Ask for new setting of cvs-status-flags." - - (interactive) - (let ((old-value (mapconcat 'identity - (copy-sequence cvs-status-flags) " "))) - (setq cvs-status-flags - (cvs-make-list (read-string "Status flags: " old-value))))) - -;;---------- -(defun cvs-set-log-flags () - "Ask for new setting of cvs-log-flags." - - (interactive) - (let ((old-value (mapconcat 'identity - (copy-sequence cvs-log-flags) " "))) - (setq cvs-log-flags - (cvs-make-list (read-string "Log flags: " old-value))))) - -;;---------- -(defun cvs-set-tag-flags () - "Ask for new setting of cvs-tag-flags." - - (interactive) - (let ((old-value (mapconcat 'identity - (copy-sequence cvs-tag-flags) " "))) - (setq cvs-tag-flags - (cvs-make-list (read-string "Tag flags: " old-value))))) - -;;---------- -(defun cvs-set-rtag-flags () - "Ask for new setting of cvs-rtag-flags." - - (interactive) - (let ((old-value (mapconcat 'identity - (copy-sequence cvs-rtag-flags) " "))) - (setq cvs-rtag-flags - (cvs-make-list (read-string "Rtag flags: " old-value))))) - -;;---------- -(if (string-match "Lucid" emacs-version) - (progn - (autoload 'pcl-cvs-fontify "pcl-cvs-lucid") - (add-hook 'cvs-mode-hook 'pcl-cvs-fontify))) - -(defun cvs-changelog-name (directory) - "Return the name of the ChangeLog file that handles DIRECTORY. -This is in DIRECTORY or one of its parents. -Signal an error if we can't find an appropriate ChangeLog file." - (let ((dir (file-name-as-directory directory)) - file) - (while (and dir - (not (file-exists-p - (setq file (expand-file-name "ChangeLog" dir))))) - (let ((last dir)) - (setq dir (file-name-directory (directory-file-name dir))) - (if (equal last dir) - (setq dir nil)))) - (or dir - (error "Can't find ChangeLog for %s" directory)) - file)) - -(defun cvs-narrow-changelog () - "Narrow to the top page of the current buffer, a ChangeLog file. -Actually, the narrowed region doesn't include the date line. -A \"page\" in a ChangeLog file is the area between two dates." - (or (eq major-mode 'change-log-mode) - (error "cvs-narrow-changelog: current buffer isn't a ChangeLog")) - - (goto-char (point-min)) - - ;; Skip date line and subsequent blank lines. - (forward-line 1) - (if (looking-at "[ \t\n]*\n") - (goto-char (match-end 0))) - - (let ((start (point))) - (forward-page 1) - (narrow-to-region start (point)) - (goto-char (point-min)))) - -(defun cvs-changelog-paragraph () - "Return the bounds of the ChangeLog paragraph containing point. -If we are between paragraphs, return the previous paragraph." - (save-excursion - (beginning-of-line) - (if (looking-at "^[ \t]*$") - (skip-chars-backward " \t\n" (point-min))) - (list (progn - (if (re-search-backward "^[ \t]*\n" nil 'or-to-limit) - (goto-char (match-end 0))) - (point)) - (if (re-search-forward "^[ \t\n]*$" nil t) - (match-beginning 0) - (point))))) - -(defun cvs-changelog-subparagraph () - "Return the bounds of the ChangeLog subparagraph containing point. -A subparagraph is a block of non-blank lines beginning with an asterisk. -If we are between sub-paragraphs, return the previous subparagraph." - (save-excursion - (end-of-line) - (if (search-backward "*" nil t) - (list (progn (beginning-of-line) (point)) - (progn - (forward-line 1) - (if (re-search-forward "^[ \t]*[\n*]" nil t) - (match-beginning 0) - (point-max)))) - (list (point) (point))))) - -(defun cvs-changelog-entry () - "Return the bounds of the ChangeLog entry containing point. -The variable `cvs-changelog-full-paragraphs' decides whether an -\"entry\" is a paragraph or a subparagraph; see its documentation string -for more details." - (if cvs-changelog-full-paragraphs - (cvs-changelog-paragraph) - (cvs-changelog-subparagraph))) - -;; NOTE: the variable user-full-name may be "free" when compiling -(defun cvs-changelog-ours-p () - "See if ChangeLog entry at point is for the current user, today. -Return non-nil iff it is." - ;; Code adapted from add-change-log-entry. - (looking-at (concat (regexp-quote (substring (current-time-string) - 0 10)) - ".* " - (regexp-quote (substring (current-time-string) -4)) - "[ \t]+" - (regexp-quote (if (and (boundp 'add-log-full-name) - add-log-full-name) - add-log-full-name - user-full-name)) - " <" - (regexp-quote (if (and (boundp 'add-log-mailing-address) - add-log-mailing-address) - add-log-mailing-address - user-mail-address))))) - -(defun cvs-relative-path (base child) - "Return a directory path relative to BASE for CHILD. -If CHILD doesn't seem to be in a subdirectory of BASE, just return -the full path to CHILD." - (let ((base (file-name-as-directory (expand-file-name base))) - (child (expand-file-name child))) - (or (string= base (substring child 0 (length base))) - (error "cvs-relative-path: %s isn't in %s" child base)) - (substring child (length base)))) - -(defun cvs-changelog-entries (file) - "Return the ChangeLog entries for FILE, and the ChangeLog they came from. -The return value looks like this: - (LOGBUFFER (ENTRYSTART . ENTRYEND) ...) -where LOGBUFFER is the name of the ChangeLog buffer, and each -\(ENTRYSTART . ENTRYEND\) pair is a buffer region." - (save-excursion - (set-buffer (find-file-noselect - (cvs-changelog-name - (file-name-directory - (expand-file-name file))))) - (or (eq major-mode 'change-log-mode) - (change-log-mode)) - (goto-char (point-min)) - (if (looking-at "[ \t\n]*\n") - (goto-char (match-end 0))) - (if (not (cvs-changelog-ours-p)) - (list (current-buffer)) - (save-restriction - (cvs-narrow-changelog) - (goto-char (point-min)) - - ;; Search for the name of FILE relative to the ChangeLog. If that - ;; doesn't occur anywhere, they're not using full relative - ;; filenames in the ChangeLog, so just look for FILE; we'll accept - ;; some false positives. - (let ((pattern (cvs-relative-path - (file-name-directory buffer-file-name) file))) - (if (or (string= pattern "") - (not (save-excursion - (search-forward pattern nil t)))) - (setq pattern file)) - - (let (texts) - (while (search-forward pattern nil t) - (let ((entry (cvs-changelog-entry))) - (setq texts (cons entry texts)) - (goto-char (elt entry 1)))) - - (cons (current-buffer) texts))))))) - -(defun cvs-changelog-insert-entries (buffer regions) - "Insert those regions in BUFFER specified in REGIONS. -Sort REGIONS front-to-back first." - (let ((regions (sort regions 'car-less-than-car)) - (last)) - (while regions - (if (and last (< last (car (car regions)))) - (newline)) - (setq last (elt (car regions) 1)) - (apply 'insert-buffer-substring buffer (car regions)) - (setq regions (cdr regions))))) - -(defun cvs-union (set1 set2) - "Return the union of SET1 and SET2, according to `equal'." - (while set2 - (or (member (car set2) set1) - (setq set1 (cons (car set2) set1))) - (setq set2 (cdr set2))) - set1) - -(defun cvs-insert-changelog-entries (files) - "Given a list of files FILES, insert the ChangeLog entries for them." - (let ((buffer-entries nil)) - - ;; Add each buffer to buffer-entries, and associate it with the list - ;; of entries we want from that file. - (while files - (let* ((entries (cvs-changelog-entries (car files))) - (pair (assq (car entries) buffer-entries))) - (if pair - (setcdr pair (cvs-union (cdr pair) (cdr entries))) - (setq buffer-entries (cons entries buffer-entries)))) - (setq files (cdr files))) - - ;; Now map over each buffer in buffer-entries, sort the entries for - ;; each buffer, and extract them as strings. - (while buffer-entries - (cvs-changelog-insert-entries (car (car buffer-entries)) - (cdr (car buffer-entries))) - (if (and (cdr buffer-entries) (cdr (car buffer-entries))) - (newline)) - (setq buffer-entries (cdr buffer-entries))))) - -(defun cvs-edit-delete-common-indentation () - "Unindent the current buffer rigidly until at least one line is flush left." - (save-excursion - (let ((common 100000)) - (goto-char (point-min)) - (while (< (point) (point-max)) - (if (not (looking-at "^[ \t]*$")) - (setq common (min common (current-indentation)))) - (forward-line 1)) - (indent-rigidly (point-min) (point-max) (- common))))) - -(defun cvs-mode-changelog-commit () - "Check in all marked files, or the current file. -Ask the user for a log message in a buffer. - -This is just like `\\[cvs-mode-commit]', except that it tries to provide -appropriate default log messages by looking at the ChangeLog. The -idea is to write your ChangeLog entries first, and then use this -command to commit your changes. - -To select default log text, we: -- find the ChangeLog entries for the files to be checked in, -- verify that the top entry in the ChangeLog is on the current date - and by the current user; if not, we don't provide any default text, -- search the ChangeLog entry for paragraphs containing the names of - the files we're checking in, and finally -- use those paragraphs as the log text." - - (interactive) - - (let* ((cvs-buf (current-buffer)) - (marked (cvs-filter (function cvs-committable) - (cvs-get-marked)))) - (if (null marked) - (error "Nothing to commit!") - (pop-to-buffer (get-buffer-create cvs-commit-prompt-buffer)) - (goto-char (point-min)) - - (erase-buffer) - (cvs-insert-changelog-entries - (mapcar (lambda (tin) - (let ((cookie (tin-cookie cvs-cookie-handle tin))) - (expand-file-name - (cvs-fileinfo->file-name cookie) - (cvs-fileinfo->dir cookie)))) - marked)) - (cvs-edit-delete-common-indentation) - - (cvs-edit-mode) - (make-local-variable 'cvs-commit-list) - (setq cvs-commit-list marked) - (message "Press C-c C-c when you are done editing.")))) - -;;;; end of file pcl-cvs.el diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.elc b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.elc deleted file mode 100644 index 3bd76385a39..00000000000 Binary files a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.elc and /dev/null differ diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info deleted file mode 100644 index bbf572fda5f..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info +++ /dev/null @@ -1,66 +0,0 @@ -This is Info file pcl-cvs.info, produced by Makeinfo-1.55 from the -input file ./pcl-cvs.texinfo. - - Copyright (C) 1992 Per Cederqvist - - Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided also -that the section entitled "GNU General Public License" is included -exactly as in the original, and provided that the entire resulting -derived work is distributed under the terms of a permission notice -identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that the section entitled "GNU General Public -License" and this permission notice may be included in translations -approved by the Free Software Foundation instead of in the original -English. - - -Indirect: -pcl-cvs.info-1: 1013 -pcl-cvs.info-2: 50562 - -Tag Table: -(Indirect) -Node: Top1013 -Node: Copying3575 -Node: Installation22813 -Node: Pcl-cvs installation23608 -Node: On-line manual installation25673 -Node: Typeset manual installation26696 -Node: About pcl-cvs27439 -Node: Contributors27813 -Node: Archives29121 -Node: Getting started29705 -Node: Buffer contents32146 -Node: File status32700 -Node: Selected files35730 -Node: Commands36403 -Node: Updating the directory37619 -Node: Movement commands39282 -Node: Marking files39873 -Node: Committing changes40735 -Node: Editing files42206 -Node: Getting info about files43056 -Node: Adding and removing files43541 -Node: Undoing changes44897 -Node: Removing handled entries45362 -Node: Ignoring files46285 -Node: Viewing differences46820 -Node: Emerge48134 -Node: Reverting your buffers49113 -Node: Miscellaneous commands49815 -Node: Customization50562 -Node: Future enhancements54248 -Node: Bugs58449 -Node: Function and Variable Index60235 -Node: Concept Index63033 -Node: Key Index69634 - -End Tag Table diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info-1 b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info-1 deleted file mode 100644 index 300b1a6459f..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info-1 +++ /dev/null @@ -1,1195 +0,0 @@ -This is Info file pcl-cvs.info, produced by Makeinfo-1.55 from the -input file ./pcl-cvs.texinfo. - - Copyright (C) 1992 Per Cederqvist - - Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided also -that the section entitled "GNU General Public License" is included -exactly as in the original, and provided that the entire resulting -derived work is distributed under the terms of a permission notice -identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that the section entitled "GNU General Public -License" and this permission notice may be included in translations -approved by the Free Software Foundation instead of in the original -English. - - -File: pcl-cvs.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) - - This info manual describes pcl-cvs which is a GNU Emacs front-end -to CVS. It works with CVS version 1.3. This manual is updated to -release 1.05 of pcl-cvs. - -* Menu: - -* Copying:: GNU General Public License -* Installation:: How to install pcl-cvs on your system. -* About pcl-cvs:: Authors and ftp sites. - -* Getting started:: An introduction with a walk-through example. -* Buffer contents:: An explanation of the buffer contents. -* Commands:: All commands, grouped by type. - -* Customization:: How you can tailor pcl-cvs to suit your needs. -* Future enhancements:: Future enhancements of pcl-cvs. -* Bugs:: Bugs (known and unknown). -* Function and Variable Index:: List of functions and variables. -* Concept Index:: List of concepts. -* Key Index:: List of keystrokes. - - -- The Detailed Node Listing -- - -Installation - -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. - -About pcl-cvs - -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? - -Buffer contents - -* File status:: The meaning of the second field. -* Selected files:: How selection works. - -Commands - -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to `diff' different versions. -* Emerge:: -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands - - -File: pcl-cvs.info, Node: Copying, Next: Installation, Prev: Top, Up: Top - -GNU GENERAL PUBLIC LICENSE -************************** - - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -Preamble -======== - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if -you distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, -and (2) offer you this license which gives you legal permission to -copy, distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make -certain that everyone understands that there is no warranty for this -free software. If the software is modified by someone else and -passed on, we want its recipients to know that what they have is not -the original, so that any problems introduced by others will not -reflect on the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at -all. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 1. This License applies to any program or other work which contains - a notice placed by the copyright holder saying it may be - distributed under the terms of this General Public License. The - "Program", below, refers to any such program or work, and a - "work based on the Program" means either the Program or any - derivative work under copyright law: that is to say, a work - containing the Program or a portion of it, either verbatim or - with modifications and/or translated into another language. - (Hereinafter, translation is included without limitation in the - term "modification".) Each licensee is addressed as "you". - - Activities other than copying, distribution and modification are - not covered by this License; they are outside its scope. The - act of running the Program is not restricted, and the output - from the Program is covered only if its contents constitute a - work based on the Program (independent of having been made by - running the Program). Whether that is true depends on what the - Program does. - - 2. You may copy and distribute verbatim copies of the Program's - source code as you receive it, in any medium, provided that you - conspicuously and appropriately publish on each copy an - appropriate copyright notice and disclaimer of warranty; keep - intact all the notices that refer to this License and to the - absence of any warranty; and give any other recipients of the - Program a copy of this License along with the Program. - - You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - - 3. You may modify your copy or copies of the Program or any portion - of it, thus forming a work based on the Program, and copy and - distribute such modifications or work under the terms of Section - 1 above, provided that you also meet all of these conditions: - - a. You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any - change. - - b. You must cause any work that you distribute or publish, - that in whole or in part contains or is derived from the - Program or any part thereof, to be licensed as a whole at - no charge to all third parties under the terms of this - License. - - c. If the modified program normally reads commands - interactively when run, you must cause it, when started - running for such interactive use in the most ordinary way, - to print or display an announcement including an - appropriate copyright notice and a notice that there is no - warranty (or else, saying that you provide a warranty) and - that users may redistribute the program under these - conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive - but does not normally print such an announcement, your work - based on the Program is not required to print an - announcement.) - - These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the - Program, and can be reasonably considered independent and - separate works in themselves, then this License, and its terms, - do not apply to those sections when you distribute them as - separate works. But when you distribute the same sections as - part of a whole which is a work based on the Program, the - distribution of the whole must be on the terms of this License, - whose permissions for other licensees extend to the entire - whole, and thus to each and every part regardless of who wrote - it. - - Thus, it is not the intent of this section to claim rights or - contest your rights to work written entirely by you; rather, the - intent is to exercise the right to control the distribution of - derivative or collective works based on the Program. - - In addition, mere aggregation of another work not based on the - Program with the Program (or with a work based on the Program) - on a volume of a storage or distribution medium does not bring - the other work under the scope of this License. - - 4. You may copy and distribute the Program (or a work based on it, - under Section 2) in object code or executable form under the - terms of Sections 1 and 2 above provided that you also do one of - the following: - - a. Accompany it with the complete corresponding - machine-readable source code, which must be distributed - under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - b. Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than - your cost of physically performing source distribution, a - complete machine-readable copy of the corresponding source - code, to be distributed under the terms of Sections 1 and 2 - above on a medium customarily used for software - interchange; or, - - c. Accompany it with the information you received as to the - offer to distribute corresponding source code. (This - alternative is allowed only for noncommercial distribution - and only if you received the program in object code or - executable form with such an offer, in accord with - Subsection b above.) - - The source code for a work means the preferred form of the work - for making modifications to it. For an executable work, - complete source code means all the source code for all modules - it contains, plus any associated interface definition files, - plus the scripts used to control compilation and installation of - the executable. However, as a special exception, the source - code distributed need not include anything that is normally - distributed (in either source or binary form) with the major - components (compiler, kernel, and so on) of the operating system - on which the executable runs, unless that component itself - accompanies the executable. - - If distribution of executable or object code is made by offering - access to copy from a designated place, then offering equivalent - access to copy the source code from the same place counts as - distribution of the source code, even though third parties are - not compelled to copy the source along with the object code. - - 5. You may not copy, modify, sublicense, or distribute the Program - except as expressly provided under this License. Any attempt - otherwise to copy, modify, sublicense or distribute the Program - is void, and will automatically terminate your rights under this - License. However, parties who have received copies, or rights, - from you under this License will not have their licenses - terminated so long as such parties remain in full compliance. - - 6. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to - modify or distribute the Program or its derivative works. These - actions are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Program (or any - work based on the Program), you indicate your acceptance of this - License to do so, and all its terms and conditions for copying, - distributing or modifying the Program or works based on it. - - 7. Each time you redistribute the Program (or any work based on the - Program), the recipient automatically receives a license from the - original licensor to copy, distribute or modify the Program - subject to these terms and conditions. You may not impose any - further restrictions on the recipients' exercise of the rights - granted herein. You are not responsible for enforcing - compliance by third parties to this License. - - 8. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent - issues), conditions are imposed on you (whether by court order, - agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this - License. If you cannot distribute so as to satisfy - simultaneously your obligations under this License and any other - pertinent obligations, then as a consequence you may not - distribute the Program at all. For example, if a patent license - would not permit royalty-free redistribution of the Program by - all those who receive copies directly or indirectly through you, - then the only way you could satisfy both it and this License - would be to refrain entirely from distribution of the Program. - - If any portion of this section is held invalid or unenforceable - under any particular circumstance, the balance of the section is - intended to apply and the section as a whole is intended to - apply in other circumstances. - - It is not the purpose of this section to induce you to infringe - any patents or other property right claims or to contest - validity of any such claims; this section has the sole purpose - of protecting the integrity of the free software distribution - system, which is implemented by public license practices. Many - people have made generous contributions to the wide range of - software distributed through that system in reliance on - consistent application of that system; it is up to the - author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose - that choice. - - This section is intended to make thoroughly clear what is - believed to be a consequence of the rest of this License. - - 9. If the distribution and/or use of the Program is restricted in - certain countries either by patents or by copyrighted - interfaces, the original copyright holder who places the Program - under this License may add an explicit geographical distribution - limitation excluding those countries, so that distribution is - permitted only in or among countries not thus excluded. In such - case, this License incorporates the limitation as if written in - the body of this License. - - 10. The Free Software Foundation may publish revised and/or new - versions of the General Public License from time to time. Such - new versions will be similar in spirit to the present version, - but may differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the - Program specifies a version number of this License which applies - to it and "any later version", you have the option of following - the terms and conditions either of that version or of any later - version published by the Free Software Foundation. If the - Program does not specify a version number of this License, you - may choose any version ever published by the Free Software - Foundation. - - 11. If you wish to incorporate parts of the Program into other free - programs whose distribution conditions are different, write to - the author to ask for permission. For software which is - copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free - status of all derivatives of our free software and of promoting - the sharing and reuse of software generally. - - NO WARRANTY - - 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO - WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE - LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE - QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE - PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY - SERVICING, REPAIR OR CORRECTION. - - 13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN - WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY - MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, - INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR - INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS - OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY - YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH - ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - -Appendix: How to Apply These Terms to Your New Programs -======================================================= - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is -safest to attach them to the start of each source file to most -effectively convey the exclusion of warranty; and each file should -have at least the "copyright" line and a pointer to where the full -notice is found. - - ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. - Copyright (C) 19YY NAME OF AUTHOR - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - Also add information on how to contact you by electronic and paper -mail. - - If the program is interactive, make it output a short notice like -this when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - - The hypothetical commands `show w' and `show c' should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w' and -`show c'; they could even be mouse-clicks or menu items--whatever -suits your program. - - You should also get your employer (if you work as a programmer) or -your school, if any, to sign a "copyright disclaimer" for the -program, if necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - SIGNATURE OF TY COON, 1 April 1989 - Ty Coon, President of Vice - - This General Public License does not permit incorporating your -program into proprietary programs. If your program is a subroutine -library, you may consider it more useful to permit linking -proprietary applications with the library. If this is what you want -to do, use the GNU Library General Public License instead of this -License. - - -File: pcl-cvs.info, Node: Installation, Next: About pcl-cvs, Prev: Copying, Up: Top - -Installation -************ - - This section describes the installation of pcl-cvs, the GNU Emacs -CVS front-end. You should install not only the elisp files -themselves, but also the on-line documentation so that your users -will know how to use it. You can create typeset documentation from -the file `pcl-cvs.texinfo' as well as an on-line info file. The -following steps are also described in the file `INSTALL' in the source -directory. - -* Menu: - -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. - - -File: pcl-cvs.info, Node: Pcl-cvs installation, Next: On-line manual installation, Prev: Installation, Up: Installation - -Installation of the pcl-cvs program -=================================== - - 1. Edit the file `Makefile' to reflect the situation at your site. - The only things you have to change is the definition of `lispdir' - and `infodir'. The elisp files will be copied to `lispdir', and - the info file to `infodir'. - - 2. Configure pcl-cvs.el - - There are a couple of paths that you have to check to make sure - that they match you system. They appear early in the file - pcl-cvs.el. - - *NOTE:* If your system is running emacs 18.57 or earlier you - MUST uncomment the line that says: - - (setq delete-exited-processes nil) - - Setting `delete-exited-processes' to `nil' works around a bug in - emacs that causes it to dump core. The bug was fixed in emacs - 18.58. - - 3. Release 1.05 and later of pcl-cvs requires parts of the Elib - library, version 0.07 or later. Elib is available via anonymous - ftp from prep.ai.mit.edu in `pub/gnu/elib-0.07.tar.z', and from - a lot of other sites that mirrors prep. Get Elib, and install - it, before proceeding. - - 4. Type `make install' in the source directory. This will - byte-compile all `.el' files and copy both the `.el' and the - `.elc' into the directory you specified in step 1. - - If you don't want to install the `.el' files but only the `.elc' - files (the byte-compiled files), you can type ``make - install_elc'' instead of ``make install''. - - If you only want to create the compiled elisp files, but don't - want to install them, you can type `make elcfiles' instead. - This is what happens if you only type `make' without parameters. - - 5. Edit the file `default.el' in your emacs lisp directory (usually - `/usr/gnu/emacs/lisp' or something similar) and enter the - contents of the file `pcl-cvs-startup.el' into it. It contains - a couple of `auto-load's that facilitates the use of pcl-cvs. - - - -File: pcl-cvs.info, Node: On-line manual installation, Next: Typeset manual installation, Prev: Pcl-cvs installation, Up: Installation - -Installation of the on-line manual. -=================================== - - 1. Create the info file `pcl-cvs' from `pcl-cvs.texinfo' by typing - `make info'. If you don't have the program `makeinfo' you can - get it by anonymous ftp from e.g. `ftp.gnu.ai.mit.edu' as - `pub/gnu/texinfo-2.14.tar.Z' (there might be a newer version - there when you read this), or you could use the preformatted - info file `pcl-cvs.info' that is included in the distribution - (type `cp pcl-cvs.info pcl-cvs'). - - 2. Move the info file `pcl-cvs' to your standard info directory. - This might be called something like `/usr/gnu/emacs/info'. - - 3. Edit the file `dir' in the info directory and enter one line to - contain a pointer to the info file `pcl-cvs'. The line can, for - instance, look like this: - - * Pcl-cvs: (pcl-cvs). An Emacs front-end to CVS. - - -File: pcl-cvs.info, Node: Typeset manual installation, Prev: On-line manual installation, Up: Installation - -How to make typeset documentation from pcl-cvs.texinfo -====================================================== - - If you have TeX installed at your site, you can make a typeset -manual from `pcl-cvs.texinfo'. - - 1. Run TeX by typing ``make pcl-cvs.dvi''. You will not get the - indices unless you have the `texindex' program. - - 2. Convert the resulting device independent file `pcl-cvs.dvi' to a - form which your printer can output and print it. If you have a - postscript printer there is a program, `dvi2ps', which does. - There is also a program which comes together with TeX, `dvips', - which you can use. - - - -File: pcl-cvs.info, Node: About pcl-cvs, Next: Getting started, Prev: Installation, Up: Top - -About pcl-cvs -************* - - Pcl-cvs is a front-end to CVS version 1.3. It integrates the most -frequently used CVS commands into emacs. - -* Menu: - -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? - - -File: pcl-cvs.info, Node: Contributors, Next: Archives, Prev: About pcl-cvs, Up: About pcl-cvs - -Contributors to pcl-cvs -======================= - - Contributions to the package are welcome. I have limited time to -work on this project, but I will gladly add any code that you -contribute to me to this package (*note Bugs::.). - - The following persons have made contributions to pcl-cvs. - - * Brian Berliner wrote CVS, together with some other contributors. - Without his work on CVS this package would be useless... - - * Per Cederqvist wrote most of the otherwise unattributed - functions in pcl-cvs as well as all documentation. - - * Inge Wallin (`inge@lysator.liu.se') wrote the skeleton to - `pcl-cvs.texinfo', and gave useful comments on it. He also wrote - the files `elib-node.el' and `compile-all.el'. The file - `cookie.el' was inspired by Inge. - - * Linus Tolke (`linus@lysator.liu.se') contributed useful comments - on both the functionality and the documentation. - - * Jamie Zawinski (`jwz@lucid.com') contributed `pcl-cvs-lucid.el'. - - * Leif Lonnblad contributed RCVS support. - - Apart from these, a lot of people have send me suggestions, ideas, -requests, bug reports and encouragement. Thanks a lot! Without your -there would be no new releases of pcl-cvs. - - -File: pcl-cvs.info, Node: Archives, Prev: Contributors, Up: About pcl-cvs - -Where can I get pcl-cvs? -======================== - - The latest release of pcl-cvs can be fetched via anonymous ftp from -`ftp.lysator.liu.se', (IP no. 130.236.254.1) in the directory -`pub/emacs'. If you don't live in Scandinavia you should probably -check with archie to see if there is a site closer to you that -archives pcl-cvs. - - New releases will be announced to appropriate newsgroups. If you -send your email address to me I will add you to my list of people to -mail when I make a new release. - - -File: pcl-cvs.info, Node: Getting started, Next: Buffer contents, Prev: About pcl-cvs, Up: Top - -Getting started -*************** - - This document assumes that you know what CVS is, and that you at -least knows the fundamental concepts of CVS. If that is not the case -you should read the man page for CVS. - - Pcl-cvs is only useful once you have checked out a module. So -before you invoke it you must have a copy of a module somewhere in -the file system. - - You invoke pcl-cvs by typing `M-x cvs-update RET'. If your emacs -responds with `[No match]' your system administrator has not -installed pcl-cvs properly. Try `M-x load-library RET pcl-cvs RET'. -If that also fails - talk to your root. If it succeeds you might put -this line in your `.emacs' file so that you don't have to type the -`load-library' command every time you wish to use pcl-cvs: - - (autoload 'cvs-update "pcl-cvs" nil t) - - The function `cvs-update' will ask for a directory. The command -`cvs update' will be run in that directory. (It should contain files -that have been checked out from a CVS archive.) The output from -`cvs' will be parsed and presented in a table in a buffer called -`*cvs*'. It might look something like this: - - PCL-CVS release 1.05. - - In directory /users/ceder/FOO/test: - Updated bar - Updated file.txt - Modified ci namechange - Updated newer - - In directory /users/ceder/FOO/test/sub: - Modified ci ChangeLog - ---------- End ----- - - In this example the three files (`bar', `file.txt' and `newer') -that are marked with `Updated' have been copied from the CVS -repository to `/users/ceder/FOO/test/' since someone else have -checked in newer versions of them. Two files (`namechange' and -`sub/ChangeLog') have been modified locally, and needs to be checked -in. - - You can move the cursor up and down in the buffer with `C-n' and -`C-p' or `n' and `p'. If you press `c' on one of the `Modified' -files that file will be checked in to the CVS repository. *Note -Committing changes::. You can press `x' to get rid of the -"uninteresting" files that have only been `Updated' (and don't -require any further action from you). - - You can also easily get a `diff' between your modified file and the -base version that you started from, and you can get the output from -`cvs log' and `cvs status' on the listed files simply by pressing a -key (*note Getting info about files::.). - - -File: pcl-cvs.info, Node: Buffer contents, Next: Commands, Prev: Getting started, Up: Top - -Buffer contents -*************** - - The display contains four columns. They contain, from left to -right: - - * An asterisk when the file is "marked" (*note Selected files::.). - - * The status of the file. See *Note File status::, for more - information. - - * A "need to be checked in"-marker (`ci'). - - * The file name. - -* Menu: - -* File status:: The meaning of the second field. -* Selected files:: How selection works. - - -File: pcl-cvs.info, Node: File status, Next: Selected files, Prev: Buffer contents, Up: Buffer contents - -File status -=========== - - The `file status' field can have the following values: - -`Updated' - The file was brought up to date with respect to the repository. - This is done for any file that exists in the repository but not - in your source, and for files that you haven't changed but are - not the most recent versions available in the repository. - -`Modified' - The file is modified in your working directory, and there was - no modification to the same file in the repository. - -`Merged' - The file is modified in your working directory, and there were - modifications in the repository as well as in your copy, but - they were merged successfully, without conflict, in your working - directory. - -`Conflict' - A conflict was detected while trying to merge your changes to - FILE with changes from the source repository. FILE (the copy in - your working directory) is now the output of the `rcsmerge' - command on the two versions; an unmodified copy of your file is - also in your working directory, with the name `.#FILE.VERSION', - where VERSION is the RCS revision that your modified file started - from. *Note Viewing differences::, for more details. - -`Added' - The file has been added by you, but it still needs to be checked - in to the repository. - -`Removed' - The file has been removed by you, but it needs to be checked in - to the repository. You can resurrect it by typing `a' (*note - Adding and removing files::.). - -`Unknown' - A file that was detected in your directory, but that neither - appears in the repository, nor is present on the list of files - that CVS should ignore. - - There are also a few special cases, that rarely occur, which have -longer strings in the fields: - -`Removed from repository' - The file has been removed from your directory since someone has - removed it from the repository. (It is still present in the - Attic directory, so no permanent loss has occurred). This, - unlike the other entries in this table, is not an error - condition. - -`Removed from repository, changed by you' - You have modified a file that someone have removed from the - repository. You can correct this situation by removing the file - manually (see *note Adding and removing files::.). - -`Removed by you, changed in repository' - You have removed a file, and before you committed the removal - someone committed a change to that file. You could use `a' to - resurrect the file (see *note Adding and removing files::.). - -`Move away FILE - it is in the way' - For some reason CVS does not like the file FILE. Rename or - remove it. - -`This repository is missing! Remove this dir manually.' - It is impossible to remove a directory in the CVS repository in - a clean way. Someone have tried to remove one, and CVS gets - confused. Remove your copy of the directory. - - -File: pcl-cvs.info, Node: Selected files, Prev: File status, Up: Buffer contents - -Selected files -============== - - Many of the commands works on the current set of "selected" files. - - * If there are any files that are marked they constitute the set of - selected files. - - * Otherwise, if the cursor points to a file, that file is the - selected file. - - * Otherwise, if the cursor points to a directory, all the files in - that directory that appears in the buffer are the selected files. - - This scheme might seem a little complicated, but once one get used -to it, it is quite powerful. - - *Note Marking files:: tells how you mark and unmark files. - - -File: pcl-cvs.info, Node: Commands, Next: Customization, Prev: Buffer contents, Up: Top - -Commands -******** - - The nodes in this menu contains explanations about all the -commands that you can use in pcl-cvs. They are grouped together by -type. - -* Menu: - -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to `diff' different versions. -* Emerge:: -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands - - -File: pcl-cvs.info, Node: Updating the directory, Next: Movement commands, Prev: Commands, Up: Commands - -Updating the directory -====================== - -`M-x cvs-update' - Run a `cvs update' command. You will be asked for the directory - in which the `cvs update' will be run. The output will be - parsed by pcl-cvs, and the result printed in the `*cvs*' buffer - (see *note Buffer contents::. for a description of the contents). - - By default, `cvs-update' will descend recursively into - subdirectories. You can avoid that behavior by giving a prefix - argument to it (e.g., by typing `C-u M-x cvs-update RET'). - - All other commands in pcl-cvs requires that you have a `*cvs*' - buffer. This is the command that you use to get one. - - CVS uses lock files in the repository to ensure the integrity of - the data files in the repository. They might be left behind - i.e. if a workstation crashes in the middle of a CVS operation. - CVS outputs a message when it is waiting for a lock file to go - away. Pcl-cvs will show the same message in the *cvs* buffer, - together with instructions for deleting the lock files. You - should normally not have to delete them manually -- just wait a - little while and the problem should fix itself. But if the lock - files doesn't disappear you can delete them with `M-x - cvs-delete-lock RET'. - -`g' - This will run `cvs update' again. It will always use the same - buffer that was used with the previous `cvs update'. Give a - prefix argument to avoid descending into subdirectories. This - runs the command `cvs-mode-update-no-prompt'. - - -File: pcl-cvs.info, Node: Movement commands, Next: Marking files, Prev: Updating the directory, Up: Commands - -Movement Commands -================= - - You can use most normal Emacs commands to move forward and -backward in the buffer. Some keys are rebound to functions that take -advantage of the fact that the buffer is a pcl-cvs buffer: - -`SPC' -`C-n' -`n' - These keys move the cursor one file forward, towards the end of - the buffer (`cookie-next-cookie'). - -`C-p' -`p' - These keys move one file backward, towards the beginning of the - buffer (`cookie-previous-cookie'). - - -File: pcl-cvs.info, Node: Marking files, Next: Committing changes, Prev: Movement commands, Up: Commands - -Marking files -============= - - Pcl-cvs works on a set of "selected files" (*note Selected -files::.). You can mark and unmark files with these commands: - -`m' - This marks the file that the cursor is positioned on. If the - cursor is positioned on a directory all files in that directory - will be marked. (`cvs-mode-mark'). - -`u' - Unmark the file that the cursor is positioned on. If the cursor - is on a directory, all files in that directory will be unmarked. - (`cvs-mode-unmark'). - -`M' - Mark *all* files in the buffer (`cvs-mode-mark-all-files'). - -`ESC DEL' - Unmark *all* files (`cvs-mode-unmark-all-files'). - -`DEL' - Unmark the file on the previous line, and move point to that line - (`cvs-mode-unmark-up'). - - -File: pcl-cvs.info, Node: Committing changes, Next: Editing files, Prev: Marking files, Up: Commands - -Committing changes -================== - -`c' - All files that have a "need to be checked in"-marker (*note - Buffer contents::.) can be checked in with the `c' command. It - checks in all selected files (*note Selected files::.) (except - those who lack the "ci"-marker - they are ignored). Pressing - `c' causes `cvs-mode-commit' to be run. - - When you press `c' you will get a buffer called - `*cvs-commit-message*'. Enter the log message for the file(s) in - it. When you are ready you should press `C-c C-c' to actually - commit the files (using `cvs-edit-done'). - - Normally the `*cvs-commit-message*' buffer will retain the log - message from the previous commit, but if the variable - `cvs-erase-input-buffer' is set to a non-`nil' value the buffer - will be erased. Point and mark will always be located around the - entire buffer so that you can easily erase it with `C-w' - (`kill-region'). - - If you are editing the files in your emacs an automatic - `revert-buffer' will be performed. (If the file contains `$Id: pcl-cvs.info-1,v 1.1.1.1 1995/12/19 09:21:41 deraadt Exp $' - keywords `cvs commit' will write a new file with the new values - substituted. The auto-revert makes sure that you get them into - your buffer). The revert will not occur if you have modified - your buffer, or if `cvs-auto-revert-after-commit' is set to - `nil'. - - -File: pcl-cvs.info, Node: Editing files, Next: Getting info about files, Prev: Committing changes, Up: Commands - -Editing files -============= - - There are currently three commands that can be used to find a file -(that is, load it into a buffer and start editing it there). These -commands work on the line that the cursor is situated at. They -ignore any marked files. - -`f' - Find the file that the cursor points to. Run `dired' (*note - Dired: (Emacs)Dired.) if the cursor points to a directory - (`cvs-mode-find-file'). - -`o' - Like `f', but use another window - (`cvs-mode-find-file-other-window'). - -`A' - Invoke `add-change-log-entry-other-window' to edit a `ChangeLog' - file. The `ChangeLog' will be found in the directory of the - file the cursor points to. - (`cvs-mode-add-change-log-entry-other-window'). - - -File: pcl-cvs.info, Node: Getting info about files, Next: Adding and removing files, Prev: Editing files, Up: Commands - -Getting info about files -======================== - - Both of the following commands can be customized. *Note -Customization::. - -`l' - Run `cvs log' on all selected files, and show the result in a - temporary buffer (`cvs-mode-log'). - -`s' - Run `cvs status' on all selected files, and show the result in a - temporary buffer (`cvs-mode-status'). - - -File: pcl-cvs.info, Node: Adding and removing files, Next: Undoing changes, Prev: Getting info about files, Up: Commands - -Adding and removing files -========================= - - The following commands are available to make it easy to add and -remove files from the CVS repository. - -`a' - Add all selected files. This command can be used on `Unknown' - files (see *note File status::.). The status of the file will - change to `Added', and you will have to use `c' - (`cvs-mode-commit', see *note Committing changes::.) to really - add the file to the repository. - - This command can also be used on `Removed' files (before you - commit them) to resurrect them. - - Selected files that are neither `Unknown' nor `Removed' will be - ignored by this command. - - The command that is run is `cvs-mode-add'. - -`r' - This command removes the selected files (after prompting for - confirmation). The files are `rm'ed from your directory and - (unless the status was `Unknown'; *note File status::.) they will - also be `cvs remove'd. If the files were `Unknown' they will - disappear from the buffer. Otherwise their status will change to - `Removed', and you must use `c' (`cvs-mode-commit', *note - Committing changes::.) to commit the removal. - - The command that is run is `cvs-mode-remove-file'. - - -File: pcl-cvs.info, Node: Undoing changes, Next: Removing handled entries, Prev: Adding and removing files, Up: Commands - -Undoing changes -=============== - -`U' - If you have modified a file, and for some reason decide that you - don't want to keep the changes, you can undo them with this - command. It works by removing your working copy of the file and - then getting the latest version from the repository - (`cvs-mode-undo-local-changes'. - - -File: pcl-cvs.info, Node: Removing handled entries, Next: Ignoring files, Prev: Undoing changes, Up: Commands - -Removing handled entries -======================== - -`x' - This command allows you to remove all entries that you have - processed. More specifically, the lines for `Updated' files - (*note File status::. and files that have been checked in (*note - Committing changes::.) are removed from the buffer. If a - directory becomes empty the heading for that directory is also - removed. This makes it easier to get an overview of what needs - to be done. - - The command is called `cvs-mode-remove-handled'. If - `cvs-auto-remove-handled' is set to non-`nil' this will - automatically be performed after every commit. - -`C-k' - This command can be used for lines that - `cvs-mode-remove-handled' would not delete, but that you want to - delete (`cvs-mode-acknowledge'). - - -File: pcl-cvs.info, Node: Ignoring files, Next: Viewing differences, Prev: Removing handled entries, Up: Commands - -Ignoring files -============== - -`i' - Arrange so that CVS will ignore the selected files. The file - names are added to the `.cvsignore' file in the corresponding - directory. If the `.cvsignore' doesn't exist it will be created. - - The `.cvsignore' file should normally be added to the repository, - but you could ignore it also if you like it better that way. - - This runs `cvs-mode-ignore'. - - -File: pcl-cvs.info, Node: Viewing differences, Next: Emerge, Prev: Ignoring files, Up: Commands - -Viewing differences -=================== - -`d' - Display a `cvs diff' between the selected files and the RCS - version that they are based on. *Note Customization:: describes - how you can send flags to `cvs diff'. If CVS-DIFF-IGNORE-MARKS - is set to a non-`nil' value or if a prefix argument is given - (but not both) any marked files will not be considered to be - selected. (`cvs-mode-diff-cvs'). - -`b' - If CVS finds a conflict while merging two versions of a file - (during a `cvs update', *note Updating the directory::.) it will - save the original file in a file called `.#FILE.VERSION' where - FILE is the name of the file, and VERSION is the RCS version - number that your file was based on. - - With the `b' command you can run a `diff' on the files - `.#FILE.VERSION' and `FILE'. You can get a context- or Unidiff - by setting `cvs-diff-flags' - *note Customization::.. This - command only works on files that have status `Conflict' or - `Merged'. - - If CVS-DIFF-IGNORE-MARKS is set to a non-`nil' value or if a - prefix argument is given (but not both) any marked files will - not be considered to be selected. (`cvs-mode-diff-backup'). - - -File: pcl-cvs.info, Node: Emerge, Next: Reverting your buffers, Prev: Viewing differences, Up: Commands - -Running emerge -============== - -`e' - Invoke `emerge' on one file. This command works slightly - different depending on the file status. - - `Modified' - Run `emerge-files' with your working file as file A, and - the latest revision in the repository as file B. - - `Merged' - `Conflict' - Run `emerge-files-with-ancestor' with your working file (as - it was prior to your invocation of `cvs-update') as file A, - the latest revision in the repository as file B, and the - revision that you based your local modifications on as - ancestor. - - *Note:* CVS has already performed a merge. The resulting file is - not used in any way if you use this command. If you use the `q' - command inside `emerge' (to successfully terminate the merge) the - file that CVS created will be overwritten. - - -File: pcl-cvs.info, Node: Reverting your buffers, Next: Miscellaneous commands, Prev: Emerge, Up: Commands - -Reverting your buffers -====================== - -`R' - If you are editing (or just viewing) a file in a buffer, and - that file is changed by CVS during a `cvs-update', all you have - to do is type `R' in the *cvs* buffer to read in the new - versions of the files. - - All files that are `Updated', `Merged' or in `Conflict' are - reverted from the disk. Any other files are ignored. Only files - that you were already editing are read. - - An error is signalled if you have modified the buffer since it - was last changed. (`cvs-mode-revert-updated-buffers'). - - -File: pcl-cvs.info, Node: Miscellaneous commands, Prev: Reverting your buffers, Up: Commands - -Miscellaneous commands -====================== - -`M-x cvs-byte-compile-files' - Byte compile all selected files that end in .el. - -`M-x cvs-delete-lock' - This command can be used in any buffer, and deletes the lock - files that the *cvs* buffer informs you about. You should - normally never have to use this command since CVS tries very - carefully to always remove the lock files itself. - - You can only use this command when a message in the *cvs* buffer - tells you so. You should wait a while before using this command - in case someone else is running a cvs command. - -`q' - Bury the *cvs* buffer. (`bury-buffer'). - diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info-2 b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info-2 deleted file mode 100644 index ef28caa179a..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info-2 +++ /dev/null @@ -1,449 +0,0 @@ -This is Info file pcl-cvs.info, produced by Makeinfo-1.55 from the -input file ./pcl-cvs.texinfo. - - Copyright (C) 1992 Per Cederqvist - - Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided also -that the section entitled "GNU General Public License" is included -exactly as in the original, and provided that the entire resulting -derived work is distributed under the terms of a permission notice -identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that the section entitled "GNU General Public -License" and this permission notice may be included in translations -approved by the Free Software Foundation instead of in the original -English. - - -File: pcl-cvs.info, Node: Customization, Next: Future enhancements, Prev: Commands, Up: Top - -Customization -************* - - If you have an idea about any customization that would be handy but -isn't present in this list, please tell me! *Note Bugs:: for info on -how to reach me. - -`cvs-erase-input-buffer' - If set to anything else than `nil' the edit buffer will be erased - before you write the log message (*note Committing changes::.). - -`cvs-inhibit-copyright-message' - The copyright message that is displayed on startup can be - annoying after a while. Set this variable to `t' if you want to - get rid of it. (But don't set this to `t' in the system - defaults file - new users should see this message at least once). - -`cvs-diff-flags' - A list of strings to pass as arguments to the `cvs diff' and - `diff' programs. This is used by `cvs-mode-diff-cvs' and - `cvs-mode-diff-backup' (key `b', *note Viewing differences::.). - If you prefer the Unidiff format you could add this line to your - `.emacs' file: - - (setq cvs-diff-flags '("-u")) - -`cvs-diff-ignore-marks' - If this variable is non-`nil' or if a prefix argument is given - (but not both) to `cvs-mode-diff-cvs' or `cvs-mode-diff-backup' - marked files are not considered selected. - -`cvs-log-flags' - List of strings to send to `cvs log'. Used by `cvs-mode-log' - (key `l', *note Getting info about files::.). - -`cvs-status-flags' - List of strings to send to `cvs status'. Used by - `cvs-mode-status' (key `s', *note Getting info about files::.). - -`cvs-auto-remove-handled' - If this variable is set to any non-`nil' value - `cvs-mode-remove-handled' will be called every time you check in - files, after the check-in is ready. *Note Removing handled - entries::. - -`cvs-auto-revert-after-commit' - If this variable is set to any non-`nil' value any buffers you - have that visit a file that is committed will be automatically - reverted. This variable is default `t'. *Note Committing - changes::. - -`cvs-update-prog-output-skip-regexp' - The `-u' flag in the `modules' file can be used to run a command - whenever a `cvs update' is performed (see cvs(5)). This regexp - is used to search for the last line in that output. It is - normally set to `"$"'. That setting is only correct if the - command outputs nothing. Note that pcl-cvs will get very - confused if the command outputs *anything* to `stderr'. - -`cvs-cvsroot' - This variable can be set to override `CVSROOT'. It should be a - string. If it is set then everytime a cvs command is run it will - be called as `cvs -d CVS-CVSROOT...' This can be useful if your - site has several repositories. - -`TMPDIR' - Pcl-cvs uses this *environment variable* to decide where to put - the temporary files it needs. It defaults to `/tmp' if it is - not set. - -`cvs-commit-buffer-require-final-newline' - When you enter a log message in the `*cvs-commit-message*' buffer - pcl-cvs will normally automatically insert a trailing newline, - unless there already is one. This behavior can be controlled via - `cvs-commit-buffer-require-final-newline'. If it is `t' (the - default behavior), a newline will always be appended. If it is - `nil', newlines will never be appended. Any other value causes - pcl-cvs to ask the user whenever there is no trailing newline in - the commit message buffer. - -`cvs-sort-ignore-file' - If this variable is set to any non-`nil' value the `.cvsignore' - will always be sorted whenever you use `cvs-mode-ignore' to add - a file to it. This option is on by default. - - -File: pcl-cvs.info, Node: Future enhancements, Next: Bugs, Prev: Customization, Up: Top - -Future enhancements -******************* - - Pcl-cvs is still under development and needs a number of -enhancements to be called complete. Below is my current wish-list -for future releases of pcl-cvs. Please, let me know which of these -features you want most. They are listed below in approximately the -order that I currently think I will implement them in. - - * Rewritten parser code. There are many situations where pcl-cvs - will fail to recognize the output from CVS. The situation could - be greatly increased. - - * `cvs-status'. This will run `cvs status' in a directory and - produce a buffer that looks pretty much like the current *cvs* - buffer. That buffer will include information for all - version-controlled files. (There will be a simple keystroke to - remove all "uninteresting" files, that is, files that are - "Up-to-date"). In this new buffer you will be able to update a - file, commit a file, et c. The big win with this is that you - will be able to watch the differences between your current - working file and the head revision in the repository before you - update the file, and you can then choose to update it or let it - wait for a while longer. - - * Log mode. When this mode is finished you will be able to move - around (using `n' and `p') between the revisions of a file, mark - two of them, and run a diff between them. You will be able to - hide branches (similar to the way you can hide sub-paragraphs in - outline-mode) and do merges between revisions. Other ideas - about this are welcome. - - * The current model for marks in the *cvs* buffer seems to be - confusing. I am considering to use the VM model instead, where - marks are normally inactive. To activate the mark, you issue a - command like `cvs-mode-next-command-uses-marks'. I might - implement a flag so that you can use either version. Feedback - on this before I start coding it is very welcome. - - * It should be possible to run commands such as `cvs log', `cvs - status' and `cvs commit' directly from a buffer containing a - file, instead of having to `cvs-update'. If the directory - contains many files the `cvs-update' can take quite some time, - especially on a slow machine. I planed to put these kind of - commands on the prefix `C-c C-v', but that turned out to be used - by for instance c++-mode. If you have any suggestions for a - better prefix key, please let me know. - - * Increased robustness. For instance, you can not currently press - `C-g' when you are entering the description of a file that you - are adding without confusing pcl-cvs. - - * Support for multiple active *cvs* buffers. - - * Dired support. I have an experimental `dired-cvs.el' that works - together with CVS 1.2. Unfortunately I wrote it on top of a - non-standard `dired.el', so it must be rewritten. - - * An ability to send user-supplied options to all the cvs commands. - - * Pcl-cvs is not at all clever about what it should do when `cvs - update' runs a program (due to the `-u' option in the `modules' - file -- see `cvs(5)'). The current release uses a regexp to - search for the end. At the very least that regexp should be - configured for different modules. Tell me if you have any idea - about what is the right thing to do. In a perfect world the - program should also be allowed to print to `stderr' without - causing pcl-cvs to crash. - - If you miss something in this wish-list, let me know! I don't -promise that I will write it, but I will at least try to coordinate -the efforts of making a good Emacs front end to CVS. See *Note -Bugs:: for information about how to reach me. - - So far, I have written most of pcl-cvs in my all-to-rare spare -time. If you want pcl-cvs to be developed faster you can write a -contract with Signum Support to do the extension. You can reach -Signum Support by email to `info@signum.se' or via mail to Signum -Support AB, Box 2044, S-580 02 Linkoping, Sweden. Phone: +46 (0) 13 - -21 46 00. Fax: +46 (0) 13 - 21 47 00. - - -File: pcl-cvs.info, Node: Bugs, Next: Function and Variable Index, Prev: Future enhancements, Up: Top - -Bugs (known and unknown) -************************ - - If you find a bug or misfeature, don't hesitate to tell me! Send -email to `ceder@lysator.liu.se'. - - If you have ideas for improvements, or if you have written some -extensions to this package, I would like to hear from you. I hope -that you find this package useful! - - Below is a partial list of currently known problems with pcl-cvs -version 1.05. - -Commit causes Emacs to hang - Emacs waits for the `cvs commit' command to finish before you can - do anything. If you start a background job from the loginfo - file you must take care that it closes `stdout' and `stderr' if - you do not want to wait for it. (You do that with - `background-command &>- 2&>- &' if you are starting - `background-command' from a `/bin/sh' shell script). - - Your emacs will also hang if there was a lock file in the - repository. In this case you can type `C-g' to get control over - your emacs again. - -Name clash in Emacs 19 - This is really a bug in Elib or the Emacs 19 distribution. Both - Elib and Emacs 19.6 through at least 19.10 contains a file named - `cookie.el'. One of the files will have to be renamed, and we - are currently negotiating about which of the files to rename. - -Commands while cvs-update is running - It is possible to type commands in the *cvs* buffer while the - update is running, but error messages is all that you will get. - The error messages should be better. - -Unexpected output from CVS - Unexpected output from CVS confuses pcl-cvs. It will currently - create a bug report that you can mail to me. It should do - something more civilized. - - -File: pcl-cvs.info, Node: Function and Variable Index, Next: Concept Index, Prev: Bugs, Up: Top - -Function and Variable Index -*************************** - -* Menu: - -* bury-buffer: Miscellaneous commands. -* cookie-next-cookie: Movement commands. -* cookie-previous-cookie: Movement commands. -* cvs-auto-remove-handled (variable): Customization. -* cvs-auto-revert-after-commit (variable): Customization. -* cvs-auto-revert-after-commit (variable): Committing changes. -* cvs-byte-compile-files: Miscellaneous commands. -* cvs-commit-buffer-require-final-newline (variable): Customization. -* cvs-cvsroot (variable): Customization. -* cvs-delete-lock: Updating the directory. -* cvs-diff-flags (variable): Customization. -* cvs-diff-ignore-marks (variable): Customization. -* cvs-diff-ignore-marks (variable): Viewing differences. -* cvs-erase-input-buffer (variable): Customization. -* cvs-erase-input-buffer (variable): Committing changes. -* cvs-inhibit-copyright-message (variable): Customization. -* cvs-log-flags (variable): Customization. -* cvs-mode-acknowledge: Removing handled entries. -* cvs-mode-add: Adding and removing files. -* cvs-mode-add-change-log-entry-other-window: Editing files. -* cvs-mode-commit: Committing changes. -* cvs-mode-diff-backup: Viewing differences. -* cvs-mode-diff-cvs: Viewing differences. -* cvs-mode-emerge: Emerge. -* cvs-mode-find-file: Editing files. -* cvs-mode-find-file-other-window: Editing files. -* cvs-mode-ignore: Removing handled entries. -* cvs-mode-log: Getting info about files. -* cvs-mode-mark: Marking files. -* cvs-mode-mark-all-files: Marking files. -* cvs-mode-remove-file: Adding and removing files. -* cvs-mode-remove-handled: Removing handled entries. -* cvs-mode-revert-updated-buffers: Reverting your buffers. -* cvs-mode-status: Getting info about files. -* cvs-mode-undo-local-changes: Undoing changes. -* cvs-mode-unmark: Marking files. -* cvs-mode-unmark-all-files: Marking files. -* cvs-mode-unmark-up: Marking files. -* cvs-mode-update-no-prompt: Updating the directory. -* cvs-sort-ignore-file (variable): Customization. -* cvs-status-flags (variable): Customization. -* cvs-update: Updating the directory. -* cvs-update-prog-output-skip-regexp (variable): Customization. -* TMPDIR (environment variable): Customization. - - -File: pcl-cvs.info, Node: Concept Index, Next: Key Index, Prev: Function and Variable Index, Up: Top - -Concept Index -************* - -* Menu: - -* -u option in modules file: Customization. -* .cvsignore file, sorting: Customization. -* About pcl-cvs: About pcl-cvs. -* Active files: Selected files. -* Added (file status): File status. -* Adding files: Adding and removing files. -* Archives: Archives. -* Author, how to reach: Bugs. -* Authors: Contributors. -* Automatically inserting newline: Customization. -* Automatically remove handled files: Customization. -* Automatically sorting .cvsignore: Customization. -* Buffer contents: Buffer contents. -* Bugs, how to report them: Bugs. -* Bugs, known: Bugs. -* Byte compilation: Miscellaneous commands. -* Ci: Committing changes. -* Commit buffer: Committing changes. -* Commit message, inserting newline: Customization. -* Committing changes: Committing changes. -* Conflict (file status): File status. -* Conflicts, how to resolve them: Viewing differences. -* Conflicts, resolving: Emerge. -* Context diff, how to get: Customization. -* Contributors: Contributors. -* Copyright message, getting rid of it: Customization. -* Customization: Customization. -* Deleting files: Adding and removing files. -* Diff: Viewing differences. -* Dired: Editing files. -* Edit buffer: Committing changes. -* Editing files: Editing files. -* Email archives: Archives. -* Email to the author: Bugs. -* Emerge: Emerge. -* Enhancements: Future enhancements. -* Erasing commit message: Committing changes. -* Erasing the input buffer: Customization. -* Example run: Getting started. -* Expunging uninteresting entries: Removing handled entries. -* FAQ: Bugs. -* File selection: Selected files. -* File status: File status. -* Finding files: Editing files. -* Flush changes: Undoing changes. -* Ftp-sites: Archives. -* Generating a typeset manual: Typeset manual installation. -* Generating the on-line manual: On-line manual installation. -* Getting pcl-cvs: Archives. -* Getting rid of lock files: Miscellaneous commands. -* Getting rid of the Copyright message.: Customization. -* Getting rid of uninteresting lines: Removing handled entries. -* Getting status: Getting info about files. -* Getting the *cvs* buffer: Updating the directory. -* Handled lines, removing them: Removing handled entries. -* Info-file (how to generate): On-line manual installation. -* Inhibiting the Copyright message.: Customization. -* Installation: Installation. -* Installation of elisp files: Pcl-cvs installation. -* Installation of on-line manual: On-line manual installation. -* Installation of typeset manual: Typeset manual installation. -* Introduction: Getting started. -* Invoking dired: Editing files. -* Invoking emerge: Emerge. -* Known bugs: Bugs. -* Loading files: Editing files. -* Lock files: Miscellaneous commands. -* Log (RCS/cvs command): Getting info about files. -* Manual installation (on-line): On-line manual installation. -* Manual installation (typeset): Typeset manual installation. -* Marked files: Selected files. -* Marking files: Marking files. -* Merged (file status): File status. -* Modified (file status): File status. -* Modules file (-u option): Customization. -* Move away FILE - it is in the way (file status): File status. -* Movement Commands: Movement commands. -* On-line manual (how to generate): On-line manual installation. -* Printing a manual: Typeset manual installation. -* Problems, list of common: Bugs. -* Putting files under CVS control: Adding and removing files. -* Recompiling elisp files: Miscellaneous commands. -* Removed (file status): File status. -* Removed by you, changed in repository (file status): File status. -* Removed from repository (file status): File status. -* Removed from repository, changed by you (file status): File status. -* Removing files: Adding and removing files. -* Removing uninteresting (processed) lines: Removing handled entries. -* Reporting bugs and ideas: Bugs. -* Require final newline: Customization. -* Resolving conflicts: Emerge. -* Resurrecting files: Adding and removing files. -* Reverting buffers: Reverting your buffers. -* Reverting buffers after commit: Committing changes. -* Reverting buffers after commit: Customization. -* Selected files: Selected files. -* Selecting files (commands to mark files): Marking files. -* Sites: Archives. -* Sorting the .cvsignore file: Customization. -* Status (cvs command): Getting info about files. -* Syncing buffers: Reverting your buffers. -* TeX - generating a typeset manual: Typeset manual installation. -* This repository is missing!... (file status): File status. -* Undo changes: Undoing changes. -* Unidiff, how to get: Customization. -* Uninteresting entries, getting rid of them: Removing handled entries. -* Unknown (file status): File status. -* Update program (-u option in modules file): Customization. -* Updated (file status): File status. -* Variables, list of all: Customization. -* Viewing differences: Viewing differences. - - -File: pcl-cvs.info, Node: Key Index, Prev: Concept Index, Up: Top - -Key Index -********* - -* Menu: - -* a - add a file: Adding and removing files. -* A - add ChangeLog entry: Editing files. -* b - diff backup file: Viewing differences. -* c - commit files: Committing changes. -* C-k - remove selected entries: Removing handled entries. -* C-n - Move down one file: Movement commands. -* C-p - Move up one file: Movement commands. -* d - run cvs diff: Viewing differences. -* DEL - unmark previous file: Marking files. -* e - invoke emerge: Emerge. -* ESC DEL - unmark all files: Marking files. -* f - find file or directory: Editing files. -* g - Rerun cvs update: Updating the directory. -* l - run cvs log: Getting info about files. -* m - marking a file: Marking files. -* M - marking all files: Marking files. -* n - Move down one file: Movement commands. -* o - find file in other window: Editing files. -* p - Move up on file: Movement commands. -* q - bury the *cvs* buffer: Miscellaneous commands. -* r - remove a file: Adding and removing files. -* R - revert buffers: Reverting your buffers. -* s - run cvs status: Getting info about files. -* SPC - Move down one file: Movement commands. -* U - undo changes: Undoing changes. -* u - unmark a file: Marking files. -* x - remove processed entries: Removing handled entries. - - diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.ps b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.ps deleted file mode 100644 index eb92557988b..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.ps +++ /dev/null @@ -1,2918 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvipsk 5.58a Copyright 1986, 1994 Radical Eye Software -%%Title: pcl-cvs.dvi -%%Pages: 32 -%%PageOrder: Ascend -%%BoundingBox: 0 0 596 842 -%%DocumentPaperSizes: a4 -%%EndComments -%DVIPSCommandLine: dvips pcl-cvs.dvi -o pcl-cvs.ps -%DVIPSParameters: dpi=300, compressed, comments removed -%DVIPSSource: TeX output 1996.02.26:1613 -%%BeginProcSet: texc.pro -/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N -/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 -mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} -ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale -isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div -hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul -TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} -forall round exch round exch]setmatrix}N /@landscape{/isls true N}B -/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B -/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ -/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N -string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N -end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ -/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] -N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup -length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ -128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub -get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data -dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N -/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup -/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx -0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff -setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff -.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N -/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id -gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp -add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add -/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{ -dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1 -adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 -idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string -putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval -adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg} -{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{ -adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2 -chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{] -}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup -length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ -cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin -0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul -add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict -/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook -known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X -/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for -65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 -0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V -{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 -getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} -ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false -RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 -false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform -round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg -rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail -{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} -B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ -4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ -p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p -a}B /bos{/SS save N}B /eos{SS restore}B end -%%EndProcSet -TeXDict begin 39158280 55380996 1000 300 300 (pcl-cvs.dvi) -@start /Fa 1 47 df<127012F8A212F012E005057B840E>46 D -E /Fb 1 47 df<1238127C12FCA212F8127006067A8512>46 D E -/Fc 51 123 df<90381FC1F090387037189038C03E3C3801807C000313783907003800A9 -B612C03907003800B2143C397FE1FFC01E2380A21C>11 D<132013401380EA01005A1206 -1204120CA25AA25AA312701260A312E0AE1260A312701230A37EA27EA2120412067E7EEA -0080134013200B327CA413>40 D<7E12407E7E12187E12041206A27EA2EA0180A313C012 -00A313E0AE13C0A312011380A3EA0300A21206A21204120C5A12105A5A5A0B327DA413> -I45 D48 -D<13801203120F12F31203B3A9EA07C0EAFFFE0F217CA018>III<1303A25BA25B1317A213271367134713871201 -13071202120612041208A212101220A2124012C0B512F838000700A7EB0F80EB7FF01521 -7FA018>I<00101380381E0700EA1FFF5B13F8EA17E00010C7FCA6EA11F8EA120CEA1C07 -381803801210380001C0A214E0A4127012F0A200E013C01280EA4003148038200700EA10 -06EA0C1CEA03F013227EA018>I<137EEA01C138030080380601C0EA0C03121C38180180 -0038C7FCA212781270A2EAF0F8EAF30CEAF4067F00F81380EB01C012F014E0A51270A300 -3813C0A238180380001C1300EA0C06EA070CEA01F013227EA018>I<12401260387FFFE0 -14C0A23840008038C0010012801302A2485A5BA25B5BA21360134013C0A21201A25B1203 -A41207A76CC7FC13237DA118>II< -497EA3497EA3EB05E0A2EB09F01308A2EB1078A3497EA3497EA2EBC01F497EA248B51280 -EB0007A20002EB03C0A348EB01E0A348EB00F0121C003EEB01F839FF800FFF20237EA225 ->65 DI<903807E0109038381830EBE0063901C0017039038000F048 -C7FC000E1470121E001C1430123CA2007C14101278A200F81400A812781510127C123CA2 -001C1420121E000E14407E6C6C13803901C001003800E002EB381CEB07E01C247DA223> -I69 -DI<903807F00890383C0C18EBE0023901C0 -01B839038000F848C71278481438121E15185AA2007C14081278A200F81400A7EC1FFF00 -78EB00F81578127C123CA27EA27E7E6C6C13B86C7E3900E0031890383C0C08903807F000 -20247DA226>I73 -D75 DI<39FF8007FF3907C000F81570D805E01320EA04F0A21378 -137C133C7F131F7FEB0780A2EB03C0EB01E0A2EB00F014F81478143C143E141E140FA2EC -07A0EC03E0A21401A21400000E1460121FD8FFE0132020227EA125>78 -D80 D82 D<3803F020380C0C60EA1802383001E0EA70 -000060136012E0A21420A36C1300A21278127FEA3FF0EA1FFE6C7E0003138038003FC0EB -07E01301EB00F0A214707EA46C1360A26C13C07E38C8018038C60700EA81FC14247DA21B ->I<39FFFC07FF390FC000F86C4813701520B3A5000314407FA2000114806C7E90386001 -00EB3006EB1C08EB03F020237EA125>85 DI97 D<120E12FE121E120EAB131FEB61C0EB8060380F0030000E -1338143C141C141EA7141C143C1438000F1370380C8060EB41C038083F0017237FA21B> -II<14E0130F13011300ABEA01F8EA0704EA0C02 -EA1C01EA38001278127012F0A7127012781238EA1801EA0C0238070CF03801F0FE17237E -A21B>II<14703803F198380E -1E18EA1C0E38380700A200781380A400381300A2EA1C0EEA1E1CEA33F00020C7FCA21230 -1238EA3FFE381FFFC06C13E0383000F0481330481318A400601330A2003813E0380E0380 -3803FE0015217F9518>103 D<120E12FE121E120EABEB1F80EB60C0EB80E0380F0070A2 -120EAF38FFE7FF18237FA21B>I<121C121E123E121E121CC7FCA8120E127E121E120EB1 -EAFFC00A227FA10E>I<120E12FE121E120EABEB03FCEB01F014C01480EB02005B5B5B13 -3813F8EA0F1CEA0E1E130E7F1480EB03C0130114E0EB00F014F838FFE3FE17237FA21A> -107 D<120E12FE121E120EB3ADEAFFE00B237FA20E>I<390E1FC07F3AFE60E183803A1E -807201C03A0F003C00E0A2000E1338AF3AFFE3FF8FFE27157F942A>I<380E1F8038FE60 -C0381E80E0380F0070A2120EAF38FFE7FF18157F941B>III114 -DI<1202A41206A3120E121E123E -EAFFFCEA0E00AB1304A6EA07081203EA01F00E1F7F9E13>I<000E137038FE07F0EA1E00 -000E1370AD14F0A238060170380382783800FC7F18157F941B>I<38FF80FE381E007814 -30000E1320A26C1340A2EB80C000031380A23801C100A2EA00E2A31374A21338A3131017 -157F941A>I<39FF8FF87F393E01E03C001CEBC01814E0000E1410EB0260147000071420 -EB04301438D803841340EB8818141CD801C81380EBD00C140E3900F00F00497EA2EB6006 -EB400220157F9423>I<38FF83FE381F00F0000E13C06C1380EB8100EA0383EA01C2EA00 -E41378A21338133C134E138FEA0187EB0380380201C0000413E0EA0C00383E01F038FF03 -FE17157F941A>I<38FF80FE381E00781430000E1320A26C1340A2EB80C000031380A238 -01C100A2EA00E2A31374A21338A31310A25BA35B12F05B12F10043C7FC123C171F7F941A ->I<383FFFC038380380EA300700201300EA600EEA401C133C1338C65A5B12015B380380 -40EA07005A000E13C04813805AEA7801EA7007B5FC12157F9416>I -E /Fe 66 123 df11 D<13FEEA038138060180EA0E03381C010090C7FCA5B51280EA -1C03AE38FF8FF0141A809915>II<126012F0A61260AA12201200A4126012F0A21260041A7D990B>33 -D<1380EA010012025A120C120812185AA35AA412E0AA1260A47EA37E1208120C12047E7E -EA008009267D9B0F>40 D<7E12407E7E12181208120C7EA37EA41380AA1300A41206A35A -1208121812105A5A5A09267E9B0F>I<1203A4EAE31CEA7338EA1FE0EA0780A2EA1FE0EA -7338EAE31CEA0300A40E107E9B13>I<126012F0A212701210A31220A21240A2040B7D83 -0B>44 DI<126012F0A2126004047D830B>I<1304130C1318A313 -30A31360A313C0A3EA0180A3EA0300A31206A35AA35AA35AA35AA35AA20E257E9B13>I< -EA07E0EA1C38EA381CEA300CEA700EEA6006A2EAE007AAEA6006A2EA700EEA300CEA381C -EA1C38EA07E010187F9713>I<12035AB4FC1207B3A2EA7FF80D187D9713>III<1318A21338137813F813B8EA01381202A2120412 -08121812101220124012C0B5FCEA0038A6EA03FF10187F9713>III<1240EA7FFF13FEA2EA4004EA80081310A2EA00201340A21380120113005AA2 -5A1206A2120EA5120410197E9813>II<130CA3131EA2132F1327A2EB4380A3EB81C0A200017F1300 -A248B47E38020070A2487FA3487FA2003C131EB4EBFFC01A1A7F991D>65 -DIIIIII<39FFE1FFC0390E001C00AB380FFFFC380E001CAC39FFE1FFC01A1A7F991D>I< -EAFF80EA1C00B3A6EAFF80091A7E990E>I<39FFE01FC0390E000F00140C14085C5C5C49 -5A0102C7FC5B130C131C132E1347EB8380EA0F03380E01C06D7EA2147080A280141E141F -39FFE07FC01A1A7F991E>75 DII<137F3801 -C1C038070070000E7F487F003C131E0038130E0078130F00707F00F01480A80078EB0F00 -A20038130E003C131E001C131C6C5B6C5B3801C1C0D8007FC7FC191A7E991E>79 -DI<137F3801C1C038070070000E7F487F003C131E0038130E007813 -0F00707F00F01480A80070140000785B0038130E383C1C1E381C221C380E4138000713F0 -3801E1C039007F8080EB00C0A214E1EC7F00A2143E141C19217E991E>III<007FB5FC38701C0700401301A200C0148000801300A300001400B1 -3803FFE0191A7F991C>I<39FFE07FC0390E000E001404B200065B12076C5B6C6C5A3800 -E0C0013FC7FC1A1A7F991D>I<39FF801FC0391C00070014066C1304A36C5BA26C6C5AA3 -6C6C5AA26C6C5AA3EB7080A213790139C7FCA2131EA3130CA21A1A7F991D>I<39FFC0FF -80390F003C0014106C5BEA03806D5A00015BEA00E101F1C7FC137A133E131C131EA21317 -EB27801343EB41C0EB81E0EA010048137000021378481338000C7F001E133EB4EB7FC01A -1A7F991D>88 D97 D<12FC121CA913FCEA1D07381E0380381C01C01300 -14E0A6EB01C01480381E0300EA1906EA10F8131A809915>II<133F1307A9EA03E7EA0C17EA -180F487E127012E0A6126012706C5AEA1C373807C7E0131A7F9915>I -III<12FC121CA9137CEA1D87381E0380A2 -121CAB38FF9FF0141A809915>I<1218123CA212181200A612FC121CAE12FF081A80990A> -I<12FC121CA9EB1FC0EB0F00130C5B13205B13E0121DEA1E70EA1C7813387F131E7F1480 -38FF9FE0131A809914>107 D<12FC121CB3A6EAFF80091A80990A>I<38FC7C1F391D8E63 -80391E0781C0A2001C1301AB39FF9FE7F81D107F8F20>IIIII< -EAFC78EA1D9CEA1E1C1308EA1C00ABEAFF800E10808F0F>I -I<1208A41218A21238EAFFC0EA3800A81320A41218EA1C40EA07800B177F960F>I<38FC -1F80EA1C03AB1307120CEA0E0B3803F3F01410808F15>I<38FF0F80383C0700EA1C0613 -04A26C5AA26C5AA3EA03A0A2EA01C0A36C5A11107F8F14>I<39FE7F1F8039381C070000 -3C1306381C0C04130E380E16081317A238072310149013A33803C1A014E0380180C0A319 -107F8F1C>I<38FE3F80383C1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E -1208EA181CEA381E38FC3FC012107F8F14>I<38FF0F80383C0700EA1C061304A26C5AA2 -6C5AA3EA03A0A2EA01C0A36C5AA248C7FCA212E112E212E4127811177F8F14>II E /Ff 4 109 df12 D<1270A212F012600404 -7D830B>46 D101 D108 D E /Fg 38 122 df<1202120F121E127C12F012600806799614> -39 D42 D45 D65 -D<3801F180EA07FFEA0E1FEA1C071238EA7003A348C7FCA738700380A338380700121CEA -0E0EEA07FCEA01F011177F9614>67 DII76 D<38FC1F80A2007C1300EA7637A4EA7777A2EA7367A313E7EA71C7A2EA7007 -A638F80F80A211177F9614>I80 D82 DI<38FE0FE0A238380380B0381C0700A2EA0E0EEA07FCEA01 -F01317809614>85 D<124012F01278123E120F120608067C9614>96 -DI<12FCA2121CA513F8EA1DFEEA1F07EA1E03001C1380EB01C0A6 -EB0380001E1300EA1F0EEA1DFCEA0CF81217809614>II<137EA2130EA5 -EA07CEEA0FFEEA1C3EEA301EEA700E12E0A61270EA301EEA383E381FEFC0EA07CF12177F -9614>II<13FCEA01FEEA038EEA07041300A3EA7FFE12FF -EA0700ACEAFFF8A20F177F9614>II<12FCA2121CA51378EA1DFEEA1F86EA1E07121CAA38FF8F -E0A21317809614>I<1206120FA21206C7FCA4B4FCA21207ACEAFFF8A20D187C9714>I<12 -FCA2121CA5EBFF80A2EB1C005B5B5BEA1DC0EA1FE0A2EA1E70EA1C38133C131C7F38FF1F -80A21117809614>107 DIIIIIIII<1206120EA4EA7FFC12FFEA0E00A8130EA3131CEA07F8EA01F00F -157F9414>II<38FE3F80A2383C -1E00EA1C1CA36C5AA3EA0630EA0770A36C5AA311107F8F14>I<38FE3F80A238700700EA -380EA3EA39CEA3EA1B6C121AA3EA1E7CA2EA0E3811107F8F14>II<38FE -3F80A2381C0E005BA2120E5BA212071330A2EA0370A25B1201A25BA3485A12730077C7FC -127E123C11187F8F14>I E /Fh 30 122 df<903803F07C90381E0DC69038380F0FEB70 -1E01E0130EEC0C003801C01CA548485A007FB512C03903803800A448485AA6000E5BA648 -485A001E7F38FF8FFC20207E9F1B>11 DI45 D<0007B512FC3900F8007C0178131C150C5B1504 -A414043901E00800A31438EBFFF8EBE0383803C010A4EC00081510485AA21520A2156015 -C0380F00011407B612801E1F7E9E1F>69 D<0007B512F83900F800780178133815185B15 -08A53901E00800A314181438EBFFF83803C0301410A491C7FC485AA648C8FC7FEAFFFC1D -1F7E9E1E>I<3807FF803800F8001378A25BA6485AA6485AA6485AA648C7FC7FEAFFF011 -1F7E9E10>73 D<3807FFE0D800FCC7FC1378A25BA6485AA6485AA41580EC0100EA0780A2 -5C14021406140E380F001E147CB512FC191F7E9E1C>76 D78 -DI<3807FFFE3900F80780 -90387801E0EC00F05B15F8A415F03801E00115E0EC03C0EC0780EC1E00EBFFF03803C038 -80141E140EA2140F48485AA51502D80F001304EB800F39FFF00788C7EA01F01F207E9E21 ->82 DI<39FFF001FE391F8000F86CC712 -601540A215807F0007EB0100A214021406EBC00400035BA25CA26C6C5AA25CA26D5A1200 -01F1C7FC13F2A213FC137C1378A21370A213201F207A9E22>86 D97 D<1207123F120F7EA2120EA65A137CEA1D83381E0180001C13C0EB -00E05A14F0A5387001E0A214C013031480EB0700EAE80EEACC38EA83E014207B9F19>I< -13FEEA0383380E0780121C0038130090C7FC12785AA45AA37E5BEA70026C5AEA1C18EA07 -E011147D9314>I<1438EB01F8EB00781438A21470A614E013FCEA0382EA0601121CEA3C -00383801C0127812F0A438E00380A412F0EA700738380F00381C37803807C7E015207D9F -19>I<13F8EA070EEA0E07121C383803801278127012F0A2B5FC00F0C7FC5AA46C5AEA70 -02EA3004EA1C18EA07E011147D9314>I<140EEB3E11EBE1A33801C1C2380381E0EA0780 -1301120FA3380703C01480EB8700EA04FC48C7FCA21218121CEA0FFF14C014E0381800F0 -4813305A5AA3006013606C13C0381C0700EA07FC181F809417>103 -D<13E0120712011200A2485AA6485AEB8F80EB90E013A0EBC0601380000713E01300A538 -0E01C0A6381C0380001E13C038FF8FF014207E9F19>I<13C0EA01E01203A2EA01C0C7FC -A6EA0380121F12071203A2EA0700A6120EA65A121EEAFF800B1F7F9E0C>I<13E0120712 -011200A2485AA6485AEB81FCEB80F014C0EB81801400EA07045B13181338137C131C120E -7FA2130F7F1480EA1C03381E07C038FF8FF016207E9F18>107 D<13E0120712011200A2 -EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B207F9F0C>I<390387C07C391F98 -61863907A072073903C03403EB80380007EB7807EB0070A5000EEBE00EA64848485A001E -EBE01E3AFFCFFCFFC022147E9326>I<38038F80381F90E0EA07A03803C0601380000713 -E01300A5380E01C0A6381C0380001E13C038FF8FF014147E9319>I<13FCEA0387380E01 -80381C00C04813E0A24813F012F0A438E001E0A214C0130300F0138038700700EA380E6C -5AEA07E014147D9317>I114 D -I<1380EA0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840EA0F800D1C -7C9B12>I<38FF83F8381E00E0001C13C01480121E380E01005B13025B12075BA25BEA03 -9013A013E05B5B120190C7FC15147C9318>118 D<390FF83F803901E00E00EBC00C1408 -13E000005B143014205C13705CA20171C7FC1339133A133E133C133813181310A25BA25B -EA70C0EAF08000F1C8FC12E61278191D809318>121 D E /Fi 1 -59 df<127012F8A3127005057C840D>58 D E /Fj 8 117 df<1238127C12FEA3127C12 -381200A61238127C12FEA3127C123807147D930D>58 D69 D<39FFC007FEA2390FE000607FEA0DF8A2EA0CFC137EA27F -EB1F80EB0FC0A2EB07E0EB03F014F81301EB00FC147EA2143FEC1FE0140FA214071403A2 -14011400D8FFC01360A21F1F7E9E24>78 DI<007F -B512C0A2387C1F830070138100601380A200E014E000C01460A400001400B13807FFFEA2 -1B1E7E9D20>84 D101 -D111 D<1203A45AA25AA2123FEAFFF8A2EA1F00AA13 -0CA5EA0F98EA07F0EA03E00E1D7F9C12>116 D E /Fk 64 123 df<903901FF81FE010F -EBEFFF903A7F81FF8F80D9FE01EB1FC03901F803FE000314FCEA07F0EE0F80020190C7FC -A7B712F0A32707F001FCC7FCB3A33A7FFF1FFFE0A32A2A7FA927>11 -D<49B4FC011F13C090387F81E0EBFC013901F807F01203EA07F0A4EC01C091C8FCA3EC3F -F8B6FCA33807F003B3A33A7FFF3FFF80A3212A7FA925>I<1306130C13181338137013E0 -1201EA03C0A2EA0780A2120F13005AA2123EA3127EA3127CA212FCAE127CA2127EA3123E -A37EA27E13801207A2EA03C0A2EA01E01200137013381318130C13060F3C7AAC1A>40 -D<12C012607E12387E7E120FEA0780A2EA03C0A213E0120113F0A2EA00F8A313FCA3137C -A2137EAE137CA213FCA313F8A3EA01F0A213E0120313C0A2EA0780A2EA0F00120E5A5A12 -305A5A0F3C7CAC1A>I45 D<121C127FA2EAFF80A3EA7F00A212 -1C09097B8813>I48 D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277B -A622>III<140FA25C5C5C5C5B -A2EB03BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0 -B612F8A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C -14C091C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0 -A21218127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B -277DA622>II<1238123E003FB512F0A34814E015C0158015003870000EA25C485B5C5CC648 -5AA2495A130791C7FC5B5B131E133EA2137E137CA213FCA41201A76C5A13701C297CA822 ->III<48B4FC000F13E0381E03F0383801F8387800FC00FC -13FE7EA3127C003813FCEA0001EB03F8EB07E0EB0FC01480EB1E00A25B1338A25BA790C7 -FCA5137013F8487E487EA36C5A6C5A1370172A7CA920>63 D65 DI<91387FE003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F4848 -147F4848143F4848141F485A160F485A1607127FA290C9FC5AA97E7F1607123FA26C7E16 -0E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F090397FF007C0011FB512800107EBFE00 -9038007FF028297CA831>IIII<91387FE003903907FFFC07011FEBFF0F90 -397FF00F9F9039FF0001FFD801FC7F484880484880484880485A82485A82127FA290CAFC -5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E6C7E6C7E6CB45B90387FF007011F -B5129F0107EBFE0F9039007FF0032D297CA835>III75 DIIIIIII<9038FF80600003EBF0E0000F13F8381F80FD383F001F00 -3E1307481303A200FC1301A214007EA26C140013C0EA7FFCEBFFE06C13F86C13FE800007 -14806C14C0C6FC010F13E0EB007FEC1FF0140F140700E01303A46C14E0A26C13076C14C0 -B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA825>I<007FB71280A39039807F -807FD87C00140F00781507A20070150300F016C0A2481501A5C791C7FCB3A490B612C0A3 -2A287EA72F>IIII<3B7F -FFF01FFFE0A3000190C7EAF0006C6D485A02C05B017F13036D6C485AD91FF090C7FC5D90 -380FF81E6D6C5A1538903803FE786D6C5A5D6D5B147F6E7EA26E7E81143F81EC7BFEECF3 -FFEB01E102C07F01036D7EEB078049486C7E010E6D7E131E496D7E01386D7E498001F013 -0348486D7EB5013F13FCA32E297EA833>I<3803FF80000F13F0381F01FC383F80FE147F -801580EA1F00C7FCA4EB3FFF3801FC3FEA0FE0EA1F80EA3F00127E5AA4145F007E13DF39 -3F839FFC381FFE0F3803FC031E1B7E9A21>97 DIIIII<9038FF80F00003EBE3F8390FC1FE1C391F007C7C48137E003EEB3E10 -007EEB3F00A6003E133E003F137E6C137C380FC1F8380BFFE00018138090C8FC1238A212 -3C383FFFF814FF6C14C06C14E06C14F0121F383C0007007CEB01F8481300A4007CEB01F0 -A2003FEB07E0390FC01F806CB5120038007FF01E287E9A22>III107 DI<26FFC07FEB1FC0 -903AC1FFC07FF0903AC307E0C1F8D80FC49038F101FC9039C803F20001D801FE7F01D05B -A201E05BB03CFFFE3FFF8FFFE0A3331B7D9A38>I<38FFC07E9038C1FF809038C30FC0D8 -0FC413E0EBC80701D813F013D0A213E0B039FFFE3FFFA3201B7D9A25>II< -38FFE1FE9038EFFF809038FE0FE0390FF803F09038F001F801E013FC140015FEA2157FA8 -157E15FEA215FC140101F013F89038F807F09038FC0FE09038EFFF809038E1FC0001E0C7 -FCA9EAFFFEA320277E9A25>I<38FFC1F0EBC7FCEBC63E380FCC7F13D813D0A2EBF03EEB -E000B0B5FCA3181B7F9A1B>114 D<3803FE30380FFFF0EA3E03EA7800127000F01370A2 -7E00FE1300EAFFE06CB4FC14C06C13E06C13F0000713F8C6FCEB07FC130000E0137C143C -7E14387E6C137038FF01E038E7FFC000C11300161B7E9A1B>I<13E0A41201A31203A212 -07120F381FFFE0B5FCA2380FE000AD1470A73807F0E0000313C03801FF8038007F001426 -7FA51A>I<39FFE07FF0A3000F1307B2140FA2000713173903F067FF3801FFC738007F87 -201B7D9A25>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0A2EBFC0300011480 -EBFE070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A -23>I<3BFFFC7FFC1FFCA33B0FE00FE001C02607F007EB0380A201F8EBF00700031600EC -0FF801FC5C0001150EEC1FFC2600FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A -16F0ECE01F011F5CA26D486C5AA2EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907 -F003803803F8079038FC0F003801FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F49 -7EEB3CFEEB38FFEB787F9038F03F803901E01FC0D803C013E0EB800F39FFF03FFFA3201B -7F9A23>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE -070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA213070038 -90C7FCEA7C0FEAFE0E131E131C5BEA74F0EA3FE0EA0F8020277F9A23>I<003FB5FCA2EB -00FEEA3C01383803FC007813F8EB07F0EA700F14E0EB1FC0EA003F1480EB7F005B5B3801 -FC07120313F8EA07F0000F130F13E0381FC00E003F131E387F803EEB00FEB5FCA2181B7E -9A1E>I E /Fl 68 123 df<127012F8B012701200A5127012F8A31270051C779B18>33 -DI -I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F -6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F -F8EA07E0EA01C0A3120011247D9F18>I38 DI<137013F0EA01E0EA03C0EA0780EA0F00121E121C5AA25AA45AA81270 -A47EA27E121E7EEA0780EA03C0EA01F0120013700C24799F18>I<126012F012787E7E7E -EA07801203EA01C0A2EA00E0A41370A813E0A4EA01C0A2EA03801207EA0F00121E5A5A5A -12600C247C9F18>II<136013F0A7387FFFC0B5 -12E0A26C13C03800F000A7136013147E9718>I<121C123E127E127F123F121F1207120E -121E127C12F81260080C788518>I<387FFFC0B512E0A26C13C013047E8F18>I<12301278 -12FCA2127812300606778518>I<1303EB0780A2130F14005B131EA2133E133C137C1378 -A213F85B12015B12035BA212075B120F90C7FCA25A121E123E123CA2127C127812F85AA2 -126011247D9F18>IIIII<383FFF80A30038C7FCA8EA3BF8EA3FFE7F383C0780383003C0EA0001 -EB00E0A2126012F0A238E001C0EA7003387C0F80383FFF00EA1FFCEA03F0131C7E9B18> -53 D<12E0B512E0A214C038E00380EB0700C65A131E131C5BA25B13F05BA2485AA3485A -A448C7FCA7131D7E9C18>55 D<1230127812FCA2127812301200A81230127812FCA21278 -12300614779318>58 D<126012F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB -07E0A2EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FC5A126013187E9918> -62 D<137CEA01FEEA07FF380F8780381E03C0EA3C1DEA387F3870FFE0EA71E313C112E1 -EAE380A638E1C1C0127113E33870FF8038387F00EA3C1C381E00E0EA0F833807FFC00001 -138038007E00131C7E9B18>64 D<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707A5 -380FFF80A3EA0E03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>I67 DIII<3801F1C0EA03FDEA0FFFEA1F0FEA1C03123813011270A2 -90C7FC5AA5EB0FF0131F130F387001C0A213031238A2EA1C07EA1F0FEA0FFFEA03FDEA01 -F1141C7E9B18>I -73 D76 D<38FC01F8EAFE03A2383B -06E0A4138EA2EA398CA213DCA3EA38D8A213F81370A21300A638FE03F8A3151C7F9B18> -I<387E07F038FF0FF8387F07F0381D81C0A313C1121CA213E1A313611371A213311339A3 -1319A2131D130DA3EA7F07EAFF87EA7F03151C7F9B18>III82 D<3803F1C0EA1FFF5AEA7C0FEA7003EAE001A390C7FC12701278123FEA1FF0EA -07FEC67EEB0F80EB03C01301EB00E0A2126012E0130100F013C038F80780B5FCEBFE00EA -E7F8131C7E9B18>I<387FFFF8B5FCA238E07038A400001300B2EA07FFA3151C7F9B18>I< -38FF83FEA3381C0070B36C13E0EA0F01380783C03803FF806C1300EA007C171C809B18> -I<38FE03F8EAFF07EAFE03383C01E0001C13C0A3EA1E03000E1380A438070700A4EA038E -A4EA018C13DCA3EA00D813F8A21370151C7F9B18>I91 D93 -D97 D<127E12FE127E120EA5133EEBFF80 -000F13C0EBC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E13803806 -3E00151C809B18>IIIII<3801E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA1E1EEA1FFC -5BEA39E00038C7FC7EEA1FFEEBFFC04813E0387801F038700070481338A4007813F0EA7E -03381FFFC06C13803801FC00151F7F9318>I<127E12FE127E120EA5133EEBFF80000F13 -C013C1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC171C809B18>II<1338137CA313381300 -A4EA0FFCA3EA001CB3A4EA6038EAF078EAFFF0EA7FE0EA3F800E277E9C18>I<127E12FE -127E120EA5EB3FF0A3EB0780EB0F00131E5B5B5BEA0FF87F139C130EEA0E0F7FEB038014 -C0387FC7F812FF127F151C7F9B18>II<38F9 -C1C038FFF7F013FF383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318> -IIII<3801F380EA07FBEA1FFFEA3E1FEA380FEA -7007A2EAE003A6EA7007A2EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB3FF8 -EB1FF0151E7E9318>I<38FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FCA9EA -FFFC7F5B14147E9318>II<487E12 -03A4387FFFC0B5FCA238038000A9144014E0A33801C1C013FF6C1380EB3E0013197F9818 ->I<387E07E0EAFE0FEA7E07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC17148093 -18>I<387F8FF000FF13F8007F13F0381C01C0380E0380A338070700A3138FEA038EA3EA -01DCA3EA00F8A2137015147F9318>I<38FF07F8138F1307383800E0A4381C01C0137113 -F9A213D9EA1DDD000D1380A3138DEA0F8FA23807070015147F9318>I<387F8FF0139F13 -8F380F0700EA078EEA039EEA01DC13F81200137013F07FEA01DCEA039E138EEA0707000E -1380387F8FF000FF13F8007F13F015147F9318>I<387F8FF000FF13F8007F13F0380E01 -C0EB0380A21207EB0700A2EA0387A2138EEA01CEA213CC120013DC1378A31370A313F05B -1279EA7BC0EA7F806CC7FC121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB0780 -38000F00131E5B13F8485AEA03C0485A380F0070121E5A5AB512F0A314147F9318>I -E /Fm 52 123 df<91393FFC07F80103B5EA3FFE903A0FF807FF0F903B3FC003FC1F8090 -3B7F0007F83FC001FE130F000115F05B0003EE1F80EF060094C7FCA8B812F0A32803FC00 -0FF0C7FCB3A8267FFFE1B512C0A332327FB12F>11 D<14C01301EB0380EB0700130E5B13 -3C5B13F85B1201485AA2485AA2120F5B121FA290C7FC5AA35AA2127EA412FEAE127EA412 -7FA27EA37E7FA2120F7F1207A26C7EA26C7E12007F13787F131C7F7FEB0380EB01C01300 -124878B51F>40 D<124012E012707E7E7E120F6C7E7F12037F6C7EA26C7EA27F137C137E -A2133E133FA31480A2131FA414C0AE1480A4133FA21400A3133E137EA2137C13FC5BA248 -5AA2485A5B12075B48C7FC120E5A5A5A5A124012487CB51F>I -45 D49 DII<157015F0140114031407140FA2141F143F147714F714E7EB01C7EB0387EB07 -07130F130E131C1338137013F013E0EA01C0EA0380EA07005A120E5A5A5A5AB712E0A3C7 -380FF000A9010FB512E0A3232E7EAD28>I<000C1430390FC007F090B512E015C0158015 -005C14F85C1480000EC8FCA8EB1FF0EBFFFE390FE03F809038000FC0000EEB07E0000C14 -F0C713F8140315FCA215FEA21218123E127F5AA215FCA25A0078EB07F815F06CEB0FE06C -EB1FC0390FC07F806CB51200000113FC38003FE01F2E7CAD28>I<14FF010713E0011F7F -90387F80F89038FE003CD801F8137C484813FE00071301EA0FE0A2EA1FC0003F6D5A1578 -92C7FC485AA338FF83FC90388FFF8090389C0FC09038B003F06E7E01E07F01C07F140081 -A2491480A4127FA4003F15007F121F5D000F495AEA07E06C6C485A3901FC0FE06CB55A01 -3F90C7FCEB0FFC212E7DAD28>I<1238123E003FB612C0A316804815005D5D5D0078C712 -3800705C5D00F0495A48495A4AC7FCA2C7120E5C5C1478147014F0495AA213035C1307A2 -130FA2131F5CA2133FA4137FA86DC8FC131E22307CAF28>II<1578A215FCA34A7E -A24A7EA24A7FA34A7FEC0E7F021E7FEC1C3FA202387F151F02787FEC700FA202E07F1507 -010180ECC003A249486C7EA201078191C7FC498191B6FCA24981011CC7123F013C810138 -141FA24981160F01F081491407A2484881486C1403B549B512FCA336317DB03D>65 -DI<913A03FF800180023F -EBF00349B5EAFC0701079038003F0FD91FF8EB079FD93FC0EB01FFD9FF807F4848C8127F -4848153F0007161F49150F485A001F1607A2485A1703127FA24992C7FCA212FFA9127FA2 -7FEF0380123FA26C7E1707000F17006C7E6D150E0003161E6C6C151C6C6C6C1478D93FC0 -5CD91FF8EB03E0D907FFEB3F800101D9FFFEC7FCD9003F13F80203138031317CB03A>I< -B812F0A3C6903880003FEE07F816031600A21778A21738A3171C1507A31700A25D5D5D91 -B5FCA3EC803F818181A21707A392C7120EA4171EA2173CA2177C17FC16011607163FB812 -F8A330317EB035>69 DI< -DA03FF1303027FEBF00749B5EAFC0F01079038007E1FD91FF0EB0FBFD97FC0EB03FF4948 -7F4848C87E485A0007824848815B001F82A2484881A2127FA24992C7FC12FFAA0307B512 -F8127F7FDB00011300123FA26C7EA2120F7F6C7E12036C7E6C6C7E6D6C5BD91FF8497ED9 -07FFEB3E3F01019038FFFC1F6D6CEBF00F0203EB800335317CB03F>I73 D75 -DI78 D80 D82 D<90391FF8018090B51203000314C73907F0 -07EF390F8000FF48C7127F003E141F150F5A150712FCA215037EA26C91C7FC13C0EA7FF0 -EBFF806C13F8ECFF806C14F06C806C806C14FFC6FC013F1480010114C0D9001F13E01401 -EC003FED1FF0150F1507126000E01403A316E07EA26CEC07C07EB4EC0F8001C0EB1F00D8 -FBFC13FE00F1B512F8D8E03F5BD8C003138024317CB02D>I<007FB8FCA39039C00FF801 -D87E00EC003F007C82007882A200708200F01780A3481603A5C792C7FCB3AA017FB6FCA3 -31307DAF38>III97 DIIIII<90391FF007C09039FFFE3FE03A01F83F79F03907E00FC300 -0F14E19039C007E0E0001FECF000A2003F80A5001F5CA2000F5CEBE00F00075C2603F83F -C7FC3806FFFE380E1FF090C9FC121EA2121F7F90B57E6C14F015FC6C806C801680000F15 -C0003FC7127F007EEC1FE0007C140F00FC1407A4007EEC0FC0003E1580003F141FD80FC0 -EB7E003907F803FC0001B512F0D8001F90C7FC242F7E9F28>III107 -DI<2703F007F8EB1FE000FFD9 -3FFEEBFFF8913A783F01E0FC02C090388300FE280FF1801FC6137F2607F30013CC01F602 -F8148001FC5CA3495CB3B500C3B5380FFFFCA33E207D9F43>I<3903F007F800FFEB3FFE -EC783F02C013803A0FF1801FC03807F30001F614E013FCA35BB3B500C3B5FCA328207D9F -2D>II<3901F83FE000FFEBFF -FC9038FBE07F9039FF003F80D807FEEB1FC049EB0FE04914F0ED07F8A216FC1503A216FE -A816FC1507A216F8A2ED0FF06D14E06DEB1FC06DEB3F809039FBC0FE009038F8FFF8EC3F -C091C8FCABB512C0A3272E7E9F2D>I<3803F03F00FFEB7FC09038F1C3E01487390FF30F -F0EA07F6A29038FC07E0EC03C091C7FCA25BB2B512E0A31C207E9F21>114 -D<3801FF86000713FEEA1F00003C133E48131E140E12F8A36C90C7FCB47E13FC387FFFC0 -6C13F0806C7F00077F00017FEA003F01001380143F0060131F00E0130FA27E15007E6C13 -1E6C131C38FF807838F3FFF038C07F8019207D9F20>I<131CA5133CA3137CA213FC1201 -12031207381FFFFEB5FCA2D803FCC7FCB0EC0380A71201EC0700EA00FEEB7F0EEB3FFCEB -07F0192E7FAD1F>IIII<3A7FFF807FFCA33A03FC000F006C6C131E6C -6C5BEC803890387FC078013F5B90381FE1E090380FF3C0ECFF806D90C7FC6D5A13016D7E -81815B903803DFE09038078FF08190380F07FC90381E03FEEB3C01496C7E4914804848EB -7FC00003EC3FE026FFFC01B5FCA328207F9F2B>II<003FB512F8 -A29038800FF0393E001FE0003C133F003814C00078EB7F8014FFD8700113005C1303495A -00005B130F495A5C495A137F9038FF801C14005A485A5B0007143C485A49133848481378 -003F14F8EBC001387F8007B6FCA21E207E9F24>I E /Fn 3 16 df0 D<14FF010713E090381F00F80178131E01E01307D80180EB018048C812C0000615 -60481530A248151848150CA2481506A4481503A900601506A46C150CA26C15186C1530A2 -6C15606C15C06C6CEB0180D800E0EB07000178131E011F13F8903807FFE0010090C7FC28 -2B7EA02D>13 D15 D E /Fo 83 125 df<90381F83E09038F06E303901C078783803 -80F8903800F03048EB7000A7B612803907007000B2383FE3FF1D20809F1B>11 -D<133FEBE0C0EA01C0380381E0EA0701A290C7FCA6B512E0EA0700B2383FC3FC1620809F -19>II<1270 -12F8A71270AA1220A51200A5127012F8A3127005217CA00D>33 DI<1340A2EA03F0EA -0C4EEA10413820408012600040134038C041C01343A238E04180EB40001270127CEA3FC0 -EA1FF86C7EEA03FEEA007FEB4F801343EB41C0A2EAF040A312801480EA404100201300EA -3042EA0C4CEA03F0EA0040A312257EA117>36 D<127012F812FCA212741204A31208A212 -10A212201240060E7C9F0D>39 D<13401380EA01005A12061204120C5AA212381230A212 -701260A412E0AC1260A412701230A212381218A27E120412067E7EEA008013400A2E7BA1 -12>I<7E12407E12307E1208120C7EA212077EA213801201A413C0AC1380A412031300A2 -5A1206A25A120812185A12205A5A0A2E7EA112>II<127012F012F8A212 -781208A31210A31220A21240050E7C840D>44 DI<127012F8A3 -127005057C840D>I<144014C0EB0180A3EB0300A31306A25BA35BA35BA25BA35BA3485A -A348C7FCA21206A35AA35AA25AA35AA35AA2122D7EA117>II<13801203120F12F31203B3A6EA07C0EAFFFE0F1E7C9D17>III<1306A2130EA2131E132EA2134E138EA2EA010E1202A212041208A212101220A21240 -12C0B512F038000E00A7EBFFE0141E7F9D17>II<137CEA0182EA0701380E0380EA0C071218383803 -0090C7FC12781270A2EAF1F0EAF21CEAF406EAF807EB0380A200F013C0A51270A2148012 -38EB07001218EA0C0E6C5AEA01F0121F7E9D17>I<1240387FFFE014C0A2384000803880 -0100A21302485AA25B5BA25BA21360A213E05B1201A41203A76C5A131F7E9D17>III<127012F8A312701200AA127012F8A3127005147C930D>I< -127012F8A312701200AA127012F012F8A212781208A31210A31220A21240051D7C930D> -I63 D<5B497EA3497EA3EB09E0 -A3EB10F0A3EB2078A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB0780A348EB03C0 -A2120C001E14E039FF801FFE1F207F9F22>65 DI<90380FE0109038381C309038E002703803C00139078000F048C712 -70121E15305A1510127C127800F81400A91278007C1410123CA26C1420A27E6C6C13406C -6C13803900E00300EB380CEB0FF01C217E9F21>III< -B61280380780071401A2140015C01540A4EC2000A3146014E013FF138014601420A391C7 -FCA87FEAFFFE1A1F7F9E1E>I<90380FE0109038381C309038E002703803C00139078000 -F048C71270121E15305A1510127C127800F81400A7EC3FFEEC01F000781300127C123CA2 -7EA27E6C7E3903C001703900E002309038380C1090380FF0001F217E9F24>I<39FFF07F -F8390F000780AD90B5FCEB0007AF39FFF07FF81D1F7E9E22>II<3807FFC038003E00131EB3A3122012F8A3EAF01CEA403CEA6038EA10 -70EA0FC012207F9E17>I<39FFF007FC390F0003E0EC0180150014025C5C5C5C5C5C49C7 -FC5B497E130FEB13C0EB21E01341EB80F0EB0078A28080A280EC0780A2EC03C015E015F0 -39FFF01FFE1F1F7E9E23>IIII -II -82 D<3803F040380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA -3FF86CB4FC00071380C613C0EB1FE013031301EB00F014707EA46C136014E06C13C038F8 -018038C60300EA81FC14217E9F19>I<007FB512E038780F010060EB006000401420A200 -C0143000801410A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0 -EC0080B3A46CEB01001380120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FF -F003FE391F8000F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002 -A213F8EB7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3B -FFF07FF81FF03B1F000FC007C06C903907800180170015C001805C00071502EC09E013C0 -00035DEC19F01410D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C146001 -3C144090383D000F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F> -I<397FF81FF8390FE007C03907C0030000031302EBE0063801F00400005BEBF818EB7810 -6D5AEB3E60EB1E406D5AA213076D7E497E1305EB08F0EB18F8EB1078EB207CEB603EEB40 -1EEB801F3901000F801407000214C000061303001FEB07E039FFC01FFE1F1F7F9E22>I< -39FFF001FF391F800078000F146012076D1340000314807F3901F001001200EBF802EB7C -06EB3C04EB3E08131EEB1F10EB0FB0EB07A014E06D5AACEB3FFC201F7F9E22>I<387FFF -FE387E003C127800701378006013F814F0384001E0130314C0EB07801200EB0F00131EA2 -5B137C13785B1201EBE002EA03C0A2EA0780000F13061300001E1304003E130C123C4813 -3C14FCB5FC171F7E9E1C>I<12FFA212C0B3B3A512FFA2082D7CA10D>II<12FFA21203 -B3B3A512FFA2082D80A10D>I<120812101220A21240A21280A312B812FCA2127C123806 -0E7D9F0D>96 DI<121C12FC121CAA137CEA1D87 -381E0180EB00C0001C13E01470A21478A6147014F014E0001E13C0381A018038198700EA -107C15207E9F19>IIII<137CEA01C6EA030F1207EA0E061300A7EAFFF0EA -0E00B2EA7FE01020809F0E>I<14E03803E330EA0E3CEA1C1C38380E00EA780FA5EA380E -6C5AEA1E38EA33E00020C7FCA21230A2EA3FFE381FFF8014C0383001E038600070481330 -A4006013606C13C0381C03803803FC00141F7F9417>I<121C12FC121CAA137C1386EA1D -03001E1380A2121CAE38FF8FF014207E9F19>I<1218123C127C123C1218C7FCA6121C12 -FC121CB1EAFF80091F7F9E0C>I<13E0EA01F0A3EA00E01300A61370EA07F012001370B3 -A31260EAF06013C0EA6180EA3F000C28829E0E>I<121C12FC121CAAEB1FE0EB0780EB06 -0013045B5B5B136013E0EA1DF0EA1E70EA1C38133C131C7F130F7F148014C038FF9FF014 -207E9F18>I<121C12FC121CB3ABEAFF8009207F9F0C>I<391C3E03E039FCC30C30391D03 -9038391E01E01CA2001C13C0AE3AFF8FF8FF8021147E9326>IIII<3801F04038070CC0EA0E02EA1C03EA3801 -1278127012F0A6127012781238EA1C03EA0C05EA0709EA01F1EA0001A8EB0FF8151D7F93 -18>III<1202A31206A2120EA2123EEAFFF8EA0E00AB1304A5EA0708 -1203EA01F00E1C7F9B12>I<381C0380EAFC1FEA1C03AE1307120CEA061B3803E3F01414 -7E9319>I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A2 -13E4EA00E8A21370A3132015147F9318>I<39FF9FE1FC393C078070391C030060EC8020 -000E1440A214C0D80704138014E0A239038861001471A23801D032143A143E3800E01CA2 -EB6018EB40081E147F9321>I<38FF87F8381E03C0380E0180EB0300EA0702EA0384EA01 -C813D8EA00F01370137813F8139CEA010E1202EA060738040380000C13C0003C13E038FE -07FC16147F9318>I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2 -EA01C4A213E4EA00E8A21370A31320A25BA3EAF080A200F1C7FC1262123C151D7F9318> -II124 -D E /Fp 25 119 df<120FEA3F80EA7FC013E0EAFFF0A213F8A2127FA2123FEA0F381200 -A31370A313E0A2120113C0EA0380A2EA0700120E5A5A12100D1D79BB1B>39 -D45 D67 D69 DII83 D85 DI97 D<903801FFF0010F13FE013FEBFF809039FF801FC03901FE003F4848EB -7FE0485A485A121F4848EB3FC0ED1F80007FEC0F004990C7FCA212FFAA127F7FA2123F6D -14F0121F6C6CEB01E012076C6CEB03C06CB4EB0F806C9038C03F0090383FFFFE010F13F8 -010113C024267DA52B>99 DI<49B47E010F13F0017F13FC9038FF81FE3A03FE007F80D807F8133F -4848EB1FC0ED0FE0485A003F15F01507485A16F8A212FFA290B6FCA301C0C8FCA4127FA3 -6C7E1678121F7F000F15F06C6C13016C6CEB03E06C6CEB0FC03A00FFC07F8090393FFFFE -00010F13F8010013C025267DA52C>I<13FE12FFA412071203B0EDFF80020313F0020F7F -91381E03FC91383801FE02607F4A7E01FF15805C91C7FCA35BB3A4B5D8F83F13FEA42F3C -7CBB36>104 DI<13FE12FFA412071203B3B3AEB512F8A4 -153C7DBB1A>108 DII<903801FFC0010F13F8017F13FFD9FF807F3A -03FE003FE0D807F8EB0FF048486D7EA248486D7E003F81A248486D7EA400FF1680A9007F -1600A36C6C495AA2001F5D6D1307000F5D6C6C495AD803FEEB3FE03A00FF80FF806DB5C7 -FC010F13F8010113C029267DA530>I<9038FE01FF00FF011F13F0027F13FC9138FC07FE -9039FFF001FF00079039C0007F806C90C7EA3FC04915E0EE1FF017F8160F17FCA2160717 -FEA917FC160FA317F8EE1FF0A26DEC3FE06EEB7FC06EEBFF806E4813009039FEFC07FE91 -387FFFF8021F13E0DA03FEC7FC91C9FCADB512F8A42F377DA536>I<3901FC03F000FFEB -0FFC4AB4FC91383C3F80EC707F00079038E0FFC000035BEBFD80A201FFEB7F809138003F -00151E92C7FC5BB3A3B512FCA422267DA528>114 D<90383FF0383903FFFE7848EBFFF8 -381FC00F383F0003003E13005A157812FCA27E6C140013C013FC387FFFF06C13FEECFF80 -6C14C06C14E0000314F0C614F8011F13FCEB007FEC07FE0070130100F01300157E7EA27E -157C6C14FC6C14F890388001F09038F00FE000F9B512C0D8F07F130038C01FF81F267DA5 -26>I<130FA55BA45BA25BA25B5A5A5A001FEBFFF0B6FCA3000190C7FCB3153CA86C1478 -1480017F13F090383FC1E090381FFFC06D1380903801FE001E377EB626>I<01FEEC3F80 -00FFEC3FFFA400071401000380B3A45DA25D120115066C6C4913C090267F807813FE6DB4 -5A6D5B010313802F267CA536>II E end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 300dpi -TeXDict begin -%%PaperSize: a4 -%%BeginPaperSize: a4 -a4 -%%EndPaperSize - -%%EndSetup -%%Page: 1 1 -1 0 bop 700 942 a Fp(Us)r(er's)33 b(Guid)n(e)933 1067 -y(t)o(o)161 1191 y(p)s(cl-cvs)g(-)g(t)l(h)m(e)f(Em)n(acs)f(F)-8 -b(ron)m(t-En)m(d)31 b(t)o(o)h(CVS)703 1378 y Fo(rele)q(as)q(e)16 -b(1.05-CVS-$Nam)o(e:)i($)827 1627 y(P)o(er)d(Ce)q(d)o(erqvi)q(st)721 -1876 y(last)g(up)q(d)o(a)o(t)o(e)q(d)h(20)f(No)o(v)f(1995)p -eop -%%Page: 2 2 -2 1 bop 0 1814 a Fo(Co)o(p)o(yr)q(igh)o(t)226 1813 y(c)213 -1814 y Fn(\015)16 b Fo(1992)e(P)o(er)h(Ce)q(d)o(erqvi)q(st)0 -1951 y(P)o(ermi)q(s)q(s)q(ion)e(i)q(s)g(gran)o(t)o(e)q(d)f(t)o(o)h(m)o -(ak)o(e)f(an)o(d)h(di)q(str)q(ibu)o(t)o(e)h(v)o(erba)o(t)o(im)f(co)o -(pie)q(s)h(of)f(t)n(hi)q(s)g(m)o(an)n(ual)g(pro)o(vid)o(e)q(d)i(t)n(h)o -(e)e(co)o(p)o(yr)q(igh)o(t)0 2014 y(not)o(ice)i(an)o(d)g(t)n(hi)q(s)h -(p)q(ermi)q(s)q(s)q(ion)f(not)o(ice)g(are)g(pre)q(s)q(erv)o(e)q(d)h(on) -f(all)h(co)o(pie)q(s.)0 2151 y(P)o(ermi)q(s)q(s)q(ion)e(i)q(s)h(gran)o -(t)o(e)q(d)f(t)o(o)g(co)o(p)o(y)h(an)o(d)f(di)q(str)q(ibu)o(t)o(e)i(mo) -q(di\014e)q(d)g(v)o(ers)q(ions)f(of)g(t)n(hi)q(s)f(m)o(an)n(ual)i(u)o -(n)o(d)o(er)g(t)n(h)o(e)e(con)o(dit)o(ions)0 2213 y(for)21 -b(v)o(erba)o(t)o(im)g(co)o(p)o(yin)o(g,)j(pro)o(vid)o(e)q(d)f(also)f(t) -n(h)o(a)o(t)e(t)n(h)o(e)i(s)q(ect)o(ion)g(en)o(t)o(it)n(le)q(d)h(\\GNU) -e(Gen)o(eral)h(Pu)n(b)o(lic)i(Licens)q(e")f(i)q(s)0 2275 -y(includ)o(e)q(d)16 b(exact)n(ly)d(as)f(in)h(t)n(h)o(e)g(or)q(igin)o -(al,)g(an)o(d)f(pro)o(vid)o(e)q(d)i(t)n(h)o(a)o(t)e(t)n(h)o(e)g(en)o(t) -o(ire)h(re)q(sul)o(t)o(in)o(g)h(d)o(er)q(iv)o(e)q(d)g(w)o(or)o(k)e(i)q -(s)h(di)q(str)q(ibu)o(t)o(e)q(d)0 2337 y(u)o(n)o(d)o(er)j(t)n(h)o(e)g -(t)o(erms)e(of)h(a)g(p)q(ermi)q(s)q(s)q(ion)g(not)o(ice)g(id)o(en)o(t)o -(ical)i(t)o(o)e(t)n(hi)q(s)g(on)o(e.)0 2474 y(P)o(ermi)q(s)q(s)q(ion)20 -b(i)q(s)h(gran)o(t)o(e)q(d)e(t)o(o)h(co)o(p)o(y)g(an)o(d)h(di)q(str)q -(ibu)o(t)o(e)g(transla)o(t)o(ions)f(of)g(t)n(hi)q(s)g(m)o(an)n(ual)h -(in)o(t)o(o)g(anot)n(h)o(er)f(lan)o(guage,)0 2537 y(u)o(n)o(d)o(er)g(t) -n(h)o(e)e(a)o(b)q(o)o(v)o(e)g(con)o(dit)o(ions)h(for)e(mo)q(di\014e)q -(d)j(v)o(ers)q(ions,)f(except)g(t)n(h)o(a)o(t)e(t)n(h)o(e)i(s)q(ect)o -(ion)f(en)o(t)o(it)n(le)q(d)i(\\GNU)e(Gen)o(eral)0 2599 -y(Pu)n(b)o(lic)i(Licens)q(e")e(an)o(d)g(t)n(hi)q(s)g(p)q(ermi)q(s)q(s)q -(ion)f(not)o(ice)h(m)o(ay)f(b)q(e)g(includ)o(e)q(d)k(in)e(transla)o(t)o -(ions)e(ap)o(pro)o(v)o(e)q(d)g(b)o(y)g(t)n(h)o(e)h(F)l(ree)0 -2661 y(Soft)o(w)o(are)c(F)l(ou)o(n)o(d)o(a)o(t)o(ion)h(inst)o(e)q(ad)g -(of)g(in)h(t)n(h)o(e)f(or)q(igin)o(al)h(En)o(gli)q(sh.)p -eop -%%Page: 1 3 -1 2 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(1:)20 b(Inst)o(alla)o(t)o(ion) -1475 b(1)0 183 y Fm(1)41 b(Inst)n(alla)n(t)n(ion)62 383 -y Fo(Thi)q(s)18 b(s)q(ect)o(ion)f(d)o(e)q(scr)q(ib)q(e)q(s)i(t)n(h)o(e) -e(inst)o(alla)o(t)o(ion)h(of)e(p)q(cl-cvs,)j(t)n(h)o(e)e(GNU)g(Em)o -(acs)g(CVS)h(f)q(ron)o(t-en)o(d.)25 b(Y)l(ou)17 b(sh)o(ould)0 -446 y(inst)o(all)e(not)f(only)g(t)n(h)o(e)g(eli)q(sp)i(\014le)q(s)f(t)n -(h)o(ems)q(elv)o(e)q(s,)f(bu)o(t)h(also)f(t)n(h)o(e)g(on-lin)o(e)h(do)q -(cu)o(m)o(en)o(t)o(a)o(t)o(ion)f(so)g(t)n(h)o(a)o(t)f(y)o(our)g(us)q -(ers)h(will)0 508 y(kno)o(w)f(h)o(o)o(w)g(t)o(o)h(us)q(e)g(it.)19 -b(Y)l(ou)14 b(can)g(cre)q(a)o(t)o(e)f(t)o(yp)q(e)q(s)q(et)g(do)q(cu)o -(m)o(en)o(t)o(a)o(t)o(ion)h(f)q(rom)e(t)n(h)o(e)i(\014le)h(`)p -Fl(pcl-cvs.texinfo)p Fo(')c(as)i(w)o(ell)0 570 y(as)19 -b(an)g(on-lin)o(e)i(info)e(\014le.)33 b(Th)o(e)19 b(fo)o(llo)o(win)o(g) -i(st)o(ep)q(s)d(are)h(also)g(d)o(e)q(scr)q(ib)q(e)q(d)i(in)f(t)n(h)o(e) -f(\014le)h(`)p Fl(INSTALL)p Fo(')e(in)i(t)n(h)o(e)f(source)0 -632 y(direct)o(ory)l(.)0 880 y Fk(1.1)33 b(Inst)n(alla)n(t)n(ion)17 -b(of)d(t)m(h)n(e)i(p)r(cl-cvs)g(program)25 1020 y Fo(1.)29 -b(P)o(o)q(s)q(s)q(ib)o(ly)13 b(e)q(dit)g(t)n(h)o(e)g(\014le)h(`)p -Fl(Makefile)p Fo(')c(t)o(o)j(re\015ect)g(t)n(h)o(e)f(s)q(it)o(ua)o(t)o -(ion)g(a)o(t)g(y)o(our)h(s)q(it)o(e.)18 b(W)l(e)13 b(say)f -Fl(")p Fo(p)q(o)q(s)q(s)q(ib)o(ly)p Fl(")h Fo(b)q(eca)n(us)q(e)90 -1082 y(t)n(h)o(e)k(v)o(ers)q(ion)f(of)g(p)q(cl-cvs)j(includ)o(e)q(d)g -(wit)n(h)e(CVS)g(us)q(e)q(s)g(a)f(con\014gura)o(t)o(ion)h(m)o(ec)o(h)o -(ani)q(sm)f(in)o(t)o(egra)o(t)o(e)q(d)g(wit)n(h)h(t)n(h)o(e)90 -1144 y(o)o(v)o(erall)e(m)o(ec)o(h)o(ani)q(sms)e(us)q(e)q(d)i(b)o(y)f(t) -n(h)o(e)h(CVS)f(build)i(an)o(d)e(inst)o(all)i(pro)q(ce)q(d)o(ure)q(s.)k -(Th)n(us)15 b(t)n(h)o(e)f(\014le)h Fl(Makefile)e Fo(will)90 -1207 y(b)q(e)j(gen)o(era)o(t)o(e)q(d)g(a)n(u)o(t)o(om)o(a)o(t)o(ically) -h(f)q(rom)f(t)n(h)o(e)g(\014le)h Fl(Makefile.in)p Fo(,)e(an)o(d)h(it)h -(sh)o(ould)g(not)f(b)q(e)g(n)o(ece)q(s)q(sary)g(t)o(o)g(e)q(dit)90 -1269 y(it)f(furt)n(h)o(er.)90 1346 y(If)i(y)o(ou)g(do)g(h)o(a)o(v)o(e)g -(t)o(o)g(e)q(dit)h(t)n(h)o(e)f(`)p Fl(Makefile)p Fo(',)e(t)n(h)o(e)j -(only)f(t)n(hin)o(gs)h(y)o(ou)f(h)o(a)o(v)o(e)g(t)o(o)g(c)o(h)o(an)o -(ge)g(i)q(s)g(t)n(h)o(e)g(d)o(e\014nit)o(ion)i(of)90 -1409 y Fl(lispdir)11 b Fo(an)o(d)h Fl(infodir)p Fo(.)18 -b(Th)o(e)11 b(eli)q(sp)j(\014le)q(s)f(will)g(b)q(e)f(co)o(pie)q(d)h(t)o -(o)f Fl(lispdir)p Fo(,)f(an)o(d)h(t)n(h)o(e)g(info)g(\014le\(s\))h(t)o -(o)e Fl(infodir)p Fo(.)25 1486 y(2.)29 b(Con\014gure)15 -b(p)q(cl-cvs.el)90 1563 y(Th)o(ere)j(are)g(a)g(coup)o(le)i(of)e(pa)o(t) -n(hn)o(am)o(e)q(s)g(t)n(h)o(a)o(t)g(y)o(ou)g(h)o(a)o(v)o(e)f(t)o(o)h(c) -o(h)o(ec)o(k)h(t)o(o)f(m)o(ak)o(e)f(sure)i(t)n(h)o(a)o(t)e(t)n(h)o(ey)h -(m)o(a)o(t)o(c)o(h)f(y)o(our)90 1626 y(syst)o(em.)i(Th)o(ey)c(ap)o(p)q -(e)q(ar)f(e)q(arly)h(in)h(t)n(h)o(e)g(\014le)g(`)p Fl(pcl-cvs.el)p -Fo('.)90 1703 y Fj(NOTE:)f Fo(If)i(y)o(our)g(syst)o(em)f(i)q(s)h(ru)o -(nnin)o(g)h(em)o(acs)f(18.57)e(or)h(e)q(arlier)i(y)o(ou)e(MUST)g(u)o -(ncomm)o(en)o(t)h(t)n(h)o(e)g(lin)o(e)h(t)n(h)o(a)o(t)90 -1765 y(says:)210 1832 y Fl(\(setq)23 b(delete-exited-processes)e(nil\)) -90 1910 y Fo(Set)n(t)o(in)o(g)13 b Fl(delete-exited-processes)d -Fo(t)o(o)i Fl(nil)g Fo(w)o(or)o(ks)g(arou)o(n)o(d)g(a)g(bug)h(in)g(em)o -(acs)g(t)n(h)o(a)o(t)e(ca)n(us)q(e)q(s)i(it)g(t)o(o)f(d)o(u)o(mp)90 -1972 y(core.)20 b(Th)o(e)15 b(bug)g(w)o(as)g(\014xe)q(d)h(in)g(em)o -(acs)f(18.58.)25 2049 y(3.)29 b(Rele)q(as)q(e)16 b(1.05)e(an)o(d)i(la)o -(t)o(er)f(of)g(p)q(cl-cvs)h(require)q(s)h(part)o(s)e(of)g(t)n(h)o(e)g -(Elib)i(library)l(,)f(v)o(ers)q(ion)g(1.0)e(or)h(la)o(t)o(er.)20 -b(Elib)d(i)q(s)90 2111 y(a)o(v)m(aila)o(b)o(le)g(via)e(anon)o(ymous)f -(ft)o(p)g(f)q(rom)g(prep.ai.mit.e)q(d)o(u)h(in)h(`)p -Fl(pub/gnu/elib-1.0.tar)o(.gz)p Fo(',)11 b(an)o(d)k(f)q(rom)e(a)90 -2174 y(lot)i(of)g(ot)n(h)o(er)g(s)q(it)o(e)q(s)g(t)n(h)o(a)o(t)f -(mirror)h(prep.)20 b(Get)15 b(Elib,)h(an)o(d)f(inst)o(all)i(it,)e(b)q -(efore)g(pro)q(cee)q(din)o(g.)90 2251 y Fj(NOTE:)f Fo(Th)o(e)i(v)o(ers) -q(ion)f(of)h(p)q(cl-cvs)h(includ)o(e)q(d)h(wit)n(h)e(CVS)g(includ)o(e)q -(s)i(a)e(co)o(p)o(y)f(of)g(Elib)i(in)f(t)n(h)o(e)g(su)n(b-direct)o(ory) -90 2313 y(`)p Fl(elib)p Fo(')e(u)o(n)o(d)o(er)i(t)n(h)o(e)f(`)p -Fl(contrib/pcl-cvs)p Fo(')e(direct)o(ory)l(.)25 2391 -y(4.)29 b(T)o(yp)q(e)13 b(`)p Fl(make)h(install)p Fo(')e(in)i(t)n(h)o -(e)f(source)h(direct)o(ory)l(.)20 b(Thi)q(s)13 b(will)i(b)o(yt)o -(e-compile)g(all)f(`)p Fl(.el)p Fo(')e(\014le)q(s)j(an)o(d)e(co)o(p)o -(y)g(t)n(h)o(e)90 2453 y(`)p Fl(*.elc)p Fo(')h(\014le)q(s)i(in)o(t)o(o) -g(t)n(h)o(e)f(direct)o(ory)g(y)o(ou)g(sp)q(eci\014e)q(d)i(in)f(st)o(ep) -f(1.)90 2530 y(If)g(y)o(ou)g(w)o(an)o(t)f(t)o(o)h(inst)o(all)i(t)n(h)o -(e)e(`)p Fl(*.el)p Fo(')f(\014le)q(s)i(t)o(o)q(o,)f(y)o(ou)g(can)g(t)o -(yp)q(e)f(`)p Fl(make)h(install-el)p Fo(')e(t)o(o)i(do)g(so.)90 -2608 y(If)f(y)o(ou)f(only)h(w)o(an)o(t)e(t)o(o)h(cre)q(a)o(t)o(e)f(t)n -(h)o(e)i(compile)q(d)h(eli)q(sp)g(\014le)q(s,)g(bu)o(t)f(don't)e(w)o -(an)o(t)h(t)o(o)g(inst)o(all)i(t)n(h)o(em,)e(y)o(ou)g(can)h(t)o(yp)q(e) -90 2670 y(`)p Fl(make)p Fo(')g(wit)n(h)o(ou)o(t)h(param)o(et)o(ers.)p -eop -%%Page: 2 4 -2 3 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(1:)20 b(Inst)o(alla)o(t)o(ion) -1475 b(2)25 183 y(5.)29 b(Edit)11 b(t)n(h)o(e)f(\014le)h(`)p -Fl(default.el)p Fo(')d(in)j(y)o(our)e(em)o(acs)h(li)q(sp)i(direct)o -(ory)e(\(usually)h(`)p Fl(/usr/gnu/lib/emacs/site-lis)o(p)p -Fo(')p 2005 195 21 46 v 90 246 a(or)k(som)o(et)n(hin)o(g)i(s)q -(imilar\))f(an)o(d)g(en)o(t)o(er)g(t)n(h)o(e)g(con)o(t)o(en)o(t)o(s)f -(of)g(t)n(h)o(e)h(\014le)h(`)p Fl(pcl-cvs-startup.el)p -Fo(')c(in)o(t)o(o)j(it.)23 b(It)16 b(con-)90 308 y(t)o(ains)f(a)g(coup) -o(le)i(of)e Fl(auto-load)p Fo(s)f(t)n(h)o(a)o(t)g(f)q(acilit)o(a)o(t)o -(e)q(s)h(t)n(h)o(e)g(us)q(e)g(of)g(p)q(cl-cvs.)0 532 -y Fk(1.2)33 b(Inst)n(alla)n(t)n(ion)17 b(of)d(t)m(h)n(e)i(on-lin)n(e)h -(m)n(an)m(ual.)25 669 y Fo(1.)29 b(Cre)q(a)o(t)o(e)e(t)n(h)o(e)h(info)h -(\014le\(s\))g(`)p Fl(pcl-cvs.info*)p Fo(')d(f)q(rom)h(`)p -Fl(pcl-cvs.texinfo)p Fo(')f(b)o(y)i(t)o(ypin)o(g)h(`)p -Fl(make)14 b(info)p Fo('.)90 731 y(If)27 b(y)o(ou)g(don't)g(h)o(a)o(v)o -(e)f(t)n(h)o(e)h(program)f(`)p Fl(makeinfo)p Fo(')g(y)o(ou)h(can)g(get) -g(it)g(b)o(y)g(anon)o(ymous)g(ft)o(p)g(f)q(rom)f(e.g.)90 -793 y(`)p Fl(prep.ai.mit.edu)p Fo(')13 b(as)i(`)p Fl -(pub/gnu/texinfo-3.7.t)o(ar.gz)p Fo(')d(\(t)n(h)o(ere)j(migh)o(t)g(b)q -(e)h(a)f(n)o(ew)o(er)g(v)o(ers)q(ion)h(t)n(h)o(ere)90 -856 y(wh)o(en)f(y)o(ou)g(re)q(ad)g(t)n(hi)q(s\).)25 930 -y(2.)29 b(Inst)o(all)14 b(t)n(h)o(e)g(info)g(\014le\(s\))f(`)p -Fl(pcl-cvs.info*)p Fo(')e(in)o(t)o(o)j(y)o(our)f(st)o(an)o(d)o(ard)f(`) -p Fl(info)p Fo(')h(direct)o(ory)l(.)20 b(Y)l(ou)13 b(sh)o(ould)i(b)q(e) -e(a)o(b)o(le)90 993 y(t)o(o)i(do)g(t)n(hi)q(s)g(b)o(y)h(t)o(ypin)o(g)f -(`)p Fl(make)g(install-info)p Fo('.)25 1067 y(3.)29 b(Edit)19 -b(t)n(h)o(e)g(\014le)g(`)p Fl(dir)p Fo(')f(in)h(t)n(h)o(e)g(`)p -Fl(info)p Fo(')e(direct)o(ory)i(an)o(d)g(en)o(t)o(er)f(on)o(e)h(lin)o -(e)h(t)o(o)e(con)o(t)o(ain)g(a)h(p)q(oin)o(t)o(er)g(t)o(o)f(t)n(h)o(e)h -(info)90 1130 y(\014le\(s\))d(`)p Fl(pcl-cvs.info*)p -Fo('.)h(Th)o(e)e(lin)o(e)i(can,)e(for)f(inst)o(ance,)i(lo)q(ok)f(lik)o -(e)h(t)n(hi)q(s:)210 1194 y Fl(*)24 b(Pcl-cvs:)e(\(pcl-cvs\).)262 -b(An)23 b(Emacs)g(front-end)g(to)h(CVS.)0 1418 y Fk(1.3)33 -b(Ho)n(w)14 b(t)o(o)h(m)n(ak)n(e)g(t)n(yp)q(e)r(s)q(et)h(do)r(cu)o(m)n -(en)n(t)n(a)n(t)n(ion)g(f)q(rom)f(p)r(cl-cvs.t)n(exinfo)62 -1555 y Fo(If)f(y)o(ou)f(h)o(a)o(v)o(e)f(T)316 1565 y(E)342 -1555 y(X)h(inst)o(alle)q(d)i(a)o(t)d(y)o(our)h(s)q(it)o(e,)g(y)o(ou)g -(can)g(m)o(ak)o(e)g(a)g(t)o(yp)q(e)q(s)q(et)f(m)o(an)n(ual)i(f)q(rom)e -(`)p Fl(pcl-cvs.texinfo)p Fo('.)25 1692 y(1.)29 b(R)m(u)o(n)21 -b(T)215 1702 y(E)240 1692 y(X)e(b)o(y)g(t)o(ypin)o(g)h(\\)p -Fl(make)14 b(pcl-cvs.dvi)p Fo(''.)29 b(Y)l(ou)20 b(will)g(not)f(get)g -(t)n(h)o(e)g(in)o(dice)q(s)i(u)o(nle)q(s)q(s)f(y)o(ou)f(h)o(a)o(v)o(e)f -(t)n(h)o(e)90 1754 y Fl(texindex)c Fo(program.)25 1829 -y(2.)29 b(Con)o(v)o(ert)15 b(t)n(h)o(e)h(re)q(sul)o(t)o(in)o(g)h(d)o -(evice)h(in)o(d)o(ep)q(en)o(d)o(en)o(t)f(\014le)g(`)p -Fl(pcl-cvs.dvi)p Fo(')c(t)o(o)j(a)f(form)g(whic)o(h)i(y)o(our)e(pr)q -(in)o(t)o(er)h(can)90 1891 y(ou)o(t)o(pu)o(t)h(an)o(d)f(pr)q(in)o(t)g -(it.)24 b(If)17 b(y)o(ou)f(h)o(a)o(v)o(e)f(a)h(p)q(o)q(st)o(scr)q(ipt)h -(pr)q(in)o(t)o(er)f(t)n(h)o(ere)g(i)q(s)h(a)f(program,)f -Fl(dvi2ps)p Fo(,)g(whic)o(h)i(do)q(e)q(s.)90 1954 y(Th)o(ere)e(i)q(s)h -(also)f(a)g(program)f(whic)o(h)i(com)o(e)q(s)f(t)o(oget)n(h)o(er)g(wit) -n(h)g(T)1144 1963 y(E)1170 1954 y(X,)g Fl(dvips)p Fo(,)f(whic)o(h)h(y)o -(ou)g(can)h(us)q(e.)p eop -%%Page: 3 5 -3 4 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(2:)20 b(A)m(b)q(ou)o(t)c(p)q -(cl-cvs)1424 b(3)0 183 y Fm(2)41 b(A)l(b)r(ou)o(t)15 -b(p)r(cl-cvs)62 390 y Fo(Pcl-cvs)i(i)q(s)f(a)f(f)q(ron)o(t-en)o(d)g(t)o -(o)g(CVS)h(v)o(ers)q(ions)f(1.5)g(t)n(hrough)g(1.7)g(an)o(d)g(n)o(ew)o -(er;)g(an)o(d)h(p)q(o)q(s)q(s)q(ib)o(ly)g(v)o(er)q(i)q(son)f(1.3)g(an)o -(d)0 452 y(1.4A2.)k(It)c(in)o(t)o(egra)o(t)o(e)q(s)f(t)n(h)o(e)h(mo)q -(st)f(f)q(requen)o(t)n(ly)i(us)q(e)q(d)g(CVS)f(comm)o(an)o(ds)g(in)o(t) -o(o)g(an)g(em)o(acs)g(in)o(t)o(erf)q(ace.)0 713 y Fk(2.1)33 -b(Con)n(tr)q(ibu)o(t)o(ors)16 b(t)o(o)f(p)r(cl-cvs)62 -854 y Fo(Con)o(tr)q(ibu)o(t)o(ions)j(t)o(o)g(t)n(h)o(e)g(pac)o(kage)f -(are)h(w)o(elcom)o(e.)29 b(I)18 b(h)o(a)o(v)o(e)f(limit)o(e)q(d)j(t)o -(im)o(e)e(t)o(o)g(w)o(or)o(k)f(on)h(t)n(hi)q(s)g(pro)s(ject,)g(bu)o(t)h -(I)0 916 y(will)c(gladly)g(add)f(an)o(y)g(co)q(d)o(e)g(t)n(h)o(a)o(t)f -(y)o(ou)h(con)o(tr)q(ibu)o(t)o(e)f(t)o(o)h(m)o(e)g(t)o(o)f(t)n(hi)q(s)h -(pac)o(kage)f(\(s)q(ee)h(Ch)o(apt)o(er)f(8)h([Bugs],)f(page)g(22\).)62 -1057 y(Th)o(e)i(fo)o(llo)o(win)o(g)i(p)q(ersons)e(h)o(a)o(v)o(e)g(m)o -(ad)o(e)g(con)o(tr)q(ibu)o(t)o(ions)h(t)o(o)f(p)q(cl-cvs.)37 -1198 y Fn(\017)30 b Fo(Br)q(ian)17 b(Berlin)o(er)h(wrot)o(e)d(CVS,)h(t) -o(oget)n(h)o(er)h(wit)n(h)f(som)o(e)g(ot)n(h)o(er)g(con)o(tr)q(ibu)o(t) -o(ors.)24 b(Wit)n(h)o(ou)o(t)17 b(hi)q(s)g(w)o(or)o(k)e(on)i(CVS)90 -1260 y(t)n(hi)q(s)e(pac)o(kage)g(w)o(ould)g(b)q(e)h(us)q(ele)q(s)q(s)p -Fi(:)8 b(:)g(:)37 1339 y Fn(\017)30 b Fo(P)o(er)20 b(Ce)q(d)o(erqvi)q -(st)h(wrot)o(e)e(mo)q(st)g(of)h(t)n(h)o(e)g(ot)n(h)o(erwi)q(s)q(e)g(u)o -(n)o(a)o(t)n(tr)q(ibu)o(t)o(e)q(d)h(fu)o(nct)o(ions)g(in)g(p)q(cl-cvs)g -(as)f(w)o(ell)h(as)f(all)90 1401 y(do)q(cu)o(m)o(en)o(t)o(a)o(t)o(ion.) -37 1480 y Fn(\017)30 b Fo(In)o(ge)14 b(W)l(allin)h(\(`)p -Fl(inge@lysator.liu.se)o Fo('\))10 b(wrot)o(e)i(t)n(h)o(e)h(sk)o(elet)o -(on)g(t)o(o)g(`)p Fl(pcl-cvs.texinfo)p Fo(',)d(an)o(d)j(ga)o(v)o(e)g -(us)q(e-)90 1542 y(ful)19 b(comm)o(en)o(t)o(s)e(on)h(it.)28 -b(He)18 b(also)g(wrot)o(e)f(t)n(h)o(e)g(\014le)q(s)j(`)p -Fl(elib-node.el)p Fo(')15 b(an)o(d)j(`)p Fl(compile-all.el)p -Fo('.)25 b(Th)o(e)18 b(\014le)90 1604 y(`)p Fl(cookie.el)p -Fo(')13 b(w)o(as)i(inspire)q(d)i(b)o(y)e(In)o(ge.)37 -1683 y Fn(\017)30 b Fo(Lin)n(us)15 b(T)l(o)o(lk)o(e)f(\(`)p -Fl(linus@lysator.liu.se)p Fo(')o(\))c(con)o(tr)q(ibu)o(t)o(e)q(d)k(us)q -(eful)h(comm)o(en)o(t)o(s)d(on)i(b)q(ot)n(h)f(t)n(h)o(e)h(fu)o(nct)o -(ion)o(alit)o(y)90 1745 y(an)o(d)h(t)n(h)o(e)g(do)q(cu)o(m)o(en)o(t)o -(a)o(t)o(ion.)37 1824 y Fn(\017)30 b Fo(Jamie)16 b(Zawinski)g(\(`)p -Fl(jwz@lucid.com)p Fo('\))c(con)o(tr)q(ibu)o(t)o(e)q(d)k(`)p -Fl(pcl-cvs-lucid.el)p Fo('.)37 1903 y Fn(\017)30 b Fo(Le)q(if)13 -b(Lonn)n(b)o(lad)g(con)o(tr)q(ibu)o(t)o(e)q(d)f(R)o(CVS)g(sup)o(p)q -(ort.)19 b(\(Since)12 b(sup)q(erce)q(d)o(e)q(d)i(b)o(y)d(t)n(h)o(e)h(n) -o(ew)f(remot)o(e)g(CVS)h(sup)o(p)q(ort.\))37 1981 y Fn(\017)30 -b Fo(Jim)20 b(Blan)o(dy)g(\(`)p Fl(jimb@cyclic.com)p -Fo('\))c(con)o(tr)q(ibu)o(t)o(e)q(d)k(h)o(o)q(oks)f(t)o(o)g(a)n(u)o(t)o -(om)o(a)o(t)o(ically)h(gue)q(s)q(s)f(CVS)g(log)h(en)o(tr)q(ie)q(s)90 -2044 y(f)q(rom)13 b(Ch)o(an)o(geLog)h(con)o(t)o(en)o(t)o(s;)f(an)o(d)h -(init)o(ial)i(sup)o(p)q(ort)e(of)g(t)n(h)o(e)f(n)o(ew)h(Cygn)n(us)h(/)e -(Cyclic)i(remot)o(e)f(CVS;)f(as)h(w)o(ell)90 2106 y(as)h(v)m(ar)q(ious) -g(su)o(n)o(dry)h(bug)f(\014xe)q(s)h(an)o(d)f(cle)q(an)n(up)q(s.)37 -2185 y Fn(\017)30 b Fo(Jim)16 b(Kin)o(gdon)i(\(`)p Fl -(kingdon@cyclic.com)p Fo(')o(\))12 b(con)o(tr)q(ibu)o(t)o(e)q(d)17 -b(lot)o(s)f(of)f(\014xe)q(s)h(t)o(o)g(t)n(h)o(e)f(build)j(an)o(d)d -(inst)o(all)i(pro)q(ce-)90 2247 y(d)o(ure.)37 2326 y -Fn(\017)30 b Fo(Greg)17 b(A.)h(W)l(o)q(o)q(ds)g(\(`)p -Fl(woods@planix.com)p Fo(')o(\))d(con)o(tr)q(ibu)o(t)o(e)q(d)j(co)q(d)o -(e)h(t)o(o)f(imp)o(lem)o(en)o(t)h(t)n(h)o(e)f(us)q(e)g(of)f(p)q -(er-\014le)j(di\013)90 2388 y(bu\013ers;)14 b(an)o(d)h(v)o(en)o(dor)f -(join)g(di\013s)h(wit)n(h)g(em)o(erge)f(an)o(d)g(e)q(di\013;)h(as)f(w)o -(ell)h(as)f(v)m(ar)q(ious)h(an)f(su)o(n)o(dry)h(bug)f(\014xe)q(s)h(an)o -(d)90 2450 y(cle)q(an)n(up)q(s.)62 2608 y(A)m(part)k(f)q(rom)f(t)n(h)o -(e)q(s)q(e,)i(a)f(lot)g(of)g(p)q(eo)o(p)o(le)h(h)o(a)o(v)o(e)e(s)q(en)o -(d)i(m)o(e)e(sugge)q(st)o(ions,)i(id)o(e)q(as,)g(reque)q(st)o(s,)h(bug) -e(rep)q(ort)o(s)g(an)o(d)0 2670 y(encouragem)o(en)o(t.)g(Th)o(anks)c(a) -g(lot!)20 b(Wit)n(h)o(ou)o(t)15 b(y)o(our)g(t)n(h)o(ere)g(w)o(ould)h(b) -q(e)f(no)g(n)o(ew)g(rele)q(as)q(e)q(s)h(of)f(p)q(cl-cvs.)p -eop -%%Page: 4 6 -4 5 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(2:)20 b(A)m(b)q(ou)o(t)c(p)q -(cl-cvs)1424 b(4)0 183 y Fk(2.2)33 b(Wh)n(ere)16 b(can)f(I)g(get)g(p)r -(cl-cvs?)62 320 y Fo(Th)o(e)g(curren)o(t)g(rele)q(as)q(e)h(of)e(p)q -(cl-cvs)j(i)q(s)e(includ)o(e)q(d)k(in)d(CVS-1.7.)62 457 -y(Th)o(e)j(a)n(u)o(t)n(h)o(or's)f(rele)q(as)q(e)g(of)g(p)q(cl-cvs)i -(can)f(b)q(e)f(fet)o(c)o(h)o(e)q(d)h(via)f(anon)o(ymous)g(ft)o(p)g(f)q -(rom)g Fl(ftp.lysator.liu.se)p Fo(,)0 519 y(\(IP)h(no.)32 -b(130.236.254.)o(1\))16 b(in)k(t)n(h)o(e)f(direct)o(ory)h -Fl(pub/emacs)p Fo(.)31 b(If)19 b(y)o(ou)g(don't)g(liv)o(e)h(in)g(Scan)o -(din)o(a)o(via)g(y)o(ou)f(sh)o(ould)0 582 y(proba)o(b)o(ly)d(c)o(h)o -(ec)o(k)f(wit)n(h)h(arc)o(hie)g(t)o(o)e(s)q(ee)i(if)g(t)n(h)o(ere)f(i)q -(s)g(a)g(s)q(it)o(e)g(clo)q(s)q(er)g(t)o(o)g(y)o(ou)g(t)n(h)o(a)o(t)f -(arc)o(hiv)o(e)q(s)i(p)q(cl-cvs.)62 719 y(New)h(rele)q(as)q(e)q(s)g -(will)h(b)q(e)f(annou)o(nce)q(d)i(t)o(o)d(ap)o(pro)o(pr)q(ia)o(t)o(e)g -(n)o(ewsgroup)q(s.)23 b(If)17 b(y)o(ou)g(s)q(en)o(d)g(y)o(our)f(em)o -(ail)i(addre)q(s)q(s)e(t)o(o)0 781 y(m)o(e)f(I)h(will)g(add)g(y)o(ou)f -(t)o(o)g(m)o(y)f(li)q(st)i(of)f(p)q(eo)o(p)o(le)h(t)o(o)f(m)o(ail)h(wh) -o(en)f(I)h(m)o(ak)o(e)f(a)f(n)o(ew)i(rele)q(as)q(e.)p -eop -%%Page: 5 7 -5 6 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(3:)20 b(Get)n(t)o(in)o(g)15 -b(st)o(art)o(e)q(d)1395 b(5)0 183 y Fm(3)41 b(Get)m(t)n(in)o(g)15 -b(st)n(art)n(e)r(d)62 410 y Fo(Thi)q(s)d(do)q(cu)o(m)o(en)o(t)g(as)q -(su)o(m)o(e)q(s)f(t)n(h)o(a)o(t)g(y)o(ou)g(kno)o(w)g(wh)o(a)o(t)f(CVS)i -(i)q(s,)g(an)o(d)g(t)n(h)o(a)o(t)e(y)o(ou)h(a)o(t)g(le)q(ast)g(kno)o -(ws)g(t)n(h)o(e)h(fu)o(n)o(d)o(am)o(en)o(t)o(al)0 472 -y(concept)o(s)k(of)f(CVS.)g(If)g(t)n(h)o(a)o(t)f(i)q(s)i(not)f(t)n(h)o -(e)g(cas)q(e)g(y)o(ou)g(sh)o(ould)h(re)q(ad)e(t)n(h)o(e)i(m)o(an)e -(page)i(for)e(CVS.)62 617 y(Pcl-cvs)19 b(i)q(s)f(only)g(us)q(eful)h -(once)f(y)o(ou)f(h)o(a)o(v)o(e)g(c)o(h)o(ec)o(k)o(e)q(d)h(ou)o(t)g(a)f -(mo)q(d)o(ule.)28 b(So)18 b(b)q(efore)f(y)o(ou)g(in)o(v)o(ok)o(e)h(it)g -(y)o(ou)f(m)n(ust)0 679 y(h)o(a)o(v)o(e)e(a)f(co)o(p)o(y)h(of)g(a)g(mo) -q(d)o(ule)h(som)o(ewh)o(ere)f(in)h(t)n(h)o(e)f(\014le)h(syst)o(em.)62 -824 y(Y)l(ou)i(in)o(v)o(ok)o(e)f(p)q(cl-cvs)i(b)o(y)e(t)o(ypin)o(g)g -Fl(M-x)e(cvs-update)f(RET)p Fo(.)25 b(If)18 b(y)o(our)e(em)o(acs)h(re)q -(sp)q(on)o(ds)h(wit)n(h)g(`)p Fl([No)c(match])p Fo(')0 -887 y(y)o(our)g(syst)o(em)g(admini)q(stra)o(t)o(or)g(h)o(as)h(not)f -(inst)o(alle)q(d)i(p)q(cl-cvs)h(pro)o(p)q(erly)l(.)j(T)l(ry)14 -b Fl(M-x)h(load-library)e(RET)i(pcl-cvs)0 949 y(RET)p -Fo(.)k(If)c(t)n(h)o(a)o(t)e(also)h(f)q(ails)h(-)f(t)o(alk)g(t)o(o)g(y)o -(our)g(ro)q(ot.)19 b(If)14 b(it)h(su)o(ccee)q(ds)g(y)o(ou)f(migh)o(t)g -(pu)o(t)h(t)n(hi)q(s)g(lin)o(e)g(in)g(y)o(our)f(`)p Fl(.emacs)p -Fo(')f(\014le)0 1011 y(so)i(t)n(h)o(a)o(t)f(y)o(ou)h(don't)g(h)o(a)o(v) -o(e)f(t)o(o)h(t)o(yp)q(e)g(t)n(h)o(e)g(`)p Fl(load-library)p -Fo(')e(comm)o(an)o(d)h(ev)o(ery)i(t)o(im)o(e)f(y)o(ou)f(wi)q(sh)i(t)o -(o)f(us)q(e)g(p)q(cl-cvs:)120 1146 y Fl(\(autoload)23 -b('cvs-update)f("pcl-cvs")h(nil)g(t\))62 1291 y Fo(Th)o(e)c(fu)o(nct)o -(ion)g Fl(cvs-update)e Fo(will)j(ask)e(for)g(a)g(direct)o(ory)l(.)30 -b(Th)o(e)18 b(comm)o(an)o(d)g(`)p Fl(cvs)d(update)p Fo(')i(will)j(b)q -(e)e(ru)o(n)h(in)0 1353 y(t)n(h)o(a)o(t)12 b(direct)o(ory)l(.)20 -b(\(It)13 b(sh)o(ould)h(con)o(t)o(ain)f(\014le)q(s)h(t)n(h)o(a)o(t)e(h) -o(a)o(v)o(e)g(b)q(een)i(c)o(h)o(ec)o(k)o(e)q(d)f(ou)o(t)g(f)q(rom)f(a)h -(CVS)g(arc)o(hiv)o(e.\))19 b(Th)o(e)13 b(ou)o(t)o(pu)o(t)0 -1415 y(f)q(rom)f Fl(cvs)h Fo(will)h(b)q(e)f(pars)q(e)q(d)h(an)o(d)f -(pre)q(s)q(en)o(t)o(e)q(d)g(in)h(a)f(t)o(a)o(b)o(le)g(in)h(a)f -(bu\013er)g(calle)q(d)i(`)p Fl(*cvs*)p Fo('.)i(It)c(migh)o(t)g(lo)q(ok) -h(som)o(et)n(hin)o(g)0 1478 y(lik)o(e)i(t)n(hi)q(s:)120 -1612 y Fl(PCL-CVS)23 b(release)g(1.05-CVS-$Name: $.)120 -1716 y(In)24 b(directory)e(/users/ceder/FOO/test:)168 -1768 y(Updated)118 b(bar)168 1820 y(Updated)g(file.txt)168 -1872 y(Modified)22 b(ci)i(namechange)168 1923 y(Updated)118 -b(newer)120 2027 y(In)24 b(directory)e(/users/ceder/FOO/test/sub:)168 -2079 y(Modified)g(ci)i(ChangeLog)120 2131 y(----------)e(End)i(-----)62 -2276 y Fo(In)19 b(t)n(hi)q(s)e(examp)o(le)j(t)n(h)o(e)d(t)o(w)o(o)g -(\014le)q(s)h(\(`)p Fl(bar)p Fo(',)f(`)p Fl(file.txt)p -Fo(',)f(an)o(d)i(`)p Fl(newer)p Fo('\))e(t)n(h)o(a)o(t)g(are)i(m)o(ar)o -(k)o(e)q(d)g(wit)n(h)g(`)p Fl(Updated)p Fo(')0 2338 y(h)o(a)o(v)o(e)d -(b)q(een)h(co)o(pie)q(d)h(f)q(rom)d(t)n(h)o(e)i(CVS)g(rep)q(o)q(s)q(it) -o(ory)f(t)o(o)g(`)p Fl(/users/ceder/FOO/test/)p Fo(')d(s)q(ince)k(som)o -(eon)o(e)f(els)q(e)i(h)o(a)o(v)o(e)0 2401 y(c)o(h)o(ec)o(k)o(e)q(d)23 -b(in)g(n)o(ew)o(er)g(v)o(ers)q(ions)g(of)f(t)n(h)o(em.)42 -b(Tw)o(o)21 b(\014le)q(s)j(\(`)p Fl(namechange)p Fo(')c(an)o(d)j(`)p -Fl(sub/ChangeLog)p Fo('\))d(h)o(a)o(v)o(e)h(b)q(een)0 -2463 y(mo)q(di\014e)q(d)c(lo)q(cally)l(,)g(an)o(d)e(n)o(ee)q(ds)h(t)o -(o)f(b)q(e)g(c)o(h)o(ec)o(k)o(e)q(d)h(in.)62 2608 y(Y)l(ou)g(can)h(mo)o -(v)o(e)e(t)n(h)o(e)h(cursor)f(up)i(an)o(d)f(do)o(wn)f(in)i(t)n(h)o(e)f -(bu\013er)g(wit)n(h)g Fl(C-n)g Fo(an)o(d)g Fl(C-p)f Fo(or)h -Fl(n)f Fo(an)o(d)h Fl(p)p Fo(.)22 b(If)17 b(y)o(ou)e(pre)q(s)q(s)0 -2670 y Fl(c)h Fo(on)g(on)o(e)g(of)f(t)n(h)o(e)h(`)p Fl(Modified)p -Fo(')e(\014le)q(s)k(t)n(h)o(a)o(t)d(\014le)i(will)g(b)q(e)f(c)o(h)o(ec) -o(k)o(e)q(d)h(in)g(t)o(o)f(t)n(h)o(e)f(CVS)i(rep)q(o)q(s)q(it)o(ory)l -(.)22 b(See)16 b(Sect)o(ion)h(5.4)p eop -%%Page: 6 8 -6 7 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(3:)20 b(Get)n(t)o(in)o(g)15 -b(st)o(art)o(e)q(d)1395 b(6)0 183 y([Commit)n(t)o(in)o(g)18 -b(c)o(h)o(an)o(ge)q(s],)g(page)g(11.)28 b(Y)l(ou)19 b(can)f(pre)q(s)q -(s)g Fl(x)g Fo(t)o(o)g(get)f(r)q(id)i(of)f(t)n(h)o(e)g -Fl(")p Fo(u)o(nin)o(t)o(ere)q(st)o(in)o(g)p Fl(")h Fo(\014le)q(s)h(t)n -(h)o(a)o(t)d(h)o(a)o(v)o(e)0 246 y(only)f(b)q(een)f(`)p -Fl(Updated)p Fo(')f(\(an)o(d)h(don't)f(require)i(an)o(y)f(furt)n(h)o -(er)g(act)o(ion)g(f)q(rom)g(y)o(ou\).)62 382 y(Y)l(ou)f(can)f(also)g(e) -q(as)q(ily)h(get)f(a)g(`)p Fl(diff)p Fo(')f(b)q(et)o(w)o(een)h(y)o(our) -f(mo)q(di\014e)q(d)j(\014le)g(an)o(d)e(t)n(h)o(e)g(bas)q(e)g(v)o(ers)q -(ion)h(t)n(h)o(a)o(t)e(y)o(ou)h(st)o(art)o(e)q(d)0 445 -y(f)q(rom,)19 b(an)o(d)g(y)o(ou)g(can)g(get)g(t)n(h)o(e)g(ou)o(t)o(pu)o -(t)h(f)q(rom)e(`)p Fl(cvs)c(log)p Fo(')k(an)o(d)h(`)p -Fl(cvs)c(status)p Fo(')j(on)h(t)n(h)o(e)g(li)q(st)o(e)q(d)h(\014le)q(s) -g(s)q(imp)o(ly)h(b)o(y)0 507 y(pre)q(s)q(s)q(in)o(g)16 -b(a)f(k)o(ey)g(\(s)q(ee)g(Sect)o(ion)g(5.6)g([Get)n(t)o(in)o(g)g(info)g -(a)o(b)q(ou)o(t)h(\014le)q(s],)f(page)g(12\).)p eop -%%Page: 7 9 -7 8 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(4:)20 b(Bu\013er)15 -b(con)o(t)o(en)o(t)o(s)1397 b(7)0 183 y Fm(4)41 b(Bu\013er)15 -b(con)n(t)n(en)n(t)o(s)62 379 y Fo(Th)o(e)g(di)q(sp)o(lay)i(con)o(t)o -(ains)e(four)g(co)o(lu)o(mns.)21 b(Th)o(ey)16 b(con)o(t)o(ain,)e(f)q -(rom)g(left)i(t)o(o)f(r)q(igh)o(t:)37 518 y Fn(\017)30 -b Fo(An)15 b(ast)o(er)q(i)q(sk)g(wh)o(en)g(t)n(h)o(e)g(\014le)i(i)q(s)e -Fh(m)o(ar)o(k)o(e)q(d)i Fo(\(s)q(ee)e(Sect)o(ion)h(4.2)e([Select)o(e)q -(d)j(\014le)q(s],)e(page)g(8\).)37 595 y Fn(\017)30 b -Fo(Th)o(e)15 b(st)o(a)o(t)o(us)f(of)h(t)n(h)o(e)g(\014le.)21 -b(See)16 b(See)f(Sect)o(ion)h(4.1)e([File)i(st)o(a)o(t)o(us],)d(page)i -(7,)g(for)g(more)f(inform)o(a)o(t)o(ion.)37 672 y Fn(\017)30 -b Fo(A)15 b Fl(")p Fo(n)o(ee)q(d)h(t)o(o)f(b)q(e)g(c)o(h)o(ec)o(k)o(e)q -(d)h(in)p Fl(")p Fo(-m)o(ar)o(k)o(er)g(\(`)p Fl(ci)p -Fo('\).)37 748 y Fn(\017)30 b Fo(Th)o(e)15 b(\014le)h(n)o(am)o(e.)0 -989 y Fk(4.1)33 b(File)16 b(st)n(a)n(t)n(us)62 1128 y -Fo(Th)o(e)f(`)p Fl(file)g(status)p Fo(')f(\014eld)i(can)f(h)o(a)o(v)o -(e)g(t)n(h)o(e)g(fo)o(llo)o(win)o(g)i(v)m(alue)q(s:)0 -1281 y(`)p Fl(Updated)p Fo(')46 b(Th)o(e)18 b(\014le)h(w)o(as)e(brough) -o(t)h(up)h(t)o(o)e(d)o(a)o(t)o(e)h(wit)n(h)h(re)q(sp)q(ect)f(t)o(o)g(t) -n(h)o(e)g(rep)q(o)q(s)q(it)o(ory)l(.)28 b(Thi)q(s)18 -b(i)q(s)h(don)o(e)f(for)f(an)o(y)240 1344 y(\014le)h(t)n(h)o(a)o(t)e -(exi)q(st)o(s)h(in)h(t)n(h)o(e)f(rep)q(o)q(s)q(it)o(ory)f(bu)o(t)i(not) -e(in)i(y)o(our)e(source,)h(an)o(d)g(for)f(\014le)q(s)j(t)n(h)o(a)o(t)c -(y)o(ou)i(h)o(a)o(v)o(en't)240 1406 y(c)o(h)o(an)o(ge)q(d)f(bu)o(t)g -(are)e(not)h(t)n(h)o(e)g(mo)q(st)f(recen)o(t)h(v)o(ers)q(ions)h(a)o(v)m -(aila)o(b)o(le)h(in)f(t)n(h)o(e)f(rep)q(o)q(s)q(it)o(ory)l(.)0 -1497 y(`)p Fl(Patched)p Fo(')46 b(Th)o(e)14 b(\014le)i(w)o(as)e(brough) -o(t)f(up)i(t)o(o)g(d)o(a)o(t)o(e)f(wit)n(h)h(re)q(sp)q(ect)f(t)o(o)g(a) -h(remot)o(e)e(rep)q(o)q(s)q(it)o(ory)h(b)o(y)h(w)o(ay)e(of)h(fet)o(c)o -(hin)o(g)240 1559 y(an)o(d)g(ap)o(p)o(lyin)o(g)i(a)e(pa)o(t)o(c)o(h)f -(t)o(o)h(t)n(h)o(e)g(\014le)h(in)g(y)o(our)f(source.)19 -b(Thi)q(s)c(i)q(s)f(don)o(e)g(for)g(an)o(y)g(\014le)h(t)n(h)o(a)o(t)e -(exi)q(st)o(s)h(in)h(a)240 1621 y(remot)o(e)g(rep)q(o)q(s)q(it)o(ory)g -(an)o(d)h(in)g(y)o(our)g(source;)f(of)h(whic)o(h)g(y)o(ou)g(h)o(a)o(v)o -(en't)e(c)o(h)o(an)o(ge)q(d)j(lo)q(cally)g(bu)o(t)f(i)q(s)g(not)240 -1684 y(t)n(h)o(e)f(mo)q(st)f(recen)o(t)h(v)o(ers)q(ion)h(a)o(v)m(aila)o -(b)o(le)h(in)f(t)n(h)o(e)f(remot)o(e)f(rep)q(o)q(s)q(it)o(ory)l(.)0 -1775 y(`)p Fl(Modified)p Fo(')240 1837 y(Th)o(e)19 b(\014le)h(i)q(s)g -(mo)q(di\014e)q(d)h(in)f(y)o(our)f(w)o(or)o(kin)o(g)g(direct)o(ory)l(,) -i(an)o(d)e(t)n(h)o(ere)g(w)o(as)g(no)g(mo)q(di\014ca)o(t)o(ion)h(t)o(o) -f(t)n(h)o(e)240 1899 y(sam)o(e)c(\014le)h(in)g(t)n(h)o(e)f(rep)q(o)q(s) -q(it)o(ory)l(.)0 1990 y(`)p Fl(Merged)p Fo(')70 b(Th)o(e)22 -b(\014le)h(i)q(s)e(mo)q(di\014e)q(d)j(in)e(y)o(our)g(w)o(or)o(kin)o(g)g -(direct)o(ory)l(,)i(an)o(d)d(t)n(h)o(ere)h(w)o(ere)g(mo)q(di\014ca)o(t) -o(ions)g(in)h(t)n(h)o(e)240 2052 y(rep)q(o)q(s)q(it)o(ory)15 -b(as)f(w)o(ell)j(as)d(in)i(y)o(our)f(co)o(p)o(y)l(,)f(bu)o(t)i(t)n(h)o -(ey)f(w)o(ere)g(m)o(erge)q(d)h(su)o(cce)q(s)q(sfully)l(,)g(wit)n(h)o -(ou)o(t)g(con\015ict,)240 2115 y(in)g(y)o(our)f(w)o(or)o(kin)o(g)g -(direct)o(ory)l(.)0 2205 y(`)p Fl(Conflict)p Fo(')240 -2268 y(A)i(con\015ict)h(w)o(as)f(d)o(et)o(ect)o(e)q(d)h(while)g(tryin)o -(g)g(t)o(o)f(m)o(erge)g(y)o(our)g(c)o(h)o(an)o(ge)q(s)h(t)o(o)f -Fh(\014le)k Fo(wit)n(h)c(c)o(h)o(an)o(ge)q(s)h(f)q(rom)240 -2330 y(t)n(h)o(e)h(source)f(rep)q(o)q(s)q(it)o(ory)l(.)30 -b Fh(\014le)22 b Fo(\(t)n(h)o(e)d(co)o(p)o(y)f(in)h(y)o(our)g(w)o(or)o -(kin)o(g)g(direct)o(ory\))g(i)q(s)f(no)o(w)h(t)n(h)o(e)f(ou)o(t)o(pu)o -(t)h(of)240 2392 y(t)n(h)o(e)e(`)p Fl(rcsmerge)p Fo(')f(comm)o(an)o(d)h -(on)g(t)n(h)o(e)h(t)o(w)o(o)e(v)o(ers)q(ions;)i(an)g(u)o(nmo)q(di\014e) -q(d)i(co)o(p)o(y)d(of)g(y)o(our)g(\014le)h(i)q(s)g(also)240 -2455 y(in)j(y)o(our)f(w)o(or)o(kin)o(g)h(direct)o(ory)l(,)h(wit)n(h)f -(t)n(h)o(e)f(n)o(am)o(e)g(`)p Fl(.#)p Fh(\014le)p Fl(.)p -Fh(v)o(ers)q(ion)p Fo(',)i(wh)o(ere)e Fh(v)o(ers)q(ion)h -Fo(i)q(s)f(t)n(h)o(e)h(R)o(CS)240 2517 y(revi)q(s)q(ion)e(t)n(h)o(a)o -(t)f(y)o(our)h(mo)q(di\014e)q(d)h(\014le)g(st)o(art)o(e)q(d)e(f)q(rom.) -30 b(See)20 b(Sect)o(ion)f(5.11)f([Viewin)o(g)i(di\013erence)q(s],)240 -2579 y(page)15 b(14,)f(for)h(more)g(d)o(et)o(ails.)0 -2670 y(`)p Fl(Added)p Fo(')94 b(Th)o(e)15 b(\014le)h(h)o(as)f(b)q(een)h -(add)o(e)q(d)g(b)o(y)f(y)o(ou,)g(bu)o(t)h(it)f(st)o(ill)i(n)o(ee)q(ds)f -(t)o(o)e(b)q(e)i(c)o(h)o(ec)o(k)o(e)q(d)f(in)h(t)o(o)f(t)n(h)o(e)g(rep) -q(o)q(s)q(it)o(ory)l(.)p eop -%%Page: 8 10 -8 9 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(4:)20 b(Bu\013er)15 -b(con)o(t)o(en)o(t)o(s)1397 b(8)0 183 y(`)p Fl(Removed)p -Fo(')46 b(Th)o(e)14 b(\014le)i(h)o(as)e(b)q(een)h(remo)o(v)o(e)q(d)f(b) -o(y)h(y)o(ou,)f(bu)o(t)h(it)f(n)o(ee)q(ds)i(t)o(o)e(b)q(e)g(c)o(h)o(ec) -o(k)o(e)q(d)h(in)h(t)o(o)e(t)n(h)o(e)g(rep)q(o)q(s)q(it)o(ory)l(.)20 -b(Y)l(ou)240 246 y(can)15 b(re)q(surrect)h(it)f(b)o(y)g(t)o(ypin)o(g)h -Fl(a)f Fo(\(s)q(ee)g(Sect)o(ion)h(5.7)e([Addin)o(g)i(an)o(d)g(remo)o -(vin)o(g)f(\014le)q(s],)h(page)f(13\).)0 334 y(`)p Fl(Unknown)p -Fo(')46 b(A)18 b(\014le)g(t)n(h)o(a)o(t)f(w)o(as)g(d)o(et)o(ect)o(e)q -(d)h(in)h(y)o(our)e(direct)o(ory)l(,)h(bu)o(t)h(t)n(h)o(a)o(t)d(n)o(e)q -(it)n(h)o(er)j(ap)o(p)q(e)q(ars)e(in)h(t)n(h)o(e)g(rep)q(o)q(s)q(it)o -(ory)l(,)240 396 y(nor)d(i)q(s)g(pre)q(s)q(en)o(t)h(on)f(t)n(h)o(e)g -(li)q(st)h(of)e(\014le)q(s)j(t)n(h)o(a)o(t)d(CVS)h(sh)o(ould)h(ignore.) -62 547 y(Th)o(ere)g(are)f(also)g(a)g(few)g(sp)q(ecial)h(cas)q(e)q(s,)f -(t)n(h)o(a)o(t)f(rarely)h(o)q(ccur,)h(whic)o(h)f(h)o(a)o(v)o(e)g(lon)o -(ger)h(str)q(in)o(gs)f(in)h(t)n(h)o(e)f(\014elds:)0 698 -y(`)p Fl(Removed)f(from)g(repository)p Fo(')240 760 y(Th)o(e)h(\014le)i -(h)o(as)e(b)q(een)h(remo)o(v)o(e)q(d)f(f)q(rom)g(y)o(our)g(direct)o -(ory)h(s)q(ince)g(som)o(eon)o(e)f(h)o(as)g(remo)o(v)o(e)q(d)h(it)f(f)q -(rom)g(t)n(h)o(e)240 823 y(rep)q(o)q(s)q(it)o(ory)l(.)k(\(It)12 -b(i)q(s)g(st)o(ill)i(pre)q(s)q(en)o(t)f(in)g(t)n(h)o(e)f(A)o(t)n(t)o -(ic)g(direct)o(ory)l(,)i(so)e(no)g(p)q(erm)o(an)o(en)o(t)g(lo)q(s)q(s)g -(h)o(as)g(o)q(ccurre)q(d\).)240 885 y(Thi)q(s,)j(u)o(nlik)o(e)i(t)n(h)o -(e)e(ot)n(h)o(er)g(en)o(tr)q(ie)q(s)h(in)g(t)n(hi)q(s)f(t)o(a)o(b)o -(le,)g(i)q(s)h(not)e(an)i(error)e(con)o(dit)o(ion.)0 -974 y(`)p Fl(Removed)g(from)g(repository,)g(changed)g(by)h(you)p -Fo(')240 1036 y(Y)l(ou)21 b(h)o(a)o(v)o(e)f(mo)q(di\014e)q(d)i(a)e -(\014le)i(t)n(h)o(a)o(t)e(som)o(eon)o(e)g(h)o(a)o(v)o(e)g(remo)o(v)o(e) -q(d)g(f)q(rom)g(t)n(h)o(e)g(rep)q(o)q(s)q(it)o(ory)l(.)36 -b(Y)l(ou)21 b(can)240 1098 y(correct)d(t)n(hi)q(s)g(s)q(it)o(ua)o(t)o -(ion)g(b)o(y)g(remo)o(vin)o(g)g(t)n(h)o(e)h(\014le)g(m)o(an)n(ually)g -(\(s)q(ee)f(s)q(ee)h(Sect)o(ion)f(5.7)g([Addin)o(g)h(an)o(d)240 -1160 y(remo)o(vin)o(g)c(\014le)q(s],)h(page)f(13\).)0 -1249 y(`)p Fl(Removed)f(by)h(you,)f(changed)g(in)h(repository)p -Fo(')240 1311 y(Y)l(ou)g(h)o(a)o(v)o(e)g(remo)o(v)o(e)q(d)g(a)g -(\014le,)h(an)o(d)f(b)q(efore)g(y)o(ou)g(commit)n(t)o(e)q(d)h(t)n(h)o -(e)f(remo)o(v)m(al)g(som)o(eon)o(e)g(commit)n(t)o(e)q(d)g(a)240 -1374 y(c)o(h)o(an)o(ge)j(t)o(o)f(t)n(h)o(a)o(t)f(\014le.)27 -b(Y)l(ou)18 b(could)g(us)q(e)g Fl(a)f Fo(t)o(o)g(re)q(surrect)h(t)n(h)o -(e)f(\014le)i(\(s)q(ee)e(s)q(ee)g(Sect)o(ion)h(5.7)f([Addin)o(g)240 -1436 y(an)o(d)e(remo)o(vin)o(g)h(\014le)q(s],)f(page)g(13\).)0 -1524 y(`)p Fl(Move)f(away)h Fh(\014le)k Fl(-)c(it)g(is)f(in)h(the)g -(way)p Fo(')240 1587 y(F)l(or)g(som)o(e)f(re)q(ason)g(CVS)i(do)q(e)q(s) -f(not)g(lik)o(e)h(t)n(h)o(e)f(\014le)h Fh(\014le)p Fo(.)21 -b(Ren)o(am)o(e)16 b(or)f(remo)o(v)o(e)f(it.)0 1675 y(`)p -Fl(This)g(repository)g(is)h(missing!)f(Remove)g(this)h(dir)g(manually.) -p Fo(')240 1738 y(It)h(i)q(s)g(imp)q(o)q(s)q(s)q(ib)o(le)h(t)o(o)f -(remo)o(v)o(e)f(a)h(direct)o(ory)h(in)f(t)n(h)o(e)g(CVS)g(rep)q(o)q(s)q -(it)o(ory)g(in)h(a)e(cle)q(an)i(w)o(ay)l(.)k(Som)o(eon)o(e)240 -1800 y(h)o(a)o(v)o(e)15 b(tr)q(ie)q(d)g(t)o(o)g(remo)o(v)o(e)g(on)o(e,) -f(an)o(d)h(CVS)h(get)o(s)f(confus)q(e)q(d.)21 b(Remo)o(v)o(e)15 -b(y)o(our)f(co)o(p)o(y)h(of)g(t)n(h)o(e)g(direct)o(ory)l(.)0 -2031 y Fk(4.2)33 b(Select)n(e)r(d)15 b(\014le)r(s)62 -2168 y Fo(Man)o(y)g(of)g(t)n(h)o(e)g(comm)o(an)o(ds)f(w)o(or)o(ks)h(on) -g(t)n(h)o(e)g(curren)o(t)g(s)q(et)g(of)g Fh(s)q(elect)o(e)q(d)j -Fo(\014le)q(s.)37 2306 y Fn(\017)30 b Fo(If)15 b(t)n(h)o(ere)h(are)f -(an)o(y)g(\014le)q(s)h(t)n(h)o(a)o(t)e(are)h(m)o(ar)o(k)o(e)q(d)g(t)n -(h)o(ey)g(const)o(it)o(u)o(t)o(e)h(t)n(h)o(e)f(s)q(et)f(of)h(s)q(elect) -o(e)q(d)i(\014le)q(s.)37 2381 y Fn(\017)30 b Fo(Ot)n(h)o(erwi)q(s)q(e,) -15 b(if)h(t)n(h)o(e)f(cursor)g(p)q(oin)o(t)o(s)h(t)o(o)f(a)g(\014le,)h -(t)n(h)o(a)o(t)e(\014le)i(i)q(s)f(t)n(h)o(e)g(s)q(elect)o(e)q(d)i -(\014le.)37 2457 y Fn(\017)30 b Fo(Ot)n(h)o(erwi)q(s)q(e,)16 -b(if)f(t)n(h)o(e)h(cursor)f(p)q(oin)o(t)o(s)h(t)o(o)g(a)f(direct)o(ory) -l(,)h(all)g(t)n(h)o(e)f(\014le)q(s)i(in)f(t)n(h)o(a)o(t)f(direct)o(ory) -h(t)n(h)o(a)o(t)e(ap)o(p)q(e)q(ars)h(in)h(t)n(h)o(e)90 -2519 y(bu\013er)f(are)g(t)n(h)o(e)g(s)q(elect)o(e)q(d)i(\014le)q(s.)62 -2670 y(Thi)q(s)f(sc)o(h)o(em)o(e)f(migh)o(t)g(s)q(eem)g(a)g(lit)n(t)n -(le)i(comp)o(lica)o(t)o(e)q(d,)f(bu)o(t)g(once)f(on)o(e)g(get)g(us)q(e) -q(d)h(t)o(o)f(it,)g(it)g(i)q(s)h(quit)o(e)f(p)q(o)o(w)o(erful.)p -eop -%%Page: 9 11 -9 10 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(4:)20 b(Bu\013er)15 -b(con)o(t)o(en)o(t)o(s)1397 b(9)62 183 y(See)16 b(Sect)o(ion)g(5.3)e -([Mar)o(kin)o(g)i(\014le)q(s],)f(page)g(11)g(t)o(ells)h(h)o(o)o(w)e(y)o -(ou)h(m)o(ar)o(k)g(an)o(d)g(u)o(nm)o(ar)o(k)h(\014le)q(s.)p -eop -%%Page: 10 12 -10 11 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(10)0 183 y Fm(5)41 b(Comm)n(an)n(ds)62 386 y Fo(Thi)q(s)16 -b(c)o(h)o(apt)o(er)e(d)o(e)q(scr)q(ib)q(e)q(s)j(all)f(t)n(h)o(e)f(comm) -o(an)o(ds)g(t)n(h)o(a)o(t)f(y)o(ou)h(can)g(us)q(e)h(in)g(p)q(cl-cvs.)0 -640 y Fk(5.1)33 b(Up)r(d)o(a)n(t)n(in)o(g)16 b(t)m(h)n(e)g(direct)o -(ory)0 796 y Fl(M-x)f(cvs-update)240 858 y Fo(R)m(u)o(n)k(a)f(`)p -Fl(cvs)c(update)p Fo(')i(comm)o(an)o(d.)27 b(Y)l(ou)18 -b(will)h(b)q(e)e(ask)o(e)q(d)h(for)f(t)n(h)o(e)h(direct)o(ory)g(in)g -(whic)o(h)g(t)n(h)o(e)g(`)p Fl(cvs)240 921 y(update)p -Fo(')f(will)i(b)q(e)f(ru)o(n.)28 b(Th)o(e)18 b(ou)o(t)o(pu)o(t)h(will)g -(b)q(e)f(pars)q(e)q(d)g(b)o(y)g(p)q(cl-cvs,)i(an)o(d)d(t)n(h)o(e)h(re)q -(sul)o(t)h(pr)q(in)o(t)o(e)q(d)f(in)240 983 y(t)n(h)o(e)e(`)p -Fl(*cvs*)p Fo(')f(bu\013er)i(\(s)q(ee)f(s)q(ee)g(Ch)o(apt)o(er)g(4)g -([Bu\013er)g(con)o(t)o(en)o(t)o(s],)f(page)i(7)f(for)f(a)h(d)o(e)q(scr) -q(ipt)o(ion)i(of)e(t)n(h)o(e)240 1045 y(con)o(t)o(en)o(t)o(s\).)240 -1123 y(By)i(d)o(ef)q(a)n(ul)o(t,)i(`)p Fl(cvs-update)p -Fo(')c(will)j(d)o(e)q(scen)o(d)h(recurs)q(iv)o(ely)f(in)o(t)o(o)f(su)n -(b)q(direct)o(or)q(ie)q(s.)31 b(Y)l(ou)18 b(can)g(a)o(v)o(oid)240 -1185 y(t)n(h)o(a)o(t)f(b)q(e)o(h)o(a)o(vior)h(b)o(y)h(givin)o(g)g(a)f -(pre\014x)h(argu)o(m)o(en)o(t)f(t)o(o)g(it)g(\(e.g.,)g(b)o(y)g(t)o -(ypin)o(g)h Fl(C-u)c(M-x)f(cvs-update)240 1248 y(RET)p -Fo(\).)240 1326 y(All)21 b(ot)n(h)o(er)f(comm)o(an)o(ds)g(in)h(p)q -(cl-cvs)h(require)q(s)f(t)n(h)o(a)o(t)e(y)o(ou)h(h)o(a)o(v)o(e)g(a)f(`) -p Fl(*cvs*)p Fo(')g(bu\013er.)35 b(Thi)q(s)21 b(i)q(s)f(t)n(h)o(e)240 -1388 y(comm)o(an)o(d)15 b(t)n(h)o(a)o(t)f(y)o(ou)h(us)q(e)g(t)o(o)g -(get)g(on)o(e.)240 1466 y(CVS)21 b(us)q(e)q(s)g(lo)q(c)o(k)g(\014le)q -(s)h(in)f(t)n(h)o(e)f(rep)q(o)q(s)q(it)o(ory)g(t)o(o)h(ensure)g(t)n(h)o -(e)f(in)o(t)o(egr)q(it)o(y)g(of)g(t)n(h)o(e)h(d)o(a)o(t)o(a)f(\014le)q -(s)i(in)f(t)n(h)o(e)240 1528 y(rep)q(o)q(s)q(it)o(ory)l(.)k(Th)o(ey)17 -b(migh)o(t)g(b)q(e)g(left)h(b)q(e)o(hin)o(d)g(i.e.)26 -b(if)17 b(a)g(w)o(or)o(kst)o(a)o(t)o(ion)f(crash)o(e)q(s)h(in)h(t)n(h)o -(e)f(middle)i(of)d(a)240 1590 y(CVS)h(o)o(p)q(era)o(t)o(ion.)25 -b(CVS)17 b(ou)o(t)o(pu)o(t)o(s)h(a)e(m)o(e)q(s)q(sage)g(wh)o(en)i(it)f -(i)q(s)g(w)o(ait)o(in)o(g)g(for)g(a)f(lo)q(c)o(k)i(\014le)g(t)o(o)f(go) -f(aw)o(ay)l(.)240 1653 y(Pcl-cvs)i(will)g(sh)o(o)o(w)f(t)n(h)o(e)f(sam) -o(e)h(m)o(e)q(s)q(sage)f(in)h(t)n(h)o(e)g(*cvs*)f(bu\013er,)h(t)o(oget) -n(h)o(er)g(wit)n(h)g(instru)o(ct)o(ions)h(for)240 1715 -y(d)o(elet)o(in)o(g)g(t)n(h)o(e)f(lo)q(c)o(k)g(\014le)q(s.)25 -b(Y)l(ou)17 b(sh)o(ould)h(norm)o(ally)f(not)f(h)o(a)o(v)o(e)g(t)o(o)g -(d)o(elet)o(e)i(t)n(h)o(em)e(m)o(an)n(ually)i(|)f(just)240 -1777 y(w)o(ait)10 b(a)h(lit)n(t)n(le)h(while)h(an)o(d)d(t)n(h)o(e)h -(prob)o(lem)h(sh)o(ould)g(\014x)e(it)o(s)q(elf.)20 b(Bu)o(t)11 -b(if)h(t)n(h)o(e)e(lo)q(c)o(k)h(\014le)q(s)h(do)q(e)q(sn't)f(di)q(sap)o -(p)q(e)q(ar)240 1840 y(y)o(ou)k(can)g(d)o(elet)o(e)h(t)n(h)o(em)f(wit)n -(h)h Fl(M-x)f(cvs-delete-lock)e(RET)p Fo(.)0 1933 y Fl(g)216 -b Fo(Thi)q(s)14 b(will)h(ru)o(n)f(`)p Fl(cvs)g(update)p -Fo(')e(again.)20 b(It)13 b(will)i(alw)o(ays)e(us)q(e)h(t)n(h)o(e)f(sam) -o(e)g(bu\013er)g(t)n(h)o(a)o(t)g(w)o(as)f(us)q(e)q(d)j(wit)n(h)240 -1996 y(t)n(h)o(e)i(previous)g(`)p Fl(cvs)d(update)p Fo('.)23 -b(Giv)o(e)17 b(a)f(pre\014x)i(argu)o(m)o(en)o(t)d(t)o(o)i(a)o(v)o(oid)f -(d)o(e)q(scen)o(din)o(g)j(in)o(t)o(o)e(su)n(b)q(direc-)240 -2058 y(t)o(or)q(ie)q(s.)j(Thi)q(s)c(ru)o(ns)f(t)n(h)o(e)g(comm)o(an)o -(d)g(`)p Fl(cvs-mode-update-no-prompt)o Fo('.)0 2152 -y Fl(G)216 b Fo(Thi)q(s)18 b(will)h(ru)o(n)f(`)p Fl(cvs)d(update)p -Fo(')h(an)o(d)h(prompt)g(for)g(a)h(n)o(ew)f(direct)o(ory)h(t)o(o)g(up)q -(d)o(a)o(t)o(e.)27 b(Thi)q(s)18 b(ru)o(ns)g(t)n(h)o(e)240 -2214 y(comm)o(an)o(d)d(`)p Fl(cvs-update)p Fo('.)0 2467 -y Fk(5.2)33 b(Mo)n(v)n(em)n(en)n(t)15 b(Comm)n(an)n(ds)62 -2608 y Fo(Y)l(ou)g(can)g(us)q(e)f(mo)q(st)f(norm)o(al)i(Em)o(acs)f -(comm)o(an)o(ds)g(t)o(o)g(mo)o(v)o(e)g(forw)o(ard)f(an)o(d)h(bac)o(kw)o -(ard)g(in)h(t)n(h)o(e)f(bu\013er.)20 b(Som)o(e)0 2670 -y(k)o(eys)15 b(are)g(re)o(b)q(ou)o(n)o(d)h(t)o(o)f(fu)o(nct)o(ions)h(t) -n(h)o(a)o(t)f(t)o(ak)o(e)f(adv)m(an)o(t)o(age)g(of)h(t)n(h)o(e)g(f)q -(act)f(t)n(h)o(a)o(t)g(t)n(h)o(e)i(bu\013er)f(i)q(s)g(a)g(p)q(cl-cvs)i -(bu\013er:)p eop -%%Page: 11 13 -11 12 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(11)0 183 y Fl(SPC)0 246 y(C-n)0 308 y(n)216 b Fo(Th)o(e)q(s)q(e)18 -b(k)o(eys)g(mo)o(v)o(e)g(t)n(h)o(e)g(cursor)g(on)o(e)g(\014le)h(forw)o -(ard,)e(t)o(o)o(w)o(ards)g(t)n(h)o(e)h(en)o(d)h(of)f(t)n(h)o(e)g -(bu\013er)g(\()p Fl(cookie-)240 370 y(next-cookie)p Fo(\).)0 -453 y Fl(C-p)0 516 y(p)216 b Fo(Th)o(e)q(s)q(e)23 b(k)o(eys)g(mo)o(v)o -(e)f(on)o(e)h(\014le)h(bac)o(kw)o(ard,)g(t)o(o)o(w)o(ards)e(t)n(h)o(e)h -(b)q(eginnin)o(g)i(of)d(t)n(h)o(e)h(bu\013er)g(\()p Fl(cookie-)240 -578 y(previous-cookie)p Fo(\).)0 795 y Fk(5.3)33 b(Mar)o(kin)o(g)16 -b(\014le)r(s)62 932 y Fo(Pcl-cvs)i(w)o(or)o(ks)e(on)g(a)h(s)q(et)f(of)g -Fh(s)q(elect)o(e)q(d)i(\014le)q(s)h Fo(\(s)q(ee)e(Sect)o(ion)g(4.2)f -([Select)o(e)q(d)h(\014le)q(s],)h(page)e(8\).)24 b(Y)l(ou)17 -b(can)f(m)o(ar)o(k)0 994 y(an)o(d)f(u)o(nm)o(ar)o(k)h(\014le)q(s)g(wit) -n(h)g(t)n(h)o(e)q(s)q(e)f(comm)o(an)o(ds:)0 1141 y Fl(m)216 -b Fo(Thi)q(s)19 b(m)o(ar)o(ks)f(t)n(h)o(e)h(\014le)h(t)n(h)o(a)o(t)d(t) -n(h)o(e)i(cursor)f(i)q(s)h(p)q(o)q(s)q(it)o(ion)o(e)q(d)g(on.)31 -b(If)19 b(t)n(h)o(e)f(cursor)h(i)q(s)g(p)q(o)q(s)q(it)o(ion)o(e)q(d)g -(on)f(a)240 1204 y(direct)o(ory)e(all)g(\014le)q(s)g(in)g(t)n(h)o(a)o -(t)f(direct)o(ory)g(will)i(b)q(e)e(m)o(ar)o(k)o(e)q(d.)21 -b(\()p Fl(cvs-mode-mark)p Fo(\).)0 1287 y Fl(u)216 b -Fo(Unm)o(ar)o(k)14 b(t)n(h)o(e)h(\014le)g(t)n(h)o(a)o(t)f(t)n(h)o(e)g -(cursor)g(i)q(s)h(p)q(o)q(s)q(it)o(ion)o(e)q(d)g(on.)k(If)c(t)n(h)o(e)f -(cursor)g(i)q(s)h(on)f(a)g(direct)o(ory)l(,)h(all)h(\014le)q(s)240 -1349 y(in)g(t)n(h)o(a)o(t)e(direct)o(ory)i(will)h(b)q(e)e(u)o(nm)o(ar)o -(k)o(e)q(d.)21 b(\()p Fl(cvs-mode-unmark)p Fo(\).)0 1433 -y Fl(M)216 b Fo(Mar)o(k)15 b Fh(all)j Fo(\014le)q(s)e(in)g(t)n(h)o(e)f -(bu\013er)h(\()p Fl(cvs-mode-mark-all-fil)o(es)p Fo(\).)0 -1516 y Fl(ESC)f(DEL)81 b Fo(Unm)o(ar)o(k)15 b Fh(all)j -Fo(\014le)q(s)f(\()p Fl(cvs-mode-unmark-all-f)o(iles)p -Fo(\).)0 1600 y Fl(DEL)168 b Fo(Unm)o(ar)o(k)16 b(t)n(h)o(e)g(\014le)i -(on)e(t)n(h)o(e)g(previous)h(lin)o(e,)h(an)o(d)e(mo)o(v)o(e)f(p)q(oin)o -(t)i(t)o(o)f(t)n(h)o(a)o(t)f(lin)o(e)j(\()p Fl(cvs-mode-unmark-)240 -1662 y(up)p Fo(\).)0 1879 y Fk(5.4)33 b(Commit)m(t)n(in)o(g)16 -b(c)n(h)n(an)o(ge)r(s)0 2026 y Fl(c)216 b Fo(All)18 b(\014le)q(s)g(t)n -(h)o(a)o(t)e(h)o(a)o(v)o(e)g(a)h Fl(")p Fo(n)o(ee)q(d)g(t)o(o)g(b)q(e)g -(c)o(h)o(ec)o(k)o(e)q(d)g(in)p Fl(")p Fo(-m)o(ar)o(k)o(er)h(\(s)q(ee)e -(Ch)o(apt)o(er)g(4)h([Bu\013er)f(con)o(t)o(en)o(t)o(s],)240 -2088 y(page)21 b(7\))f(can)h(b)q(e)g(c)o(h)o(ec)o(k)o(e)q(d)g(in)h(wit) -n(h)f(t)n(h)o(e)g Fl(c)g Fo(comm)o(an)o(d.)36 b(It)21 -b(c)o(h)o(ec)o(ks)g(in)g(all)h(s)q(elect)o(e)q(d)g(\014le)q(s)g(\(s)q -(ee)240 2151 y(Sect)o(ion)c(4.2)e([Select)o(e)q(d)j(\014le)q(s],)f -(page)f(8\))g(\(except)h(t)n(h)o(o)q(s)q(e)e(wh)o(o)h(lac)o(k)h(t)n(h)o -(e)f Fl(")p Fo(ci)p Fl(")p Fo(-m)o(ar)o(k)o(er)h(-)f(t)n(h)o(ey)g(are) -240 2213 y(ignore)q(d\).)j(Pre)q(s)q(s)q(in)o(g)c Fl(c)f -Fo(ca)n(us)q(e)q(s)h Fl(cvs-mode-commit)d Fo(t)o(o)i(b)q(e)g(ru)o(n.) -240 2286 y(Wh)o(en)g(y)o(ou)g(pre)q(s)q(s)g Fl(c)g Fo(y)o(ou)g(will)h -(get)f(a)g(bu\013er)g(calle)q(d)i(`)p Fl(*cvs-commit-message*)p -Fo('.)f(En)o(t)o(er)f(t)n(h)o(e)g(log)240 2348 y(m)o(e)q(s)q(sage)f -(for)h(t)n(h)o(e)g(\014le\(s\))g(in)h(it.)k(Wh)o(en)15 -b(y)o(ou)g(are)g(re)q(ady)f(y)o(ou)h(sh)o(ould)h(pre)q(s)q(s)f -Fl(C-c)g(C-c)g Fo(t)o(o)f(act)o(ually)240 2410 y(commit)h(t)n(h)o(e)g -(\014le)q(s)i(\(us)q(in)o(g)e Fl(cvs-edit-done)p Fo(\).)240 -2483 y(Norm)o(ally)f(t)n(h)o(e)g(`)p Fl(*cvs-commit-message*)p -Fo(')d(bu\013er)j(will)i(ret)o(ain)e(t)n(h)o(e)g(log)g(m)o(e)q(s)q -(sage)f(f)q(rom)g(t)n(h)o(e)h(pre-)240 2545 y(vious)j(commit,)g(bu)o(t) -g(if)g(t)n(h)o(e)g(v)m(ar)q(ia)o(b)o(le)h Fl(cvs-erase-input-buffer)13 -b Fo(i)q(s)k(s)q(et)f(t)o(o)h(a)f(non-)p Fl(nil)h Fo(v)m(alue)240 -2608 y(t)n(h)o(e)12 b(bu\013er)g(will)i(b)q(e)e(eras)q(e)q(d.)19 -b(P)o(oin)o(t)11 b(an)o(d)h(m)o(ar)o(k)g(will)i(alw)o(ays)d(b)q(e)h(lo) -q(ca)o(t)o(e)q(d)h(arou)o(n)o(d)f(t)n(h)o(e)g(en)o(t)o(ire)g(bu\013er) -240 2670 y(so)j(t)n(h)o(a)o(t)f(y)o(ou)h(can)g(e)q(as)q(ily)h(eras)q(e) -f(it)g(wit)n(h)h Fl(C-w)f Fo(\(`)p Fl(kill-region)p Fo('\).)p -eop -%%Page: 12 14 -12 13 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(12)240 183 y(If)26 b(y)o(ou)g(are)g(e)q(dit)o(in)o(g)h(t)n(h)o(e)f -(\014le)q(s)i(in)f(y)o(our)e(em)o(acs)h(an)g(a)n(u)o(t)o(om)o(a)o(t)o -(ic)g(`)p Fl(revert-buffer)p Fo(')d(will)28 b(b)q(e)240 -246 y(p)q(erform)o(e)q(d.)40 b(\(If)22 b(t)n(h)o(e)f(\014le)i(con)o(t)o -(ains)f(`)p Fl($Id: pcl-cvs.ps,v 1.1.1.2 1996/04/27 20:02:48 tholo Exp $)p Fo(')e(k)o(eyw)o(ords)h(`)p Fl(cvs)15 -b(commit)p Fo(')21 b(will)i(wr)q(it)o(e)e(a)h(n)o(ew)g(\014le)240 -308 y(wit)n(h)k(t)n(h)o(e)f(n)o(ew)g(v)m(alue)q(s)i(su)n(b)q(st)o(it)o -(u)o(t)o(e)q(d.)51 b(Th)o(e)25 b(a)n(u)o(t)o(o-rev)o(ert)g(m)o(ak)o(e)q -(s)g(sure)h(t)n(h)o(a)o(t)e(y)o(ou)h(get)g(t)n(h)o(em)240 -370 y(in)o(t)o(o)c(y)o(our)e(bu\013er\).)36 b(Th)o(e)20 -b(rev)o(ert)g(will)i(not)e(o)q(ccur)h(if)g(y)o(ou)f(h)o(a)o(v)o(e)f(mo) -q(di\014e)q(d)j(y)o(our)e(bu\013er,)i(or)d(if)240 432 -y(`)p Fl(cvs-auto-revert-after-c)o(ommit)p Fo(')12 b(i)q(s)j(s)q(et)g -(t)o(o)g(`)p Fl(nil)p Fo('.)0 521 y Fl(C)216 b Fo(Thi)q(s)15 -b(i)q(s)g(just)g(lik)o(e)h(`)p Fl(cvs-mode-commit)p Fo(',)c(except)j(t) -n(h)o(a)o(t)f(it)i(tr)q(ie)q(s)f(t)o(o)f(pro)o(vid)o(e)i(ap)o(pro)o(pr) -q(ia)o(t)o(e)e(d)o(ef)q(a)n(ul)o(t)240 583 y(log)k(m)o(e)q(s)q(sage)q -(s)g(b)o(y)g(lo)q(okin)o(g)i(a)o(t)e(t)n(h)o(e)g(`)p -Fl(ChangeLog)p Fo('s)e(in)k(t)n(h)o(e)e(curren)o(t)g(direct)o(ory)l(.) -30 b(Th)o(e)19 b(id)o(e)q(a)g(i)q(s)f(t)o(o)240 645 y(wr)q(it)o(e)11 -b(y)o(our)g(Ch)o(an)o(geLog)h(en)o(tr)q(ie)q(s)f(\014rst,)h(an)o(d)g(t) -n(h)o(en)f(us)q(e)h(t)n(hi)q(s)g(comm)o(an)o(d)f(t)o(o)g(commit)h(y)o -(our)f(c)o(h)o(an)o(ge)q(s.)240 707 y(Pre)q(s)q(s)q(in)o(g)k -Fl(C)g Fo(ca)n(us)q(e)q(s)h Fl(cvs-mode-changelog-commit)c -Fo(t)o(o)j(b)q(e)g(ru)o(n.)240 783 y(T)l(o)g(s)q(elect)h(d)o(ef)q(a)n -(ul)o(t)g(log)f(t)o(ext,)f(p)q(cl-cvs:)265 858 y Fn(\000)30 -b Fo(\014n)o(ds)16 b(t)n(h)o(e)f(Ch)o(an)o(geLogs)g(for)f(t)n(h)o(e)h -(\014le)q(s)i(t)o(o)e(b)q(e)g(c)o(h)o(ec)o(k)o(e)q(d)h(in;)265 -933 y Fn(\000)30 b Fo(v)o(er)q(i\014e)q(s)22 b(t)n(h)o(a)o(t)d(t)n(h)o -(e)i(t)o(o)o(p)g(en)o(try)f(in)i(t)n(h)o(e)e(Ch)o(an)o(geLog)h(i)q(s)g -(on)g(t)n(h)o(e)f(curren)o(t)h(d)o(a)o(t)o(e)g(an)o(d)f(b)o(y)h(t)n(h)o -(e)330 996 y(curren)o(t)15 b(us)q(er;)g(if)h(not,)e(no)h(d)o(ef)q(a)n -(ul)o(t)i(t)o(ext)d(i)q(s)h(pro)o(vid)o(e)q(d;)265 1071 -y Fn(\000)30 b Fo(s)q(e)q(arc)o(h)14 b(t)n(h)o(e)g(Ch)o(an)o(geLog)h -(en)o(try)f(for)g(paragraphs)f(con)o(t)o(ainin)o(g)i(t)n(h)o(e)g(n)o -(am)o(e)q(s)f(of)g(t)n(h)o(e)h(\014le)q(s)h(w)o(e're)330 -1133 y(c)o(h)o(ec)o(kin)o(g)g(in;)g(an)o(d)f(\014n)o(ally)265 -1209 y Fn(\000)30 b Fo(us)q(e)q(s)11 b(t)n(h)o(o)q(s)q(e)e(paragraphs)h -(as)g(t)n(h)o(e)g(d)o(ef)q(a)n(ul)o(t)i(log)e(t)o(ext)g(in)h(t)n(h)o(e) -f(`)p Fl(*cvs-commit-message*)p Fo(')d(bu\013er.)240 -1297 y(Y)l(ou)15 b(can)h(t)n(h)o(en)f(commit)g(t)n(h)o(e)g(`)p -Fl(ChangeLog)p Fo(')f(\014le)i(once)f(p)q(er)h(d)o(ay)f(wit)n(h)o(ou)o -(t)h(an)o(y)f(log)g(m)o(e)q(s)q(sage.)0 1527 y Fk(5.5)33 -b(Edit)n(in)o(g)17 b(\014le)r(s)62 1664 y Fo(Th)o(ere)e(are)g(curren)o -(t)n(ly)g(t)n(hree)g(comm)o(an)o(ds)f(t)n(h)o(a)o(t)g(can)h(b)q(e)g(us) -q(e)q(d)g(t)o(o)g(\014n)o(d)g(a)f(\014le)i(\(t)n(h)o(a)o(t)e(i)q(s,)g -(load)h(it)g(in)o(t)o(o)g(a)g(bu\013er)0 1726 y(an)o(d)h(st)o(art)f(e)q -(dit)o(in)o(g)j(it)f(t)n(h)o(ere\).)23 b(Th)o(e)q(s)q(e)16 -b(comm)o(an)o(ds)g(w)o(or)o(k)g(on)g(t)n(h)o(e)g(lin)o(e)i(t)n(h)o(a)o -(t)d(t)n(h)o(e)h(cursor)g(i)q(s)h(s)q(it)o(ua)o(t)o(e)q(d)f(a)o(t.)22 -b(Th)o(ey)0 1789 y(ignore)15 b(an)o(y)g(m)o(ar)o(k)o(e)q(d)h(\014le)q -(s.)0 1939 y Fl(f)216 b Fo(Fin)o(d)17 b(t)n(h)o(e)g(\014le)g(t)n(h)o(a) -o(t)f(t)n(h)o(e)g(cursor)g(p)q(oin)o(t)o(s)i(t)o(o.)23 -b(R)m(u)o(n)c(`)p Fl(dired)p Fo(')c(if)i(t)n(h)o(e)f(cursor)h(p)q(oin)o -(t)o(s)g(t)o(o)f(a)g(direct)o(ory)240 2002 y(\()p Fl -(cvs-mode-find-file)p Fo(\).)0 2090 y Fl(o)216 b Fo(Lik)o(e)16 -b Fl(f)p Fo(,)f(bu)o(t)g(us)q(e)h(anot)n(h)o(er)f(win)o(do)o(w)g(\()p -Fl(cvs-mode-find-file-othe)o(r-windo)o(w)p Fo(\).)0 2178 -y Fl(A)216 b Fo(In)o(v)o(ok)o(e)29 b(`)p Fl(add-change-log-entry-other) -o(-window)p Fo(')d(t)o(o)j(e)q(dit)i(a)e(`)p Fl(ChangeLog)p -Fo(')f(\014le.)64 b(Th)o(e)240 2241 y(`)p Fl(ChangeLog)p -Fo(')21 b(will)k(b)q(e)e(fou)o(n)o(d)h(in)g(t)n(h)o(e)f(direct)o(ory)h -(of)e(t)n(h)o(e)h(\014le)i(t)n(h)o(e)e(cursor)g(p)q(oin)o(t)o(s)g(t)o -(o.)44 b(\()p Fl(cvs-)240 2303 y(mode-add-change-log-entry-)o(other-w)o -(indow)p Fo(\))o(.)0 2532 y Fk(5.6)33 b(Get)m(t)n(in)o(g)16 -b(info)f(a)n(b)r(ou)o(t)h(\014le)r(s)62 2670 y Fo(Bot)n(h)f(of)g(t)n(h) -o(e)g(fo)o(llo)o(win)o(g)i(comm)o(an)o(ds)e(can)g(b)q(e)g(cust)o(omize) -q(d.)22 b(See)16 b(Ch)o(apt)o(er)e(6)h([Cust)o(omiza)o(t)o(ion],)f -(page)h(18.)p eop -%%Page: 13 15 -13 14 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(13)0 183 y Fl(l)216 b Fo(R)m(u)o(n)21 b(`)p Fl(cvs)14 -b(log)p Fo(')19 b(on)g(all)h(s)q(elect)o(e)q(d)g(\014le)q(s,)h(an)o(d)e -(sh)o(o)o(w)g(t)n(h)o(e)g(re)q(sul)o(t)h(in)g(a)f(t)o(emp)q(orary)f -(bu\013er)i(\()p Fl(cvs-)240 246 y(mode-log)p Fo(\).)0 -345 y Fl(s)216 b Fo(R)m(u)o(n)16 b(`)p Fl(cvs)e(status)p -Fo(')f(on)h(all)h(s)q(elect)o(e)q(d)h(\014le)q(s,)f(an)o(d)f(sh)o(o)o -(w)f(t)n(h)o(e)h(re)q(sul)o(t)i(in)f(a)e(t)o(emp)q(orary)h(bu\013er)g -(\()p Fl(cvs-)240 407 y(mode-status)p Fo(\).)0 685 y -Fk(5.7)33 b(Addin)o(g)16 b(an)n(d)g(remo)n(vin)o(g)g(\014le)r(s)62 -828 y Fo(Th)o(e)i(fo)o(llo)o(win)o(g)i(comm)o(an)o(ds)e(are)g(a)o(v)m -(aila)o(b)o(le)i(t)o(o)e(m)o(ak)o(e)g(it)g(e)q(asy)g(t)o(o)g(add)g(an)o -(d)g(remo)o(v)o(e)g(\014le)q(s)h(f)q(rom)f(t)n(h)o(e)g(CVS)0 -890 y(rep)q(o)q(s)q(it)o(ory)l(.)0 1051 y Fl(a)216 b -Fo(Add)13 b(all)h(s)q(elect)o(e)q(d)f(\014le)q(s.)20 -b(Thi)q(s)13 b(comm)o(an)o(d)f(can)h(b)q(e)f(us)q(e)q(d)i(on)e(`)p -Fl(Unknown)p Fo(')f(\014le)q(s)j(\(s)q(ee)e(s)q(ee)h(Sect)o(ion)g(4.1) -240 1114 y([File)i(st)o(a)o(t)o(us],)d(page)i(7\).)19 -b(Th)o(e)c(st)o(a)o(t)o(us)d(of)i(t)n(h)o(e)g(\014le)i(will)g(c)o(h)o -(an)o(ge)e(t)o(o)g(`)p Fl(Added)p Fo(',)f(an)o(d)h(y)o(ou)g(will)i(h)o -(a)o(v)o(e)d(t)o(o)240 1176 y(us)q(e)g Fl(c)g Fo(\(`)p -Fl(cvs-mode-commit)p Fo(',)d(s)q(ee)k(s)q(ee)f(Sect)o(ion)h(5.4)e -([Commit)n(t)o(in)o(g)h(c)o(h)o(an)o(ge)q(s],)g(page)g(11\))g(t)o(o)g -(re)q(ally)240 1238 y(add)i(t)n(h)o(e)h(\014le)g(t)o(o)f(t)n(h)o(e)g -(rep)q(o)q(s)q(it)o(ory)l(.)240 1319 y(Thi)q(s)10 b(comm)o(an)o(d)g -(can)h(also)f(b)q(e)g(us)q(e)q(d)h(on)f(`)p Fl(Removed)p -Fo(')f(\014le)q(s)i(\(b)q(efore)f(y)o(ou)g(commit)g(t)n(h)o(em\))g(t)o -(o)g(re)q(surrect)240 1381 y(t)n(h)o(em.)240 1462 y(Select)o(e)q(d)k -(\014le)q(s)f(t)n(h)o(a)o(t)e(are)h(n)o(e)q(it)n(h)o(er)h(`)p -Fl(Unknown)p Fo(')e(nor)h(`)p Fl(Removed)p Fo(')e(will)k(b)q(e)e -(ignore)q(d)h(b)o(y)f(t)n(hi)q(s)h(comm)o(an)o(d.)240 -1543 y(Th)o(e)i(comm)o(an)o(d)g(t)n(h)o(a)o(t)f(i)q(s)h(ru)o(n)h(i)q(s) -g Fl(cvs-mode-add)p Fo(.)0 1642 y Fl(r)216 b Fo(Thi)q(s)16 -b(comm)o(an)o(d)f(remo)o(v)o(e)q(s)h(t)n(h)o(e)f(s)q(elect)o(e)q(d)i -(\014le)q(s)g(\(aft)o(er)e(prompt)o(in)o(g)h(for)f(con\014rm)o(a)o(t)o -(ion\).)21 b(Th)o(e)16 b(\014le)q(s)240 1704 y(are)j(`)p -Fl(rm)p Fo('e)q(d)f(f)q(rom)g(y)o(our)h(direct)o(ory)g(an)o(d)g(\(u)o -(nle)q(s)q(s)h(t)n(h)o(e)f(st)o(a)o(t)o(us)e(w)o(as)i(`)p -Fl(Unknown)p Fo(';)f(s)q(ee)h(Sect)o(ion)h(4.1)240 1766 -y([File)e(st)o(a)o(t)o(us],)d(page)i(7\))f(t)n(h)o(ey)h(will)i(also)e -(b)q(e)g(`)p Fl(cvs)d(remove)p Fo('d.)24 b(If)18 b(t)n(h)o(e)f(\014le)q -(s)h(w)o(ere)f(`)p Fl(Unknown)p Fo(')e(t)n(h)o(ey)240 -1829 y(will)21 b(di)q(sap)o(p)q(e)q(ar)d(f)q(rom)g(t)n(h)o(e)h -(bu\013er.)32 b(Ot)n(h)o(erwi)q(s)q(e)19 b(t)n(h)o(e)q(ir)h(st)o(a)o(t) -o(us)d(will)k(c)o(h)o(an)o(ge)e(t)o(o)g(`)p Fl(Removed)p -Fo(',)f(an)o(d)240 1891 y(y)o(ou)13 b(m)n(ust)g(us)q(e)h -Fl(c)f Fo(\(`)p Fl(cvs-mode-commit)p Fo(',)d(s)q(ee)k(Sect)o(ion)g(5.4) -e([Commit)n(t)o(in)o(g)h(c)o(h)o(an)o(ge)q(s],)h(page)f(11\))f(t)o(o) -240 1953 y(commit)j(t)n(h)o(e)g(remo)o(v)m(al.)240 2034 -y(Th)o(e)g(comm)o(an)o(d)g(t)n(h)o(a)o(t)f(i)q(s)h(ru)o(n)h(i)q(s)g -Fl(cvs-mode-remove-file)p Fo(.)0 2312 y Fk(5.8)33 b(Un)n(doin)o(g)16 -b(c)n(h)n(an)o(ge)r(s)0 2473 y Fl(U)216 b Fo(If)15 b(y)o(ou)f(h)o(a)o -(v)o(e)g(mo)q(di\014e)q(d)i(a)e(\014le,)h(an)o(d)f(for)g(som)o(e)g(re)q -(ason)g(d)o(ecid)o(e)i(t)n(h)o(a)o(t)e(y)o(ou)g(don't)g(w)o(an)o(t)f(t) -o(o)h(k)o(eep)h(t)n(h)o(e)240 2535 y(c)o(h)o(an)o(ge)q(s,)i(y)o(ou)g -(can)g(u)o(n)o(do)h(t)n(h)o(em)f(wit)n(h)g(t)n(hi)q(s)g(comm)o(an)o(d.) -25 b(It)17 b(w)o(or)o(ks)g(b)o(y)g(remo)o(vin)o(g)g(y)o(our)g(w)o(or)o -(kin)o(g)240 2598 y(co)o(p)o(y)12 b(of)g(t)n(h)o(e)g(\014le)i(an)o(d)e -(t)n(h)o(en)g(get)n(t)o(in)o(g)h(t)n(h)o(e)f(la)o(t)o(e)q(st)g(v)o(ers) -q(ion)h(f)q(rom)e(t)n(h)o(e)h(rep)q(o)q(s)q(it)o(ory)g(\()p -Fl(cvs-mode-undo-)240 2660 y(local-changes)p Fo(.)p eop -%%Page: 14 16 -14 15 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(14)0 183 y Fk(5.9)33 b(Remo)n(vin)o(g)16 b(h)n(an)n(dle)r(d)g(en)n -(tr)q(ie)r(s)0 329 y Fl(x)216 b Fo(Thi)q(s)15 b(comm)o(an)o(d)f(allo)o -(ws)h(y)o(ou)g(t)o(o)f(remo)o(v)o(e)g(all)i(en)o(tr)q(ie)q(s)f(t)n(h)o -(a)o(t)f(y)o(ou)g(h)o(a)o(v)o(e)g(pro)q(ce)q(s)q(s)q(e)q(d.)21 -b(More)14 b(sp)q(eci\014-)240 391 y(cally)l(,)g(t)n(h)o(e)e(lin)o(e)q -(s)i(for)e(`)p Fl(Updated)p Fo(')f(\014le)q(s)j(\(s)q(ee)e(Sect)o(ion)h -(4.1)f([File)h(st)o(a)o(t)o(us],)e(page)h(7)g(an)o(d)g(\014le)q(s)i(t)n -(h)o(a)o(t)e(h)o(a)o(v)o(e)240 454 y(b)q(een)j(c)o(h)o(ec)o(k)o(e)q(d)g -(in)h(\(s)q(ee)e(Sect)o(ion)i(5.4)d([Commit)n(t)o(in)o(g)i(c)o(h)o(an)o -(ge)q(s],)f(page)h(11\))f(are)g(remo)o(v)o(e)q(d)g(f)q(rom)g(t)n(h)o(e) -240 516 y(bu\013er.)30 b(If)19 b(a)f(direct)o(ory)h(b)q(ecom)o(e)q(s)g -(empt)o(y)f(t)n(h)o(e)h(h)o(e)q(adin)o(g)g(for)f(t)n(h)o(a)o(t)f -(direct)o(ory)i(i)q(s)g(also)g(remo)o(v)o(e)q(d.)240 -578 y(Thi)q(s)c(m)o(ak)o(e)q(s)g(it)h(e)q(as)q(ier)f(t)o(o)g(get)f(an)h -(o)o(v)o(erview)h(of)e(wh)o(a)o(t)h(n)o(ee)q(ds)h(t)o(o)f(b)q(e)g(don)o -(e.)240 650 y(Th)o(e)e(comm)o(an)o(d)g(i)q(s)h(calle)q(d)h -Fl(cvs-mode-remove-handled)p Fo(.)i(If)c(`)p Fl -(cvs-auto-remove-handled)p Fo(')d(i)q(s)240 712 y(s)q(et)15 -b(t)o(o)g(non-)p Fl(nil)g Fo(t)n(hi)q(s)g(will)i(a)n(u)o(t)o(om)o(a)o -(t)o(ically)f(b)q(e)f(p)q(erform)o(e)q(d)g(aft)o(er)g(ev)o(ery)g -(commit.)0 792 y Fl(C-k)168 b Fo(Thi)q(s)11 b(comm)o(an)o(d)g(can)g(b)q -(e)g(us)q(e)q(d)g(for)g(lin)o(e)q(s)h(t)n(h)o(a)o(t)e(`)p -Fl(cvs-mode-remove-handled)p Fo(')d(w)o(ould)12 b(not)e(d)o(elet)o(e,) -240 854 y(bu)o(t)16 b(t)n(h)o(a)o(t)e(y)o(ou)h(w)o(an)o(t)f(t)o(o)h(d)o -(elet)o(e)h(\()p Fl(cvs-mode-acknowledge)p Fo(\).)0 1064 -y Fk(5.10)32 b(Ignor)q(in)o(g)16 b(\014le)r(s)0 1210 -y Fl(i)216 b Fo(Arran)o(ge)19 b(so)g(t)n(h)o(a)o(t)g(CVS)g(will)i -(ignore)f(t)n(h)o(e)f(s)q(elect)o(e)q(d)i(\014le)q(s.)33 -b(Th)o(e)20 b(\014le)g(n)o(am)o(e)q(s)f(are)g(add)o(e)q(d)i(t)o(o)e(t)n -(h)o(e)240 1273 y(`)p Fl(.cvsignore)p Fo(')d(\014le)j(in)f(t)n(h)o(e)g -(corre)q(sp)q(on)o(din)o(g)h(direct)o(ory)l(.)29 b(If)18 -b(t)n(h)o(e)g(`)p Fl(.cvsignore)p Fo(')d(do)q(e)q(sn't)j(exi)q(st)g(it) -240 1335 y(will)f(b)q(e)e(cre)q(a)o(t)o(e)q(d.)240 1406 -y(Th)o(e)e(`)p Fl(.cvsignore)p Fo(')e(\014le)j(sh)o(ould)g(norm)o(ally) -f(b)q(e)g(add)o(e)q(d)h(t)o(o)f(t)n(h)o(e)g(rep)q(o)q(s)q(it)o(ory)l(,) -g(bu)o(t)g(y)o(ou)g(could)h(ignore)240 1468 y(it)h(also)h(if)f(y)o(ou)g -(lik)o(e)h(it)g(b)q(et)n(t)o(er)f(t)n(h)o(a)o(t)f(w)o(ay)l(.)240 -1540 y(Thi)q(s)h(ru)o(ns)h Fl(cvs-mode-ignore)p Fo(.)0 -1750 y Fk(5.11)32 b(Viewin)o(g)16 b(di\013erence)r(s)0 -1896 y Fl(d)216 b Fo(Di)q(sp)o(lay)14 b(a)e(`)p Fl(cvs)j(diff)p -Fo(')c(b)q(et)o(w)o(een)i(t)n(h)o(e)f(s)q(elect)o(e)q(d)i(\014le)q(s)g -(an)o(d)f(t)n(h)o(e)g(R)o(CS)g(v)o(ers)q(ion)g(t)n(h)o(a)o(t)e(t)n(h)o -(ey)i(are)f(bas)q(e)q(d)240 1958 y(on.)25 b(See)17 b(Ch)o(apt)o(er)f(6) -h([Cust)o(omiza)o(t)o(ion],)f(page)h(18)f(d)o(e)q(scr)q(ib)q(e)q(s)i(h) -o(o)o(w)e(y)o(ou)h(can)g(s)q(en)o(d)g(\015ags)f(t)o(o)h(`)p -Fl(cvs)240 2020 y(diff)p Fo('.)h(If)c Fh(cvs-di\013-ignore-m)o(ar)o(ks) -j Fo(i)q(s)c(s)q(et)h(t)o(o)f(a)g(non-)p Fl(nil)h Fo(v)m(alue)h(or)e -(if)h(a)f(pre\014x)h(argu)o(m)o(en)o(t)f(i)q(s)g(giv)o(en)240 -2083 y(\(bu)o(t)f(not)f(b)q(ot)n(h\))h(an)o(y)g(m)o(ar)o(k)o(e)q(d)g -(\014le)q(s)h(will)g(not)f(b)q(e)f(cons)q(id)o(ere)q(d)j(t)o(o)e(b)q(e) -f(s)q(elect)o(e)q(d.)20 b(\()p Fl(cvs-mode-diff-)240 -2145 y(cvs)p Fo(\).)0 2225 y Fl(b)216 b Fo(If)15 b(CVS)h(\014n)o(ds)f -(a)g(con\015ict)h(while)g(m)o(ergin)o(g)g(t)o(w)o(o)e(v)o(ers)q(ions)h -(of)g(a)f(\014le)j(\(d)o(ur)q(in)o(g)e(a)g(`)p Fl(cvs)f(update)p -Fo(',)g(s)q(ee)240 2287 y(Sect)o(ion)g(5.1)e([Up)q(d)o(a)o(t)o(in)o(g)i -(t)n(h)o(e)g(direct)o(ory],)f(page)g(10\))g(it)g(will)i(sa)o(v)o(e)e(t) -n(h)o(e)g(or)q(igin)o(al)h(\014le)h(in)f(a)f(\014le)h(calle)q(d)240 -2350 y(`)p Fl(.#)p Fh(FILE)p Fl(.)p Fh(VERSION)5 b Fo(')19 -b(wh)o(ere)g Fh(FILE)i Fo(i)q(s)e(t)n(h)o(e)f(n)o(am)o(e)g(of)g(t)n(h)o -(e)h(\014le,)h(an)o(d)e Fh(VERSION)25 b Fo(i)q(s)18 b(t)n(h)o(e)h(R)o -(CS)240 2412 y(v)o(ers)q(ion)c(n)n(u)o(m)n(b)q(er)h(t)n(h)o(a)o(t)e(y)o -(our)h(\014le)h(w)o(as)f(bas)q(e)q(d)g(on.)240 2483 y(Wit)n(h)d(t)n(h)o -(e)g Fl(b)g Fo(comm)o(an)o(d)f(y)o(ou)h(can)g(ru)o(n)g(a)g(`)p -Fl(diff)p Fo(')f(on)h(t)n(h)o(e)f(\014le)q(s)j(`)p Fl(.#)p -Fh(FILE)p Fl(.)p Fh(VERSION)5 b Fo(')12 b(an)o(d)g(`)p -Fh(FILE)s Fo('.)240 2545 y(Y)l(ou)18 b(can)f(get)g(a)h(con)o(t)o(ext-)e -(or)h(Unidi\013)i(b)o(y)e(s)q(et)n(t)o(in)o(g)h(`)p Fl(cvs-diff-flags)p -Fo(')d(-)j(s)q(ee)f(Ch)o(apt)o(er)g(6)g([Cus-)240 2608 -y(t)o(omiza)o(t)o(ion],)c(page)h(18.)19 b(Thi)q(s)14 -b(comm)o(an)o(d)f(only)h(w)o(or)o(ks)g(on)f(\014le)q(s)i(t)n(h)o(a)o(t) -e(h)o(a)o(v)o(e)g(st)o(a)o(t)o(us)g(`)p Fl(Conflict)p -Fo(')e(or)240 2670 y(`)p Fl(Merged)p Fo('.)p eop -%%Page: 15 17 -15 16 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(15)240 183 y(If)11 b Fh(cvs-di\013-ignore-m)o(ar)o(ks)k -Fo(i)q(s)c(s)q(et)g(t)o(o)g(a)g(non-)p Fl(nil)g Fo(v)m(alue)h(or)f(if)h -(a)f(pre\014x)g(argu)o(m)o(en)o(t)g(i)q(s)g(giv)o(en)h(\(bu)o(t)f(not) -240 246 y(b)q(ot)n(h\))h(an)o(y)f(m)o(ar)o(k)o(e)q(d)h(\014le)q(s)i -(will)f(not)f(b)q(e)g(cons)q(id)o(ere)q(d)h(t)o(o)f(b)q(e)g(s)q(elect)o -(e)q(d.)20 b(\()p Fl(cvs-mode-diff-backup)p Fo(\))o(.)0 -490 y Fk(5.12)32 b(R)l(u)o(nnin)o(g)18 b(e)r(di\013)0 -644 y Fl(e)216 b Fo(Thi)q(s)15 b(comm)o(an)o(d)f(w)o(or)o(ks)h(sligh)o -(t)n(ly)h(di\013eren)o(t)f(d)o(ep)q(en)o(din)o(g)h(on)f(t)n(h)o(e)g(v)o -(ers)q(ion)g(of)f(`)p Fl(ediff)p Fo(')f(an)o(d)i(t)n(h)o(e)g(\014le)240 -707 y(st)o(a)o(t)o(us.)240 784 y(Wit)n(h)10 b(mo)q(d)o(er)q(n)h(v)o -(ers)q(ions)f(of)g(`)p Fl(ediff)p Fo(',)f(t)n(hi)q(s)i(comm)o(an)o(d)e -(in)o(v)o(ok)o(e)q(s)i(`)p Fl(run-ediff-from-cvs-b)o(uffer)p -Fo(')p 1955 792 21 41 v 240 846 a(on)k(on)o(e)g(\014le.)240 -923 y Fj(Not)o(e:)26 b Fo(Wh)o(en)19 b(t)n(h)o(e)g(\014le)h(st)o(a)o(t) -o(us)e(i)q(s)h(`)p Fl(Merged)p Fo(')e(or)i(`)p Fl(Conflict)p -Fo(',)e(CVS)i(h)o(as)g(alre)q(ady)g(p)q(erform)o(e)q(d)f(a)240 -985 y(m)o(erge.)h(Th)o(e)12 b(re)q(sul)o(t)o(in)o(g)i(\014le)g(i)q(s)f -(not)f(us)q(e)q(d)h(in)g(an)o(y)g(w)o(ay)e(if)i(y)o(ou)f(us)q(e)h(t)n -(hi)q(s)g(comm)o(an)o(d.)18 b(If)13 b(y)o(ou)f(us)q(e)h(t)n(h)o(e)240 -1047 y Fl(q)g Fo(comm)o(an)o(d)g(ins)q(id)o(e)i(`)p Fl(ediff)p -Fo(')d(\(t)o(o)h(su)o(cce)q(s)q(sfully)i(t)o(ermin)o(a)o(t)o(e)e(a)g(m) -o(erge\))g(t)n(h)o(e)g(\014le)i(t)n(h)o(a)o(t)d(CVS)i(cre)q(a)o(t)o(e)q -(d)240 1110 y(will)j(b)q(e)e(o)o(v)o(erwr)q(it)n(t)o(en.)240 -1187 y(Old)o(er)d(v)o(ers)q(ions)e(of)g(`)p Fl(ediff)p -Fo(')e(us)q(e)j(an)f(in)o(t)o(erf)q(ace)g(s)q(imilar)h(t)o(o)e(`)p -Fl(emerge)p Fo('.)17 b(Th)o(e)10 b(fu)o(nct)o(ion)h(`)p -Fl(cvs-old-ediff-interface)p Fo(')p 2271 1197 21 42 v -240 1249 a(i)q(s)f(in)o(v)o(ok)o(e)q(d)h(if)g(t)n(h)o(e)f(v)o(ers)q -(ion)g(of)g(`)p Fl(ediff)p Fo(')e(y)o(ou)i(h)o(a)o(v)o(e)g(do)q(e)q -(sn't)f(sup)o(p)q(ort)h(`)p Fl(run-ediff-from-cvs-buffer)o -Fo('.)p 2034 1258 21 41 v 240 1311 a(Th)o(e)q(s)q(e)15 -b(o)o(ld)o(er)i(v)o(ers)q(ions)e(do)h(not)e(sup)o(p)q(ort)h(m)o(ergin)o -(g)h(of)f(revi)q(s)q(ions.)240 1403 y(`)p Fl(Modified)p -Fo(')480 1465 y(R)m(u)o(n)h(`)p Fl(ediff-files)p Fo(')c(wit)n(h)j(y)o -(our)f(w)o(or)o(kin)o(g)h(\014le)h(as)e(\014le)h(A,)g(an)o(d)f(t)n(h)o -(e)g(la)o(t)o(e)q(st)h(revi)q(s)q(ion)480 1527 y(in)h(t)n(h)o(e)f(rep)q -(o)q(s)q(it)o(ory)g(as)g(\014le)h(B.)240 1619 y(`)p Fl(Merged)p -Fo(')240 1681 y(`)p Fl(Conflict)p Fo(')480 1744 y(R)m(u)o(n)f(`)p -Fl(ediff-files3)p Fo(')c(wit)n(h)j(y)o(our)f(w)o(or)o(kin)o(g)h(\014le) -h(\(as)e(it)g(w)o(as)g(pr)q(ior)g(t)o(o)h(y)o(our)f(in)o(v)o(o)q(ca-) -480 1806 y(t)o(ion)j(of)g(`)p Fl(cvs-update)p Fo('\))e(as)i(\014le)h -(A,)f(t)n(h)o(e)g(la)o(t)o(e)q(st)g(revi)q(s)q(ion)g(in)h(t)n(h)o(e)f -(rep)q(o)q(s)q(it)o(ory)g(as)g(\014le)480 1868 y(B,)e(an)o(d)g(t)n(h)o -(e)f(revi)q(s)q(ion)i(t)n(h)o(a)o(t)e(y)o(ou)g(bas)q(e)q(d)i(y)o(our)e -(lo)q(cal)i(mo)q(di\014ca)o(t)o(ions)g(on)f(as)f(ance)q(st)o(or.)240 -1960 y(`)p Fl(Updated)p Fo(')240 2022 y(`)p Fl(Patched)p -Fo(')46 b(R)m(u)o(n)15 b(`)p Fl(ediff-files)p Fo(')d(wit)n(h)i(y)o(our) -f(w)o(or)o(kin)o(g)h(\014le)h(as)e(\014le)i(A,)e(an)o(d)h(a)f(giv)o(en) -h(revi)q(s)q(ion)g(in)480 2084 y(t)n(h)o(e)g(rep)q(o)q(s)q(it)o(ory)g -(as)g(\014le)h(B.)g(Y)l(ou)f(are)g(prompt)o(e)q(d)h(for)e(t)n(h)o(e)i -(revi)q(s)q(ion)f(t)o(o)g(e)q(di\013)i(against,)480 2147 -y(an)o(d)d(y)o(ou)h(m)o(ay)f(sp)q(ecify)h(e)q(it)n(h)o(er)g(a)g(t)o(ag) -e(n)o(am)o(e)h(or)g(a)g(n)n(u)o(m)o(er)q(ical)i(revi)q(s)q(ion)f(n)n(u) -o(m)n(b)q(er)g(\(s)q(ee)480 2209 y(Sect)o(ion)i(5.6)e([Get)n(t)o(in)o -(g)h(info)h(a)o(b)q(ou)o(t)f(\014le)q(s],)h(page)f(12\).)0 -2454 y Fk(5.13)32 b(R)l(u)o(nnin)o(g)18 b(em)n(erge)0 -2608 y Fl(E)216 b Fo(In)o(v)o(ok)o(e)17 b(`)p Fl(emerge)p -Fo(')f(on)i(on)o(e)f(\014le.)28 b(Thi)q(s)18 b(comm)o(an)o(d)f(w)o(or)o -(ks)g(sligh)o(t)n(ly)i(di\013eren)o(t)f(d)o(ep)q(en)o(din)o(g)i(on)d(t) -n(h)o(e)240 2670 y(\014le)f(st)o(a)o(t)o(us.)p eop -%%Page: 16 18 -16 17 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(16)240 183 y(`)p Fl(Modified)p Fo(')480 246 y(R)m(u)o(n)14 -b(`)p Fl(emerge-files)p Fo(')c(wit)n(h)j(y)o(our)f(w)o(or)o(kin)o(g)h -(\014le)h(as)e(\014le)h(A,)g(an)o(d)f(t)n(h)o(e)g(la)o(t)o(e)q(st)h -(revi)q(s)q(ion)480 308 y(in)j(t)n(h)o(e)f(rep)q(o)q(s)q(it)o(ory)g(as) -g(\014le)h(B.)240 396 y(`)p Fl(Merged)p Fo(')240 458 -y(`)p Fl(Conflict)p Fo(')480 520 y(R)m(u)o(n)d(`)p Fl -(emerge-files-with-an)o(cestor)p Fo(')7 b(wit)n(h)k(y)o(our)g(w)o(or)o -(kin)o(g)g(\014le)h(\(as)e(it)h(w)o(as)f(pr)q(ior)480 -582 y(t)o(o)21 b(y)o(our)g(in)o(v)o(o)q(ca)o(t)o(ion)g(of)g(`)p -Fl(cvs-update)p Fo('\))e(as)i(\014le)i(A,)e(t)n(h)o(e)g(la)o(t)o(e)q -(st)g(revi)q(s)q(ion)h(in)g(t)n(h)o(e)480 645 y(rep)q(o)q(s)q(it)o(ory) -11 b(as)f(\014le)j(B,)e(an)o(d)g(t)n(h)o(e)g(revi)q(s)q(ion)h(t)n(h)o -(a)o(t)e(y)o(ou)h(bas)q(e)q(d)g(y)o(our)g(lo)q(cal)h(mo)q(di\014ca)o(t) -o(ions)480 707 y(on)j(as)g(ance)q(st)o(or.)240 795 y -Fj(Not)o(e:)26 b Fo(Wh)o(en)19 b(t)n(h)o(e)g(\014le)h(st)o(a)o(t)o(us)e -(i)q(s)h(`)p Fl(Merged)p Fo(')e(or)i(`)p Fl(Conflict)p -Fo(',)e(CVS)i(h)o(as)g(alre)q(ady)g(p)q(erform)o(e)q(d)f(a)240 -857 y(m)o(erge.)24 b(Th)o(e)17 b(re)q(sul)o(t)o(in)o(g)h(\014le)g(i)q -(s)e(not)h(us)q(e)q(d)g(in)h(an)o(y)e(w)o(ay)g(if)h(y)o(ou)f(us)q(e)h -(t)n(hi)q(s)g(comm)o(an)o(d.)24 b(If)16 b(y)o(ou)h(us)q(e)240 -919 y(t)n(h)o(e)e Fl(q)g Fo(comm)o(an)o(d)g(ins)q(id)o(e)i(`)p -Fl(emerge)p Fo(')c(\(t)o(o)i(su)o(cce)q(s)q(sfully)h(t)o(ermin)o(a)o(t) -o(e)f(t)n(h)o(e)g(m)o(erge\))f(t)n(h)o(e)h(\014le)i(t)n(h)o(a)o(t)d -(CVS)240 981 y(cre)q(a)o(t)o(e)q(d)h(will)h(b)q(e)g(o)o(v)o(erwr)q(it)n -(t)o(en.)0 1208 y Fk(5.14)32 b(Rev)n(ert)n(in)o(g)17 -b(y)n(our)f(bu\013ers)0 1358 y Fl(R)216 b Fo(If)17 b(y)o(ou)g(are)f(e)q -(dit)o(in)o(g)j(\(or)d(just)g(viewin)o(g\))i(a)f(\014le)h(in)g(a)e -(bu\013er,)h(an)o(d)g(t)n(h)o(a)o(t)f(\014le)i(i)q(s)f(c)o(h)o(an)o(ge) -q(d)g(b)o(y)g(CVS)240 1420 y(d)o(ur)q(in)o(g)h(a)e(`)p -Fl(cvs-update)p Fo(',)f(all)i(y)o(ou)g(h)o(a)o(v)o(e)f(t)o(o)g(do)h(i)q -(s)g(t)o(yp)q(e)f Fl(R)h Fo(in)h(t)n(h)o(e)e(*cvs*)h(bu\013er)g(t)o(o)f -(re)q(ad)g(in)i(t)n(h)o(e)240 1483 y(n)o(ew)d(v)o(ers)q(ions)g(of)g(t)n -(h)o(e)g(\014le)q(s.)240 1558 y(All)h(\014le)q(s)h(t)n(h)o(a)o(t)d(are) -g(`)p Fl(Updated)p Fo(',)f(`)p Fl(Merged)p Fo(')h(or)g(in)i(`)p -Fl(Conflict)p Fo(')d(are)i(rev)o(ert)o(e)q(d)g(f)q(rom)f(t)n(h)o(e)h -(di)q(sk.)20 b(An)o(y)240 1620 y(ot)n(h)o(er)15 b(\014le)q(s)h(are)f -(ignore)q(d.)21 b(Only)16 b(\014le)q(s)h(t)n(h)o(a)o(t)d(y)o(ou)h(w)o -(ere)g(alre)q(ady)g(e)q(dit)o(in)o(g)i(are)e(re)q(ad.)240 -1695 y(An)i(error)g(i)q(s)g(s)q(ign)o(alle)q(d)h(if)g(y)o(ou)e(h)o(a)o -(v)o(e)h(mo)q(di\014e)q(d)h(t)n(h)o(e)f(bu\013er)g(s)q(ince)h(it)f(w)o -(as)f(last)h(c)o(h)o(an)o(ge)q(d.)26 b(\()p Fl(cvs-)240 -1757 y(mode-revert-updated-buffer)o(s)p Fo(\).)0 1984 -y Fk(5.15)32 b(Mi)q(scellan)n(eous)15 b(comm)n(an)n(ds)0 -2134 y Fl(M-x)g(cvs-byte-compile-files)240 2196 y Fo(Byt)o(e)g(compile) -i(all)f(s)q(elect)o(e)q(d)g(\014le)q(s)g(t)n(h)o(a)o(t)f(en)o(d)g(in)h -(.el.)0 2284 y Fl(M-x)f(cvs-delete-lock)240 2346 y Fo(Thi)q(s)e(comm)o -(an)o(d)g(can)g(b)q(e)f(us)q(e)q(d)i(in)g(an)o(y)e(bu\013er,)h(an)o(d)g -(d)o(elet)o(e)q(s)h(t)n(h)o(e)f(lo)q(c)o(k)h(\014le)q(s)g(t)n(h)o(a)o -(t)e(t)n(h)o(e)g(*cvs*)h(bu\013er)240 2408 y(informs)18 -b(y)o(ou)f(a)o(b)q(ou)o(t.)26 b(Y)l(ou)18 b(sh)o(ould)h(norm)o(ally)f -(n)o(ev)o(er)f(h)o(a)o(v)o(e)g(t)o(o)g(us)q(e)h(t)n(hi)q(s)g(comm)o(an) -o(d)f(s)q(ince)h(CVS)240 2470 y(tr)q(ie)q(s)d(v)o(ery)g(carefully)i(t)o -(o)e(alw)o(ays)g(remo)o(v)o(e)f(t)n(h)o(e)h(lo)q(c)o(k)h(\014le)q(s)g -(it)o(s)q(elf.)240 2545 y(Y)l(ou)g(can)h(only)f(us)q(e)h(t)n(hi)q(s)f -(comm)o(an)o(d)g(wh)o(en)g(a)g(m)o(e)q(s)q(sage)f(in)i(t)n(h)o(e)g -(*cvs*)e(bu\013er)i(t)o(ells)f(y)o(ou)g(so.)23 b(Y)l(ou)240 -2608 y(sh)o(ould)18 b(w)o(ait)f(a)g(while)i(b)q(efore)e(us)q(in)o(g)h -(t)n(hi)q(s)g(comm)o(an)o(d)f(in)h(cas)q(e)f(som)o(eon)o(e)g(els)q(e)h -(i)q(s)g(ru)o(nnin)o(g)h(a)e(cvs)240 2670 y(comm)o(an)o(d.)p -eop -%%Page: 17 19 -17 18 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(5:)20 b(Comm)o(an)o(ds)1454 -b(17)0 183 y Fl(q)216 b Fo(Bury)15 b(t)n(h)o(e)h(*cvs*)e(bu\013er.)20 -b(\()p Fl(bury-buffer)p Fo(\).)p eop -%%Page: 18 20 -18 19 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(6:)20 b(Cust)o(omiza)o(t)o(ion) -1390 b(18)0 183 y Fm(6)41 b(Cust)o(omiza)n(t)n(ion)62 -394 y Fo(If)16 b(y)o(ou)g(h)o(a)o(v)o(e)f(an)h(id)o(e)q(a)g(a)o(b)q(ou) -o(t)g(an)o(y)f(cust)o(omiza)o(t)o(ion)h(t)n(h)o(a)o(t)f(w)o(ould)h(b)q -(e)g(h)o(an)o(dy)g(bu)o(t)g(i)q(sn't)f(pre)q(s)q(en)o(t)h(in)h(t)n(hi)q -(s)f(li)q(st,)0 456 y(p)o(le)q(as)q(e)g(t)o(ell)g(m)o(e!)k(See)15 -b(Ch)o(apt)o(er)g(8)g([Bugs],)f(page)h(22)g(for)f(info)i(on)f(h)o(o)o -(w)g(t)o(o)f(re)q(ac)o(h)h(m)o(e.)0 616 y(`)p Fl -(cvs-erase-input-buffer)p Fo(')240 678 y(If)h(s)q(et)g(t)o(o)g(an)o(yt) -n(hin)o(g)h(els)q(e)g(t)n(h)o(an)f Fl(nil)g Fo(t)n(h)o(e)g(e)q(dit)h -(bu\013er)g(will)g(b)q(e)g(eras)q(e)q(d)f(b)q(efore)g(y)o(ou)g(wr)q(it) -o(e)g(t)n(h)o(e)g(log)240 740 y(m)o(e)q(s)q(sage)e(\(s)q(ee)h(Sect)o -(ion)h(5.4)e([Commit)n(t)o(in)o(g)h(c)o(h)o(an)o(ge)q(s],)g(page)g -(11\).)0 837 y(`)p Fl(cvs-inhibit-copyright-m)o(essage)p -Fo(')240 899 y(Th)o(e)g(co)o(p)o(yr)q(igh)o(t)f(m)o(e)q(s)q(sage)g(t)n -(h)o(a)o(t)g(i)q(s)i(di)q(sp)o(lay)o(e)q(d)h(on)e(st)o(art)o(up)f(can)h -(b)q(e)g(anno)o(yin)o(g)h(aft)o(er)e(a)h(while.)21 b(Set)240 -961 y(t)n(hi)q(s)16 b(v)m(ar)q(ia)o(b)o(le)h(t)o(o)e(`)p -Fl(t)p Fo(')g(if)h(y)o(ou)g(w)o(an)o(t)e(t)o(o)i(get)f(r)q(id)h(of)f -(it.)22 b(\(Bu)o(t)16 b(don't)f(s)q(et)g(t)n(hi)q(s)h(t)o(o)g(`)p -Fl(t)p Fo(')e(in)j(t)n(h)o(e)f(syst)o(em)240 1024 y(d)o(ef)q(a)n(ul)o -(t)o(s)h(\014le)f(-)f(n)o(ew)g(us)q(ers)h(sh)o(ould)g(s)q(ee)f(t)n(hi)q -(s)h(m)o(e)q(s)q(sage)e(a)o(t)g(le)q(ast)h(once\).)0 -1120 y(`)p Fl(cvs-diff-flags)p Fo(')240 1183 y(A)i(li)q(st)g(of)g(str)q -(in)o(gs)f(t)o(o)h(pas)q(s)f(as)g(argu)o(m)o(en)o(t)o(s)h(t)o(o)f(t)n -(h)o(e)h(`)p Fl(cvs)d(diff)p Fo(')i(an)o(d)h(`)p Fl(diff)p -Fo(')e(programs.)24 b(Thi)q(s)17 b(i)q(s)240 1245 y(us)q(e)q(d)i(b)o(y) -f(`)p Fl(cvs-mode-diff-cvs)p Fo(')c(an)o(d)k(`)p Fl -(cvs-mode-diff-backup)p Fo(')d(\(k)o(ey)i Fl(b)p Fo(,)h(s)q(ee)h(Sect)o -(ion)f(5.11)240 1307 y([Viewin)o(g)d(di\013erence)q(s],)h(page)e(14\).) -k(If)d(y)o(ou)e(prefer)i(t)n(h)o(e)f(Unidi\013)h(form)o(a)o(t)e(y)o(ou) -h(could)h(add)f(t)n(hi)q(s)h(lin)o(e)240 1370 y(t)o(o)g(y)o(our)g(`)p -Fl(.emacs)p Fo(')e(\014le:)360 1439 y Fl(\(setq)23 b(cvs-diff-flags)f -('\("-u"\)\))0 1536 y Fo(`)p Fl(cvs-diff-ignore-marks)p -Fo(')240 1598 y(If)10 b(t)n(hi)q(s)h(v)m(ar)q(ia)o(b)o(le)g(i)q(s)g -(non-)p Fl(nil)f Fo(or)f(if)i(a)f(pre\014x)g(argu)o(m)o(en)o(t)g(i)q(s) -g(giv)o(en)h(\(bu)o(t)f(not)g(b)q(ot)n(h\))g(t)o(o)g(`)p -Fl(cvs-mode-diff-cvs)p Fo(')p 2105 1609 21 46 v 240 1660 -a(or)15 b(`)p Fl(cvs-mode-diff-backup)p Fo(')c(m)o(ar)o(k)o(e)q(d)16 -b(\014le)q(s)g(are)f(not)g(cons)q(id)o(ere)q(d)i(s)q(elect)o(e)q(d.)0 -1757 y(`)p Fl(cvs-log-flags)p Fo(')240 1819 y(Li)q(st)h(of)g(str)q(in)o -(gs)f(t)o(o)h(s)q(en)o(d)g(t)o(o)g(`)p Fl(cvs)c(log)p -Fo('.)27 b(Us)q(e)q(d)18 b(b)o(y)g(`)p Fl(cvs-mode-log)p -Fo(')d(\(k)o(ey)j Fl(l)p Fo(,)g(s)q(ee)f(Sect)o(ion)i(5.6)240 -1881 y([Get)n(t)o(in)o(g)c(info)h(a)o(b)q(ou)o(t)f(\014le)q(s],)g(page) -h(12\).)0 1978 y(`)p Fl(cvs-status-flags)p Fo(')240 2040 -y(Li)q(st)i(of)f(str)q(in)o(gs)g(t)o(o)h(s)q(en)o(d)f(t)o(o)g(`)p -Fl(cvs)e(status)p Fo('.)25 b(Us)q(e)q(d)18 b(b)o(y)g(`)p -Fl(cvs-mode-status)p Fo(')c(\(k)o(ey)j Fl(s)p Fo(,)h(s)q(ee)f(Sec-)240 -2103 y(t)o(ion)e(5.6)f([Get)n(t)o(in)o(g)h(info)h(a)o(b)q(ou)o(t)f -(\014le)q(s],)h(page)f(12\).)0 2200 y(`)p Fl(cvs-auto-remove-handled)o -Fo(')240 2262 y(If)h(t)n(hi)q(s)g(v)m(ar)q(ia)o(b)o(le)h(i)q(s)e(s)q -(et)h(t)o(o)f(an)o(y)g(non-)p Fl(nil)h Fo(v)m(alue)h(`)p -Fl(cvs-mode-remove-hand)o(led)p Fo(')12 b(will)17 b(b)q(e)f(calle)q(d) -240 2324 y(ev)o(ery)j(t)o(im)o(e)g(y)o(ou)f(c)o(h)o(ec)o(k)h(in)h -(\014le)q(s,)h(aft)o(er)d(t)n(h)o(e)h(c)o(h)o(ec)o(k-in)h(i)q(s)f(re)q -(ady)l(.)30 b(See)20 b(Sect)o(ion)f(5.9)f([Remo)o(vin)o(g)240 -2386 y(h)o(an)o(dle)q(d)e(en)o(tr)q(ie)q(s],)f(page)g(14.)0 -2483 y(`)p Fl(cvs-auto-revert-after-c)o(ommit)p Fo(')240 -2545 y(If)f(t)n(hi)q(s)g(v)m(ar)q(ia)o(b)o(le)h(i)q(s)f(s)q(et)g(t)o(o) -f(an)o(y)h(non-`)p Fl(nil)p Fo(')f(v)m(alue)i(an)o(y)e(bu\013ers)h(y)o -(ou)g(h)o(a)o(v)o(e)f(t)n(h)o(a)o(t)g(vi)q(s)q(it)h(a)f(\014le)i(t)n(h) -o(a)o(t)e(i)q(s)240 2608 y(commit)n(t)o(e)q(d)j(will)i(b)q(e)e(a)n(u)o -(t)o(om)o(a)o(t)o(ically)h(rev)o(ert)o(e)q(d.)22 b(Thi)q(s)16 -b(v)m(ar)q(ia)o(b)o(le)i(i)q(s)e(d)o(ef)q(a)n(ul)o(t)h(`)p -Fl(t)p Fo('.)22 b(See)16 b(Sect)o(ion)h(5.4)240 2670 -y([Commit)n(t)o(in)o(g)e(c)o(h)o(an)o(ge)q(s],)g(page)g(11.)p -eop -%%Page: 19 21 -19 20 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(6:)20 b(Cust)o(omiza)o(t)o(ion) -1390 b(19)0 183 y(`)p Fl(cvs-update-prog-output-)o(skip-reg)o(exp)p -Fo(')240 246 y(Th)o(e)20 b(`)p Fl(-u)p Fo(')g(\015ag)g(in)h(t)n(h)o(e)g -(`)p Fl(modules)p Fo(')e(\014le)i(can)g(b)q(e)f(us)q(e)q(d)h(t)o(o)g -(ru)o(n)g(a)f(comm)o(an)o(d)g(wh)o(en)o(ev)o(er)h(a)f(`)p -Fl(cvs)240 308 y(update)p Fo(')12 b(i)q(s)h(p)q(erform)o(e)q(d)g(\(s)q -(ee)g(cvs\(5\)\).)18 b(Thi)q(s)c(regexp)f(i)q(s)g(us)q(e)q(d)h(t)o(o)f -(s)q(e)q(arc)o(h)f(for)h(t)n(h)o(e)g(last)g(lin)o(e)i(in)f(t)n(h)o(a)o -(t)240 370 y(ou)o(t)o(pu)o(t.)20 b(It)14 b(i)q(s)f(norm)o(ally)h(s)q -(et)g(t)o(o)f(`)p Fl("$")p Fo('.)18 b(Th)o(a)o(t)13 b(s)q(et)n(t)o(in)o -(g)g(i)q(s)h(only)g(correct)f(if)h(t)n(h)o(e)g(comm)o(an)o(d)f(ou)o(t)o -(pu)o(t)o(s)240 432 y(not)n(hin)o(g.)22 b(Not)o(e)15 -b(t)n(h)o(a)o(t)g(p)q(cl-cvs)i(will)h(get)d(v)o(ery)h(confus)q(e)q(d)g -(if)g(t)n(h)o(e)g(comm)o(an)o(d)f(ou)o(t)o(pu)o(t)o(s)i -Fh(an)o(yt)n(hin)o(g)j Fo(t)o(o)240 495 y(`)p Fl(stderr)p -Fo('.)0 582 y(`)p Fl(cvs-cvsroot)p Fo(')240 644 y(Thi)q(s)d(v)m(ar)q -(ia)o(b)o(le)h(can)f(b)q(e)g(s)q(et)f(t)o(o)h(o)o(v)o(err)q(id)o(e)g(`) -p Fl(CVSROOT)p Fo('.)23 b(It)17 b(sh)o(ould)g(b)q(e)g(a)g(str)q(in)o -(g.)24 b(If)17 b(it)g(i)q(s)g(s)q(et)g(t)n(h)o(en)240 -706 y(ev)o(eryt)o(im)o(e)c(a)h(cvs)f(comm)o(an)o(d)g(i)q(s)h(ru)o(n)g -(it)g(will)h(b)q(e)f(calle)q(d)h(as)e(`)p Fl(cvs)i(-d)g -Fh(cvs-cvsro)q(ot)q Fi(:)8 b(:)g(:)m Fo(')13 b(Thi)q(s)h(can)g(b)q(e) -240 769 y(us)q(eful)i(if)g(y)o(our)f(s)q(it)o(e)f(h)o(as)h(s)q(ev)o -(eral)h(rep)q(o)q(s)q(it)o(or)q(ie)q(s.)0 856 y(`)p Fl(TMPDIR)p -Fo(')70 b(Pcl-cvs)21 b(us)q(e)q(s)e(t)n(hi)q(s)h Fh(en)o(vironm)o(en)o -(t)g(v)m(ar)q(ia)o(b)o(le)j Fo(t)o(o)c(d)o(ecid)o(e)j(wh)o(ere)e(t)o(o) -f(pu)o(t)h(t)n(h)o(e)f(t)o(emp)q(orary)g(\014le)q(s)i(it)240 -918 y(n)o(ee)q(ds.)g(It)15 b(d)o(ef)q(a)n(ul)o(t)o(s)i(t)o(o)e(`)p -Fl(/tmp)p Fo(')e(if)j(it)f(i)q(s)h(not)f(s)q(et.)0 1005 -y(`)p Fl(cvs-commit-buffer-requi)o(re-final)o(-newlin)o(e)p -Fo(')240 1067 y(Wh)o(en)g(y)o(ou)g(en)o(t)o(er)f(a)h(log)g(m)o(e)q(s)q -(sage)f(in)i(t)n(h)o(e)f(`)p Fl(*cvs-commit-message*)p -Fo(')d(bu\013er)j(p)q(cl-cvs)h(will)h(nor-)240 1130 y(m)o(ally)d(a)n(u) -o(t)o(om)o(a)o(t)o(ically)g(ins)q(ert)g(a)f(trailin)o(g)i(n)o(ewlin)o -(e,)g(u)o(nle)q(s)q(s)f(t)n(h)o(ere)g(alre)q(ady)f(i)q(s)g(on)o(e.)20 -b(Thi)q(s)13 b(b)q(e)o(h)o(a)o(vior)240 1192 y(can)j(b)q(e)h(con)o(tro) -o(lle)q(d)g(via)g(`)p Fl(cvs-commit-buffer-requ)o(ire-fin)o(al-newli)o -(ne)p Fo('.)j(If)c(it)h(i)q(s)f(`)p Fl(t)p Fo(')f(\(t)n(h)o(e)240 -1254 y(d)o(ef)q(a)n(ul)o(t)h(b)q(e)o(h)o(a)o(vior\),)e(a)h(n)o(ewlin)o -(e)i(will)f(alw)o(ays)f(b)q(e)g(ap)o(p)q(en)o(d)o(e)q(d.)21 -b(If)15 b(it)h(i)q(s)f(`)p Fl(nil)p Fo(',)e(n)o(ewlin)o(e)q(s)k(will)g -(n)o(ev)o(er)240 1316 y(b)q(e)k(ap)o(p)q(en)o(d)o(e)q(d.)38 -b(An)o(y)22 b(ot)n(h)o(er)e(v)m(alue)j(ca)n(us)q(e)q(s)e(p)q(cl-cvs)i -(t)o(o)e(ask)f(t)n(h)o(e)h(us)q(er)h(wh)o(en)o(ev)o(er)f(t)n(h)o(ere)g -(i)q(s)g(no)240 1379 y(trailin)o(g)c(n)o(ewlin)o(e)f(in)g(t)n(h)o(e)f -(commit)h(m)o(e)q(s)q(sage)e(bu\013er.)0 1466 y(`)p Fl -(cvs-sort-ignore-file)p Fo(')240 1528 y(If)20 b(t)n(hi)q(s)g(v)m(ar)q -(ia)o(b)o(le)h(i)q(s)e(s)q(et)g(t)o(o)h(an)o(y)f(non-`)p -Fl(nil)p Fo(')g(v)m(alue)i(t)n(h)o(e)e(`)p Fl(.cvsignore)p -Fo(')f(will)j(alw)o(ays)e(b)q(e)g(sort)o(e)q(d)240 1590 -y(wh)o(en)o(ev)o(er)c(y)o(ou)g(us)q(e)h(`)p Fl(cvs-mode-ignore)p -Fo(')c(t)o(o)j(add)g(a)g(\014le)h(t)o(o)f(it.)20 b(Thi)q(s)c(o)o(pt)o -(ion)f(i)q(s)g(on)g(b)o(y)g(d)o(ef)q(a)n(ul)o(t.)p eop -%%Page: 20 22 -20 21 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(7:)20 b(F)l(u)o(t)o(ure)15 -b(enh)o(ancem)o(en)o(t)o(s)1257 b(20)0 183 y Fm(7)41 -b(F)-7 b(u)o(t)n(ure)14 b(enh)n(ancem)n(en)n(t)o(s)62 -369 y Fo(Pcl-cvs)k(i)q(s)f(st)o(ill)i(u)o(n)o(d)o(er)f(d)o(ev)o(elo)o -(pm)o(en)o(t)f(an)o(d)g(n)o(ee)q(ds)h(a)e(n)n(u)o(m)n(b)q(er)i(of)e -(enh)o(ancem)o(en)o(t)o(s)i(t)o(o)f(b)q(e)g(calle)q(d)h(comp)o(let)o -(e.)0 431 y(Belo)o(w)h(i)q(s)h(m)o(y)e(curren)o(t)h(wi)q(sh-li)q(st)h -(for)f(fu)o(t)o(ure)g(rele)q(as)q(e)q(s)g(of)g(p)q(cl-cvs.)33 -b(Ple)q(as)q(e,)19 b(let)h(m)o(e)f(kno)o(w)f(whic)o(h)i(of)f(t)n(h)o(e) -q(s)q(e)0 493 y(fe)q(a)o(t)o(ure)q(s)c(y)o(ou)h(w)o(an)o(t)f(mo)q(st.) -21 b(Th)o(ey)16 b(are)g(li)q(st)o(e)q(d)h(b)q(elo)o(w)f(in)h(ap)o(pro)o -(xim)o(a)o(t)o(ely)f(t)n(h)o(e)g(ord)o(er)g(t)n(h)o(a)o(t)f(I)i(curren) -o(t)n(ly)g(t)n(hink)g(I)0 556 y(will)g(imp)o(lem)o(en)o(t)f(t)n(h)o(em) -f(in.)37 693 y Fn(\017)30 b Fo(Rewr)q(it)n(t)o(en)12 -b(pars)q(er)f(co)q(d)o(e.)20 b(Th)o(ere)12 b(are)f(m)o(an)o(y)g(s)q(it) -o(ua)o(t)o(ions)g(wh)o(ere)h(p)q(cl-cvs)h(will)g(f)q(ail)f(t)o(o)f -(recognize)i(t)n(h)o(e)e(ou)o(t)o(pu)o(t)90 755 y(f)q(rom)j(CVS.)h(Th)o -(e)g(s)q(it)o(ua)o(t)o(ion)g(could)h(b)q(e)f(gre)q(a)o(t)n(ly)g(incre)q -(as)q(e)q(d.)37 829 y Fn(\017)30 b Fo(`)p Fl(cvs-status)p -Fo('.)17 b(Thi)q(s)d(will)h(ru)o(n)g(`)p Fl(cvs)f(status)p -Fo(')f(in)h(a)g(direct)o(ory)g(an)o(d)f(pro)q(d)o(u)o(ce)i(a)e -(bu\013er)h(t)n(h)o(a)o(t)e(lo)q(oks)i(pret)n(t)o(y)90 -892 y(m)n(u)o(c)o(h)d(lik)o(e)g(t)n(h)o(e)g(curren)o(t)f(*cvs*)g -(bu\013er.)19 b(Th)o(a)o(t)9 b(bu\013er)i(will)h(includ)o(e)i(inform)o -(a)o(t)o(ion)c(for)g(all)h(v)o(ers)q(ion-con)o(tro)o(lle)q(d)90 -954 y(\014le)q(s.)21 b(\(Th)o(ere)13 b(will)i(b)q(e)f(a)f(s)q(imp)o(le) -i(k)o(eystrok)o(e)e(t)o(o)g(remo)o(v)o(e)g(all)h Fl(")p -Fo(u)o(nin)o(t)o(ere)q(st)o(in)o(g)p Fl(")h Fo(\014le)q(s,)g(t)n(h)o(a) -o(t)d(i)q(s,)i(\014le)q(s)h(t)n(h)o(a)o(t)d(are)90 1016 -y Fl(")p Fo(Up-t)o(o-d)o(a)o(t)o(e)p Fl(")p Fo(\).)19 -b(In)c(t)n(hi)q(s)f(n)o(ew)g(bu\013er)g(y)o(ou)g(will)i(b)q(e)e(a)o(b)o -(le)h(t)o(o)f(up)q(d)o(a)o(t)o(e)g(a)g(\014le,)h(commit)f(a)g(\014le,)h -(et)f(c.)19 b(Th)o(e)14 b(big)90 1078 y(win)g(wit)n(h)g(t)n(hi)q(s)g(i) -q(s)f(t)n(h)o(a)o(t)g(y)o(ou)g(will)i(b)q(e)e(a)o(b)o(le)i(t)o(o)e(w)o -(a)o(t)o(c)o(h)f(t)n(h)o(e)i(di\013erence)q(s)h(b)q(et)o(w)o(een)e(y)o -(our)g(curren)o(t)g(w)o(or)o(kin)o(g)h(\014le)90 1141 -y(an)o(d)h(t)n(h)o(e)h(h)o(e)q(ad)f(revi)q(s)q(ion)g(in)i(t)n(h)o(e)e -(rep)q(o)q(s)q(it)o(ory)g(b)q(efore)g(y)o(ou)g(up)q(d)o(a)o(t)o(e)h(t)n -(h)o(e)f(\014le,)h(an)o(d)f(y)o(ou)g(can)h(t)n(h)o(en)g(c)o(h)o(o)q(o)q -(s)q(e)e(t)o(o)90 1203 y(up)q(d)o(a)o(t)o(e)i(it)f(or)g(let)g(it)h(w)o -(ait)f(for)f(a)h(while)i(lon)o(ger.)37 1277 y Fn(\017)30 -b Fo(Log)12 b(mo)q(d)o(e.)19 b(Wh)o(en)13 b(t)n(hi)q(s)f(mo)q(d)o(e)g -(i)q(s)h(\014ni)q(sh)o(e)q(d)g(y)o(ou)f(will)i(b)q(e)e(a)o(b)o(le)h(t)o -(o)f(mo)o(v)o(e)f(arou)o(n)o(d)h(\(us)q(in)o(g)h Fl(n)f -Fo(an)o(d)g Fl(p)p Fo(\))f(b)q(et)o(w)o(een)90 1340 y(t)n(h)o(e)19 -b(revi)q(s)q(ions)g(of)f(a)g(\014le,)j(m)o(ar)o(k)d(t)o(w)o(o)f(of)i(t) -n(h)o(em,)g(an)o(d)f(ru)o(n)i(a)e(di\013)h(b)q(et)o(w)o(een)f(t)n(h)o -(em.)30 b(Y)l(ou)19 b(will)i(b)q(e)e(a)o(b)o(le)g(t)o(o)90 -1402 y(hid)o(e)c(branc)o(h)o(e)q(s)e(\(s)q(imilar)h(t)o(o)f(t)n(h)o(e)g -(w)o(ay)f(y)o(ou)h(can)g(hid)o(e)i(su)n(b-paragraphs)e(in)h(ou)o(t)n -(lin)o(e-mo)q(d)o(e\))h(an)o(d)e(do)g(m)o(erge)q(s)90 -1464 y(b)q(et)o(w)o(een)i(revi)q(s)q(ions.)20 b(Ot)n(h)o(er)c(id)o(e)q -(as)f(a)o(b)q(ou)o(t)g(t)n(hi)q(s)h(are)f(w)o(elcom)o(e.)37 -1539 y Fn(\017)30 b Fo(Th)o(e)17 b(curren)o(t)h(mo)q(d)o(el)g(for)f(m)o -(ar)o(ks)g(in)i(t)n(h)o(e)e(*cvs*)g(bu\013er)h(s)q(eems)f(t)o(o)g(b)q -(e)h(confus)q(in)o(g.)27 b(I)18 b(am)f(cons)q(id)o(er)q(in)o(g)i(t)o(o) -90 1601 y(us)q(e)14 b(t)n(h)o(e)g(VM)f(mo)q(d)o(el)i(inst)o(e)q(ad,)e -(wh)o(ere)h(m)o(ar)o(ks)f(are)h(norm)o(ally)g(in)o(act)o(iv)o(e.)20 -b(T)l(o)13 b(act)o(iv)m(a)o(t)o(e)h(t)n(h)o(e)f(m)o(ar)o(k,)h(y)o(ou)f -(i)q(s)q(sue)90 1663 y(a)g(comm)o(an)o(d)h(lik)o(e)h(`)p -Fl(cvs-mode-next-comman)o(d-uses-)o(marks)p Fo(')o(.)i(I)d(migh)o(t)f -(imp)o(lem)o(en)o(t)i(a)f(\015ag)f(so)h(t)n(h)o(a)o(t)e(y)o(ou)90 -1725 y(can)j(us)q(e)h(e)q(it)n(h)o(er)g(v)o(ers)q(ion.)k(F)l(ee)q(dbac) -o(k)c(on)f(t)n(hi)q(s)g(b)q(efore)g(I)h(st)o(art)e(co)q(din)o(g)i(it)g -(i)q(s)f(v)o(ery)g(w)o(elcom)o(e.)37 1800 y Fn(\017)30 -b Fo(It)23 b(sh)o(ould)h(b)q(e)e(p)q(o)q(s)q(s)q(ib)o(le)i(t)o(o)f(ru)o -(n)g(comm)o(an)o(ds)f(su)o(c)o(h)h(as)f(`)p Fl(cvs)15 -b(log)p Fo(',)23 b(`)p Fl(cvs)15 b(status)p Fo(')21 b(an)o(d)i(`)p -Fl(cvs)14 b(commit)p Fo(')90 1862 y(direct)n(ly)21 b(f)q(rom)e(a)h -(bu\013er)g(con)o(t)o(ainin)o(g)g(a)g(\014le,)h(inst)o(e)q(ad)f(of)f(h) -o(a)o(vin)o(g)h(t)o(o)g(`)p Fl(cvs-update)p Fo('.)32 -b(If)20 b(t)n(h)o(e)f(direct)o(ory)90 1924 y(con)o(t)o(ains)d(m)o(an)o -(y)g(\014le)q(s)h(t)n(h)o(e)f(`)p Fl(cvs-update)p Fo(')e(can)i(t)o(ak)o -(e)g(quit)o(e)g(som)o(e)g(t)o(im)o(e,)g(e)q(sp)q(ecially)i(on)e(a)g -(slo)o(w)g(m)o(ac)o(hin)o(e.)90 1987 y(I)f(p)o(lan)o(e)q(d)i(t)o(o)d -(pu)o(t)h(t)n(h)o(e)q(s)q(e)g(kin)o(d)h(of)e(comm)o(an)o(ds)g(on)h(t)n -(h)o(e)g(pre\014x)g Fl(C-c)g(C-v)p Fo(,)f(bu)o(t)h(t)n(h)o(a)o(t)f(t)o -(ur)q(n)o(e)q(d)g(ou)o(t)h(t)o(o)f(b)q(e)h(us)q(e)q(d)90 -2049 y(b)o(y)j(for)g(inst)o(ance)h(c)p Fl(++)p Fo(-mo)q(d)o(e.)29 -b(If)19 b(y)o(ou)e(h)o(a)o(v)o(e)h(an)o(y)g(sugge)q(st)o(ions)g(for)g -(a)f(b)q(et)n(t)o(er)h(pre\014x)h(k)o(ey)l(,)g(p)o(le)q(as)q(e)g(let)f -(m)o(e)90 2111 y(kno)o(w.)37 2186 y Fn(\017)30 b Fo(Incre)q(as)q(e)q(d) -15 b(robustn)o(e)q(s)q(s.)k(F)l(or)13 b(inst)o(ance,)i(y)o(ou)f(can)g -(not)g(curren)o(t)n(ly)g(pre)q(s)q(s)g Fl(C-g)g Fo(wh)o(en)g(y)o(ou)g -(are)g(en)o(t)o(er)q(in)o(g)g(t)n(h)o(e)90 2248 y(d)o(e)q(scr)q(ipt)o -(ion)j(of)d(a)h(\014le)h(t)n(h)o(a)o(t)f(y)o(ou)f(are)h(addin)o(g)i -(wit)n(h)o(ou)o(t)e(confus)q(in)o(g)h(p)q(cl-cvs.)37 -2322 y Fn(\017)30 b Fo(Sup)o(p)q(ort)15 b(for)g(m)n(ul)o(t)o(ip)o(le)j -(act)o(iv)o(e)d(*cvs*)g(bu\013ers.)37 2397 y Fn(\017)30 -b Fo(Dire)q(d)21 b(sup)o(p)q(ort.)36 b(I)21 b(h)o(a)o(v)o(e)f(an)h(exp) -q(er)q(im)o(en)o(t)o(al)g(`)p Fl(dired-cvs.el)p Fo(')d(t)n(h)o(a)o(t)h -(w)o(or)o(ks)h(t)o(oget)n(h)o(er)h(wit)n(h)g(CVS)f(1.2.)90 -2459 y(Unfort)o(u)o(n)o(a)o(t)o(ely)15 b(I)g(wrot)o(e)g(it)g(on)g(t)o -(o)o(p)g(of)g(a)g(non-st)o(an)o(d)o(ard)g(`)p Fl(dired.el)p -Fo(',)e(so)i(it)g(m)n(ust)g(b)q(e)g(rewr)q(it)n(t)o(en.)37 -2533 y Fn(\017)30 b Fo(An)15 b(a)o(bilit)o(y)i(t)o(o)e(s)q(en)o(d)g(us) -q(er-sup)o(p)o(lie)q(d)j(o)o(pt)o(ions)d(t)o(o)g(all)h(t)n(h)o(e)f(cvs) -h(comm)o(an)o(ds.)37 2608 y Fn(\017)30 b Fo(Pcl-cvs)19 -b(i)q(s)f(not)f(a)o(t)h(all)g(clev)o(er)h(a)o(b)q(ou)o(t)f(wh)o(a)o(t)f -(it)h(sh)o(ould)h(do)f(wh)o(en)g(`)p Fl(cvs)c(update)p -Fo(')j(ru)o(ns)i(a)e(program)g(\(d)o(ue)90 2670 y(t)o(o)f(t)n(h)o(e)g -(`)p Fl(-u)p Fo(')f(o)o(pt)o(ion)h(in)h(t)n(h)o(e)g(`)p -Fl(modules)p Fo(')d(\014le)j(|)g(s)q(ee)g(`)p Fl(cvs\(5\))p -Fo('\).)k(Th)o(e)16 b(curren)o(t)g(rele)q(as)q(e)g(us)q(e)q(s)h(a)f -(regexp)g(t)o(o)p eop -%%Page: 21 23 -21 22 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(7:)20 b(F)l(u)o(t)o(ure)15 -b(enh)o(ancem)o(en)o(t)o(s)1257 b(21)90 183 y(s)q(e)q(arc)o(h)17 -b(for)f(t)n(h)o(e)h(en)o(d.)27 b(A)o(t)17 b(t)n(h)o(e)g(v)o(ery)g(le)q -(ast)g(t)n(h)o(a)o(t)g(regexp)g(sh)o(ould)h(b)q(e)g(con\014gure)q(d)g -(for)f(di\013eren)o(t)g(mo)q(d)o(ule)q(s.)90 246 y(T)l(ell)d(m)o(e)e -(if)h(y)o(ou)g(h)o(a)o(v)o(e)f(an)o(y)g(id)o(e)q(a)h(a)o(b)q(ou)o(t)f -(wh)o(a)o(t)g(i)q(s)h(t)n(h)o(e)f(r)q(igh)o(t)g(t)n(hin)o(g)i(t)o(o)e -(do.)19 b(In)13 b(a)g(p)q(erfect)f(w)o(orld)h(t)n(h)o(e)f(program)90 -308 y(sh)o(ould)k(also)f(b)q(e)h(allo)o(w)o(e)q(d)f(t)o(o)g(pr)q(in)o -(t)g(t)o(o)g(`)p Fl(stderr)p Fo(')f(wit)n(h)o(ou)o(t)i(ca)n(us)q(in)o -(g)g(p)q(cl-cvs)g(t)o(o)f(crash.)62 457 y(If)e(y)o(ou)e(mi)q(s)q(s)h -(som)o(et)n(hin)o(g)g(in)h(t)n(hi)q(s)f(wi)q(sh-li)q(st,)i(let)e(m)o(e) -g(kno)o(w!)18 b(I)13 b(don't)e(promi)q(s)q(e)h(t)n(h)o(a)o(t)f(I)i -(will)g(wr)q(it)o(e)f(it,)g(bu)o(t)h(I)f(will)0 519 y(a)o(t)i(le)q(ast) -h(try)f(t)o(o)g(co)q(ordin)o(a)o(t)o(e)h(t)n(h)o(e)g(e\013ort)o(s)f(of) -g(m)o(akin)o(g)i(a)e(go)q(o)q(d)h(Em)o(acs)f(f)q(ron)o(t)g(en)o(d)h(t)o -(o)g(CVS.)f(See)i(See)f(Ch)o(apt)o(er)f(8)0 582 y([Bugs],)g(page)h(22)g -(for)f(inform)o(a)o(t)o(ion)h(a)o(b)q(ou)o(t)g(h)o(o)o(w)g(t)o(o)g(re)q -(ac)o(h)g(m)o(e.)62 719 y(So)j(f)q(ar,)g(I)h(h)o(a)o(v)o(e)e(wr)q(it)n -(t)o(en)h(mo)q(st)f(of)h(p)q(cl-cvs)i(in)f(m)o(y)e(all-t)o(o-rare)i -(spare)f(t)o(im)o(e.)29 b(If)18 b(y)o(ou)g(w)o(an)o(t)f(p)q(cl-cvs)j(t) -o(o)e(b)q(e)0 781 y(d)o(ev)o(elo)o(p)q(e)q(d)d(f)q(ast)o(er)e(y)o(ou)h -(can)g(wr)q(it)o(e)g(a)g(con)o(tract)f(wit)n(h)h(Sign)n(u)o(m)i(Sup)o -(p)q(ort)e(t)o(o)g(do)g(t)n(h)o(e)g(ext)o(ens)q(ion.)20 -b(Y)l(ou)14 b(can)h(re)q(ac)o(h)0 843 y(Sign)n(u)o(m)f(Sup)o(p)q(ort)f -(b)o(y)g(em)o(ail)h(t)o(o)f(`)p Fl(info@signum.se)p Fo(')d(or)i(via)i -(m)o(ail)f(t)o(o)g(Sign)n(u)o(m)h(Sup)o(p)q(ort)f(AB,)g(Bo)o(x)g(2044,) -e(S-580)0 906 y(02)k(Link)o(o)o(pin)o(g,)h(Sw)o(e)q(d)o(en.)21 -b(Ph)o(on)o(e:)f Fl(+)p Fo(46)14 b(\(0\))h(13)f(-)i(21)e(46)h(00.)k(F)l -(ax:)h Fl(+)p Fo(46)14 b(\(0\))g(13)h(-)g(21)g(47)f(00.)p -eop -%%Page: 22 24 -22 23 bop 0 -58 a Fo(Ch)o(apt)o(er)14 b(8:)20 b(Bugs)15 -b(\(kno)o(wn)g(an)o(d)g(u)o(nkno)o(wn\))1117 b(22)0 183 -y Fm(8)41 b(Bugs)15 b(\(kno)n(wn)g(an)n(d)g(u)o(nkno)n(wn\))62 -370 y Fo(If)d(y)o(ou)f(\014n)o(d)h(a)f(bug)g(or)g(mi)q(sfe)q(a)o(t)o -(ure,)g(don't)f(h)o(e)q(s)q(it)o(a)o(t)o(e)h(t)o(o)g(t)o(ell)h(m)o(e!) -19 b(Sen)o(d)12 b(em)o(ail)g(t)o(o)f(`)p Fl(ceder@lysator.liu.se)p -Fo(')o(.)62 507 y(If)19 b(y)o(ou)f(h)o(a)o(v)o(e)f(id)o(e)q(as)i(for)f -(impro)o(v)o(em)o(en)o(t)o(s,)g(or)g(if)h(y)o(ou)e(h)o(a)o(v)o(e)h(wr)q -(it)n(t)o(en)g(som)o(e)g(ext)o(ens)q(ions)g(t)o(o)g(t)n(hi)q(s)h(pac)o -(kage,)f(I)0 569 y(w)o(ould)e(lik)o(e)g(t)o(o)f(h)o(e)q(ar)f(f)q(rom)g -(y)o(ou.)20 b(I)c(h)o(o)o(p)q(e)e(t)n(h)o(a)o(t)h(y)o(ou)f(\014n)o(d)i -(t)n(hi)q(s)f(pac)o(kage)g(us)q(eful!)62 706 y(Belo)o(w)h(i)q(s)f(a)g -(part)o(ial)g(li)q(st)h(of)f(curren)o(t)n(ly)g(kno)o(wn)g(prob)o(lems)i -(wit)n(h)e(p)q(cl-cvs)i(v)o(ers)q(ion)f(1.05.)0 856 y(Commit)f(ca)n(us) -q(e)q(s)h(Em)o(acs)e(t)o(o)h(h)o(an)o(g)240 918 y(Em)o(acs)d(w)o(ait)o -(s)g(for)g(t)n(h)o(e)h(`)p Fl(cvs)h(commit)p Fo(')d(comm)o(an)o(d)h(t)o -(o)g(\014ni)q(sh)i(b)q(efore)e(y)o(ou)g(can)h(do)f(an)o(yt)n(hin)o(g.) -20 b(If)12 b(y)o(ou)240 980 y(st)o(art)j(a)g(bac)o(kgrou)o(n)o(d)h(job) -g(f)q(rom)f(t)n(h)o(e)h(loginfo)g(\014le)h(y)o(ou)f(m)n(ust)g(t)o(ak)o -(e)e(care)i(t)n(h)o(a)o(t)f(it)h(clo)q(s)q(e)q(s)h(`)p -Fl(stdout)p Fo(')240 1043 y(an)o(d)12 b(`)p Fl(stderr)p -Fo(')f(if)h(y)o(ou)g(do)g(not)g(w)o(an)o(t)f(t)o(o)h(w)o(ait)g(for)g -(it.)19 b(\(Y)l(ou)12 b(do)g(t)n(h)o(a)o(t)f(wit)n(h)i(`)p -Fl(background-command)240 1105 y(&>-)i(2&>-)f(&)p Fo(')h(if)h(y)o(ou)f -(are)f(st)o(art)o(in)o(g)h(`)p Fl(background-command)p -Fo(')d(f)q(rom)i(a)h(`)p Fl(/bin/sh)p Fo(')e(sh)o(ell)k(scr)q(ipt\).) -240 1180 y(Y)l(our)d(em)o(acs)g(will)h(also)f(h)o(an)o(g)g(if)h(t)n(h)o -(ere)f(w)o(as)f(a)g(lo)q(c)o(k)i(\014le)g(in)g(t)n(h)o(e)f(rep)q(o)q(s) -q(it)o(ory)l(.)19 b(In)14 b(t)n(hi)q(s)g(cas)q(e)g(y)o(ou)g(can)240 -1242 y(t)o(yp)q(e)h Fl(C-g)f Fo(t)o(o)h(get)g(con)o(tro)o(l)g(o)o(v)o -(er)g(y)o(our)g(em)o(acs)g(again.)0 1329 y(Nam)o(e)g(clash)h(in)g(Em)o -(acs)e(19)240 1391 y(Thi)q(s)k(i)q(s)f(re)q(ally)h(a)f(bug)g(in)h(Elib) -h(or)e(t)n(h)o(e)g(Em)o(acs)g(19)g(di)q(str)q(ibu)o(t)o(ion.)27 -b(Bot)n(h)17 b(Elib)i(an)o(d)e(Em)o(acs)g(19.6)240 1453 -y(t)n(hrough)f(a)o(t)f(le)q(ast)g(19.10)f(con)o(t)o(ains)i(a)g(\014le)g -(n)o(am)o(e)q(d)g(`)p Fl(cookie.el)p Fo('.)k(On)o(e)c(of)g(t)n(h)o(e)g -(\014le)q(s)h(will)g(h)o(a)o(v)o(e)e(t)o(o)240 1516 y(b)q(e)g(ren)o(am) -o(e)q(d,)g(an)o(d)g(w)o(e)g(are)g(curren)o(t)n(ly)h(n)o(egot)o(ia)o(t)o -(in)o(g)f(a)o(b)q(ou)o(t)g(whic)o(h)h(of)e(t)n(h)o(e)i(\014le)q(s)g(t)o -(o)f(ren)o(am)o(e.)0 1603 y(Comm)o(an)o(ds)f(while)j(cvs-up)q(d)o(a)o -(t)o(e)f(i)q(s)f(ru)o(nnin)o(g)240 1665 y(It)j(i)q(s)g(p)q(o)q(s)q(s)q -(ib)o(le)h(t)o(o)f(t)o(yp)q(e)g(comm)o(an)o(ds)f(in)i(t)n(h)o(e)f -(*cvs*)g(bu\013er)g(while)h(t)n(h)o(e)f(up)q(d)o(a)o(t)o(e)h(i)q(s)f -(ru)o(nnin)o(g,)i(bu)o(t)240 1727 y(error)15 b(m)o(e)q(s)q(sage)q(s)f -(i)q(s)h(all)i(t)n(h)o(a)o(t)d(y)o(ou)h(will)i(get.)i(Th)o(e)c(error)g -(m)o(e)q(s)q(sage)q(s)f(sh)o(ould)i(b)q(e)g(b)q(et)n(t)o(er.)0 -1815 y(Un)o(exp)q(ect)o(e)q(d)g(ou)o(t)o(pu)o(t)g(f)q(rom)e(CVS)240 -1877 y(Un)o(exp)q(ect)o(e)q(d)19 b(ou)o(t)o(pu)o(t)g(f)q(rom)e(CVS)h -(confus)q(e)q(s)h(p)q(cl-cvs.)30 b(It)18 b(will)i(curren)o(t)n(ly)f -(cre)q(a)o(t)o(e)e(a)h(bug)g(rep)q(ort)240 1939 y(t)n(h)o(a)o(t)c(y)o -(ou)h(can)g(m)o(ail)h(t)o(o)f(m)o(e.)20 b(It)15 b(sh)o(ould)h(do)f(som) -o(et)n(hin)o(g)h(more)f(civilize)q(d.)p eop -%%Page: 23 25 -23 24 bop 0 -58 a Fo(A)m(p)o(p)q(en)o(dix)17 b(A:)e(GNU)g(GENERAL)g -(PUBLIC)h(LICENSE)891 b(23)0 183 y Fm(A)l(p)n(p)q(en)n(dix)12 -b(A)41 b(GNU)15 b(GENERAL)i(PUBLIC)f(LICENSE)p eop -%%Page: 24 26 -24 25 bop 0 -58 a Fo(F)l(u)o(nct)o(ion)16 b(an)o(d)f(V)l(ar)q(ia)o(b)o -(le)i(In)o(d)o(ex)1343 b(24)0 183 y Fm(F)-7 b(u)o(nct)n(ion)14 -b(an)n(d)h(V)-7 b(ar)q(ia)n(b)o(le)15 b(In)n(d)o(ex)0 -416 y Fk(B)0 482 y Fg(bury-buffe)o(r)t Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 -b Fe(16)0 590 y Fk(C)0 656 y Fg(cookie-nex)o(t-)o(coo)o(ki)o(e)t -Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)16 -b Fe(10)0 715 y Fg(cookie-pre)o(vi)o(ous)o(-c)o(ook)o(ie)7 -b Ff(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(10)0 773 -y(cvs-a)o(u)o(t)o(o-remo)o(v)o(e-h)o(an)o(dle)q(d)d(\(v)n(ar)q(ia)o -(ble\))7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)19 b Fe(18)0 831 y(cvs-a)o(u)o(t)o(o-rev)o(ert-aft)o -(er-commit)c(\(v)n(ar)q(ia)o(ble\))s Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)16 b Fe(11,)d(18)0 889 y Fg(cvs-byte-c)o(om)o(pil)o(e-)o -(fil)o(es)7 b Ff(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b -Fe(16)0 947 y(cvs-commit-bu\013er-require)q(-\014n)o(al)q(-n)o(ewli)q -(n)o(e)c(\(v)n(ar)q(ia)o(ble\))7 b Ff(.)g(.)f(.)20 b -Fe(18)0 1005 y(cvs-cvsro)q(ot)14 b(\(v)n(ar)q(ia)o(ble\))9 -b Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 -b Fe(18)0 1063 y Fg(cvs-delete)o(-l)o(ock)6 b Ff(.)t(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fe(10)0 -1121 y(cvs-di\013-\015ags)15 b(\(v)n(ar)q(ia)o(ble\))7 -b Ff(.)g(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b -Fe(18)0 1180 y(cvs-di\013-ignore-m)o(arks)c(\(v)n(ar)q(ia)o(ble\))8 -b Ff(.)f(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -21 b Fe(14,)13 b(18)0 1238 y(cvs-eras)q(e-inpu)o(t-bu\013e)q(r)i(\(v)n -(ar)q(ia)o(ble\))d Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)22 b Fe(11,)13 b(18)0 1296 y(cvs-inhibit-co)o(pyr)q -(ight-m)o(e)q(ssage)j(\(v)n(ar)q(ia)o(ble\))9 b Ff(.)f(.)e(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(18)0 1354 y(cvs-log-\015ags)15 -b(\(v)n(ar)q(ia)o(ble\))c Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)22 b Fe(18)0 1412 y Fg(cvs-mode-a)o(ck)o(now)o(le)o(dge)6 -b Ff(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Fe(14)0 -1470 y Fg(cvs-mode-a)o(dd)8 b Ff(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Fe(13)0 1528 -y Fg(cvs-mode-a)o(dd)o(-ch)o(an)o(ge-)o(log)o(-e)o(ntr)o(y-)o(oth)o(er) -o(-wi)o(ndo)o(w)7 b Ff(.)s(.)f(.)20 b Fe(12)0 1586 y -Fg(cvs-mode-c)o(ha)o(nge)o(lo)o(g-c)o(omm)o(it)r Ff(.)t(.)6 -b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)16 b Fe(11)0 1644 y Fg(cvs-mode-c)o(om)o(mit)6 -b Ff(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 -b Fe(11)0 1703 y Fg(cvs-mode-d)o(if)o(f-b)o(ac)o(kup)6 -b Ff(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Fe(14)0 -1761 y Fg(cvs-mode-d)o(if)o(f-c)o(vs)t Ff(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(14)0 1819 y Fg(cvs-mode-e)o(di)o -(ff)8 b Ff(.)s(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)21 b Fe(15)0 1877 y Fg(cvs-mode-e)o(me)o(rge)6 -b Ff(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 -b Fe(15)1015 416 y Fg(cvs-mode-fi)o(nd)o(-fi)o(le)s Ff(.)s(.)6 -b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(12)1015 -474 y Fg(cvs-mode-fi)o(nd)o(-fi)o(le-)o(ot)o(her)o(-w)o(ind)o(ow)t -Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 -b Fe(12)1015 532 y Fg(cvs-mode-ig)o(no)o(re)7 b Ff(.)s(.)f(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Fe(14)1015 -590 y Fg(cvs-mode-lo)o(g)8 b Ff(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Fe(12)1015 648 -y Fg(cvs-mode-ma)o(rk)6 b Ff(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fe(11)1015 706 y -Fg(cvs-mode-ma)o(rk)o(-al)o(l-f)o(il)o(es)5 b Ff(.)s(.)i(.)f(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)19 b Fe(11)1015 764 y Fg(cvs-mode-re)o(mo)o(ve-)o(fil)o(e)6 -b Ff(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(13)1015 -823 y Fg(cvs-mode-re)o(mo)o(ve-)o(han)o(dl)o(ed)5 b Ff(.)s(.)i(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)g(.)19 b Fe(14)1015 881 y Fg(cvs-mode-re)o(ve)o(rt-)o(upd)o(at) -o(ed-)o(bu)o(ffe)o(rs)t Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)h(.)f(.)17 b Fe(16)1015 939 y Fg(cvs-mode-st)o(at)o(us)7 -b Ff(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fe(12)1015 997 y Fg(cvs-mode-un)o(do)o(-lo)o(cal)o(-c)o(han)o(ge)o(s) -9 b Ff(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)22 b Fe(13)1015 1055 y Fg(cvs-mode-un)o(ma)o(rk)7 -b Ff(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fe(11)1015 1113 y Fg(cvs-mode-un)o(ma)o(rk-)o(all)o(-f)o(ile)o(s)s -Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(11)1015 1171 y Fg(cvs-mode-un)o(ma)o -(rk-)o(up)s Ff(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 -b Fe(11)1015 1229 y Fg(cvs-mode-up)o(da)o(te-)o(no-)o(pr)o(omp)o(t)s -Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(10)1015 1287 y Fg(cvs-old-edi)o(ff)o -(-in)o(ter)o(fa)o(ce)5 b Ff(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)19 -b Fe(15)1015 1346 y(cvs-sort-ignore-\014le)d(\(v)n(ar)q(ia)o(ble\))8 -b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(18)1015 1404 y(cvs-st)o(a)o(t)o -(us-\015ags)15 b(\(v)n(ar)q(ia)o(ble\))d Ff(.)6 b(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)24 b Fe(18)1015 1462 y Fg(cvs-update)5 b Ff(.)s(.)h(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 -b Fe(10)1015 1520 y(cvs-up)q(d)o(a)o(t)o(e-prog-out)o(put-ski)q -(p-regex)q(p)d(\(v)n(ar)q(ia)o(ble\))11 b Ff(.)6 b(.)g(.)g(.)g(.)h(.)23 -b Fe(18)1015 1632 y Fk(R)1015 1698 y Fg(run-ediff-f)o(ro)o(m-c)o(vs-)o -(bu)o(ffe)o(r)s Ff(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(15)1015 -1810 y Fk(T)1015 1877 y Fe(TMPDIR)e(\(en)o(vironm)o(en)o(t)g(v)n(ar)q -(ia)o(ble\))6 b Ff(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)19 b Fe(18)p eop -%%Page: 25 27 -25 26 bop 0 -58 a Fo(Concept)15 b(In)o(d)o(ex)1618 b(25)0 -183 y Fm(Concept)16 b(In)n(d)o(ex)0 437 y Fk(-)0 503 -y Fe(-u)d(o)o(pt)o(ion)h(in)g(mo)q(d)o(ule)q(s)h(\014le)c -Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(18)0 -616 y Fk(.)0 682 y Fe(.cvs)q(ignore)14 b(\014le,)g(sort)o(in)o(g)6 -b Ff(.)h(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 -b Fe(18)0 795 y Fk(A)0 861 y Fe(A)n(b)q(ou)o(t)14 b(p)q(cl-cvs)5 -b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)18 b Fe(3)0 920 y(Act)o(iv)o(e)13 -b(\014le)q(s)s Ff(.)8 b(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Fe(8)0 -978 y(Add)o(e)q(d)e(\(\014le)g(st)o(a)o(t)o(us\))8 b -Ff(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)20 -b Fe(7)0 1036 y(Addin)o(g)15 b(\014le)q(s)s Ff(.)8 b(.)e(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)16 -b Fe(13)0 1094 y(Arc)o(hiv)o(e)q(s)7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)19 b Fe(4)0 1152 y(A)n(u)o(t)n(h)o(or,)14 b(h)o(o)o(w)f(t)o(o)g -(reac)o(h)s Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)16 -b Fe(22)0 1210 y(A)n(u)o(t)n(h)o(ors)5 b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)17 b Fe(3)0 1268 y(A)n(u)o(t)o(om)o(a)o(t)o(ically)f(ins)q -(ert)o(in)o(g)g(n)o(ewlin)o(e)c Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Fe(18)0 -1326 y(A)n(u)o(t)o(om)o(a)o(t)o(ically)16 b(remo)o(v)o(e)e(h)o(an)o -(dle)q(d)h(\014le)q(s)7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)19 b Fe(18)0 1385 y(A)n(u)o(t)o(om)o(a)o(t)o -(ically)d(sort)o(in)o(g)f(.cvs)q(ignore)5 b Ff(.)i(.)f(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 -b Fe(18)0 1497 y Fk(B)0 1564 y Fe(Bu\013er)c(con)o(t)o(en)o(ts)s -Ff(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)16 b Fe(7)0 1622 y(Bugs,)d(h)o(o)o(w)g(t)o(o)h(rep)q -(ort)f(t)n(h)o(em)7 b Ff(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)20 -b Fe(22)0 1680 y(Bugs,)13 b(kno)o(wn)t Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17 -b Fe(22)0 1738 y(Byt)o(e)c(compila)o(t)o(ion)t Ff(.)c(.)d(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b -Fe(16)0 1851 y Fk(C)0 1917 y Fe(Ci)7 b Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Fe(11)0 1975 y(Commit)13 -b(bu\013er)6 b Ff(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)18 b Fe(11)0 2033 y(Commit)13 -b(m)o(e)q(ssage,)h(ins)q(ert)o(in)o(g)i(n)o(ewlin)o(e)5 -b Ff(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -18 b Fe(18)0 2091 y(Commit)o(t)o(in)o(g)c(c)o(h)o(an)o(ge)q(s)e -Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 -b Fe(11)0 2149 y(Con\015ict)14 b(\(\014le)g(st)o(a)o(t)o(us\))6 -b Ff(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 -b Fe(7)0 2208 y(Con\015icts,)13 b(h)o(o)o(w)g(t)o(o)h(re)q(solv)o(e)f -(t)n(h)o(em)t Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Fe(14)0 2266 -y(Con\015icts,)c(re)q(solvin)o(g)t Ff(.)c(.)d(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)16 b Fe(15)0 2324 y(Con)o(t)o(ext)d -(di\013,)h(h)o(o)o(w)f(t)o(o)g(get)5 b Ff(.)i(.)f(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)18 b Fe(18)0 2382 y(Con)o(tr)q(ibu)o(t)o(ors)6 -b Ff(.)i(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)18 b Fe(3)0 2440 y(Co)o(p)o(yr)q(igh)o(t)c(m)o -(e)q(ssage,)g(get)o(t)o(in)o(g)g(r)q(id)f(of)g(it)e Ff(.)6 -b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 -b Fe(18)0 2498 y(Cust)o(omiza)o(t)o(ion)9 b Ff(.)f(.)f(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 -b Fe(18)0 2611 y Fk(D)0 2677 y Fe(Delet)o(in)o(g)15 b(\014le)q(s)s -Ff(.)8 b(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)16 b Fe(13)1015 437 y(Di\013)t Ff(.)8 -b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b -Fe(14)1015 495 y(Dire)q(d)5 b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)18 b Fe(12)1015 609 y Fk(E)1015 676 y Fe(Edi\013)7 -b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(14,)13 b(15)1015 -734 y(Edit)h(bu\013er)s Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 -b Fe(11)1015 792 y(Edit)o(in)o(g)g(\014le)q(s)d Ff(.)6 -b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)25 b Fe(12)1015 850 y(Em)o(ail)15 b(arc)o(hiv)o(e)q(s)7 -b Ff(.)h(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)20 b Fe(4)1015 908 y(Em)o(ail)15 b(t)o(o)e(t)n(h)o(e)h -(a)o(u)o(t)n(h)o(or)8 b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)21 b Fe(22)1015 966 y(Em)o(erge)6 b Ff(.)i(.)e(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)20 b Fe(15)1015 1024 y(Enh)o(ancem)o(en)o(ts)9 -b Ff(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)22 b Fe(20)1015 1083 y(Eras)q(in)o(g)15 b(commit)f(m)o(e)q -(ssage)8 b Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fe(11)1015 1141 y(Eras)q(in)o(g)15 b(t)n(h)o(e)e(inpu)o(t)i(bu\013er) -5 b Ff(.)i(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(18)1015 -1199 y(Example)d(ru)o(n)5 b Ff(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b -Fe(5)1015 1257 y(Expu)o(n)o(gi)q(n)o(g)e(u)o(nin)o(t)o(ere)q(st)o(ing)g -(en)o(tr)q(ie)q(s)7 b Ff(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)20 b Fe(14)1015 1371 -y Fk(F)1015 1438 y Fe(F)l(A)o(Q)t Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)18 b Fe(22)1015 1496 y(File)d(s)q(elect)o(ion)s -Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(8)1015 1554 y(File)f(st)o(a)o(t)o(us)9 -b Ff(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(7)1015 1612 y(Fin)o(din)o(g)16 -b(\014le)q(s)9 b Ff(.)e(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(12)1015 1670 -y(Flush)15 b(c)o(h)o(an)o(ge)q(s)e Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Fe(13)1015 -1728 y(Ft)o(p-s)q(it)o(e)q(s)5 b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 -b Fe(4)1015 1843 y Fk(G)1015 1909 y Fe(Gen)o(era)o(t)o(in)o(g)e(a)d(t)o -(yp)q(e)q(s)q(et)g(m)o(an)n(ual)8 b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fe(2)1015 1967 y(Gen)o(era)o(t)o(in)o(g)16 b(t)n(h)o(e)d(on-lin)o(e)i -(m)o(an)n(ual)6 b Ff(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(2)1015 -2025 y(Get)o(t)o(in)o(g)c(p)q(cl-cvs)s Ff(.)7 b(.)f(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 -b Fe(4)1015 2083 y(Get)o(t)o(in)o(g)f(r)q(id)e(of)g(lo)q(c)o(k)h -(\014le)q(s)s Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 -b Fe(16)1015 2141 y(Get)o(t)o(in)o(g)e(r)q(id)e(of)g(t)n(h)o(e)g(Co)o -(p)o(yr)q(igh)o(t)h(m)o(e)q(ssage.)c Ff(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(18)1015 2200 y(Get)o(t)o(in)o(g)15 -b(r)q(id)e(of)g(u)o(nin)o(t)o(ere)q(st)o(in)o(g)j(lin)o(e)q(s)9 -b Ff(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)22 b Fe(14)1015 2258 y(Get)o(t)o(in)o(g)15 b(st)o(a)o(t)o(us)c -Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)24 b Fe(12)1015 2316 y(Get)o(t)o(in)o(g)15 -b(t)n(h)o(e)e(*cvs*)h(bu\013er)t Ff(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)18 b Fe(10)1015 2430 y Fk(H)1015 2497 y Fe(Han)o(dle)q(d)d(lin) -o(e)q(s,)f(remo)o(vin)o(g)h(t)n(h)o(em)7 b Ff(.)g(.)f(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)20 -b Fe(14)1015 2611 y Fk(I)1015 2677 y Fe(Info-\014le)14 -b(\(h)o(o)o(w)f(t)o(o)h(gen)o(era)o(t)o(e\))7 b Ff(.)f(.)h(.)f(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)20 b Fe(2)p eop -%%Page: 26 28 -26 27 bop 0 -58 a Fo(Concept)15 b(In)o(d)o(ex)1618 b(26)0 -183 y Fe(Inhibit)o(ing)16 b(t)n(h)o(e)d(Co)o(p)o(yr)q(igh)o(t)h(m)o(e)q -(ssage.)8 b Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)21 b Fe(18)0 241 y(Inst)o(alla)o(t)o(ion)13 -b Ff(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(1)0 299 y(Inst)o(alla)o(t)o(ion)16 -b(of)d(eli)q(sp)h(\014le)q(s)8 b Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)20 b Fe(1)0 358 y(Inst)o(alla)o(t)o(ion)c(of)d(on-lin)o(e)h(m)o -(an)n(ual)t Ff(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(2)0 416 -y(Inst)o(alla)o(t)o(ion)f(of)d(t)o(yp)q(e)q(s)q(et)g(m)o(an)n(ual)8 -b Ff(.)f(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)20 b Fe(2)0 474 y(In)o(tro)q(d)o(u)o(ct)o(ion) -11 b Ff(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(5)0 532 y(In)o(v)o(okin)o(g)15 -b(dire)q(d)8 b Ff(.)f(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)20 b Fe(12)0 590 y(In)o(v)o(okin)o(g)15 -b(e)q(di\013)9 b Ff(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)22 b Fe(14,)13 b(15)0 648 y(In)o(v)o(okin)o(g)i(em)o(erge) -10 b Ff(.)c(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)22 b Fe(15)0 781 y Fk(K)0 847 y Fe(Kno)o(wn)13 b(bugs)8 -b Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)21 b Fe(22)0 980 y Fk(L)0 1047 y Fe(Loadin)o(g)15 -b(\014le)q(s)6 b Ff(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Fe(12)0 1105 y(Lo)q(c)o(k)13 -b(\014le)q(s)7 b Ff(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(16)0 -1163 y(Log)13 b(\(R)o(CS/cvs)h(comm)o(an)o(d\))d Ff(.)6 -b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(12)0 1296 y Fk(M)0 -1362 y Fe(Man)n(ual)15 b(inst)o(alla)o(t)o(i)q(on)h(\(on-lin)o(e\))c -Ff(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fe(2)0 1420 y(Man)n(ual)15 -b(inst)o(alla)o(t)o(i)q(on)h(\(t)o(yp)q(e)q(s)q(et\))6 -b Ff(.)f(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Fe(2)0 1478 y(Mark)o(e)q(d)13 -b(\014le)q(s)f Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(8)0 1537 -y(Markin)o(g)15 b(\014le)q(s)d Ff(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 b Fe(11)0 -1595 y(M)o(erge)q(d)14 b(\(\014le)g(st)o(a)o(t)o(us\))9 -b Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 -b Fe(7)0 1653 y(Mo)q(di\014e)q(d)15 b(\(\014le)f(st)o(a)o(t)o(us\))6 -b Ff(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 -b Fe(7)0 1711 y(Mo)q(d)o(ule)q(s)c(\014le)f(\(-u)f(o)o(pt)o(ion\))7 -b Ff(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(18)0 -1769 y(Mo)o(v)o(e)13 b(aw)o(ay)h Ff(\014le)h Fe(-)e(it)g(i)q(s)h(in)f -(t)n(h)o(e)h(w)o(ay)f(\(\014le)h(st)o(a)o(t)o(us\))5 -b Ff(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(7)0 1827 -y(Mo)o(v)o(em)o(en)o(t)c(Comm)o(an)o(ds)e Ff(.)6 b(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)24 b Fe(10)0 1960 y Fk(O)0 2026 y -Fe(On-lin)o(e)14 b(m)o(an)n(ual)h(\(h)o(o)o(w)f(t)o(o)f(gen)o(era)o(t)o -(e\))f Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)23 b Fe(2)0 2159 y Fk(P)0 2226 y Fe(P)o(a)o(t)o(c)o(h)o -(e)q(d)14 b(\(\014le)g(st)o(a)o(t)o(us\))5 b Ff(.)h(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(7)0 2284 -y(Pr)q(in)o(t)o(in)o(g)d(a)e(m)o(an)n(ual)t Ff(.)8 b(.)e(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(2)0 -2342 y(Problems,)d(li)q(st)f(of)g(common)8 b Ff(.)f(.)f(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)21 b Fe(22)0 2400 y(Pu)o(t)o(t)o(in)o(g)15 b(\014le)q(s)f(u)o -(n)o(d)o(er)h(CVS)d(con)o(trol)f Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)22 b Fe(13)1015 -183 y Fk(R)1015 250 y Fe(Recompiling)16 b(eli)q(sp)e(\014le)q(s)e -Ff(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b -Fe(16)1015 308 y(Remo)o(v)o(e)q(d)14 b(\(\014le)g(st)o(a)o(t)o(us\))s -Ff(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 -b Fe(7)1015 366 y(Remo)o(v)o(e)q(d)e(b)o(y)f(y)o(ou,)g(c)o(h)o(an)o(ge) -q(d)h(in)f(rep)q(os)q(it)o(ory)i(\(\014le)e(st)o(a)o(t)o(us\))5 -b Ff(.)i(.)18 b Fe(7)1015 424 y(Remo)o(v)o(e)q(d)c(f)q(rom)f(rep)q(os)q -(it)o(ory)i(\(\014le)f(st)o(a)o(t)o(us\))e Ff(.)6 b(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)24 b Fe(7)1015 482 -y(Remo)o(v)o(e)q(d)14 b(f)q(rom)f(rep)q(os)q(it)o(ory)m(,)h(c)o(h)o(an) -o(ge)q(d)h(b)o(y)f(y)o(ou)f(\(\014le)h(st)o(a)o(t)o(us\))1099 -540 y Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 -b Fe(7)1015 598 y(Remo)o(vin)o(g)d(\014le)q(s)7 b Ff(.)g(.)f(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 -b Fe(13)1015 656 y(Remo)o(vin)o(g)c(u)o(nin)o(t)o(ere)q(st)o(in)o(g)g -(\(pro)q(ce)q(ss)q(e)q(d\))f(lin)o(e)q(s)6 b Ff(.)i(.)e(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)19 b Fe(14)1015 715 y(Rep)q(ort)o(in)o(g)d(bugs)e -(an)o(d)f(id)o(eas)f Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 -b Fe(22)1015 773 y(Require)15 b(\014n)o(al)f(n)o(ewlin)o(e)5 -b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 -b Fe(18)1015 831 y(Re)q(solvin)o(g)e(con\015icts)8 b -Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fe(15)1015 889 y(Re)q(surrect)o(in)o(g)16 b(\014le)q(s)11 -b Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -23 b Fe(13)1015 947 y(Rev)o(ert)o(in)o(g)16 b(bu\013ers)c -Ff(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)24 -b Fe(16)1015 1005 y(Rev)o(ert)o(in)o(g)16 b(bu\013ers)e(aft)o(er)f -(commit)f Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)24 b Fe(11,)13 b(18)1015 1113 y Fk(S)1015 -1180 y Fe(Select)o(e)q(d)i(\014le)q(s)6 b Ff(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 -b Fe(8)1015 1238 y(Select)o(in)o(g)d(\014le)q(s)e(\(comm)o(an)o(ds)g(t) -o(o)g(m)o(ark)e(\014le)q(s\))d Ff(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)22 b Fe(11)1015 1296 y(Sit)o(e)q(s)5 b Ff(.)j(.)e(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Fe(4)1015 1354 y(Sort)o(in)o(g)d -(t)n(h)o(e)f(.cvs)q(ignore)g(\014le)d Ff(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)24 b Fe(18)1015 1412 y(St)o(a)o(t)o(us)14 b(\(cvs)f(comm)o(an)o(d\)) -g Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 -b Fe(12)1015 1470 y(Syncin)o(g)16 b(bu\013ers)11 b Ff(.)6 -b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -23 b Fe(16)1015 1578 y Fk(T)1015 1644 y Fe(T)m(eX)13 -b(-)f(gen)o(era)o(t)o(in)o(g)k(a)d(t)o(yp)q(e)q(s)q(et)g(m)o(an)n(ual)f -Ff(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)23 b Fe(2)1015 1703 y(Thi)q(s)14 b(rep)q(os)q(it)o(ory)h(i)q(s)e -(mi)q(ss)q(in)o(g!)66 b(\(\014le)14 b(st)o(a)o(t)o(us\))d -Ff(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)24 b Fe(7)1015 -1810 y Fk(U)1015 1877 y Fe(Un)o(do)14 b(c)o(h)o(an)o(ge)q(s)5 -b Ff(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)g(.)18 b Fe(13)1015 1935 y(Unidi\013,)d(h)o(o)o(w)e(t)o(o)h -(get)5 b Ff(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -19 b Fe(18)1015 1993 y(Unin)o(t)o(ere)q(st)o(in)o(g)d(en)o(tr)q(ie)q -(s,)d(get)o(t)o(in)o(g)i(r)q(id)e(of)g(t)n(h)o(em)7 b -Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Fe(14)1015 -2051 y(Unkno)o(wn)14 b(\(\014le)g(st)o(a)o(t)o(us\))9 -b Ff(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)22 -b Fe(7)1015 2109 y(Up)q(d)o(a)o(t)o(e)14 b(program)g(\(-u)f(o)o(pt)o -(ion)h(in)g(mo)q(d)o(ule)q(s)h(\014le\))5 b Ff(.)i(.)f(.)g(.)g(.)g(.)g -(.)g(.)g(.)18 b Fe(18)1015 2167 y(Up)q(d)o(a)o(t)o(e)q(d)d(\(\014le)f -(st)o(a)o(t)o(us\))8 b Ff(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)f(.)21 b Fe(7)1015 2275 y Fk(V)1015 2342 y Fe(V)m(ar)q(ia)o -(ble)q(s,)14 b(li)q(st)g(of)f(all)8 b Ff(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(18)1015 2400 y(Viewin)o(g)15 -b(di\013erence)q(s)5 b Ff(.)j(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -18 b Fe(14,)13 b(15)p eop -%%Page: 27 29 -27 28 bop 0 -58 a Fo(K)o(ey)15 b(In)o(d)o(ex)1704 b(27)0 -183 y Fm(K)n(ey)14 b(In)n(d)o(ex)0 430 y Fk(A)0 496 y -Fg(a)e(-)h(add)e(a)i(file)5 b Ff(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(13)0 554 -y Fg(A)12 b(-)h(add)e(ChangeLog)f(entry)f Ff(.)d(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)24 b Fe(12)0 679 y Fk(B)0 745 y Fg(b)12 b(-)h(diff)e(backup)g -(file)6 b Ff(.)t(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 -b Fe(14)0 870 y Fk(C)0 936 y Fg(c)12 b(-)h(commit)d(files)e -Ff(.)t(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fe(11)0 994 y Fg(C)12 b(-)h(commit)d(files)h(with)g(ChangeLog)f -(message)c Ff(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b -Fe(11)0 1052 y Fg(C-k)12 b(-)g(remove)f(selected)e(entries)s -Ff(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)g(.)g(.)16 b Fe(14)0 1110 y Fg(C-n)c(-)g(Move)f(down)h(one)f(file)t -Ff(.)5 b(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17 b Fe(10)0 1169 -y Fg(C-p)12 b(-)g(Move)f(up)h(one)g(file)7 b Ff(.)e(.)h(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)20 b Fe(10)0 1293 y Fk(D)0 1359 y Fg(d)12 -b(-)h(run)e(`cvs)19 b(diff')5 b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)18 b Fe(14)0 1418 y Fg(DEL)12 b(-)g(unmark)f -(previous)e(file)e Ff(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(11)0 -1542 y Fk(E)0 1609 y Fg(e)12 b(-)h(invoke)d(`ediff')5 -b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 -b Fe(15)0 1667 y Fg(E)12 b(-)h(invoke)d(`emerge')t Ff(.)s(.)c(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(15)0 1725 -y Fg(ESC)12 b(DEL)f(-)i(unmark)d(all)i(files)c Ff(.)e(.)g(.)h(.)f(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -23 b Fe(11)0 1849 y Fk(F)0 1916 y Fg(f)12 b(-)h(find)e(file)g(or)h -(directory)7 b Ff(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Fe(12)0 2040 -y Fk(G)0 2107 y Fg(g)12 b(-)h(Rerun)e(`cvs)18 b(update')9 -b Ff(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Fe(10)0 -2231 y Fk(I)0 2298 y Fg(i)12 b(-)h(ignoring)d(files)5 -b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 -b Fe(14)1015 430 y Fk(L)1015 496 y Fg(l)13 b(-)f(run)g(`cvs)18 -b(log')7 b Ff(.)t(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)20 b Fe(12)1015 604 y Fk(M)1015 670 y Fg(m)13 b(-)f(marking)e(a)j -(file)c Ff(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 -b Fe(11)1015 729 y Fg(M)13 b(-)f(marking)e(all)i(files)5 -b Ff(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b -Fe(11)1015 836 y Fk(N)1015 903 y Fg(n)13 b(-)f(Move)g(down)f(one)g -(file)c Ff(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20 -b Fe(10)1015 1011 y Fk(O)1015 1077 y Fg(o)13 b(-)f(find)g(file)f(in)h -(other)f(window)c Ff(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Fe(12)1015 1185 y Fk(P)1015 -1252 y Fg(p)13 b(-)f(Move)g(up)g(on)g(file)d Ff(.)d(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -h(.)f(.)g(.)g(.)g(.)g(.)g(.)24 b Fe(10)1015 1359 y Fk(Q)1015 -1426 y Fg(q)13 b(-)f(bury)g(the)f(*cvs*)g(buffer)s Ff(.)t(.)6 -b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)h(.)16 b Fe(16)1015 1534 y Fk(R)1015 -1600 y Fg(r)d(-)f(remove)f(a)h(file)d Ff(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fe(13)1015 1658 y -Fg(R)13 b(-)f(revert)f(buffers)5 b Ff(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(16)1015 1766 y Fk(S)1015 -1833 y Fg(s)13 b(-)f(run)g(`cvs)18 b(status')9 b Ff(.)d(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)25 b Fe(12)1015 1891 y Fg(SPC)12 -b(-)h(Move)e(down)g(one)h(file)t Ff(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -18 b Fe(10)1015 1999 y Fk(U)1015 2065 y Fg(U)13 b(-)f(undo)g(changes)c -Ff(.)s(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21 -b Fe(13)1015 2123 y Fg(u)13 b(-)f(unmark)f(a)h(file)d -Ff(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 -b Fe(11)1015 2231 y Fk(X)1015 2298 y Fg(x)13 b(-)f(remove)f(processed)e -(entries)c Ff(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Fe(14)p eop -%%Page: -1 30 --1 29 bop 1937 -58 a Fo(i)0 183 y Fm(Sh)n(ort)16 b(Con)n(t)n(en)n(t)o -(s)0 299 y Fc(1)78 b(Inst)o(alla)o(t)o(ion)11 b Fb(.)f(.)g(.)f(.)h(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.) -h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)f(.)h(.)g(.)g(.)28 b Fc(1)0 366 y(2)78 b(A)m(b)q(ou)o(t)18 -b(p)q(cl-cvs)11 b Fb(.)f(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f -(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)28 -b Fc(3)0 432 y(3)78 b(Get)n(t)o(in)o(g)17 b(st)o(art)o(e)q(d)11 -b Fb(.)f(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)28 b Fc(5)0 499 y(4)78 -b(Bu\013er)17 b(con)o(t)o(en)o(t)o(s)12 b Fb(.)d(.)h(.)f(.)h(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.) -29 b Fc(7)0 565 y(5)78 b(Comm)o(an)o(ds)13 b Fb(.)d(.)g(.)g(.)g(.)g(.)f -(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)30 b Fc(10)0 632 y(6)78 b(Cust)o(omiza)o(t)o(ion)7 -b Fb(.)j(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fc(18)0 698 y(7)78 -b(F)l(u)o(t)o(ure)16 b(enh)o(ancem)o(en)o(t)o(s)6 b Fb(.)h(.)j(.)g(.)g -(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fc(20)0 764 y(8)78 b(Bugs)17 b(\(kno)o(wn)f(an)o(d)h(u)o(nkno)o(wn\)) -e Fb(.)10 b(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)30 -b Fc(22)0 831 y(A)m(p)o(p)q(en)o(dix)14 b(A)50 b(GNU)15 -b(GENERAL)i(PUBLIC)f(LICENSE)6 b Fb(.)k(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)22 b Fc(23)0 897 y(F)l(u)o(nct)o(ion)16 -b(an)o(d)g(V)l(ar)q(ia)o(b)o(le)g(In)o(d)o(ex)7 b Fb(.)i(.)h(.)g(.)g(.) -g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 -b Fc(24)0 964 y(Concept)16 b(In)o(d)o(ex)f Fb(.)9 b(.)h(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g -(.)g(.)g(.)g(.)31 b Fc(25)0 1030 y(K)o(ey)15 b(In)o(d)o(ex)5 -b Fb(.)10 b(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)21 -b Fc(27)p eop -%%Page: -2 31 --2 30 bop 1925 -58 a Fo(ii)0 183 y Fm(T)-7 b(a)n(b)o(le)15 -b(of)g(Con)n(t)n(en)n(t)o(s)0 358 y Fk(1)67 b(Inst)n(alla)n(t)n(ion)18 -b Fb(.)10 b(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)37 b Fk(1)149 435 y Fo(1.1)45 -b(Inst)o(alla)o(t)o(ion)16 b(of)f(t)n(h)o(e)g(p)q(cl-cvs)i(program)8 -b Fa(.)e(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 -b Fo(1)149 498 y(1.2)45 b(Inst)o(alla)o(t)o(ion)16 b(of)f(t)n(h)o(e)g -(on-lin)o(e)h(m)o(an)n(ual.)5 b Fa(.)j(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -g(.)f(.)h(.)f(.)h(.)19 b Fo(2)149 560 y(1.3)45 b(Ho)o(w)15 -b(t)o(o)f(m)o(ak)o(e)h(t)o(yp)q(e)q(s)q(et)g(do)q(cu)o(m)o(en)o(t)o(a)o -(t)o(ion)g(f)q(rom)f(p)q(cl-cvs.t)o(exinfo)9 b Fa(.)g(.)f(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)24 b Fo(2)0 684 y Fk(2)67 b(A)l(b)r(ou)o(t)23 -b(p)r(cl-cvs)c Fb(.)10 b(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)40 b Fk(3)149 762 y Fo(2.1)45 -b(Con)o(tr)q(ibu)o(t)o(ors)15 b(t)o(o)g(p)q(cl-cvs)f -Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fo(3)149 825 y(2.2)45 -b(Wh)o(ere)15 b(can)h(I)f(get)g(p)q(cl-cvs?)7 b Fa(.)i(.)f(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 -b Fo(4)0 949 y Fk(3)67 b(Get)m(t)n(in)o(g)23 b(st)n(art)n(e)r(d)12 -b Fb(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)33 b Fk(5)0 1089 y(4)67 b(Bu\013er)23 b(con)n(t)n(en)n(t)o -(s)12 b Fb(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)34 b Fk(7)149 1167 y Fo(4.1)45 b(File)16 -b(st)o(a)o(t)o(us)10 b Fa(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fo(7)149 1229 y(4.2)45 -b(Select)o(e)q(d)17 b(\014le)q(s)8 b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)g(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fo(8)0 1354 y Fk(5)67 -b(Comm)n(an)n(ds)14 b Fb(.)c(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)37 b Fk(10)149 -1432 y Fo(5.1)45 b(Up)q(d)o(a)o(t)o(in)o(g)16 b(t)n(h)o(e)f(direct)o -(ory)6 b Fa(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fo(10)149 1494 y(5.2)45 -b(Mo)o(v)o(em)o(en)o(t)14 b(Comm)o(an)o(ds)d Fa(.)c(.)g(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)26 -b Fo(10)149 1556 y(5.3)45 b(Mar)o(kin)o(g)16 b(\014le)q(s)5 -b Fa(.)k(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)20 -b Fo(11)149 1618 y(5.4)45 b(Commit)n(t)o(in)o(g)15 b(c)o(h)o(an)o(ge)q -(s)8 b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fo(11)149 -1681 y(5.5)45 b(Edit)o(in)o(g)16 b(\014le)q(s)5 b Fa(.)k(.)e(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fo(12)149 -1743 y(5.6)45 b(Get)n(t)o(in)o(g)15 b(info)h(a)o(b)q(ou)o(t)f(\014le)q -(s)f Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fo(12)149 1805 y(5.7)45 -b(Addin)o(g)17 b(an)o(d)e(remo)o(vin)o(g)g(\014le)q(s)g -Fa(.)8 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)29 b Fo(13)149 1868 y(5.8)45 b(Un)o(doin)o(g)16 -b(c)o(h)o(an)o(ge)q(s)11 b Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)26 b Fo(13)149 1930 y(5.9)45 b(Remo)o(vin)o(g)16 b(h)o(an)o(dle)q(d) -h(en)o(tr)q(ie)q(s)6 b Fa(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fo(14)149 1992 -y(5.10)45 b(Ignor)q(in)o(g)16 b(\014le)q(s)5 b Fa(.)j(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fo(14)149 2054 -y(5.11)45 b(Viewin)o(g)17 b(di\013erence)q(s)7 b Fa(.)i(.)e(.)h(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)22 b Fo(14)149 2117 y(5.12)45 b(R)m(u)o(nnin)o(g)18 -b(e)q(di\013)11 b Fa(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) -26 b Fo(15)149 2179 y(5.13)45 b(R)m(u)o(nnin)o(g)18 b(em)o(erge)6 -b Fa(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) -f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fo(15)149 -2241 y(5.14)45 b(Rev)o(ert)o(in)o(g)16 b(y)o(our)e(bu\013ers)9 -b Fa(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)24 b Fo(16)149 2303 y(5.15)45 -b(Mi)q(scellan)o(eous)16 b(comm)o(an)o(ds)5 b Fa(.)i(.)h(.)f(.)h(.)f(.) -h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g -(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 -b Fo(16)0 2428 y Fk(6)67 b(Cust)o(omiza)n(t)n(ion)8 b -Fb(.)j(.)f(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -f(.)h(.)31 b Fk(18)0 2568 y(7)67 b(F)-6 b(u)o(t)n(ure)24 -b(enh)n(ancem)n(en)n(t)o(s)6 b Fb(.)k(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.) -g(.)g(.)g(.)28 b Fk(20)p eop -%%Page: -3 32 --3 31 bop 1912 -58 a Fo(iii)0 45 y Fk(8)67 b(Bugs)22 -b(\(kno)n(wn)h(an)n(d)g(u)o(nkno)n(wn\))16 b Fb(.)10 -b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)f(.)h(.)g(.)38 b Fk(22)0 185 y(A)l(p)n(p)q(en)n(dix)25 -b(A)67 b(GNU)22 b(GENERAL)g(PUBLIC)g(LICENSE)141 247 -y Fb(.)10 b(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f -(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)29 -b Fk(23)0 387 y(F)-6 b(u)o(nct)n(ion)25 b(an)n(d)e(V)-6 -b(ar)q(ia)n(b)o(le)24 b(In)n(d)o(ex)7 b Fb(.)j(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.) -g(.)29 b Fk(24)0 527 y(Concept)22 b(In)n(d)o(ex)13 b -Fb(.)e(.)f(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.) -g(.)g(.)g(.)g(.)g(.)35 b Fk(25)0 667 y(K)n(ey)22 b(In)n(d)o(ex)6 -b Fb(.)12 b(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)29 b Fk(27)p -eop -%%Trailer -end -userdict /end-hook known{end-hook}if -%%EOF diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.texinfo b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.texinfo deleted file mode 100644 index 6f865f0e27e..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.texinfo +++ /dev/null @@ -1,1565 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@comment OrigId: pcl-cvs.texinfo,v 1.45 1993/05/31 22:38:15 ceder Exp -@comment @@(#)cvs/contrib/pcl-cvs:$Name: $:$Id: pcl-cvs.texinfo,v 1.1.1.2 1996/01/30 00:19:14 tholo Exp $ - -@comment Documentation for the GNU Emacs CVS mode. -@comment Copyright (C) 1992 Per Cederqvist - -@comment This file is part of the pcl-cvs distribution. - -@comment Pcl-cvs is free software; you can redistribute it and/or modify -@comment it under the terms of the GNU General Public License as published by -@comment the Free Software Foundation; either version 1, or (at your option) -@comment any later version. - -@comment Pcl-cvs is distributed in the hope that it will be useful, -@comment but WITHOUT ANY WARRANTY; without even the implied warranty of -@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -@comment GNU General Public License for more details. - -@comment You should have received a copy of the GNU General Public License -@comment along with pcl-cvs; see the file COPYING. If not, write to -@comment the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -@setfilename pcl-cvs.info -@settitle Pcl-cvs - The Emacs Front-End to CVS -@setchapternewpage on - -@ifinfo -Copyright @copyright{} 1992 Per Cederqvist - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU General Public License'' is included exactly as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU General Public License'' and -this permission notice may be included in translations approved by the -Free Software Foundation instead of in the original English. -@end ifinfo - -@synindex vr fn -@comment The titlepage section does not appear in the Info file. -@titlepage -@sp 4 -@comment The title is printed in a large font. -@center @titlefont{User's Guide} -@sp -@center @titlefont{to} -@sp -@center @titlefont{pcl-cvs - the Emacs Front-End to CVS} -@sp 2 -@center release 1.05-CVS-$Name: $ -@comment -release- -@sp 3 -@center Per Cederqvist -@sp 3 -@center last updated 20 Nov 1995 -@comment -date- - -@comment The following two commands start the copyright page -@comment for the printed manual. This will not appear in the Info file. -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1992 Per Cederqvist - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU General Public License'' is included exactly as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU General Public License'' and -this permission notice may be included in translations approved by the -Free Software Foundation instead of in the original English. -@end titlepage - -@comment ================================================================ -@comment The real text starts here -@comment ================================================================ - -@node Top, Installation, (dir), (dir) -@comment node-name, next, previous, up - - -@ifinfo -This info manual describes pcl-cvs which is a GNU Emacs front-end to -CVS. It works with CVS versions 1.5 through 1.7 and newer, and possibly -CVS-1.3 and CVS-1.4A2. This manual is updated to release -1.05-CVS-$Name: $ of pcl-cvs. -@end ifinfo -@comment -release- - -@menu -* Installation:: How to install pcl-cvs on your system. -* About pcl-cvs:: Authors and ftp sites. - -* Getting started:: An introduction with a walk-through example. -* Buffer contents:: An explanation of the buffer contents. -* Commands:: All commands, grouped by type. - -* Customization:: How you can tailor pcl-cvs to suit your needs. -* Future enhancements:: Future enhancements of pcl-cvs. -* Bugs:: Bugs (known and unknown). -* COPYING:: GNU General Public License -* Function and Variable Index:: List of functions and variables. -* Concept Index:: List of concepts. -* Key Index:: List of keystrokes. - - --- The Detailed Node Listing --- - -Installation - -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. - -About pcl-cvs - -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? - -Buffer contents - -* File status:: The meaning of the second field. -* Selected files:: How selection works. - -Commands - -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to @samp{diff} different versions. -* Invoking Ediff:: Running @samp{ediff} from @samp{*cvs*} buffer. -* Invoking Emerge:: Running @samp{emerge} from @samp{*cvs*} buffer. -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands -@end menu - - -@node Installation, About pcl-cvs, Top, Top -@comment node-name, next, previous, up - -@chapter Installation -@cindex Installation - -This section describes the installation of pcl-cvs, the GNU Emacs CVS -front-end. You should install not only the elisp files themselves, but -also the on-line documentation so that your users will know how to use -it. You can create typeset documentation from the file -@file{pcl-cvs.texinfo} as well as an on-line info file. The following -steps are also described in the file @file{INSTALL} in the source -directory. - -@menu -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. -@end menu - - -@node Pcl-cvs installation, On-line manual installation, Installation, Installation -@comment node-name, next, previous, up -@section Installation of the pcl-cvs program -@cindex Installation of elisp files - -@enumerate -@item -Possibly edit the file @file{Makefile} to reflect the situation at your -site. We say "possibly" because the version of pcl-cvs included with -CVS uses a configuration mechanism integrated with the overall -mechanisms used by the CVS build and install procedures. Thus the file -@code{Makefile} will be generated automatically from the file -@code{Makefile.in}, and it should not be necessary to edit it further. - -If you do have to edit the @file{Makefile}, the only things you have to -change is the definition of @code{lispdir} and @code{infodir}. The -elisp files will be copied to @code{lispdir}, and the info file(s) to -@code{infodir}. - -@item -Configure pcl-cvs.el - -There are a couple of pathnames that you have to check to make sure that -they match your system. They appear early in the file -@samp{pcl-cvs.el}. - -@strong{NOTE:} If your system is running emacs 18.57 or earlier you MUST -uncomment the line that says: -@example -(setq delete-exited-processes nil) -@end example - -Setting @code{delete-exited-processes} to @code{nil} works around a bug -in emacs that causes it to dump core. The bug was fixed in emacs -18.58.@refill - -@item -Release 1.05 and later of pcl-cvs requires parts of the Elib library, -version 1.0 or later. Elib is available via anonymous ftp from -prep.ai.mit.edu in @file{pub/gnu/elib-1.0.tar.gz}, and from a lot of -other sites that mirror prep. Get Elib, and install it, before -proceeding. - -@strong{NOTE:} The version of pcl-cvs included with CVS includes a copy -of Elib in the sub-directory @file{elib} under the -@file{contrib/pcl-cvs} directory. - -@item -Type @samp{make install} in the source directory. This will -byte-compile all @file{.el} files and copy the @file{*.elc} files into -the directory you specified in step 1. - -If you want to install the @file{*.el} files too, you can type -@samp{make install-el} to do so. - -If you only want to create the compiled elisp files, but don't want to -install them, you can type @samp{make} without parameters. - -@item -Edit the file @file{default.el} in your emacs lisp directory (usually -@file{/usr/gnu/lib/emacs/site-lisp} or something similar) and enter the -contents of the file @file{pcl-cvs-startup.el} into it. It contains a -couple of @code{auto-load}s that facilitates the use of pcl-cvs. - -@end enumerate - - -@node On-line manual installation, Typeset manual installation, Pcl-cvs installation, Installation -@comment node-name, next, previous, up - -@section Installation of the on-line manual. -@cindex Manual installation (on-line) -@cindex Installation of on-line manual -@cindex Generating the on-line manual -@cindex On-line manual (how to generate) -@cindex Info-file (how to generate) - -@enumerate -@item -Create the info file(s) @file{pcl-cvs.info*} from @file{pcl-cvs.texinfo} -by typing @samp{make info}. If you don't have the program -@samp{makeinfo} you can get it by anonymous ftp from -e.g. @samp{prep.ai.mit.edu} as @file{pub/gnu/texinfo-3.7.tar.gz} (there -might be a newer version there when you read this).@refill - -@item -Install the info file(s) @file{pcl-cvs.info*} into your standard -@file{info} directory. You should be able to do this by typing -@samp{make install-info}.@refill - -@item -Edit the file @file{dir} in the @file{info} directory and enter one line -to contain a pointer to the info file(s) @file{pcl-cvs.info*}. The line -can, for instance, look like this:@refill - -@example -* Pcl-cvs: (pcl-cvs). An Emacs front-end to CVS. -@end example -@end enumerate - - -@node Typeset manual installation, , On-line manual installation, Installation -@comment node-name, next, previous, up - -@section How to make typeset documentation from pcl-cvs.texinfo -@cindex Manual installation (typeset) -@cindex Installation of typeset manual -@cindex Printing a manual -@cindex TeX - generating a typeset manual -@cindex Generating a typeset manual - -If you have @TeX{} installed at your site, you can make a typeset manual -from @file{pcl-cvs.texinfo}. - -@enumerate -@item -Run @TeX{} by typing `@samp{make pcl-cvs.dvi}'. You will not get the -indices unless you have the @code{texindex} program. - -@item -Convert the resulting device independent file @file{pcl-cvs.dvi} to a -form which your printer can output and print it. If you have a -postscript printer there is a program, @code{dvi2ps}, which does. There -is also a program which comes together with @TeX{}, @code{dvips}, which -you can use. - -@end enumerate - - -@node About pcl-cvs, Getting started, Installation, Top -@comment node-name, next, previous, up - -@chapter About pcl-cvs -@cindex About pcl-cvs - -Pcl-cvs is a front-end to CVS versions 1.5 through 1.7 and newer; and -possibly verison 1.3 and 1.4A2. It integrates the most frequently used -CVS commands into an emacs interface. - -@menu -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? -@end menu - - -@node Contributors, Archives, About pcl-cvs, About pcl-cvs -@comment node-name, next, previous, up - -@section Contributors to pcl-cvs -@cindex Contributors -@cindex Authors - -Contributions to the package are welcome. I have limited time to work -on this project, but I will gladly add any code that you contribute to -me to this package (@pxref{Bugs}). - -The following persons have made contributions to pcl-cvs. - -@itemize @bullet -@item -Brian Berliner wrote CVS, together with some other contributors. -Without his work on CVS this package would be useless@dots{} - -@item -Per Cederqvist wrote most of the otherwise unattributed functions in -pcl-cvs as well as all documentation. - -@item -Inge Wallin (@samp{inge@@lysator.liu.se}) wrote the skeleton to -@file{pcl-cvs.texinfo}, and gave useful comments on it. He also wrote -the files @file{elib-node.el} and @file{compile-all.el}. The file -@file{cookie.el} was inspired by Inge.@refill - -@item -Linus Tolke (@samp{linus@@lysator.liu.se}) contributed useful comments -on both the functionality and the documentation.@refill - -@item -Jamie Zawinski (@samp{jwz@@lucid.com}) contributed -@file{pcl-cvs-lucid.el}. - -@item -Leif Lonnblad contributed RCVS support. (Since superceded by the new -remote CVS support.) - -@item -Jim Blandy (@samp{jimb@@cyclic.com}) contributed hooks to automatically -guess CVS log entries from ChangeLog contents; and initial support of -the new Cygnus / Cyclic remote CVS; as well as various sundry bug fixes -and cleanups. - -@item -Jim Kingdon (@samp{kingdon@@cyclic.com}) contributed lots of fixes to -the build and install procedure. - -@item -Greg A. Woods (@samp{woods@@planix.com}) contributed code to implement -the use of per-file diff buffers; and vendor join diffs with emerge and -ediff; as well as various an sundry bug fixes and cleanups. -@end itemize - -Apart from these, a lot of people have send me suggestions, ideas, -requests, bug reports and encouragement. Thanks a lot! Without your -there would be no new releases of pcl-cvs. - - -@node Archives, , Contributors, About pcl-cvs -@comment node-name, next, previous, up - -@section Where can I get pcl-cvs? -@cindex Sites -@cindex Archives -@cindex Ftp-sites -@cindex Getting pcl-cvs -@cindex Email archives - -The current release of pcl-cvs is included in CVS-1.7. - -The author's release of pcl-cvs can be fetched via anonymous ftp from -@code{ftp.lysator.liu.se}, (IP no. 130.236.254.1) in the directory -@code{pub/emacs}. If you don't live in Scandinavia you should probably -check with archie to see if there is a site closer to you that archives -pcl-cvs. - -New releases will be announced to appropriate newsgroups. If you send -your email address to me I will add you to my list of people to mail -when I make a new release. - - -@node Getting started, Buffer contents, About pcl-cvs, Top -@comment node-name, next, previous, up - -@chapter Getting started -@cindex Introduction -@cindex Example run - -This document assumes that you know what CVS is, and that you at least -knows the fundamental concepts of CVS. If that is not the case you -should read the man page for CVS. - -Pcl-cvs is only useful once you have checked out a module. So before -you invoke it you must have a copy of a module somewhere in the file -system. - -You invoke pcl-cvs by typing @kbd{M-x cvs-update RET}. If your emacs -responds with @samp{[No match]} your system administrator has not -installed pcl-cvs properly. Try @kbd{M-x load-library RET pcl-cvs RET}. -If that also fails - talk to your root. If it succeeds you might put -this line in your @file{.emacs} file so that you don't have to type the -@samp{load-library} command every time you wish to use pcl-cvs: - -@example -(autoload 'cvs-update "pcl-cvs" nil t) -@end example - -The function @code{cvs-update} will ask for a directory. The command -@samp{cvs update} will be run in that directory. (It should contain -files that have been checked out from a CVS archive.) The output from -@code{cvs} will be parsed and presented in a table in a buffer called -@samp{*cvs*}. It might look something like this: - -@example -PCL-CVS release 1.05-CVS-$Name: $. -@comment -release- - -In directory /users/ceder/FOO/test: - Updated bar - Updated file.txt - Modified ci namechange - Updated newer - -In directory /users/ceder/FOO/test/sub: - Modified ci ChangeLog ----------- End ----- -@end example - -In this example the two files (@file{bar}, @file{file.txt}, and -@file{newer}) that are marked with @samp{Updated} have been copied from -the CVS repository to @file{/users/ceder/FOO/test/} since someone else -have checked in newer versions of them. Two files (@file{namechange} -and @file{sub/ChangeLog}) have been modified locally, and needs to be -checked in. - -You can move the cursor up and down in the buffer with @kbd{C-n} and -@kbd{C-p} or @kbd{n} and @kbd{p}. If you press @kbd{c} on one of the -@samp{Modified} files that file will be checked in to the CVS -repository. @xref{Committing changes}. You can press @kbd{x} to get rid -of the "uninteresting" files that have only been @samp{Updated} (and -don't require any further action from you).@refill - -You can also easily get a @samp{diff} between your modified file and the -base version that you started from, and you can get the output from -@samp{cvs log} and @samp{cvs status} on the listed files simply by -pressing a key (@pxref{Getting info about files}). - - -@node Buffer contents, Commands, Getting started, Top -@comment node-name, next, previous, up - -@chapter Buffer contents -@cindex Buffer contents - -The display contains four columns. They contain, from left to right: - -@itemize @bullet -@item -An asterisk when the file is @dfn{marked} (@pxref{Selected -files}).@refill -@item -The status of the file. See @xref{File status}, for more -information.@refill -@item -A "need to be checked in"-marker (@samp{ci}). -@item -The file name. -@end itemize - -@menu -* File status:: The meaning of the second field. -* Selected files:: How selection works. -@end menu - - -@node File status, Selected files, Buffer contents, Buffer contents -@comment node-name, next, previous, up - -@section File status -@cindex File status -@cindex Updated (file status) -@cindex Patched (file status) -@cindex Modified (file status) -@cindex Merged (file status) -@cindex Conflict (file status) -@cindex Added (file status) -@cindex Removed (file status) -@cindex Unknown (file status) -@cindex Removed from repository (file status) -@cindex Removed from repository, changed by you (file status) -@cindex Removed by you, changed in repository (file status) -@cindex Move away @var{file} - it is in the way (file status) -@cindex This repository is missing!@dots{} (file status) - -The @samp{file status} field can have the following values: - -@table @samp - -@item Updated -The file was brought up to date with respect to the repository. This is -done for any file that exists in the repository but not in your source, -and for files that you haven't changed but are not the most recent -versions available in the repository.@refill - -@item Patched -The file was brought up to date with respect to a remote repository by -way of fetching and applying a patch to the file in your source. This -is done for any file that exists in a remote repository and in your -source; of which you haven't changed locally but is not the most recent -version available in the remote repository.@refill - -@item Modified -The file is modified in your working directory, and there was no -modification to the same file in the repository.@refill - -@item Merged -The file is modified in your working directory, and there were -modifications in the repository as well as in your copy, but they were -merged successfully, without conflict, in your working directory.@refill - -@item Conflict -A conflict was detected while trying to merge your changes to @var{file} -with changes from the source repository. @var{file} (the copy in your -working directory) is now the output of the @samp{rcsmerge} command on -the two versions; an unmodified copy of your file is also in your -working directory, with the name @file{.#@var{file}.@var{version}}, -where @var{version} is the RCS revision that your modified file started -from. @xref{Viewing differences}, for more details.@refill - -@item Added -The file has been added by you, but it still needs to be checked in to -the repository.@refill - -@item Removed -The file has been removed by you, but it needs to be checked in to the -repository. You can resurrect it by typing @kbd{a} (@pxref{Adding and -removing files}).@refill - -@item Unknown -A file that was detected in your directory, but that neither appears in -the repository, nor is present on the list of files that CVS should -ignore.@refill - -@end table - -There are also a few special cases, that rarely occur, which have longer -strings in the fields: - -@table @samp -@item Removed from repository -The file has been removed from your directory since someone has removed -it from the repository. (It is still present in the Attic directory, so -no permanent loss has occurred). This, unlike the other entries in this -table, is not an error condition.@refill - -@item Removed from repository, changed by you -You have modified a file that someone have removed from the repository. -You can correct this situation by removing the file manually (see -@pxref{Adding and removing files}).@refill - -@item Removed by you, changed in repository -You have removed a file, and before you committed the removal someone -committed a change to that file. You could use @kbd{a} to resurrect the -file (see @pxref{Adding and removing files}).@refill - -@item Move away @var{file} - it is in the way -For some reason CVS does not like the file @var{file}. Rename or remove -it.@refill - -@item This repository is missing! Remove this dir manually. -It is impossible to remove a directory in the CVS repository in a clean -way. Someone have tried to remove one, and CVS gets confused. Remove -your copy of the directory.@refill -@end table - - -@node Selected files, , File status, Buffer contents -@comment node-name, next, previous, up - -@section Selected files -@cindex Selected files -@cindex Marked files -@cindex File selection -@cindex Active files - -Many of the commands works on the current set of @dfn{selected} files. - -@itemize @bullet -@item -If there are any files that are marked they constitute the set of -selected files.@refill -@item -Otherwise, if the cursor points to a file, that file is the selected -file.@refill -@item -Otherwise, if the cursor points to a directory, all the files in that -directory that appears in the buffer are the selected files. -@end itemize - -This scheme might seem a little complicated, but once one get used to -it, it is quite powerful. - -@xref{Marking files} tells how you mark and unmark files. - - -@node Commands, Customization, Buffer contents, Top -@comment node-name, next, previous, up - -@chapter Commands - -@iftex -This chapter describes all the commands that you can use in pcl-cvs. -@end iftex -@ifinfo -The nodes in this menu contains explanations about all the commands that -you can use in pcl-cvs. They are grouped together by type. -@end ifinfo - -@menu -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to @samp{diff} different versions. -* Invoking Ediff:: Running @samp{ediff} from @samp{*cvs*} buffer. -* Invoking Emerge:: Running @samp{emerge} from @samp{*cvs*} buffer. -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands -@end menu - - -@node Updating the directory, Movement commands, Commands, Commands -@comment node-name, next, previous, up - -@section Updating the directory -@findex cvs-update -@findex cvs-mode-update-no-prompt -@findex cvs-delete-lock -@cindex Getting the *cvs* buffer -@kindex g - Rerun @samp{cvs update} - - -@table @kbd - -@item M-x cvs-update -Run a @samp{cvs update} command. You will be asked for the directory in -which the @samp{cvs update} will be run. The output will be parsed by -pcl-cvs, and the result printed in the @samp{*cvs*} buffer (see -@pxref{Buffer contents} for a description of the contents).@refill - -By default, @samp{cvs-update} will descend recursively into -subdirectories. You can avoid that behavior by giving a prefix -argument to it (e.g., by typing @kbd{C-u M-x cvs-update RET}).@refill - -All other commands in pcl-cvs requires that you have a @samp{*cvs*} -buffer. This is the command that you use to get one.@refill - -CVS uses lock files in the repository to ensure the integrity of the -data files in the repository. They might be left behind i.e. if a -workstation crashes in the middle of a CVS operation. CVS outputs a -message when it is waiting for a lock file to go away. Pcl-cvs will -show the same message in the *cvs* buffer, together with instructions -for deleting the lock files. You should normally not have to delete -them manually --- just wait a little while and the problem should fix -itself. But if the lock files doesn't disappear you can delete them -with @kbd{M-x cvs-delete-lock RET}.@refill - -@item g -This will run @samp{cvs update} again. It will always use the same -buffer that was used with the previous @samp{cvs update}. Give a prefix -argument to avoid descending into subdirectories. This runs the command -@samp{cvs-mode-update-no-prompt}.@refill - -@item G -This will run @samp{cvs update} and prompt for a new directory to -update. This runs the command @samp{cvs-update}.@refill - -@end table - - -@node Movement commands, Marking files, Updating the directory, Commands -@comment node-name, next, previous, up - -@section Movement Commands -@cindex Movement Commands -@findex cookie-next-cookie -@findex cookie-previous-cookie -@kindex SPC - Move down one file -@kindex C-n - Move down one file -@kindex n - Move down one file -@kindex C-p - Move up one file -@kindex p - Move up on file - -You can use most normal Emacs commands to move forward and backward in -the buffer. Some keys are rebound to functions that take advantage of -the fact that the buffer is a pcl-cvs buffer: - - -@table @kbd -@item SPC -@itemx C-n -@itemx n -These keys move the cursor one file forward, towards the end of the -buffer (@code{cookie-next-cookie}). - -@item C-p -@itemx p -These keys move one file backward, towards the beginning of the buffer -(@code{cookie-previous-cookie}). -@end table - - -@node Marking files, Committing changes, Movement commands, Commands -@comment node-name, next, previous, up - -@section Marking files -@cindex Selecting files (commands to mark files) -@cindex Marking files -@kindex m - marking a file -@kindex M - marking all files -@kindex u - unmark a file -@kindex ESC DEL - unmark all files -@kindex DEL - unmark previous file -@findex cvs-mode-mark -@findex cvs-mode-unmark -@findex cvs-mode-mark-all-files -@findex cvs-mode-unmark-all-files -@findex cvs-mode-unmark-up - -Pcl-cvs works on a set of @dfn{selected files} (@pxref{Selected files}). -You can mark and unmark files with these commands: - -@table @kbd -@item m -This marks the file that the cursor is positioned on. If the cursor is -positioned on a directory all files in that directory will be marked. -(@code{cvs-mode-mark}). - -@item u -Unmark the file that the cursor is positioned on. If the cursor is on a -directory, all files in that directory will be unmarked. -(@code{cvs-mode-unmark}).@refill - -@item M -Mark @emph{all} files in the buffer (@code{cvs-mode-mark-all-files}). - -@item @key{ESC} @key{DEL} -Unmark @emph{all} files (@code{cvs-mode-unmark-all-files}). - -@item @key{DEL} -Unmark the file on the previous line, and move point to that line -(@code{cvs-mode-unmark-up}). -@end table - - -@node Committing changes, Editing files, Marking files, Commands -@comment node-name, next, previous, up - -@section Committing changes -@cindex Committing changes -@cindex Ci -@findex cvs-mode-commit -@findex cvs-mode-changelog-commit -@kindex c - commit files -@kindex C - commit files with ChangeLog message -@vindex cvs-erase-input-buffer (variable) -@vindex cvs-auto-revert-after-commit (variable) -@cindex Commit buffer -@cindex Edit buffer -@cindex Erasing commit message -@cindex Reverting buffers after commit - -@table @kbd - -@item c -All files that have a "need to be checked in"-marker (@pxref{Buffer -contents}) can be checked in with the @kbd{c} command. It checks in all -selected files (@pxref{Selected files}) (except those who lack the -"ci"-marker - they are ignored). Pressing @kbd{c} causes -@code{cvs-mode-commit} to be run.@refill - -When you press @kbd{c} you will get a buffer called -@samp{*cvs-commit-message*}. Enter the log message for the file(s) in -it. When you are ready you should press @kbd{C-c C-c} to actually -commit the files (using @code{cvs-edit-done}). - -Normally the @samp{*cvs-commit-message*} buffer will retain the log -message from the previous commit, but if the variable -@code{cvs-erase-input-buffer} is set to a non-@code{nil} value the -buffer will be erased. Point and mark will always be located around the -entire buffer so that you can easily erase it with @kbd{C-w} -(@samp{kill-region}).@refill - -If you are editing the files in your emacs an automatic -@samp{revert-buffer} will be performed. (If the file contains -@samp{$@asis{Id}$} keywords @samp{cvs commit} will write a new file with -the new values substituted. The auto-revert makes sure that you get -them into your buffer). The revert will not occur if you have modified -your buffer, or if @samp{cvs-auto-revert-after-commit} is set to -@samp{nil}.@refill - -@item C -This is just like @samp{cvs-mode-commit}, except that it tries to -provide appropriate default log messages by looking at the -@samp{ChangeLog}s in the current directory. The idea is to write your -ChangeLog entries first, and then use this command to commit your -changes. Pressing @kbd{C} causes @code{cvs-mode-changelog-commit} to be -run.@refill - -To select default log text, pcl-cvs: -@itemize @minus -@item -finds the ChangeLogs for the files to be checked in; -@item -verifies that the top entry in the ChangeLog is on the current date and -by the current user; if not, no default text is provided; -@item -search the ChangeLog entry for paragraphs containing the names of the -files we're checking in; and finally -@item -uses those paragraphs as the default log text in the -@samp{*cvs-commit-message*} buffer. -@end itemize - -You can then commit the @samp{ChangeLog} file once per day without any -log message.@refill - -@end table - - -@node Editing files, Getting info about files, Committing changes, Commands -@comment node-name, next, previous, up - -@section Editing files -@cindex Editing files -@cindex Finding files -@cindex Loading files -@cindex Dired -@cindex Invoking dired -@findex cvs-mode-find-file -@findex cvs-mode-find-file-other-window -@findex cvs-mode-add-change-log-entry-other-window -@kindex f - find file or directory -@kindex o - find file in other window -@kindex A - add ChangeLog entry - -There are currently three commands that can be used to find a file (that -is, load it into a buffer and start editing it there). These commands -work on the line that the cursor is situated at. They ignore any marked -files. - -@table @kbd -@item f -Find the file that the cursor points to. Run @samp{dired} -@ifinfo -(@pxref{Dired,,,Emacs}) -@end ifinfo -if the cursor points to a directory (@code{cvs-mode-find-file}).@refill - -@item o -Like @kbd{f}, but use another window -(@code{cvs-mode-find-file-other-window}).@refill - -@item A -Invoke @samp{add-change-log-entry-other-window} to edit a -@samp{ChangeLog} file. The @samp{ChangeLog} will be found in the -directory of the file the cursor points to. -(@code{cvs-mode-add-change-log-entry-other-window}).@refill -@end table - - -@node Getting info about files, Adding and removing files, Editing files, Commands -@comment node-name, next, previous, up - -@section Getting info about files -@cindex Status (cvs command) -@cindex Log (RCS/cvs command) -@cindex Getting status -@kindex l - run @samp{cvs log} -@kindex s - run @samp{cvs status} -@findex cvs-mode-log -@findex cvs-mode-status - -Both of the following commands can be customized. -@xref{Customization}.@refill - -@table @kbd -@item l -Run @samp{cvs log} on all selected files, and show the result in a -temporary buffer (@code{cvs-mode-log}). - -@item s -Run @samp{cvs status} on all selected files, and show the result in a -temporary buffer (@code{cvs-mode-status}). -@end table - - -@node Adding and removing files, Undoing changes, Getting info about files, Commands -@comment node-name, next, previous, up - -@section Adding and removing files -@cindex Adding files -@cindex Removing files -@cindex Resurrecting files -@cindex Deleting files -@cindex Putting files under CVS control -@kindex a - add a file -@kindex r - remove a file -@findex cvs-mode-add -@findex cvs-mode-remove-file - -The following commands are available to make it easy to add and remove -files from the CVS repository. - -@table @kbd -@item a -Add all selected files. This command can be used on @samp{Unknown} -files (see @pxref{File status}). The status of the file will change to -@samp{Added}, and you will have to use @kbd{c} (@samp{cvs-mode-commit}, see -@pxref{Committing changes}) to really add the file to the -repository.@refill - -This command can also be used on @samp{Removed} files (before you commit -them) to resurrect them. - -Selected files that are neither @samp{Unknown} nor @samp{Removed} will -be ignored by this command. - -The command that is run is @code{cvs-mode-add}. - -@item r -This command removes the selected files (after prompting for -confirmation). The files are @samp{rm}ed from your directory and -(unless the status was @samp{Unknown}; @pxref{File status}) they will -also be @samp{cvs remove}d. If the files were @samp{Unknown} they will -disappear from the buffer. Otherwise their status will change to -@samp{Removed}, and you must use @kbd{c} (@samp{cvs-mode-commit}, -@pxref{Committing changes}) to commit the removal.@refill - -The command that is run is @code{cvs-mode-remove-file}. -@end table - - -@node Undoing changes, Removing handled entries, Adding and removing files, Commands -@comment node-name, next, previous, up - -@section Undoing changes -@cindex Undo changes -@cindex Flush changes -@kindex U - undo changes -@findex cvs-mode-undo-local-changes - -@table @kbd -@item U -If you have modified a file, and for some reason decide that you don't -want to keep the changes, you can undo them with this command. It works -by removing your working copy of the file and then getting the latest -version from the repository (@code{cvs-mode-undo-local-changes}. -@end table - - -@node Removing handled entries, Ignoring files, Undoing changes, Commands -@comment node-name, next, previous, up - -@section Removing handled entries -@cindex Expunging uninteresting entries -@cindex Uninteresting entries, getting rid of them -@cindex Getting rid of uninteresting lines -@cindex Removing uninteresting (processed) lines -@cindex Handled lines, removing them -@kindex x - remove processed entries -@kindex C-k - remove selected entries -@findex cvs-mode-remove-handled -@findex cvs-mode-acknowledge - -@table @kbd -@item x -This command allows you to remove all entries that you have processed. -More specifically, the lines for @samp{Updated} files (@pxref{File -status} and files that have been checked in (@pxref{Committing changes}) -are removed from the buffer. If a directory becomes empty the heading -for that directory is also removed. This makes it easier to get an -overview of what needs to be done. - -The command is called @code{cvs-mode-remove-handled}. If -@samp{cvs-auto-remove-handled} is set to non-@code{nil} this will -automatically be performed after every commit.@refill - -@item C-k -This command can be used for lines that @samp{cvs-mode-remove-handled} would -not delete, but that you want to delete (@code{cvs-mode-acknowledge}). -@end table - - -@node Ignoring files, Viewing differences, Removing handled entries, Commands -@comment node-name, next, previous, up - -@section Ignoring files -@kindex i - ignoring files -@findex cvs-mode-ignore - -@table @kbd -@item i -Arrange so that CVS will ignore the selected files. The file names are -added to the @file{.cvsignore} file in the corresponding directory. If -the @file{.cvsignore} doesn't exist it will be created. - -The @file{.cvsignore} file should normally be added to the repository, -but you could ignore it also if you like it better that way. - -This runs @code{cvs-mode-ignore}. -@end table - - -@node Viewing differences, Invoking Ediff, Ignoring files, Commands -@comment node-name, next, previous, up - -@section Viewing differences -@cindex Diff -@cindex Ediff -@cindex Invoking ediff -@cindex Conflicts, how to resolve them -@cindex Viewing differences -@kindex d - run @samp{cvs diff} -@kindex b - diff backup file -@findex cvs-mode-diff-cvs -@findex cvs-mode-diff-backup -@vindex cvs-diff-ignore-marks (variable) - -@table @kbd -@item d -Display a @samp{cvs diff} between the selected files and the RCS version -that they are based on. @xref{Customization} describes how you can send -flags to @samp{cvs diff}. If @var{cvs-diff-ignore-marks} is set to a -non-@code{nil} value or if a prefix argument is given (but not both) any -marked files will not be considered to be selected. -(@code{cvs-mode-diff-cvs}).@refill - -@item b -If CVS finds a conflict while merging two versions of a file (during a -@samp{cvs update}, @pxref{Updating the directory}) it will save the -original file in a file called @file{.#@var{FILE}.@var{VERSION}} where -@var{FILE} is the name of the file, and @var{VERSION} is the RCS version -number that your file was based on.@refill - -With the @kbd{b} command you can run a @samp{diff} on the files -@file{.#@var{FILE}.@var{VERSION}} and @file{@var{FILE}}. You can get a -context- or Unidiff by setting @samp{cvs-diff-flags} - -@pxref{Customization}. This command only works on files that have -status @samp{Conflict} or @samp{Merged}.@refill - -If @var{cvs-diff-ignore-marks} is set to a non-@code{nil} value or if a -prefix argument is given (but not both) any marked files will not be -considered to be selected. (@code{cvs-mode-diff-backup}).@refill -@end table - - -@node Invoking Ediff, Invoking Emerge, Viewing differences, Commands -@comment node-name, next, previous, up - -@section Running ediff -@cindex Ediff -@cindex Invoking ediff -@cindex Viewing differences -@cindex Conflicts, resolving -@cindex Resolving conflicts -@kindex e - invoke @samp{ediff} -@findex cvs-mode-ediff -@findex run-ediff-from-cvs-buffer -@findex cvs-old-ediff-interface - -@table @kbd -@item e -This command works -slightly different depending on the version of @samp{ediff} and the file -status.@refill - -With modern versions of @samp{ediff}, this command invokes -@samp{run-ediff-from-cvs-buffer} on one file.@refill - -@strong{Note:} When the file status is @samp{Merged} or @samp{Conflict}, -CVS has already performed a merge. The resulting file is not used in -any way if you use this command. If you use the @kbd{q} command inside -@samp{ediff} (to successfully terminate a merge) the file that CVS -created will be overwritten.@refill - -Older versions of @samp{ediff} use an interface similar to -@samp{emerge}. The function @samp{cvs-old-ediff-interface} is invoked -if the version of @samp{ediff} you have doesn't support -@samp{run-ediff-from-cvs-buffer}. These older versions do not support -merging of revisions.@refill - -@table @asis -@item @samp{Modified} -Run @samp{ediff-files} with your working file as file A, and the latest -revision in the repository as file B. - -@item @samp{Merged} -@itemx @samp{Conflict} -Run @samp{ediff-files3} with your working file (as it was prior to your -invocation of @samp{cvs-update}) as file A, the latest revision in the -repository as file B, and the revision that you based your local -modifications on as ancestor. - -@item @samp{Updated} -@itemx @samp{Patched} -Run @samp{ediff-files} with your working file as file A, and a given -revision in the repository as file B. You are prompted for the revision -to ediff against, and you may specify either a tag name or a numerical -revision number (@pxref{Getting info about files}). -@end table - -@end table - -@node Invoking Emerge, Reverting your buffers, Invoking Ediff, Commands -@comment node-name, next, previous, up - -@section Running emerge -@cindex Emerge -@cindex Ediff -@cindex Viewing differences -@cindex Invoking emerge -@cindex Conflicts, resolving -@cindex Resolving conflicts -@kindex E - invoke @samp{emerge} -@findex cvs-mode-emerge - -@table @kbd -@item E -Invoke @samp{emerge} on one file. This command works slightly different -depending on the file status. - -@table @asis -@item @samp{Modified} -Run @samp{emerge-files} with your working file as file A, and the latest -revision in the repository as file B. - -@item @samp{Merged} -@itemx @samp{Conflict} -Run @samp{emerge-files-with-ancestor} with your working file (as it was -prior to your invocation of @samp{cvs-update}) as file A, the latest -revision in the repository as file B, and the revision that you based -your local modifications on as ancestor. -@end table - -@strong{Note:} When the file status is @samp{Merged} or @samp{Conflict}, -CVS has already performed a merge. The resulting file is not used in -any way if you use this command. If you use the @kbd{q} command inside -@samp{emerge} (to successfully terminate the merge) the file that CVS -created will be overwritten. - -@end table - - -@node Reverting your buffers, Miscellaneous commands, Invoking Emerge, Commands -@comment node-name, next, previous, up - -@section Reverting your buffers -@findex cvs-mode-revert-updated-buffers -@kindex R - revert buffers -@cindex Syncing buffers -@cindex Reverting buffers - -@table @kbd -@item R -If you are editing (or just viewing) a file in a buffer, and that file -is changed by CVS during a @samp{cvs-update}, all you have to do is type -@kbd{R} in the *cvs* buffer to read in the new versions of the -files.@refill - -All files that are @samp{Updated}, @samp{Merged} or in @samp{Conflict} -are reverted from the disk. Any other files are ignored. Only files -that you were already editing are read.@refill - -An error is signalled if you have modified the buffer since it was last -changed. (@code{cvs-mode-revert-updated-buffers}).@refill -@end table - - -@node Miscellaneous commands, , Reverting your buffers, Commands -@comment node-name, next, previous, up - -@section Miscellaneous commands -@findex cvs-byte-compile-files -@cindex Recompiling elisp files -@cindex Byte compilation -@cindex Getting rid of lock files -@cindex Lock files -@kindex q - bury the *cvs* buffer -@findex bury-buffer - -@table @kbd -@item M-x cvs-byte-compile-files -Byte compile all selected files that end in .el. - -@item M-x cvs-delete-lock -This command can be used in any buffer, and deletes the lock files that -the *cvs* buffer informs you about. You should normally never have to -use this command since CVS tries very carefully to always remove the -lock files itself. - -You can only use this command when a message in the *cvs* buffer tells -you so. You should wait a while before using this command in case -someone else is running a cvs command. - -@item q -Bury the *cvs* buffer. (@code{bury-buffer}). - -@end table - - -@node Customization, Future enhancements, Commands, Top -@comment node-name, next, previous, up - -@chapter Customization -@vindex cvs-erase-input-buffer (variable) -@vindex cvs-inhibit-copyright-message (variable) -@vindex cvs-diff-flags (variable) -@vindex cvs-diff-ignore-marks (variable) -@vindex cvs-log-flags (variable) -@vindex cvs-status-flags (variable) -@vindex cvs-auto-remove-handled (variable) -@vindex cvs-update-prog-output-skip-regexp (variable) -@vindex cvs-cvsroot (variable) -@vindex TMPDIR (environment variable) -@vindex cvs-auto-revert-after-commit (variable) -@vindex cvs-commit-buffer-require-final-newline (variable) -@vindex cvs-sort-ignore-file (variable) -@cindex Inhibiting the Copyright message. -@cindex Copyright message, getting rid of it -@cindex Getting rid of the Copyright message. -@cindex Customization -@cindex Variables, list of all -@cindex Erasing the input buffer -@cindex Context diff, how to get -@cindex Unidiff, how to get -@cindex Automatically remove handled files -@cindex -u option in modules file -@cindex Modules file (-u option) -@cindex Update program (-u option in modules file) -@cindex Reverting buffers after commit -@cindex Require final newline -@cindex Automatically inserting newline -@cindex Commit message, inserting newline -@cindex Sorting the .cvsignore file -@cindex .cvsignore file, sorting -@cindex Automatically sorting .cvsignore - -If you have an idea about any customization that would be handy but -isn't present in this list, please tell me! @xref{Bugs} for info on how -to reach me.@refill - -@table @samp -@item cvs-erase-input-buffer -If set to anything else than @code{nil} the edit buffer will be erased -before you write the log message (@pxref{Committing changes}). - -@item cvs-inhibit-copyright-message -The copyright message that is displayed on startup can be annoying after -a while. Set this variable to @samp{t} if you want to get rid of it. -(But don't set this to @samp{t} in the system defaults file - new users -should see this message at least once). - -@item cvs-diff-flags -A list of strings to pass as arguments to the @samp{cvs diff} and -@samp{diff} programs. This is used by @samp{cvs-mode-diff-cvs} and -@samp{cvs-mode-diff-backup} (key @kbd{b}, @pxref{Viewing differences}). If -you prefer the Unidiff format you could add this line to your -@file{.emacs} file:@refill - -@example -(setq cvs-diff-flags '("-u")) -@end example - -@item cvs-diff-ignore-marks -If this variable is non-@code{nil} or if a prefix argument is given (but -not both) to @samp{cvs-mode-diff-cvs} or @samp{cvs-mode-diff-backup} -marked files are not considered selected. - -@item cvs-log-flags -List of strings to send to @samp{cvs log}. Used by @samp{cvs-mode-log} -(key @kbd{l}, @pxref{Getting info about files}). - -@item cvs-status-flags -List of strings to send to @samp{cvs status}. Used by @samp{cvs-mode-status} -(key @kbd{s}, @pxref{Getting info about files}). - -@item cvs-auto-remove-handled -If this variable is set to any non-@code{nil} value -@samp{cvs-mode-remove-handled} will be called every time you check in -files, after the check-in is ready. @xref{Removing handled -entries}.@refill - -@item cvs-auto-revert-after-commit -If this variable is set to any non-@samp{nil} value any buffers you have -that visit a file that is committed will be automatically reverted. -This variable is default @samp{t}. @xref{Committing changes}.@refill - -@item cvs-update-prog-output-skip-regexp -The @samp{-u} flag in the @file{modules} file can be used to run a command -whenever a @samp{cvs update} is performed (see cvs(5)). This regexp -is used to search for the last line in that output. It is normally set -to @samp{"$"}. That setting is only correct if the command outputs -nothing. Note that pcl-cvs will get very confused if the command -outputs @emph{anything} to @samp{stderr}. - -@item cvs-cvsroot -This variable can be set to override @samp{CVSROOT}. It should be a -string. If it is set then everytime a cvs command is run it will be -called as @samp{cvs -d @var{cvs-cvsroot}@dots{}} This can be useful if -your site has several repositories. - -@item TMPDIR -Pcl-cvs uses this @emph{environment variable} to decide where to put the -temporary files it needs. It defaults to @file{/tmp} if it is not set. - -@item cvs-commit-buffer-require-final-newline -When you enter a log message in the @samp{*cvs-commit-message*} buffer -pcl-cvs will normally automatically insert a trailing newline, unless -there already is one. This behavior can be controlled via -@samp{cvs-commit-buffer-require-final-newline}. If it is @samp{t} (the -default behavior), a newline will always be appended. If it is -@samp{nil}, newlines will never be appended. Any other value causes -pcl-cvs to ask the user whenever there is no trailing newline in the -commit message buffer. - -@item cvs-sort-ignore-file -If this variable is set to any non-@samp{nil} value the -@file{.cvsignore} will always be sorted whenever you use -@samp{cvs-mode-ignore} to add a file to it. This option is on by -default. - -@end table - - -@node Future enhancements, Bugs, Customization, Top -@comment node-name, next, previous, up - -@chapter Future enhancements -@cindex Enhancements - -Pcl-cvs is still under development and needs a number of enhancements to -be called complete. Below is my current wish-list for future releases -of pcl-cvs. Please, let me know which of these features you want most. -They are listed below in approximately the order that I currently think -I will implement them in. - -@itemize @bullet -@item -Rewritten parser code. There are many situations where pcl-cvs will -fail to recognize the output from CVS. The situation could be greatly -increased. - -@item -@samp{cvs-status}. This will run @samp{cvs status} in a directory and -produce a buffer that looks pretty much like the current *cvs* buffer. -That buffer will include information for all version-controlled files. -(There will be a simple keystroke to remove all "uninteresting" files, -that is, files that are "Up-to-date"). In this new buffer you will be -able to update a file, commit a file, et c. The big win with this is -that you will be able to watch the differences between your current -working file and the head revision in the repository before you update -the file, and you can then choose to update it or let it wait for a -while longer. - -@item -Log mode. When this mode is finished you will be able to move around -(using @kbd{n} and @kbd{p}) between the revisions of a file, mark two of -them, and run a diff between them. You will be able to hide branches -(similar to the way you can hide sub-paragraphs in outline-mode) and do -merges between revisions. Other ideas about this are welcome. - -@item -The current model for marks in the *cvs* buffer seems to be confusing. -I am considering to use the VM model instead, where marks are normally -inactive. To activate the mark, you issue a command like -@samp{cvs-mode-next-command-uses-marks}. I might implement a flag so -that you can use either version. Feedback on this before I start coding -it is very welcome. - -@item -It should be possible to run commands such as @samp{cvs log}, @samp{cvs -status} and @samp{cvs commit} directly from a buffer containing a file, -instead of having to @samp{cvs-update}. If the directory contains many -files the @samp{cvs-update} can take quite some time, especially on a -slow machine. I planed to put these kind of commands on the prefix -@kbd{C-c C-v}, but that turned out to be used by for instance c++-mode. -If you have any suggestions for a better prefix key, please let me know. - -@item -Increased robustness. For instance, you can not currently press -@kbd{C-g} when you are entering the description of a file that you are -adding without confusing pcl-cvs. - -@item -Support for multiple active *cvs* buffers. - -@item -Dired support. I have an experimental @file{dired-cvs.el} that works -together with CVS 1.2. Unfortunately I wrote it on top of a -non-standard @file{dired.el}, so it must be rewritten.@refill - -@item -An ability to send user-supplied options to all the cvs commands. - -@item -Pcl-cvs is not at all clever about what it should do when @samp{cvs -update} runs a program (due to the @samp{-u} option in the -@file{modules} file --- see @samp{cvs(5)}). The current release uses a -regexp to search for the end. At the very least that regexp should be -configured for different modules. Tell me if you have any idea about -what is the right thing to do. In a perfect world the program should -also be allowed to print to @samp{stderr} without causing pcl-cvs to -crash. -@end itemize - - -If you miss something in this wish-list, let me know! I don't promise -that I will write it, but I will at least try to coordinate the efforts -of making a good Emacs front end to CVS. See @xref{Bugs} for -information about how to reach me.@refill - -So far, I have written most of pcl-cvs in my all-to-rare spare time. If -you want pcl-cvs to be developed faster you can write a contract with -Signum Support to do the extension. You can reach Signum Support by -email to @samp{info@@signum.se} or via mail to Signum Support AB, Box -2044, S-580 02 Linkoping, Sweden. Phone: +46 (0) 13 - 21 46 00. Fax: -+46 (0) 13 - 21 47 00. - - -@node Bugs, COPYING, Future enhancements, Top -@comment node-name, next, previous, up - -@chapter Bugs (known and unknown) -@cindex Reporting bugs and ideas -@cindex Bugs, how to report them -@cindex Author, how to reach -@cindex Email to the author -@cindex Known bugs -@cindex Bugs, known -@cindex FAQ -@cindex Problems, list of common - -If you find a bug or misfeature, don't hesitate to tell me! Send email -to @samp{ceder@@lysator.liu.se}. - -If you have ideas for improvements, or if you have written some -extensions to this package, I would like to hear from you. I hope that -you find this package useful! - -Below is a partial list of currently known problems with pcl-cvs version -1.05. - -@table @asis -@item Commit causes Emacs to hang -Emacs waits for the @samp{cvs commit} command to finish before you can -do anything. If you start a background job from the loginfo file you -must take care that it closes @samp{stdout} and @samp{stderr} if you do -not want to wait for it. (You do that with @samp{background-command &>- -2&>- &} if you are starting @samp{background-command} from a -@samp{/bin/sh} shell script). - -Your emacs will also hang if there was a lock file in the repository. -In this case you can type @kbd{C-g} to get control over your emacs -again. - -@item Name clash in Emacs 19 -This is really a bug in Elib or the Emacs 19 distribution. Both Elib and -Emacs 19.6 through at least 19.10 contains a file named -@file{cookie.el}. One of the files will have to be renamed, and we are -currently negotiating about which of the files to rename. - -@item Commands while cvs-update is running -It is possible to type commands in the *cvs* buffer while the update is -running, but error messages is all that you will get. The error -messages should be better. - -@item Unexpected output from CVS -Unexpected output from CVS confuses pcl-cvs. It will currently create a -bug report that you can mail to me. It should do something more -civilized. -@end table - - -@node COPYING, Function and Variable Index, Bugs, Top -@comment node-name, next, previous, up - -@appendix GNU GENERAL PUBLIC LICENSE -@c @include gpl.texinfo - - -@node Function and Variable Index, Concept Index, COPYING, Top -@comment node-name, next, previous, up - -@unnumbered Function and Variable Index - -@printindex fn - - -@node Concept Index, Key Index, Function and Variable Index, Top -@comment node-name, next, previous, up - -@unnumbered Concept Index - -@printindex cp - - -@node Key Index, , Concept Index, Top -@comment node-name, next, previous, up - -@unnumbered Key Index - -@printindex ky - -@summarycontents -@contents -@bye diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/texinfo.tex b/gnu/usr.bin/cvs/contrib/pcl-cvs/texinfo.tex deleted file mode 100644 index de11a7ffca0..00000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/texinfo.tex +++ /dev/null @@ -1,4381 +0,0 @@ -%% TeX macros to handle texinfo files - -% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc. - -%This texinfo.tex file is free software; you can redistribute it and/or -%modify it under the terms of the GNU General Public License as -%published by the Free Software Foundation; either version 2, or (at -%your option) any later version. - -%This texinfo.tex file is distributed in the hope that it will be -%useful, but WITHOUT ANY WARRANTY; without even the implied warranty -%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -%General Public License for more details. - -%You should have received a copy of the GNU General Public License -%along with this texinfo.tex file; see the file COPYING. If not, write -%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, -%USA. - - -%In other words, you are welcome to use, share and improve this program. -%You are forbidden to forbid anyone else to use, share and improve -%what you give them. Help stamp out software-hoarding! - -% This automatically updates the version number based on RCS. -\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} -\deftexinfoversion$fixed-revision: 2.137 $ -\message{Loading texinfo package [Version \texinfoversion]:} - -% Print the version number if in a .fmt file. -\everyjob{\message{[Texinfo version \texinfoversion]}\message{}} - -% Save some parts of plain tex whose names we will redefine. - -\let\ptextilde=\~ -\let\ptexlbrace=\{ -\let\ptexrbrace=\} -\let\ptexdots=\dots -\let\ptexdot=\. -\let\ptexstar=\* -\let\ptexend=\end -\let\ptexbullet=\bullet -\let\ptexb=\b -\let\ptexc=\c -\let\ptexi=\i -\let\ptext=\t -\let\ptexl=\l -\let\ptexL=\L - -% Be sure we're in horizontal mode when doing a tie, since we make space -% equivalent to this in @example-like environments. Otherwise, a space -% at the beginning of a line will start with \penalty -- and -% since \penalty is valid in vertical mode, we'd end up putting the -% penalty on the vertical list instead of in the new paragraph. -{\catcode`@ = 11 - \gdef\tie{\leavevmode\penalty\@M\ } -} -\let\~ = \tie % And make it available as @~. - -\message{Basics,} -\chardef\other=12 - -% If this character appears in an error message or help string, it -% starts a new line in the output. -\newlinechar = `^^J - -% Set up fixed words for English. -\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi% -\def\putwordInfo{Info}% -\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi% -\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi% -\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi% -\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi% -\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi% -\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi% -\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi% -\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi% -\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi% - -% Ignore a token. -% -\def\gobble#1{} - -\hyphenation{ap-pen-dix} -\hyphenation{mini-buf-fer mini-buf-fers} -\hyphenation{eshell} - -% Margin to add to right of even pages, to left of odd pages. -\newdimen \bindingoffset \bindingoffset=0pt -\newdimen \normaloffset \normaloffset=\hoffset -\newdimen\pagewidth \newdimen\pageheight -\pagewidth=\hsize \pageheight=\vsize - -% Sometimes it is convenient to have everything in the transcript file -% and nothing on the terminal. We don't just call \tracingall here, -% since that produces some useless output on the terminal. -% -\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% -\def\loggingall{\tracingcommands2 \tracingstats2 - \tracingpages1 \tracingoutput1 \tracinglostchars1 - \tracingmacros2 \tracingparagraphs1 \tracingrestores1 - \showboxbreadth\maxdimen\showboxdepth\maxdimen -}% - -%---------------------Begin change----------------------- -% -%%%% For @cropmarks command. -% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986 -% -\newdimen\cornerlong \newdimen\cornerthick -\newdimen \topandbottommargin -\newdimen \outerhsize \newdimen \outervsize -\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks -\outerhsize=7in -%\outervsize=9.5in -% Alternative @smallbook page size is 9.25in -\outervsize=9.25in -\topandbottommargin=.75in -% -%---------------------End change----------------------- - -% \onepageout takes a vbox as an argument. Note that \pagecontents -% does insertions itself, but you have to call it yourself. -\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}} -\def\onepageout#1{\hoffset=\normaloffset -\ifodd\pageno \advance\hoffset by \bindingoffset -\else \advance\hoffset by -\bindingoffset\fi -{\escapechar=`\\\relax % makes sure backslash is used in output files. -\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}% -{\let\hsize=\pagewidth \makefootline}}}% -\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} - -%%%% For @cropmarks command %%%% - -% Here is a modification of the main output routine for Near East Publications -% This provides right-angle cropmarks at all four corners. -% The contents of the page are centerlined into the cropmarks, -% and any desired binding offset is added as an \hskip on either -% site of the centerlined box. (P. A. MacKay, 12 November, 1986) -% -\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up -{\escapechar=`\\\relax % makes sure backslash is used in output files. - \shipout - \vbox to \outervsize{\hsize=\outerhsize - \vbox{\line{\ewtop\hfill\ewtop}} - \nointerlineskip - \line{\vbox{\moveleft\cornerthick\nstop} - \hfill - \vbox{\moveright\cornerthick\nstop}} - \vskip \topandbottommargin - \centerline{\ifodd\pageno\hskip\bindingoffset\fi - \vbox{ - {\let\hsize=\pagewidth \makeheadline} - \pagebody{#1} - {\let\hsize=\pagewidth \makefootline}} - \ifodd\pageno\else\hskip\bindingoffset\fi} - \vskip \topandbottommargin plus1fill minus1fill - \boxmaxdepth\cornerthick - \line{\vbox{\moveleft\cornerthick\nsbot} - \hfill - \vbox{\moveright\cornerthick\nsbot}} - \nointerlineskip - \vbox{\line{\ewbot\hfill\ewbot}} - }} - \advancepageno - \ifnum\outputpenalty>-20000 \else\dosupereject\fi} -% -% Do @cropmarks to get crop marks -\def\cropmarks{\let\onepageout=\croppageout } - -\newinsert\margin \dimen\margin=\maxdimen - -\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} -{\catcode`\@ =11 -\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi -% marginal hacks, juha@viisa.uucp (Juha Takala) -\ifvoid\margin\else % marginal info is present - \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi -\dimen@=\dp#1 \unvbox#1 -\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi -\ifr@ggedbottom \kern-\dimen@ \vfil \fi} -} - -% -% Here are the rules for the cropmarks. Note that they are -% offset so that the space between them is truly \outerhsize or \outervsize -% (P. A. MacKay, 12 November, 1986) -% -\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} -\def\nstop{\vbox - {\hrule height\cornerthick depth\cornerlong width\cornerthick}} -\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} -\def\nsbot{\vbox - {\hrule height\cornerlong depth\cornerthick width\cornerthick}} - -% Parse an argument, then pass it to #1. The argument is the rest of -% the input line (except we remove a trailing comment). #1 should be a -% macro which expects an ordinary undelimited TeX argument. -% -\def\parsearg#1{% - \let\next = #1% - \begingroup - \obeylines - \futurelet\temp\parseargx -} - -% If the next token is an obeyed space (from an @example environment or -% the like), remove it and recurse. Otherwise, we're done. -\def\parseargx{% - % \obeyedspace is defined far below, after the definition of \sepspaces. - \ifx\obeyedspace\temp - \expandafter\parseargdiscardspace - \else - \expandafter\parseargline - \fi -} - -% Remove a single space (as the delimiter token to the macro call). -{\obeyspaces % - \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} - -{\obeylines % - \gdef\parseargline#1^^M{% - \endgroup % End of the group started in \parsearg. - % - % First remove any @c comment, then any @comment. - % Result of each macro is put in \toks0. - \argremovec #1\c\relax % - \expandafter\argremovecomment \the\toks0 \comment\relax % - % - % Call the caller's macro, saved as \next in \parsearg. - \expandafter\next\expandafter{\the\toks0}% - }% -} - -% Since all \c{,omment} does is throw away the argument, we can let TeX -% do that for us. The \relax here is matched by the \relax in the call -% in \parseargline; it could be more or less anything, its purpose is -% just to delimit the argument to the \c. -\def\argremovec#1\c#2\relax{\toks0 = {#1}} -\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} - -% \argremovec{,omment} might leave us with trailing spaces, though; e.g., -% @end itemize @c foo -% will have two active spaces as part of the argument with the -% `itemize'. Here we remove all active spaces from #1, and assign the -% result to \toks0. -% -% This loses if there are any *other* active characters besides spaces -% in the argument -- _ ^ +, for example -- since they get expanded. -% Fortunately, Texinfo does not define any such commands. (If it ever -% does, the catcode of the characters in questionwill have to be changed -% here.) But this means we cannot call \removeactivespaces as part of -% \argremovec{,omment}, since @c uses \parsearg, and thus the argument -% that \parsearg gets might well have any character at all in it. -% -\def\removeactivespaces#1{% - \begingroup - \ignoreactivespaces - \edef\temp{#1}% - \global\toks0 = \expandafter{\temp}% - \endgroup -} - -% Change the active space to expand to nothing. -% -\begingroup - \obeyspaces - \gdef\ignoreactivespaces{\obeyspaces\let =\empty} -\endgroup - - -\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} - -%% These are used to keep @begin/@end levels from running away -%% Call \inENV within environments (after a \begingroup) -\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} -\def\ENVcheck{% -\ifENV\errmessage{Still within an environment. Type Return to continue.} -\endgroup\fi} % This is not perfect, but it should reduce lossage - -% @begin foo is the same as @foo, for now. -\newhelp\EMsimple{Type to continue.} - -\outer\def\begin{\parsearg\beginxxx} - -\def\beginxxx #1{% -\expandafter\ifx\csname #1\endcsname\relax -{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else -\csname #1\endcsname\fi} - -% @end foo executes the definition of \Efoo. -% -\def\end{\parsearg\endxxx} -\def\endxxx #1{% - \removeactivespaces{#1}% - \edef\endthing{\the\toks0}% - % - \expandafter\ifx\csname E\endthing\endcsname\relax - \expandafter\ifx\csname \endthing\endcsname\relax - % There's no \foo, i.e., no ``environment'' foo. - \errhelp = \EMsimple - \errmessage{Undefined command `@end \endthing'}% - \else - \unmatchedenderror\endthing - \fi - \else - % Everything's ok; the right environment has been started. - \csname E\endthing\endcsname - \fi -} - -% There is an environment #1, but it hasn't been started. Give an error. -% -\def\unmatchedenderror#1{% - \errhelp = \EMsimple - \errmessage{This `@end #1' doesn't have a matching `@#1'}% -} - -% Define the control sequence \E#1 to give an unmatched @end error. -% -\def\defineunmatchedend#1{% - \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% -} - - -% Single-spacing is done by various environments (specifically, in -% \nonfillstart and \quotations). -\newskip\singlespaceskip \singlespaceskip = 12.5pt -\def\singlespace{% - % Why was this kern here? It messes up equalizing space above and below - % environments. --karl, 6may93 - %{\advance \baselineskip by -\singlespaceskip - %\kern \baselineskip}% - \setleading \singlespaceskip -} - -%% Simple single-character @ commands - -% @@ prints an @ -% Kludge this until the fonts are right (grr). -\def\@{{\tt \char '100}} - -% This is turned off because it was never documented -% and you can use @w{...} around a quote to suppress ligatures. -%% Define @` and @' to be the same as ` and ' -%% but suppressing ligatures. -%\def\`{{`}} -%\def\'{{'}} - -% Used to generate quoted braces. - -\def\mylbrace {{\tt \char '173}} -\def\myrbrace {{\tt \char '175}} -\let\{=\mylbrace -\let\}=\myrbrace - -% @: forces normal size whitespace following. -\def\:{\spacefactor=1000 } - -% @* forces a line break. -\def\*{\hfil\break\hbox{}\ignorespaces} - -% @. is an end-of-sentence period. -\def\.{.\spacefactor=3000 } - -% @enddots{} is an end-of-sentence ellipsis. -\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000} - -% @! is an end-of-sentence bang. -\gdef\!{!\spacefactor=3000 } - -% @? is an end-of-sentence query. -\gdef\?{?\spacefactor=3000 } - -% @w prevents a word break. Without the \leavevmode, @w at the -% beginning of a paragraph, when TeX is still in vertical mode, would -% produce a whole line of output instead of starting the paragraph. -\def\w#1{\leavevmode\hbox{#1}} - -% @group ... @end group forces ... to be all on one page, by enclosing -% it in a TeX vbox. We use \vtop instead of \vbox to construct the box -% to keep its height that of a normal line. According to the rules for -% \topskip (p.114 of the TeXbook), the glue inserted is -% max (\topskip - \ht (first item), 0). If that height is large, -% therefore, no glue is inserted, and the space between the headline and -% the text is small, which looks bad. -% -\def\group{\begingroup - \ifnum\catcode13=\active \else - \errhelp = \groupinvalidhelp - \errmessage{@group invalid in context where filling is enabled}% - \fi - % - % The \vtop we start below produces a box with normal height and large - % depth; thus, TeX puts \baselineskip glue before it, and (when the - % next line of text is done) \lineskip glue after it. (See p.82 of - % the TeXbook.) Thus, space below is not quite equal to space - % above. But it's pretty close. - \def\Egroup{% - \egroup % End the \vtop. - \endgroup % End the \group. - }% - % - \vtop\bgroup - % We have to put a strut on the last line in case the @group is in - % the midst of an example, rather than completely enclosing it. - % Otherwise, the interline space between the last line of the group - % and the first line afterwards is too small. But we can't put the - % strut in \Egroup, since there it would be on a line by itself. - % Hence this just inserts a strut at the beginning of each line. - \everypar = {\strut}% - % - % Since we have a strut on every line, we don't need any of TeX's - % normal interline spacing. - \offinterlineskip - % - % OK, but now we have to do something about blank - % lines in the input in @example-like environments, which normally - % just turn into \lisppar, which will insert no space now that we've - % turned off the interline space. Simplest is to make them be an - % empty paragraph. - \ifx\par\lisppar - \edef\par{\leavevmode \par}% - % - % Reset ^^M's definition to new definition of \par. - \obeylines - \fi - % - % Do @comment since we are called inside an environment such as - % @example, where each end-of-line in the input causes an - % end-of-line in the output. We don't want the end-of-line after - % the `@group' to put extra space in the output. Since @group - % should appear on a line by itself (according to the Texinfo - % manual), we don't worry about eating any user text. - \comment -} -% -% TeX puts in an \escapechar (i.e., `@') at the beginning of the help -% message, so this ends up printing `@group can only ...'. -% -\newhelp\groupinvalidhelp{% -group can only be used in environments such as @example,^^J% -where each line of input produces a line of output.} - -% @need space-in-mils -% forces a page break if there is not space-in-mils remaining. - -\newdimen\mil \mil=0.001in - -\def\need{\parsearg\needx} - -% Old definition--didn't work. -%\def\needx #1{\par % -%% This method tries to make TeX break the page naturally -%% if the depth of the box does not fit. -%{\baselineskip=0pt% -%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 -%\prevdepth=-1000pt -%}} - -\def\needx#1{% - % Go into vertical mode, so we don't make a big box in the middle of a - % paragraph. - \par - % - % Don't add any leading before our big empty box, but allow a page - % break, since the best break might be right here. - \allowbreak - \nointerlineskip - \vtop to #1\mil{\vfil}% - % - % TeX does not even consider page breaks if a penalty added to the - % main vertical list is 10000 or more. But in order to see if the - % empty box we just added fits on the page, we must make it consider - % page breaks. On the other hand, we don't want to actually break the - % page after the empty box. So we use a penalty of 9999. - % - % There is an extremely small chance that TeX will actually break the - % page at this \penalty, if there are no other feasible breakpoints in - % sight. (If the user is using lots of big @group commands, which - % almost-but-not-quite fill up a page, TeX will have a hard time doing - % good page breaking, for example.) However, I could not construct an - % example where a page broke at this \penalty; if it happens in a real - % document, then we can reconsider our strategy. - \penalty9999 - % - % Back up by the size of the box, whether we did a page break or not. - \kern -#1\mil - % - % Do not allow a page break right after this kern. - \nobreak -} - -% @br forces paragraph break - -\let\br = \par - -% @dots{} output some dots - -\def\dots{$\ldots$} - -% @page forces the start of a new page - -\def\page{\par\vfill\supereject} - -% @exdent text.... -% outputs text on separate line in roman font, starting at standard page margin - -% This records the amount of indent in the innermost environment. -% That's how much \exdent should take out. -\newskip\exdentamount - -% This defn is used inside fill environments such as @defun. -\def\exdent{\parsearg\exdentyyy} -\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} - -% This defn is used inside nofill environments such as @example. -\def\nofillexdent{\parsearg\nofillexdentyyy} -\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount -\leftline{\hskip\leftskip{\rm#1}}}} - -%\hbox{{\rm#1}}\hfil\break}} - -% @include file insert text of that file as input. - -\def\include{\parsearg\includezzz} -%Use \input\thisfile to avoid blank after \input, which may be an active -%char (in which case the blank would become the \input argument). -%The grouping keeps the value of \thisfile correct even when @include -%is nested. -\def\includezzz #1{\begingroup -\def\thisfile{#1}\input\thisfile -\endgroup} - -\def\thisfile{} - -% @center line outputs that line, centered - -\def\center{\parsearg\centerzzz} -\def\centerzzz #1{{\advance\hsize by -\leftskip -\advance\hsize by -\rightskip -\centerline{#1}}} - -% @sp n outputs n lines of vertical space - -\def\sp{\parsearg\spxxx} -\def\spxxx #1{\par \vskip #1\baselineskip} - -% @comment ...line which is ignored... -% @c is the same as @comment -% @ignore ... @end ignore is another way to write a comment - -\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% -\parsearg \commentxxx} - -\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } - -\let\c=\comment - -% Prevent errors for section commands. -% Used in @ignore and in failing conditionals. -\def\ignoresections{% -\let\chapter=\relax -\let\unnumbered=\relax -\let\top=\relax -\let\unnumberedsec=\relax -\let\unnumberedsection=\relax -\let\unnumberedsubsec=\relax -\let\unnumberedsubsection=\relax -\let\unnumberedsubsubsec=\relax -\let\unnumberedsubsubsection=\relax -\let\section=\relax -\let\subsec=\relax -\let\subsubsec=\relax -\let\subsection=\relax -\let\subsubsection=\relax -\let\appendix=\relax -\let\appendixsec=\relax -\let\appendixsection=\relax -\let\appendixsubsec=\relax -\let\appendixsubsection=\relax -\let\appendixsubsubsec=\relax -\let\appendixsubsubsection=\relax -\let\contents=\relax -\let\smallbook=\relax -\let\titlepage=\relax -} - -% Used in nested conditionals, where we have to parse the Texinfo source -% and so want to turn off most commands, in case they are used -% incorrectly. -% -\def\ignoremorecommands{% - \let\defcv = \relax - \let\deffn = \relax - \let\deffnx = \relax - \let\defindex = \relax - \let\defivar = \relax - \let\defmac = \relax - \let\defmethod = \relax - \let\defop = \relax - \let\defopt = \relax - \let\defspec = \relax - \let\deftp = \relax - \let\deftypefn = \relax - \let\deftypefun = \relax - \let\deftypevar = \relax - \let\deftypevr = \relax - \let\defun = \relax - \let\defvar = \relax - \let\defvr = \relax - \let\ref = \relax - \let\xref = \relax - \let\printindex = \relax - \let\pxref = \relax - \let\settitle = \relax - \let\include = \relax - \let\lowersections = \relax - \let\down = \relax - \let\raisesections = \relax - \let\up = \relax - \let\set = \relax - \let\clear = \relax - \let\item = \relax - \let\message = \relax -} - -% Ignore @ignore ... @end ignore. -% -\def\ignore{\doignore{ignore}} - -% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text. -% -\def\ifinfo{\doignore{ifinfo}} -\def\ifhtml{\doignore{ifhtml}} -\def\html{\doignore{html}} -\def\menu{\doignore{menu}} -\def\direntry{\doignore{direntry}} - -% Ignore text until a line `@end #1'. -% -\def\doignore#1{\begingroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define a command to swallow text until we reach `@end #1'. - \long\def\doignoretext##1\end #1{\enddoignore}% - % - % Make sure that spaces turn into tokens that match what \doignoretext wants. - \catcode32 = 10 - % - % And now expand that command. - \doignoretext -} - -% What we do to finish off ignored text. -% -\def\enddoignore{\endgroup\ignorespaces}% - -\newif\ifwarnedobs\warnedobsfalse -\def\obstexwarn{% - \ifwarnedobs\relax\else - % We need to warn folks that they may have trouble with TeX 3.0. - % This uses \immediate\write16 rather than \message to get newlines. - \immediate\write16{} - \immediate\write16{***WARNING*** for users of Unix TeX 3.0!} - \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} - \immediate\write16{If you are running another version of TeX, relax.} - \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} - \immediate\write16{ Then upgrade your TeX installation if you can.} - \immediate\write16{If you are stuck with version 3.0, run the} - \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} - \immediate\write16{ to use a workaround.} - \immediate\write16{} - \warnedobstrue - \fi -} - -% **In TeX 3.0, setting text in \nullfont hangs tex. For a -% workaround (which requires the file ``dummy.tfm'' to be installed), -% uncomment the following line: -%%%%%\font\nullfont=dummy\let\obstexwarn=\relax - -% Ignore text, except that we keep track of conditional commands for -% purposes of nesting, up to an `@end #1' command. -% -\def\nestedignore#1{% - \obstexwarn - % We must actually expand the ignored text to look for the @end - % command, so that nested ignore constructs work. Thus, we put the - % text into a \vbox and then do nothing with the result. To minimize - % the change of memory overflow, we follow the approach outlined on - % page 401 of the TeXbook: make the current font be a dummy font. - % - \setbox0 = \vbox\bgroup - % Don't complain about control sequences we have declared \outer. - \ignoresections - % - % Define `@end #1' to end the box, which will in turn undefine the - % @end command again. - \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% - % - % We are going to be parsing Texinfo commands. Most cause no - % trouble when they are used incorrectly, but some commands do - % complicated argument parsing or otherwise get confused, so we - % undefine them. - % - % We can't do anything about stray @-signs, unfortunately; - % they'll produce `undefined control sequence' errors. - \ignoremorecommands - % - % Set the current font to be \nullfont, a TeX primitive, and define - % all the font commands to also use \nullfont. We don't use - % dummy.tfm, as suggested in the TeXbook, because not all sites - % might have that installed. Therefore, math mode will still - % produce output, but that should be an extremely small amount of - % stuff compared to the main input. - % - \nullfont - \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont - \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont - \let\tensf = \nullfont - % Similarly for index fonts (mostly for their use in - % smallexample) - \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont - \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont - \let\indsf = \nullfont - % - % Don't complain when characters are missing from the fonts. - \tracinglostchars = 0 - % - % Don't bother to do space factor calculations. - \frenchspacing - % - % Don't report underfull hboxes. - \hbadness = 10000 - % - % Do minimal line-breaking. - \pretolerance = 10000 - % - % Do not execute instructions in @tex - \def\tex{\doignore{tex}} -} - -% @set VAR sets the variable VAR to an empty value. -% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. -% -% Since we want to separate VAR from REST-OF-LINE (which might be -% empty), we can't just use \parsearg; we have to insert a space of our -% own to delimit the rest of the line, and then take it out again if we -% didn't need it. -% -\def\set{\parsearg\setxxx} -\def\setxxx#1{\setyyy#1 \endsetyyy} -\def\setyyy#1 #2\endsetyyy{% - \def\temp{#2}% - \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty - \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. - \fi -} -\def\setzzz#1#2 \endsetzzz{\expandafter\xdef\csname SET#1\endcsname{#2}} - -% @clear VAR clears (i.e., unsets) the variable VAR. -% -\def\clear{\parsearg\clearxxx} -\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} - -% @value{foo} gets the text saved in variable foo. -% -\def\value#1{\expandafter - \ifx\csname SET#1\endcsname\relax - {\{No value for ``#1''\}} - \else \csname SET#1\endcsname \fi} - -% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined -% with @set. -% -\def\ifset{\parsearg\ifsetxxx} -\def\ifsetxxx #1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \expandafter\ifsetfail - \else - \expandafter\ifsetsucceed - \fi -} -\def\ifsetsucceed{\conditionalsucceed{ifset}} -\def\ifsetfail{\nestedignore{ifset}} -\defineunmatchedend{ifset} - -% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been -% defined with @set, or has been undefined with @clear. -% -\def\ifclear{\parsearg\ifclearxxx} -\def\ifclearxxx #1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \expandafter\ifclearsucceed - \else - \expandafter\ifclearfail - \fi -} -\def\ifclearsucceed{\conditionalsucceed{ifclear}} -\def\ifclearfail{\nestedignore{ifclear}} -\defineunmatchedend{ifclear} - -% @iftex always succeeds; we read the text following, through @end -% iftex). But `@end iftex' should be valid only after an @iftex. -% -\def\iftex{\conditionalsucceed{iftex}} -\defineunmatchedend{iftex} - -% We can't just want to start a group at @iftex (for example) and end it -% at @end iftex, since then @set commands inside the conditional have no -% effect (they'd get reverted at the end of the group). So we must -% define \Eiftex to redefine itself to be its previous value. (We can't -% just define it to fail again with an ``unmatched end'' error, since -% the @ifset might be nested.) -% -\def\conditionalsucceed#1{% - \edef\temp{% - % Remember the current value of \E#1. - \let\nece{prevE#1} = \nece{E#1}% - % - % At the `@end #1', redefine \E#1 to be its previous value. - \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% - }% - \temp -} - -% We need to expand lots of \csname's, but we don't want to expand the -% control sequences after we've constructed them. -% -\def\nece#1{\expandafter\noexpand\csname#1\endcsname} - -% @asis just yields its argument. Used with @table, for example. -% -\def\asis#1{#1} - -% @math means output in math mode. -% We don't use $'s directly in the definition of \math because control -% sequences like \math are expanded when the toc file is written. Then, -% we read the toc file back, the $'s will be normal characters (as they -% should be, according to the definition of Texinfo). So we must use a -% control sequence to switch into and out of math mode. -% -% This isn't quite enough for @math to work properly in indices, but it -% seems unlikely it will ever be needed there. -% -\let\implicitmath = $ -\def\math#1{\implicitmath #1\implicitmath} - -% @bullet and @minus need the same treatment as @math, just above. -\def\bullet{\implicitmath\ptexbullet\implicitmath} -\def\minus{\implicitmath-\implicitmath} - -\def\node{\ENVcheck\parsearg\nodezzz} -\def\nodezzz#1{\nodexxx [#1,]} -\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} -\let\nwnode=\node -\let\lastnode=\relax - -\def\donoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\setref{\lastnode}\fi -\global\let\lastnode=\relax} - -\def\unnumbnoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi -\global\let\lastnode=\relax} - -\def\appendixnoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi -\global\let\lastnode=\relax} - -\let\refill=\relax - -% @setfilename is done at the beginning of every texinfo file. -% So open here the files we need to have open while reading the input. -% This makes it possible to make a .fmt file for texinfo. -\def\setfilename{% - \readauxfile - \opencontents - \openindices - \fixbackslash % Turn off hack to swallow `\input texinfo'. - \global\let\setfilename=\comment % Ignore extra @setfilename cmds. - \comment % Ignore the actual filename. -} - -\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} - -\def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, - node \samp{\ignorespaces#1{}}} - -\message{fonts,} - -% Font-change commands. - -% Texinfo supports the sans serif font style, which plain TeX does not. -% So we set up a \sf analogous to plain's \rm, etc. -\newfam\sffam -\def\sf{\fam=\sffam \tensf} -\let\li = \sf % Sometimes we call it \li, not \sf. - -%% Try out Computer Modern fonts at \magstephalf -\let\mainmagstep=\magstephalf - -% Set the font macro #1 to the font named #2, adding on the -% specified font prefix (normally `cm'). -\def\setfont#1#2{\font#1=\fontprefix#2} - -% Use cm as the default font prefix. -% To specify the font prefix, you must define \fontprefix -% before you read in texinfo.tex. -\ifx\fontprefix\undefined -\def\fontprefix{cm} -\fi - -\ifx\bigger\relax -\let\mainmagstep=\magstep1 -\setfont\textrm{r12} -\setfont\texttt{tt12} -\else -\setfont\textrm{r10 scaled \mainmagstep} -\setfont\texttt{tt10 scaled \mainmagstep} -\fi -% Instead of cmb10, you many want to use cmbx10. -% cmbx10 is a prettier font on its own, but cmb10 -% looks better when embedded in a line with cmr10. -\setfont\textbf{b10 scaled \mainmagstep} -\setfont\textit{ti10 scaled \mainmagstep} -\setfont\textsl{sl10 scaled \mainmagstep} -\setfont\textsf{ss10 scaled \mainmagstep} -\setfont\textsc{csc10 scaled \mainmagstep} -\font\texti=cmmi10 scaled \mainmagstep -\font\textsy=cmsy10 scaled \mainmagstep - -% A few fonts for @defun, etc. -\setfont\defbf{bx10 scaled \magstep1} %was 1314 -\setfont\deftt{tt10 scaled \magstep1} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} - -% Fonts for indices and small examples. -% We actually use the slanted font rather than the italic, -% because texinfo normally uses the slanted fonts for that. -% Do not make many font distinctions in general in the index, since they -% aren't very useful. -\setfont\ninett{tt9} -\setfont\indrm{r9} -\setfont\indit{sl9} -\let\indsl=\indit -\let\indtt=\ninett -\let\indsf=\indrm -\let\indbf=\indrm -\let\indsc=\indrm -\font\indi=cmmi9 -\font\indsy=cmsy9 - -% Fonts for headings -\setfont\chaprm{bx12 scaled \magstep2} -\setfont\chapit{ti12 scaled \magstep2} -\setfont\chapsl{sl12 scaled \magstep2} -\setfont\chaptt{tt12 scaled \magstep2} -\setfont\chapsf{ss12 scaled \magstep2} -\let\chapbf=\chaprm -\setfont\chapsc{csc10 scaled\magstep3} -\font\chapi=cmmi12 scaled \magstep2 -\font\chapsy=cmsy10 scaled \magstep3 - -\setfont\secrm{bx12 scaled \magstep1} -\setfont\secit{ti12 scaled \magstep1} -\setfont\secsl{sl12 scaled \magstep1} -\setfont\sectt{tt12 scaled \magstep1} -\setfont\secsf{ss12 scaled \magstep1} -\setfont\secbf{bx12 scaled \magstep1} -\setfont\secsc{csc10 scaled\magstep2} -\font\seci=cmmi12 scaled \magstep1 -\font\secsy=cmsy10 scaled \magstep2 - -% \setfont\ssecrm{bx10 scaled \magstep1} % This size an font looked bad. -% \setfont\ssecit{cmti10 scaled \magstep1} % The letters were too crowded. -% \setfont\ssecsl{sl10 scaled \magstep1} -% \setfont\ssectt{tt10 scaled \magstep1} -% \setfont\ssecsf{ss10 scaled \magstep1} - -%\setfont\ssecrm{b10 scaled 1315} % Note the use of cmb rather than cmbx. -%\setfont\ssecit{ti10 scaled 1315} % Also, the size is a little larger than -%\setfont\ssecsl{sl10 scaled 1315} % being scaled magstep1. -%\setfont\ssectt{tt10 scaled 1315} -%\setfont\ssecsf{ss10 scaled 1315} - -%\let\ssecbf=\ssecrm - -\setfont\ssecrm{bx12 scaled \magstephalf} -\setfont\ssecit{ti12 scaled \magstephalf} -\setfont\ssecsl{sl12 scaled \magstephalf} -\setfont\ssectt{tt12 scaled \magstephalf} -\setfont\ssecsf{ss12 scaled \magstephalf} -\setfont\ssecbf{bx12 scaled \magstephalf} -\setfont\ssecsc{csc10 scaled \magstep1} -\font\sseci=cmmi12 scaled \magstephalf -\font\ssecsy=cmsy10 scaled \magstep1 -% The smallcaps and symbol fonts should actually be scaled \magstep1.5, -% but that is not a standard magnification. - -% Fonts for title page: -\setfont\titlerm{bx12 scaled \magstep3} -\let\authorrm = \secrm - -% In order for the font changes to affect most math symbols and letters, -% we have to define the \textfont of the standard families. Since -% texinfo doesn't allow for producing subscripts and superscripts, we -% don't bother to reset \scriptfont and \scriptscriptfont (which would -% also require loading a lot more fonts). -% -\def\resetmathfonts{% - \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy - \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf - \textfont\ttfam = \tentt \textfont\sffam = \tensf -} - - -% The font-changing commands redefine the meanings of \tenSTYLE, instead -% of just \STYLE. We do this so that font changes will continue to work -% in math mode, where it is the current \fam that is relevant in most -% cases, not the current. Plain TeX does, for example, -% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need -% to redefine \bf itself. -\def\textfonts{% - \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl - \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc - \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy - \resetmathfonts} -\def\chapfonts{% - \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl - \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc - \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy - \resetmathfonts} -\def\secfonts{% - \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl - \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc - \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy - \resetmathfonts} -\def\subsecfonts{% - \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl - \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc - \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy - \resetmathfonts} -\def\indexfonts{% - \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl - \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc - \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy - \resetmathfonts} - -% Set up the default fonts, so we can use them for creating boxes. -% -\textfonts - -% Count depth in font-changes, for error checks -\newcount\fontdepth \fontdepth=0 - -% Fonts for short table of contents. -\setfont\shortcontrm{r12} -\setfont\shortcontbf{bx12} -\setfont\shortcontsl{sl12} - -%% Add scribe-like font environments, plus @l for inline lisp (usually sans -%% serif) and @ii for TeX italic - -% \smartitalic{ARG} outputs arg in italics, followed by an italic correction -% unless the following character is such as not to need one. -\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} -\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} - -\let\i=\smartitalic -\let\var=\smartitalic -\let\dfn=\smartitalic -\let\emph=\smartitalic -\let\cite=\smartitalic - -\def\b#1{{\bf #1}} -\let\strong=\b - -% We can't just use \exhyphenpenalty, because that only has effect at -% the end of a paragraph. Restore normal hyphenation at the end of the -% group within which \nohyphenation is presumably called. -% -\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} -\def\restorehyphenation{\hyphenchar\font = `- } - -\def\t#1{% - {\tt \nohyphenation \rawbackslash \frenchspacing #1}% - \null -} -\let\ttfont = \t -%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} -\def\samp #1{`\tclose{#1}'\null} -\def\key #1{{\tt \nohyphenation \uppercase{#1}}\null} -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -\let\file=\samp - -% @code is a modification of @t, -% which makes spaces the same size as normal in the surrounding text. -\def\tclose#1{% - {% - % Change normal interword space to be same as for the current font. - \spaceskip = \fontdimen2\font - % - % Switch to typewriter. - \tt - % - % But `\ ' produces the large typewriter interword space. - \def\ {{\spaceskip = 0pt{} }}% - % - % Turn off hyphenation. - \nohyphenation - % - \rawbackslash - \frenchspacing - #1% - }% - \null -} - -% We *must* turn on hyphenation at `-' and `_' in \code. -% Otherwise, it is too hard to avoid overful hboxes -% in the Emacs manual, the Library manual, etc. - -% Unfortunately, TeX uses one parameter (\hyphenchar) to control -% both hyphenation at - and hyphenation within words. -% We must therefore turn them both off (\tclose does that) -% and arrange explicitly to hyphenate an a dash. -% -- rms. -{ -\catcode`\-=\active -\catcode`\_=\active -\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} -% The following is used by \doprintindex to insure that long function names -% wrap around. It is necessary for - and _ to be active before the index is -% read from the file, as \entry parses the arguments long before \code is -% ever called. -- mycroft -\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder} -} -\def\realdash{-} -\def\realunder{_} -\def\codedash{-\discretionary{}{}{}} -\def\codeunder{\normalunderscore\discretionary{}{}{}} -\def\codex #1{\tclose{#1}\endgroup} - -%\let\exp=\tclose %Was temporary - -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. - -\def\xkey{\key} -\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% -\ifx\one\xkey\ifx\threex\three \key{#2}% -\else\tclose{\look}\fi -\else\tclose{\look}\fi} - -% Typeset a dimension, e.g., `in' or `pt'. The only reason for the -% argument is to make the input look right: @dmn{pt} instead of -% @dmn{}pt. -% -\def\dmn#1{\thinspace #1} - -\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} - -\def\l#1{{\li #1}\null} % - -\def\r#1{{\rm #1}} % roman font -% Use of \lowercase was suggested. -\def\sc#1{{\smallcaps#1}} % smallcaps font -\def\ii#1{{\it #1}} % italic font - -\message{page headings,} - -\newskip\titlepagetopglue \titlepagetopglue = 1.5in -\newskip\titlepagebottomglue \titlepagebottomglue = 2pc - -% First the title page. Must do @settitle before @titlepage. -\def\titlefont#1{{\titlerm #1}} - -\newif\ifseenauthor -\newif\iffinishedtitlepage - -\def\shorttitlepage{\parsearg\shorttitlepagezzz} -\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% - \endgroup\page\hbox{}\page} - -\def\titlepage{\begingroup \parindent=0pt \textfonts - \let\subtitlerm=\tenrm -% I deinstalled the following change because \cmr12 is undefined. -% This change was not in the ChangeLog anyway. --rms. -% \let\subtitlerm=\cmr12 - \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% - % - \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% - % - % Leave some space at the very top of the page. - \vglue\titlepagetopglue - % - % Now you can print the title using @title. - \def\title{\parsearg\titlezzz}% - \def\titlezzz##1{\leftline{\titlefont{##1}} - % print a rule at the page bottom also. - \finishedtitlepagefalse - \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% - % No rule at page bottom unless we print one at the top with @title. - \finishedtitlepagetrue - % - % Now you can put text using @subtitle. - \def\subtitle{\parsearg\subtitlezzz}% - \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% - % - % @author should come last, but may come many times. - \def\author{\parsearg\authorzzz}% - \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi - {\authorfont \leftline{##1}}}% - % - % Most title ``pages'' are actually two pages long, with space - % at the top of the second. We don't want the ragged left on the second. - \let\oldpage = \page - \def\page{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - \oldpage - \let\page = \oldpage - \hbox{}}% -% \def\page{\oldpage \hbox{}} -} - -\def\Etitlepage{% - \iffinishedtitlepage\else - \finishtitlepage - \fi - % It is important to do the page break before ending the group, - % because the headline and footline are only empty inside the group. - % If we use the new definition of \page, we always get a blank page - % after the title page, which we certainly don't want. - \oldpage - \endgroup - \HEADINGSon -} - -\def\finishtitlepage{% - \vskip4pt \hrule height 2pt width \hsize - \vskip\titlepagebottomglue - \finishedtitlepagetrue -} - -%%% Set up page headings and footings. - -\let\thispage=\folio - -\newtoks \evenheadline % Token sequence for heading line of even pages -\newtoks \oddheadline % Token sequence for heading line of odd pages -\newtoks \evenfootline % Token sequence for footing line of even pages -\newtoks \oddfootline % Token sequence for footing line of odd pages - -% Now make Tex use those variables -\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline - \else \the\evenheadline \fi}} -\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline - \else \the\evenfootline \fi}\HEADINGShook} -\let\HEADINGShook=\relax - -% Commands to set those variables. -% For example, this is what @headings on does -% @evenheading @thistitle|@thispage|@thischapter -% @oddheading @thischapter|@thispage|@thistitle -% @evenfooting @thisfile|| -% @oddfooting ||@thisfile - -\def\evenheading{\parsearg\evenheadingxxx} -\def\oddheading{\parsearg\oddheadingxxx} -\def\everyheading{\parsearg\everyheadingxxx} - -\def\evenfooting{\parsearg\evenfootingxxx} -\def\oddfooting{\parsearg\oddfootingxxx} -\def\everyfooting{\parsearg\everyfootingxxx} - -{\catcode`\@=0 % - -\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} -\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% -\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} -\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% -\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} -\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% -\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} -\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} -\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% -\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} -\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% -\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} -\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% -\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}} -\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} -% -}% unbind the catcode of @. - -% @headings double turns headings on for double-sided printing. -% @headings single turns headings on for single-sided printing. -% @headings off turns them off. -% @headings on same as @headings double, retained for compatibility. -% @headings after turns on double-sided headings after this page. -% @headings doubleafter turns on double-sided headings after this page. -% @headings singleafter turns on single-sided headings after this page. -% By default, they are off. - -\def\headings #1 {\csname HEADINGS#1\endcsname} - -\def\HEADINGSoff{ -\global\evenheadline={\hfil} \global\evenfootline={\hfil} -\global\oddheadline={\hfil} \global\oddfootline={\hfil}} -\HEADINGSoff -% When we turn headings on, set the page number to 1. -% For double-sided printing, put current file name in lower left corner, -% chapter name on inside top of right hand pages, document -% title on inside top of left hand pages, and page numbers on outside top -% edge of all pages. -\def\HEADINGSdouble{ -%\pagealignmacro -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} -% For single-sided printing, chapter title goes across top left of page, -% page number on top right. -\def\HEADINGSsingle{ -%\pagealignmacro -\global\pageno=1 -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} -\def\HEADINGSon{\HEADINGSdouble} - -\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} -\let\HEADINGSdoubleafter=\HEADINGSafter -\def\HEADINGSdoublex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} - -\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} -\def\HEADINGSsinglex{% -\global\evenfootline={\hfil} -\global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -} - -% Subroutines used in generating headings -% Produces Day Month Year style of output. -\def\today{\number\day\space -\ifcase\month\or -January\or February\or March\or April\or May\or June\or -July\or August\or September\or October\or November\or December\fi -\space\number\year} - -% Use this if you want the Month Day, Year style of output. -%\def\today{\ifcase\month\or -%January\or February\or March\or April\or May\or June\or -%July\or August\or September\or October\or November\or December\fi -%\space\number\day, \number\year} - -% @settitle line... specifies the title of the document, for headings -% It generates no output of its own - -\def\thistitle{No Title} -\def\settitle{\parsearg\settitlezzz} -\def\settitlezzz #1{\gdef\thistitle{#1}} - -\message{tables,} - -% @tabs -- simple alignment - -% These don't work. For one thing, \+ is defined as outer. -% So these macros cannot even be defined. - -%\def\tabs{\parsearg\tabszzz} -%\def\tabszzz #1{\settabs\+#1\cr} -%\def\tabline{\parsearg\tablinezzz} -%\def\tablinezzz #1{\+#1\cr} -%\def\&{&} - -% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). - -% default indentation of table text -\newdimen\tableindent \tableindent=.8in -% default indentation of @itemize and @enumerate text -\newdimen\itemindent \itemindent=.3in -% margin between end of table item and start of table text. -\newdimen\itemmargin \itemmargin=.1in - -% used internally for \itemindent minus \itemmargin -\newdimen\itemmax - -% Note @table, @vtable, and @vtable define @item, @itemx, etc., with -% these defs. -% They also define \itemindex -% to index the item name in whatever manner is desired (perhaps none). - -\newif\ifitemxneedsnegativevskip - -\def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi} - -\def\internalBitem{\smallbreak \parsearg\itemzzz} -\def\internalBitemx{\itemxpar \parsearg\itemzzz} - -\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} -\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} - -\def\internalBkitem{\smallbreak \parsearg\kitemzzz} -\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} - -\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% - \itemzzz {#1}} - -\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% - \itemzzz {#1}} - -\def\itemzzz #1{\begingroup % - \advance\hsize by -\rightskip - \advance\hsize by -\tableindent - \setbox0=\hbox{\itemfont{#1}}% - \itemindex{#1}% - \nobreak % This prevents a break before @itemx. - % - % Be sure we are not still in the middle of a paragraph. - %{\parskip = 0in - %\par - %}% - % - % If the item text does not fit in the space we have, put it on a line - % by itself, and do not allow a page break either before or after that - % line. We do not start a paragraph here because then if the next - % command is, e.g., @kindex, the whatsit would get put into the - % horizontal list on a line by itself, resulting in extra blank space. - \ifdim \wd0>\itemmax - % - % Make this a paragraph so we get the \parskip glue and wrapping, - % but leave it ragged-right. - \begingroup - \advance\leftskip by-\tableindent - \advance\hsize by\tableindent - \advance\rightskip by0pt plus1fil - \leavevmode\unhbox0\par - \endgroup - % - % We're going to be starting a paragraph, but we don't want the - % \parskip glue -- logically it's part of the @item we just started. - \nobreak \vskip-\parskip - % - % Stop a page break at the \parskip glue coming up. Unfortunately - % we can't prevent a possible page break at the following - % \baselineskip glue. - \nobreak - \endgroup - \itemxneedsnegativevskipfalse - \else - % The item text fits into the space. Start a paragraph, so that the - % following text (if any) will end up on the same line. Since that - % text will be indented by \tableindent, we make the item text be in - % a zero-width box. - \noindent - \rlap{\hskip -\tableindent\box0}\ignorespaces% - \endgroup% - \itemxneedsnegativevskiptrue% - \fi -} - -\def\item{\errmessage{@item while not in a table}} -\def\itemx{\errmessage{@itemx while not in a table}} -\def\kitem{\errmessage{@kitem while not in a table}} -\def\kitemx{\errmessage{@kitemx while not in a table}} -\def\xitem{\errmessage{@xitem while not in a table}} -\def\xitemx{\errmessage{@xitemx while not in a table}} - -%% Contains a kludge to get @end[description] to work -\def\description{\tablez{\dontindex}{1}{}{}{}{}} - -\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} -{\obeylines\obeyspaces% -\gdef\tablex #1^^M{% -\tabley\dontindex#1 \endtabley}} - -\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} -{\obeylines\obeyspaces% -\gdef\ftablex #1^^M{% -\tabley\fnitemindex#1 \endtabley -\def\Eftable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} -{\obeylines\obeyspaces% -\gdef\vtablex #1^^M{% -\tabley\vritemindex#1 \endtabley -\def\Evtable{\endgraf\afterenvbreak\endgroup}% -\let\Etable=\relax}} - -\def\dontindex #1{} -\def\fnitemindex #1{\doind {fn}{\code{#1}}}% -\def\vritemindex #1{\doind {vr}{\code{#1}}}% - -{\obeyspaces % -\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% -\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} - -\def\tablez #1#2#3#4#5#6{% -\aboveenvbreak % -\begingroup % -\def\Edescription{\Etable}% Neccessary kludge. -\let\itemindex=#1% -\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % -\ifnum 0#4>0 \tableindent=#4\mil \fi % -\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % -\def\itemfont{#2}% -\itemmax=\tableindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \tableindent % -\exdentamount=\tableindent -\parindent = 0pt -\parskip = \smallskipamount -\ifdim \parskip=0pt \parskip=2pt \fi% -\def\Etable{\endgraf\afterenvbreak\endgroup}% -\let\item = \internalBitem % -\let\itemx = \internalBitemx % -\let\kitem = \internalBkitem % -\let\kitemx = \internalBkitemx % -\let\xitem = \internalBxitem % -\let\xitemx = \internalBxitemx % -} - -% This is the counter used by @enumerate, which is really @itemize - -\newcount \itemno - -\def\itemize{\parsearg\itemizezzz} - -\def\itemizezzz #1{% - \begingroup % ended by the @end itemsize - \itemizey {#1}{\Eitemize} -} - -\def\itemizey #1#2{% -\aboveenvbreak % -\itemmax=\itemindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \itemindent % -\exdentamount=\itemindent -\parindent = 0pt % -\parskip = \smallskipamount % -\ifdim \parskip=0pt \parskip=2pt \fi% -\def#2{\endgraf\afterenvbreak\endgroup}% -\def\itemcontents{#1}% -\let\item=\itemizeitem} - -% Set sfcode to normal for the chars that usually have another value. -% These are `.?!:;,' -\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 - \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } - -% \splitoff TOKENS\endmark defines \first to be the first token in -% TOKENS, and \rest to be the remainder. -% -\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% - -% Allow an optional argument of an uppercase letter, lowercase letter, -% or number, to specify the first label in the enumerated list. No -% argument is the same as `1'. -% -\def\enumerate{\parsearg\enumeratezzz} -\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} -\def\enumeratey #1 #2\endenumeratey{% - \begingroup % ended by the @end enumerate - % - % If we were given no argument, pretend we were given `1'. - \def\thearg{#1}% - \ifx\thearg\empty \def\thearg{1}\fi - % - % Detect if the argument is a single token. If so, it might be a - % letter. Otherwise, the only valid thing it can be is a number. - % (We will always have one token, because of the test we just made. - % This is a good thing, since \splitoff doesn't work given nothing at - % all -- the first parameter is undelimited.) - \expandafter\splitoff\thearg\endmark - \ifx\rest\empty - % Only one token in the argument. It could still be anything. - % A ``lowercase letter'' is one whose \lccode is nonzero. - % An ``uppercase letter'' is one whose \lccode is both nonzero, and - % not equal to itself. - % Otherwise, we assume it's a number. - % - % We need the \relax at the end of the \ifnum lines to stop TeX from - % continuing to look for a . - % - \ifnum\lccode\expandafter`\thearg=0\relax - \numericenumerate % a number (we hope) - \else - % It's a letter. - \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax - \lowercaseenumerate % lowercase letter - \else - \uppercaseenumerate % uppercase letter - \fi - \fi - \else - % Multiple tokens in the argument. We hope it's a number. - \numericenumerate - \fi -} - -% An @enumerate whose labels are integers. The starting integer is -% given in \thearg. -% -\def\numericenumerate{% - \itemno = \thearg - \startenumeration{\the\itemno}% -} - -% The starting (lowercase) letter is in \thearg. -\def\lowercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more lowercase letters in @enumerate; get a bigger - alphabet}% - \fi - \char\lccode\itemno - }% -} - -% The starting (uppercase) letter is in \thearg. -\def\uppercaseenumerate{% - \itemno = \expandafter`\thearg - \startenumeration{% - % Be sure we're not beyond the end of the alphabet. - \ifnum\itemno=0 - \errmessage{No more uppercase letters in @enumerate; get a bigger - alphabet} - \fi - \char\uccode\itemno - }% -} - -% Call itemizey, adding a period to the first argument and supplying the -% common last two arguments. Also subtract one from the initial value in -% \itemno, since @item increments \itemno. -% -\def\startenumeration#1{% - \advance\itemno by -1 - \itemizey{#1.}\Eenumerate\flushcr -} - -% @alphaenumerate and @capsenumerate are abbreviations for giving an arg -% to @enumerate. -% -\def\alphaenumerate{\enumerate{a}} -\def\capsenumerate{\enumerate{A}} -\def\Ealphaenumerate{\Eenumerate} -\def\Ecapsenumerate{\Eenumerate} - -% Definition of @item while inside @itemize. - -\def\itemizeitem{% -\advance\itemno by 1 -{\let\par=\endgraf \smallbreak}% -\ifhmode \errmessage{\in hmode at itemizeitem}\fi -{\parskip=0in \hskip 0pt -\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% -\vadjust{\penalty 1200}}% -\flushcr} - -% @multitable macros -% Amy Hendrickson, 8/18/94 -% -% @multitable ... @endmultitable will make as many columns as desired. -% Contents of each column will wrap at width given in preamble. Width -% can be specified either with sample text given in a template line, -% or in percent of \hsize, the current width of text on page. - -% Table can continue over pages but will only break between lines. - -% To make preamble: -% -% Either define widths of columns in terms of percent of \hsize: -% @multitable @percentofhsize .2 .3 .5 -% @item ... -% -% Numbers following @percentofhsize are the percent of the total -% current hsize to be used for each column. You may use as many -% columns as desired. - -% Or use a template: -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item ... -% using the widest term desired in each column. - - -% Each new table line starts with @item, each subsequent new column -% starts with @tab. Empty columns may be produced by supplying @tab's -% with nothing between them for as many times as empty columns are needed, -% ie, @tab@tab@tab will produce two empty columns. - -% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their -% own lines, but it will not hurt if they are. - -% Sample multitable: - -% @multitable {Column 1 template} {Column 2 template} {Column 3 template} -% @item first col stuff @tab second col stuff @tab third col -% @item -% first col stuff -% @tab -% second col stuff -% @tab -% third col -% @item first col stuff @tab second col stuff -% @tab Many paragraphs of text may be used in any column. -% -% They will wrap at the width determined by the template. -% @item@tab@tab This will be in third column. -% @endmultitable - -% Default dimensions may be reset by user. -% @intableparskip will set vertical space between paragraphs in table. -% @intableparindent will set paragraph indent in table. -% @spacebetweencols will set horizontal space to be left between columns. -% @spacebetweenlines will set vertical space to be left between lines. - -%%%% -% Dimensions - -\newdimen\intableparskip -\newdimen\intableparindent -\newdimen\spacebetweencols -\newdimen\spacebetweenlines -\intableparskip=0pt -\intableparindent=6pt -\spacebetweencols=12pt -\spacebetweenlines=12pt - -%%%% -% Macros used to set up halign preamble: -\let\endsetuptable\relax -\def\xendsetuptable{\endsetuptable} -\let\percentofhsize\relax -\def\xpercentofhsize{\percentofhsize} -\newif\ifsetpercent - -\newcount\colcount -\def\setuptable#1{\def\firstarg{#1}% -\ifx\firstarg\xendsetuptable\let\go\relax% -\else - \ifx\firstarg\xpercentofhsize\global\setpercenttrue% - \else - \ifsetpercent - \if#1.\else% - \global\advance\colcount by1 % - \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% - \fi - \else - \global\advance\colcount by1 - \setbox0=\hbox{#1}% - \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% - \fi% - \fi% - \let\go\setuptable% -\fi\go} -%%%% -% multitable syntax -\def\tab{&} - -%%%% -% @multitable ... @endmultitable definitions: - -\def\multitable#1\item{\bgroup -\let\item\cr -\tolerance=9500 -\hbadness=9500 -\parskip=\intableparskip -\parindent=\intableparindent -\overfullrule=0pt -\global\colcount=0\relax% -\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}% - % To parse everything between @multitable and @item : -\def\one{#1}\expandafter\setuptable\one\endsetuptable - % Need to reset this to 0 after \setuptable. -\global\colcount=0\relax% - % - % This preamble sets up a generic column definition, which will - % be used as many times as user calls for columns. - % \vtop will set a single line and will also let text wrap and - % continue for many paragraphs if desired. -\halign\bgroup&\global\advance\colcount by 1\relax% -\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname - % In order to keep entries from bumping into each other - % we will add a \leftskip of \spacebetweencols to all columns after - % the first one. - % If a template has been used, we will add \spacebetweencols - % to the width of each template entry. - % If user has set preamble in terms of percent of \hsize - % we will use that dimension as the width of the column, and - % the \leftskip will keep entries from bumping into each other. - % Table will start at left margin and final column will justify at - % right margin. -\ifnum\colcount=1 -\else - \ifsetpercent - \else - % If user has set preamble in terms of percent of \hsize - % we will advance \hsize by \spacebetweencols - \advance\hsize by \spacebetweencols - \fi - % In either case we will make \leftskip=\spacebetweencols: -\leftskip=\spacebetweencols -\fi -\noindent##}\cr% - % \everycr will reset column counter, \colcount, at the end of - % each line. Every column entry will cause \colcount to advance by one. - % The table preamble - % looks at the current \colcount to find the correct column width. -\global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines -\filbreak%% keeps underfull box messages off when table breaks over pages. -\global\colcount=0\relax}}} - -\message{indexing,} -% Index generation facilities - -% Define \newwrite to be identical to plain tex's \newwrite -% except not \outer, so it can be used within \newindex. -{\catcode`\@=11 -\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} - -% \newindex {foo} defines an index named foo. -% It automatically defines \fooindex such that -% \fooindex ...rest of line... puts an entry in the index foo. -% It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index. The file's extension is foo. -% The name of an index should be no more than 2 characters long -% for the sake of vms. - -\def\newindex #1{ -\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file -\openout \csname#1indfile\endcsname \jobname.#1 % Open the file -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\doindex {#1}} -} - -% @defindex foo == \newindex{foo} - -\def\defindex{\parsearg\newindex} - -% Define @defcodeindex, like @defindex except put all entries in @code. - -\def\newcodeindex #1{ -\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file -\openout \csname#1indfile\endcsname \jobname.#1 % Open the file -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\docodeindex {#1}} -} - -\def\defcodeindex{\parsearg\newcodeindex} - -% @synindex foo bar makes index foo feed into index bar. -% Do this instead of @defindex foo if you don't want it as a separate index. -\def\synindex #1 #2 {% -\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname -\expandafter\let\csname#1indfile\endcsname=\synindexfoo -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\doindex {#2}}% -} - -% @syncodeindex foo bar similar, but put all entries made for index foo -% inside @code. -\def\syncodeindex #1 #2 {% -\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname -\expandafter\let\csname#1indfile\endcsname=\synindexfoo -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\docodeindex {#2}}% -} - -% Define \doindex, the driver for all \fooindex macros. -% Argument #1 is generated by the calling \fooindex macro, -% and it is "foo", the name of the index. - -% \doindex just uses \parsearg; it calls \doind for the actual work. -% This is because \doind is more useful to call from other macros. - -% There is also \dosubind {index}{topic}{subtopic} -% which makes an entry in a two-level index such as the operation index. - -\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} -\def\singleindexer #1{\doind{\indexname}{#1}} - -% like the previous two, but they put @code around the argument. -\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} -\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} - -\def\indexdummies{% -% Take care of the plain tex accent commands. -\def\"{\realbackslash "}% -\def\`{\realbackslash `}% -\def\'{\realbackslash '}% -\def\^{\realbackslash ^}% -\def\~{\realbackslash ~}% -\def\={\realbackslash =}% -\def\b{\realbackslash b}% -\def\c{\realbackslash c}% -\def\d{\realbackslash d}% -\def\u{\realbackslash u}% -\def\v{\realbackslash v}% -\def\H{\realbackslash H}% -% Take care of the plain tex special European modified letters. -\def\oe{\realbackslash oe}% -\def\ae{\realbackslash ae}% -\def\aa{\realbackslash aa}% -\def\OE{\realbackslash OE}% -\def\AE{\realbackslash AE}% -\def\AA{\realbackslash AA}% -\def\o{\realbackslash o}% -\def\O{\realbackslash O}% -\def\l{\realbackslash l}% -\def\L{\realbackslash L}% -\def\ss{\realbackslash ss}% -% Take care of texinfo commands likely to appear in an index entry. -\def\_{{\realbackslash _}}% -\def\w{\realbackslash w }% -\def\bf{\realbackslash bf }% -\def\rm{\realbackslash rm }% -\def\sl{\realbackslash sl }% -\def\sf{\realbackslash sf}% -\def\tt{\realbackslash tt}% -\def\gtr{\realbackslash gtr}% -\def\less{\realbackslash less}% -\def\hat{\realbackslash hat}% -\def\char{\realbackslash char}% -\def\TeX{\realbackslash TeX}% -\def\dots{\realbackslash dots }% -\def\copyright{\realbackslash copyright }% -\def\tclose##1{\realbackslash tclose {##1}}% -\def\code##1{\realbackslash code {##1}}% -\def\samp##1{\realbackslash samp {##1}}% -\def\t##1{\realbackslash r {##1}}% -\def\r##1{\realbackslash r {##1}}% -\def\i##1{\realbackslash i {##1}}% -\def\b##1{\realbackslash b {##1}}% -\def\cite##1{\realbackslash cite {##1}}% -\def\key##1{\realbackslash key {##1}}% -\def\file##1{\realbackslash file {##1}}% -\def\var##1{\realbackslash var {##1}}% -\def\kbd##1{\realbackslash kbd {##1}}% -\def\dfn##1{\realbackslash dfn {##1}}% -\def\emph##1{\realbackslash emph {##1}}% -} - -% \indexnofonts no-ops all font-change commands. -% This is used when outputting the strings to sort the index by. -\def\indexdummyfont#1{#1} -\def\indexdummytex{TeX} -\def\indexdummydots{...} - -\def\indexnofonts{% -% Just ignore accents. -\let\"=\indexdummyfont -\let\`=\indexdummyfont -\let\'=\indexdummyfont -\let\^=\indexdummyfont -\let\~=\indexdummyfont -\let\==\indexdummyfont -\let\b=\indexdummyfont -\let\c=\indexdummyfont -\let\d=\indexdummyfont -\let\u=\indexdummyfont -\let\v=\indexdummyfont -\let\H=\indexdummyfont -% Take care of the plain tex special European modified letters. -\def\oe{oe}% -\def\ae{ae}% -\def\aa{aa}% -\def\OE{OE}% -\def\AE{AE}% -\def\AA{AA}% -\def\o{o}% -\def\O{O}% -\def\l{l}% -\def\L{L}% -\def\ss{ss}% -\let\w=\indexdummyfont -\let\t=\indexdummyfont -\let\r=\indexdummyfont -\let\i=\indexdummyfont -\let\b=\indexdummyfont -\let\emph=\indexdummyfont -\let\strong=\indexdummyfont -\let\cite=\indexdummyfont -\let\sc=\indexdummyfont -%Don't no-op \tt, since it isn't a user-level command -% and is used in the definitions of the active chars like <, >, |... -%\let\tt=\indexdummyfont -\let\tclose=\indexdummyfont -\let\code=\indexdummyfont -\let\file=\indexdummyfont -\let\samp=\indexdummyfont -\let\kbd=\indexdummyfont -\let\key=\indexdummyfont -\let\var=\indexdummyfont -\let\TeX=\indexdummytex -\let\dots=\indexdummydots -} - -% To define \realbackslash, we must make \ not be an escape. -% We must first make another character (@) an escape -% so we do not become unable to do a definition. - -{\catcode`\@=0 \catcode`\\=\other -@gdef@realbackslash{\}} - -\let\indexbackslash=0 %overridden during \printindex. - -\let\SETmarginindex=\relax %initialize! -% workhorse for all \fooindexes -% #1 is name of index, #2 is stuff to put there -\def\doind #1#2{% -% Put the index entry in the margin if desired. -\ifx\SETmarginindex\relax\else% -\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% -\fi% -{\count10=\lastpenalty % -{\indexdummies % Must do this here, since \bf, etc expand at this stage -\escapechar=`\\% -{\let\folio=0% Expand all macros now EXCEPT \folio -\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now -% so it will be output as is; and it will print as backslash in the indx. -% -% Now process the index-string once, with all font commands turned off, -% to get the string to sort the index by. -{\indexnofonts -\xdef\temp1{#2}% -}% -% Now produce the complete index entry. We process the index-string again, -% this time with font commands expanded, to get what to print in the index. -\edef\temp{% -\write \csname#1indfile\endcsname{% -\realbackslash entry {\temp1}{\folio}{#2}}}% -\temp }% -}\penalty\count10}} - -\def\dosubind #1#2#3{% -{\count10=\lastpenalty % -{\indexdummies % Must do this here, since \bf, etc expand at this stage -\escapechar=`\\% -{\let\folio=0% -\def\rawbackslashxx{\indexbackslash}% -% -% Now process the index-string once, with all font commands turned off, -% to get the string to sort the index by. -{\indexnofonts -\xdef\temp1{#2 #3}% -}% -% Now produce the complete index entry. We process the index-string again, -% this time with font commands expanded, to get what to print in the index. -\edef\temp{% -\write \csname#1indfile\endcsname{% -\realbackslash entry {\temp1}{\folio}{#2}{#3}}}% -\temp }% -}\penalty\count10}} - -% The index entry written in the file actually looks like -% \entry {sortstring}{page}{topic} -% or -% \entry {sortstring}{page}{topic}{subtopic} -% The texindex program reads in these files and writes files -% containing these kinds of lines: -% \initial {c} -% before the first topic whose initial is c -% \entry {topic}{pagelist} -% for a topic that is used without subtopics -% \primary {topic} -% for the beginning of a topic that is used with subtopics -% \secondary {subtopic}{pagelist} -% for each subtopic. - -% Define the user-accessible indexing commands -% @findex, @vindex, @kindex, @cindex. - -\def\findex {\fnindex} -\def\kindex {\kyindex} -\def\cindex {\cpindex} -\def\vindex {\vrindex} -\def\tindex {\tpindex} -\def\pindex {\pgindex} - -\def\cindexsub {\begingroup\obeylines\cindexsub} -{\obeylines % -\gdef\cindexsub "#1" #2^^M{\endgroup % -\dosubind{cp}{#2}{#1}}} - -% Define the macros used in formatting output of the sorted index material. - -% This is what you call to cause a particular index to get printed. -% Write -% @unnumbered Function Index -% @printindex fn - -\def\printindex{\parsearg\doprintindex} - -\def\doprintindex#1{% - \tex - \dobreak \chapheadingskip {10000} - \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other - \catcode`\$=\other - \catcode`\~=\other - \indexbreaks - % - % The following don't help, since the chars were translated - % when the raw index was written, and their fonts were discarded - % due to \indexnofonts. - %\catcode`\"=\active - %\catcode`\^=\active - %\catcode`\_=\active - %\catcode`\|=\active - %\catcode`\<=\active - %\catcode`\>=\active - % % - \def\indexbackslash{\rawbackslashxx} - \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt - \begindoublecolumns - % - % See if the index file exists and is nonempty. - \openin 1 \jobname.#1s - \ifeof 1 - % \enddoublecolumns gets confused if there is no text in the index, - % and it loses the chapter title and the aux file entries for the - % index. The easiest way to prevent this problem is to make sure - % there is some text. - (Index is nonexistent) - \else - % - % If the index file exists but is empty, then \openin leaves \ifeof - % false. We have to make TeX try to read something from the file, so - % it can discover if there is anything in it. - \read 1 to \temp - \ifeof 1 - (Index is empty) - \else - \input \jobname.#1s - \fi - \fi - \closein 1 - \enddoublecolumns - \Etex -} - -% These macros are used by the sorted index file itself. -% Change them to control the appearance of the index. - -% Same as \bigskipamount except no shrink. -% \balancecolumns gets confused if there is any shrink. -\newskip\initialskipamount \initialskipamount 12pt plus4pt - -\def\initial #1{% -{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt -\ifdim\lastskip<\initialskipamount -\removelastskip \penalty-200 \vskip \initialskipamount\fi -\line{\secbf#1\hfill}\kern 2pt\penalty10000}} - -% This typesets a paragraph consisting of #1, dot leaders, and then #2 -% flush to the right margin. It is used for index and table of contents -% entries. The paragraph is indented by \leftskip. -% -\def\entry #1#2{\begingroup - % - % Start a new paragraph if necessary, so our assignments below can't - % affect previous text. - \par - % - % Do not fill out the last line with white space. - \parfillskip = 0in - % - % No extra space above this paragraph. - \parskip = 0in - % - % Do not prefer a separate line ending with a hyphen to fewer lines. - \finalhyphendemerits = 0 - % - % \hangindent is only relevant when the entry text and page number - % don't both fit on one line. In that case, bob suggests starting the - % dots pretty far over on the line. Unfortunately, a large - % indentation looks wrong when the entry text itself is broken across - % lines. So we use a small indentation and put up with long leaders. - % - % \hangafter is reset to 1 (which is the value we want) at the start - % of each paragraph, so we need not do anything with that. - \hangindent=2em - % - % When the entry text needs to be broken, just fill out the first line - % with blank space. - \rightskip = 0pt plus1fil - % - % Start a ``paragraph'' for the index entry so the line breaking - % parameters we've set above will have an effect. - \noindent - % - % Insert the text of the index entry. TeX will do line-breaking on it. - #1% - % The following is kluged to not output a line of dots in the index if - % there are no page numbers. The next person who breaks this will be - % cursed by a Unix daemon. - \def\tempa{{\rm }}% - \def\tempb{#2}% - \edef\tempc{\tempa}% - \edef\tempd{\tempb}% - \ifx\tempc\tempd\ \else% - % - % If we must, put the page number on a line of its own, and fill out - % this line with blank space. (The \hfil is overwhelmed with the - % fill leaders glue in \indexdotfill if the page number does fit.) - \hfil\penalty50 - \null\nobreak\indexdotfill % Have leaders before the page number. - % - % The `\ ' here is removed by the implicit \unskip that TeX does as - % part of (the primitive) \par. Without it, a spurious underfull - % \hbox ensues. - \ #2% The page number ends the paragraph. - \fi% - \par -\endgroup} - -% Like \dotfill except takes at least 1 em. -\def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} - -\def\primary #1{\line{#1\hfil}} - -\newskip\secondaryindent \secondaryindent=0.5cm - -\def\secondary #1#2{ -{\parfillskip=0in \parskip=0in -\hangindent =1in \hangafter=1 -\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par -}} - -%% Define two-column mode, which is used in indexes. -%% Adapted from the TeXbook, page 416. -\catcode `\@=11 - -\newbox\partialpage - -\newdimen\doublecolumnhsize - -\def\begindoublecolumns{\begingroup - % Grab any single-column material above us. - \output = {\global\setbox\partialpage - =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}% - \eject - % - % Now switch to the double-column output routine. - \output={\doublecolumnout}% - % - % Change the page size parameters. We could do this once outside this - % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 - % format, but then we repeat the same computation. Repeating a couple - % of assignments once per index is clearly meaningless for the - % execution time, so we may as well do it once. - % - % First we halve the line length, less a little for the gutter between - % the columns. We compute the gutter based on the line length, so it - % changes automatically with the paper format. The magic constant - % below is chosen so that the gutter has the same value (well, +- < - % 1pt) as it did when we hard-coded it. - % - % We put the result in a separate register, \doublecolumhsize, so we - % can restore it in \pagesofar, after \hsize itself has (potentially) - % been clobbered. - % - \doublecolumnhsize = \hsize - \advance\doublecolumnhsize by -.04154\hsize - \divide\doublecolumnhsize by 2 - \hsize = \doublecolumnhsize - % - % Double the \vsize as well. (We don't need a separate register here, - % since nobody clobbers \vsize.) - \vsize = 2\vsize - \doublecolumnpagegoal -} - -\def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage} - -\def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth - \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage - \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1} - \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3} - \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi - \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi -} -\def\doublecolumnpagegoal{% - \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@ -} -\def\pagesofar{\unvbox\partialpage % - \hsize=\doublecolumnhsize % have to restore this since output routine - \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} -\def\doublecolumnout{% - \setbox5=\copy255 - {\vbadness=10000 \doublecolumnsplit} - \ifvbox255 - \setbox0=\vtop to\dimen@{\unvbox0} - \setbox2=\vtop to\dimen@{\unvbox2} - \onepageout\pagesofar \unvbox255 \penalty\outputpenalty - \else - \setbox0=\vbox{\unvbox5} - \ifvbox0 - \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip - \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth - {\vbadness=10000 - \loop \global\setbox5=\copy0 - \setbox1=\vsplit5 to\dimen@ - \setbox3=\vsplit5 to\dimen@ - \ifvbox5 \global\advance\dimen@ by1pt \repeat - \setbox0=\vbox to\dimen@{\unvbox1} - \setbox2=\vbox to\dimen@{\unvbox3} - \global\setbox\partialpage=\vbox{\pagesofar} - \doublecolumnpagegoal - } - \fi - \fi -} - -\catcode `\@=\other -\message{sectioning,} -% Define chapters, sections, etc. - -\newcount \chapno -\newcount \secno \secno=0 -\newcount \subsecno \subsecno=0 -\newcount \subsubsecno \subsubsecno=0 - -% This counter is funny since it counts through charcodes of letters A, B, ... -\newcount \appendixno \appendixno = `\@ -\def\appendixletter{\char\the\appendixno} - -\newwrite \contentsfile -% This is called from \setfilename. -\def\opencontents{\openout \contentsfile = \jobname.toc} - -% Each @chapter defines this as the name of the chapter. -% page headings and footings can use it. @section does likewise - -\def\thischapter{} \def\thissection{} -\def\seccheck#1{\if \pageno<0 % -\errmessage{@#1 not allowed after generating table of contents}\fi -% -} - -\def\chapternofonts{% -\let\rawbackslash=\relax% -\let\frenchspacing=\relax% -\def\result{\realbackslash result} -\def\equiv{\realbackslash equiv} -\def\expansion{\realbackslash expansion} -\def\print{\realbackslash print} -\def\TeX{\realbackslash TeX} -\def\dots{\realbackslash dots} -\def\copyright{\realbackslash copyright} -\def\tt{\realbackslash tt} -\def\bf{\realbackslash bf } -\def\w{\realbackslash w} -\def\less{\realbackslash less} -\def\gtr{\realbackslash gtr} -\def\hat{\realbackslash hat} -\def\char{\realbackslash char} -\def\tclose##1{\realbackslash tclose {##1}} -\def\code##1{\realbackslash code {##1}} -\def\samp##1{\realbackslash samp {##1}} -\def\r##1{\realbackslash r {##1}} -\def\b##1{\realbackslash b {##1}} -\def\key##1{\realbackslash key {##1}} -\def\file##1{\realbackslash file {##1}} -\def\kbd##1{\realbackslash kbd {##1}} -% These are redefined because @smartitalic wouldn't work inside xdef. -\def\i##1{\realbackslash i {##1}} -\def\cite##1{\realbackslash cite {##1}} -\def\var##1{\realbackslash var {##1}} -\def\emph##1{\realbackslash emph {##1}} -\def\dfn##1{\realbackslash dfn {##1}} -} - -\newcount\absseclevel % used to calculate proper heading level -\newcount\secbase\secbase=0 % @raise/lowersections modify this count - -% @raisesections: treat @section as chapter, @subsection as section, etc. -\def\raisesections{\global\advance\secbase by -1} -\let\up=\raisesections % original BFox name - -% @lowersections: treat @chapter as section, @section as subsection, etc. -\def\lowersections{\global\advance\secbase by 1} -\let\down=\lowersections % original BFox name - -% Choose a numbered-heading macro -% #1 is heading level if unmodified by @raisesections or @lowersections -% #2 is text for heading -\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \chapterzzz{#2} -\or - \seczzz{#2} -\or - \numberedsubseczzz{#2} -\or - \numberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \chapterzzz{#2} - \else - \numberedsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses appendix heading levels -\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \appendixzzz{#2} -\or - \appendixsectionzzz{#2} -\or - \appendixsubseczzz{#2} -\or - \appendixsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \appendixzzz{#2} - \else - \appendixsubsubseczzz{#2} - \fi -\fi -} - -% like \numhead, but chooses numberless heading levels -\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \unnumberedzzz{#2} -\or - \unnumberedseczzz{#2} -\or - \unnumberedsubseczzz{#2} -\or - \unnumberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \unnumberedzzz{#2} - \else - \unnumberedsubsubseczzz{#2} - \fi -\fi -} - - -\def\thischaptername{No Chapter Title} -\outer\def\chapter{\parsearg\chapteryyy} -\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz -\def\chapterzzz #1{\seccheck{chapter}% -\secno=0 \subsecno=0 \subsubsecno=0 -\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}% -\chapmacro {#1}{\the\chapno}% -\gdef\thissection{#1}% -\gdef\thischaptername{#1}% -% We don't substitute the actual chapter name into \thischapter -% because we don't want its macros evaluated now. -\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% -{\chapternofonts% -\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\global\let\section = \numberedsec -\global\let\subsection = \numberedsubsec -\global\let\subsubsection = \numberedsubsubsec -}} - -\outer\def\appendix{\parsearg\appendixyyy} -\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz -\def\appendixzzz #1{\seccheck{appendix}% -\secno=0 \subsecno=0 \subsubsecno=0 -\global\advance \appendixno by 1 \message{Appendix \appendixletter}% -\chapmacro {#1}{\putwordAppendix{} \appendixletter}% -\gdef\thissection{#1}% -\gdef\thischaptername{#1}% -\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% -{\chapternofonts% -\edef\temp{{\realbackslash chapentry - {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\global\let\section = \appendixsec -\global\let\subsection = \appendixsubsec -\global\let\subsubsection = \appendixsubsubsec -}} - -\outer\def\top{\parsearg\unnumberedyyy} -\outer\def\unnumbered{\parsearg\unnumberedyyy} -\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz -\def\unnumberedzzz #1{\seccheck{unnumbered}% -\secno=0 \subsecno=0 \subsubsecno=0 -% -% This used to be simply \message{#1}, but TeX fully expands the -% argument to \message. Therefore, if #1 contained @-commands, TeX -% expanded them. For example, in `@unnumbered The @cite{Book}', TeX -% expanded @cite (which turns out to cause errors because \cite is meant -% to be executed, not expanded). -% -% Anyway, we don't want the fully-expanded definition of @cite to appear -% as a result of the \message, we just want `@cite' itself. We use -% \the to achieve this: TeX expands \the only once, -% simply yielding the contents of the . -\toks0 = {#1}\message{(\the\toks0)}% -% -\unnumbchapmacro {#1}% -\gdef\thischapter{#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\global\let\section = \unnumberedsec -\global\let\subsection = \unnumberedsubsec -\global\let\subsubsection = \unnumberedsubsubsec -}} - -\outer\def\numberedsec{\parsearg\secyyy} -\def\secyyy #1{\numhead1{#1}} % normally calls seczzz -\def\seczzz #1{\seccheck{section}% -\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% -{\chapternofonts% -\edef\temp{{\realbackslash secentry % -{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\penalty 10000 % -}} - -\outer\def\appenixsection{\parsearg\appendixsecyyy} -\outer\def\appendixsec{\parsearg\appendixsecyyy} -\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz -\def\appendixsectionzzz #1{\seccheck{appendixsection}% -\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% -{\chapternofonts% -\edef\temp{{\realbackslash secentry % -{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} - -\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} -\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz -\def\unnumberedseczzz #1{\seccheck{unnumberedsec}% -\plainsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\penalty 10000 % -}} - -\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} -\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz -\def\numberedsubseczzz #1{\seccheck{subsection}% -\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsecentry % -{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\penalty 10000 % -}} - -\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} -\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz -\def\appendixsubseczzz #1{\seccheck{appendixsubsec}% -\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsecentry % -{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} - -\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} -\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz -\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% -\plainsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\penalty 10000 % -}} - -\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} -\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz -\def\numberedsubsubseczzz #1{\seccheck{subsubsection}% -\gdef\thissection{#1}\global\advance \subsubsecno by 1 % -\subsubsecheading {#1} - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsubsecentry % - {#1} - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} - {\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\donoderef % -\penalty 10000 % -}} - -\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} -\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz -\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% -\gdef\thissection{#1}\global\advance \subsubsecno by 1 % -\subsubsecheading {#1} - {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% -{\chapternofonts% -\edef\temp{{\realbackslash subsubsecentry{#1}% - {\appendixletter} - {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} - -\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} -\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz -\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% -\plainsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% -\escapechar=`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\penalty 10000 % -}} - -% These are variants which are not "outer", so they can appear in @ifinfo. -% Actually, they should now be obsolete; ordinary section commands should work. -\def\infotop{\parsearg\unnumberedzzz} -\def\infounnumbered{\parsearg\unnumberedzzz} -\def\infounnumberedsec{\parsearg\unnumberedseczzz} -\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} -\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} - -\def\infoappendix{\parsearg\appendixzzz} -\def\infoappendixsec{\parsearg\appendixseczzz} -\def\infoappendixsubsec{\parsearg\appendixsubseczzz} -\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} - -\def\infochapter{\parsearg\chapterzzz} -\def\infosection{\parsearg\sectionzzz} -\def\infosubsection{\parsearg\subsectionzzz} -\def\infosubsubsection{\parsearg\subsubsectionzzz} - -% These macros control what the section commands do, according -% to what kind of chapter we are in (ordinary, appendix, or unnumbered). -% Define them by default for a numbered chapter. -\global\let\section = \numberedsec -\global\let\subsection = \numberedsubsec -\global\let\subsubsection = \numberedsubsubsec - -% Define @majorheading, @heading and @subheading - -% NOTE on use of \vbox for chapter headings, section headings, and -% such: -% 1) We use \vbox rather than the earlier \line to permit -% overlong headings to fold. -% 2) \hyphenpenalty is set to 10000 because hyphenation in a -% heading is obnoxious; this forbids it. -% 3) Likewise, headings look best if no \parindent is used, and -% if justification is not attempted. Hence \raggedright. - - -\def\majorheading{\parsearg\majorheadingzzz} -\def\majorheadingzzz #1{% -{\advance\chapheadingskip by 10pt \chapbreak }% -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -\def\chapheading{\parsearg\chapheadingzzz} -\def\chapheadingzzz #1{\chapbreak % -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -\def\heading{\parsearg\secheadingi} - -\def\subheading{\parsearg\subsecheadingi} - -\def\subsubheading{\parsearg\subsubsecheadingi} - -% These macros generate a chapter, section, etc. heading only -% (including whitespace, linebreaking, etc. around it), -% given all the information in convenient, parsed form. - -%%% Args are the skip and penalty (usually negative) -\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} - -\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} - -%%% Define plain chapter starts, and page on/off switching for it -% Parameter controlling skip before chapter headings (if needed) - -\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt - -\def\chapbreak{\dobreak \chapheadingskip {-4000}} -\def\chappager{\par\vfill\supereject} -\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} - -\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} - -\def\CHAPPAGoff{ -\global\let\pchapsepmacro=\chapbreak -\global\let\pagealignmacro=\chappager} - -\def\CHAPPAGon{ -\global\let\pchapsepmacro=\chappager -\global\let\pagealignmacro=\chappager -\global\def\HEADINGSon{\HEADINGSsingle}} - -\def\CHAPPAGodd{ -\global\let\pchapsepmacro=\chapoddpage -\global\let\pagealignmacro=\chapoddpage -\global\def\HEADINGSon{\HEADINGSdouble}} - -\CHAPPAGon - -\def\CHAPFplain{ -\global\let\chapmacro=\chfplain -\global\let\unnumbchapmacro=\unnchfplain} - -\def\chfplain #1#2{% - \pchapsepmacro - {% - \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #2\enspace #1}% - }% - \bigskip - \penalty5000 -} - -\def\unnchfplain #1{% -\pchapsepmacro % -{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 10000 % -} -\CHAPFplain % The default - -\def\unnchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 10000 % -} - -\def\chfopen #1#2{\chapoddpage {\chapfonts -\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% -\par\penalty 5000 % -} - -\def\CHAPFopen{ -\global\let\chapmacro=\chfopen -\global\let\unnumbchapmacro=\unnchfopen} - -% Parameter controlling skip before section headings. - -\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt -\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} - -\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt -\def\secheadingbreak{\dobreak \secheadingskip {-1000}} - -% @paragraphindent is defined for the Info formatting commands only. -\let\paragraphindent=\comment - -% Section fonts are the base font at magstep2, which produces -% a size a bit more than 14 points in the default situation. - -\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} -\def\plainsecheading #1{\secheadingi {#1}} -\def\secheadingi #1{{\advance \secheadingskip by \parskip % -\secheadingbreak}% -{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } - - -% Subsection fonts are the base font at magstep1, -% which produces a size of 12 points. - -\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} -\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip % -\subsecheadingbreak}% -{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } - -\def\subsubsecfonts{\subsecfonts} % Maybe this should change: - % Perhaps make sssec fonts scaled - % magstep half -\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}} -\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip % -\subsecheadingbreak}% -{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\raggedright - \rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000} - - -\message{toc printing,} - -% Finish up the main text and prepare to read what we've written -% to \contentsfile. - -\newskip\contentsrightmargin \contentsrightmargin=1in -\def\startcontents#1{% - \pagealignmacro - \immediate\closeout \contentsfile - \ifnum \pageno>0 - \pageno = -1 % Request roman numbered pages. - \fi - % Don't need to put `Contents' or `Short Contents' in the headline. - % It is abundantly clear what they are. - \unnumbchapmacro{#1}\def\thischapter{}% - \begingroup % Set up to handle contents files properly. - \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 - \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi - \raggedbottom % Worry more about breakpoints than the bottom. - \advance\hsize by -\contentsrightmargin % Don't use the full line length. -} - - -% Normal (long) toc. -\outer\def\contents{% - \startcontents{\putwordTableofContents}% - \input \jobname.toc - \endgroup - \vfill \eject -} - -% And just the chapters. -\outer\def\summarycontents{% - \startcontents{\putwordShortContents}% - % - \let\chapentry = \shortchapentry - \let\unnumbchapentry = \shortunnumberedentry - % We want a true roman here for the page numbers. - \secfonts - \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl - \rm - \advance\baselineskip by 1pt % Open it up a little. - \def\secentry ##1##2##3##4{} - \def\unnumbsecentry ##1##2{} - \def\subsecentry ##1##2##3##4##5{} - \def\unnumbsubsecentry ##1##2{} - \def\subsubsecentry ##1##2##3##4##5##6{} - \def\unnumbsubsubsecentry ##1##2{} - \input \jobname.toc - \endgroup - \vfill \eject -} -\let\shortcontents = \summarycontents - -% These macros generate individual entries in the table of contents. -% The first argument is the chapter or section name. -% The last argument is the page number. -% The arguments in between are the chapter number, section number, ... - -% Chapter-level things, for both the long and short contents. -\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} - -% See comments in \dochapentry re vbox and related settings -\def\shortchapentry#1#2#3{% - \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% -} - -% Typeset the label for a chapter or appendix for the short contents. -% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. -% We could simplify the code here by writing out an \appendixentry -% command in the toc file for appendices, instead of using \chapentry -% for both, but it doesn't seem worth it. -\setbox0 = \hbox{\shortcontrm \putwordAppendix } -\newdimen\shortappendixwidth \shortappendixwidth = \wd0 - -\def\shortchaplabel#1{% - % We typeset #1 in a box of constant width, regardless of the text of - % #1, so the chapter titles will come out aligned. - \setbox0 = \hbox{#1}% - \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi - % - % This space should be plenty, since a single number is .5em, and the - % widest letter (M) is 1em, at least in the Computer Modern fonts. - % (This space doesn't include the extra space that gets added after - % the label; that gets put in in \shortchapentry above.) - \advance\dimen0 by 1.1em - \hbox to \dimen0{#1\hfil}% -} - -\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} -\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} - -% Sections. -\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} -\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} - -% Subsections. -\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} -\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} - -% And subsubsections. -\def\subsubsecentry#1#2#3#4#5#6{% - \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} -\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} - - -% This parameter controls the indentation of the various levels. -\newdimen\tocindent \tocindent = 3pc - -% Now for the actual typesetting. In all these, #1 is the text and #2 is the -% page number. -% -% If the toc has to be broken over pages, we would want to be at chapters -% if at all possible; hence the \penalty. -\def\dochapentry#1#2{% - \penalty-300 \vskip\baselineskip - \begingroup - \chapentryfonts - \tocentry{#1}{\dopageno{#2}}% - \endgroup - \nobreak\vskip .25\baselineskip -} - -\def\dosecentry#1#2{\begingroup - \secentryfonts \leftskip=\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -\def\dosubsecentry#1#2{\begingroup - \subsecentryfonts \leftskip=2\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -\def\dosubsubsecentry#1#2{\begingroup - \subsubsecentryfonts \leftskip=3\tocindent - \tocentry{#1}{\dopageno{#2}}% -\endgroup} - -% Final typesetting of a toc entry; we use the same \entry macro as for -% the index entries, but we want to suppress hyphenation here. (We -% can't do that in the \entry macro, since index entries might consist -% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) -% -\def\tocentry#1#2{\begingroup - \hyphenpenalty = 10000 - \entry{#1}{#2}% -\endgroup} - -% Space between chapter (or whatever) number and the title. -\def\labelspace{\hskip1em \relax} - -\def\dopageno#1{{\rm #1}} -\def\doshortpageno#1{{\rm #1}} - -\def\chapentryfonts{\secfonts \rm} -\def\secentryfonts{\textfonts} -\let\subsecentryfonts = \textfonts -\let\subsubsecentryfonts = \textfonts - - -\message{environments,} - -% Since these characters are used in examples, it should be an even number of -% \tt widths. Each \tt character is 1en, so two makes it 1em. -% Furthermore, these definitions must come after we define our fonts. -\newbox\dblarrowbox \newbox\longdblarrowbox -\newbox\pushcharbox \newbox\bullbox -\newbox\equivbox \newbox\errorbox - -\let\ptexequiv = \equiv - -%{\tentt -%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} -%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} -%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} -%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} -% Adapted from the manmac format (p.420 of TeXbook) -%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex -% depth .1ex\hfil} -%} - -\def\point{$\star$} - -\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} -\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} -\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} - -\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} - -% Adapted from the TeXbook's \boxit. -{\tentt \global\dimen0 = 3em}% Width of the box. -\dimen2 = .55pt % Thickness of rules -% The text. (`r' is open on the right, `e' somewhat less so on the left.) -\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} - -\global\setbox\errorbox=\hbox to \dimen0{\hfil - \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. - \advance\hsize by -2\dimen2 % Rules. - \vbox{ - \hrule height\dimen2 - \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. - \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. - \kern3pt\vrule width\dimen2}% Space to right. - \hrule height\dimen2} - \hfil} - -% The @error{} command. -\def\error{\leavevmode\lower.7ex\copy\errorbox} - -% @tex ... @end tex escapes into raw Tex temporarily. -% One exception: @ is still an escape character, so that @end tex works. -% But \@ or @@ will get a plain tex @ character. - -\def\tex{\begingroup -\catcode `\\=0 \catcode `\{=1 \catcode `\}=2 -\catcode `\$=3 \catcode `\&=4 \catcode `\#=6 -\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie -\catcode `\%=14 -\catcode 43=12 -\catcode`\"=12 -\catcode`\==12 -\catcode`\|=12 -\catcode`\<=12 -\catcode`\>=12 -\escapechar=`\\ -% -\let\~=\ptextilde -\let\{=\ptexlbrace -\let\}=\ptexrbrace -\let\.=\ptexdot -\let\*=\ptexstar -\let\dots=\ptexdots -\def\@{@}% -\let\bullet=\ptexbullet -\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl -\let\L=\ptexL -% -\let\Etex=\endgroup} - -% Define @lisp ... @endlisp. -% @lisp does a \begingroup so it can rebind things, -% including the definition of @endlisp (which normally is erroneous). - -% Amount to narrow the margins by for @lisp. -\newskip\lispnarrowing \lispnarrowing=0.4in - -% This is the definition that ^^M gets inside @lisp, @example, and other -% such environments. \null is better than a space, since it doesn't -% have any width. -\def\lisppar{\null\endgraf} - -% Make each space character in the input produce a normal interword -% space in the output. Don't allow a line break at this space, as this -% is used only in environments like @example, where each line of input -% should produce a line of output anyway. -% -{\obeyspaces % -\gdef\sepspaces{\obeyspaces\let =\tie}} - -% Define \obeyedspace to be our active space, whatever it is. This is -% for use in \parsearg. -{\sepspaces% -\global\let\obeyedspace= } - -% This space is always present above and below environments. -\newskip\envskipamount \envskipamount = 0pt - -% Make spacing and below environment symmetrical. We use \parskip here -% to help in doing that, since in @example-like environments \parskip -% is reset to zero; thus the \afterenvbreak inserts no space -- but the -% start of the next paragraph will insert \parskip -% -\def\aboveenvbreak{{\advance\envskipamount by \parskip -\endgraf \ifdim\lastskip<\envskipamount -\removelastskip \penalty-50 \vskip\envskipamount \fi}} - -\let\afterenvbreak = \aboveenvbreak - -% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. -\let\nonarrowing=\relax - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \cartouche: draw rectangle w/rounded corners around argument -\font\circle=lcircle10 -\newdimen\circthick -\newdimen\cartouter\newdimen\cartinner -\newskip\normbskip\newskip\normpskip\newskip\normlskip -\circthick=\fontdimen8\circle -% -\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth -\def\ctr{{\hskip 6pt\circle\char'010}} -\def\cbl{{\circle\char'012\hskip -6pt}} -\def\cbr{{\hskip 6pt\circle\char'011}} -\def\carttop{\hbox to \cartouter{\hskip\lskip - \ctl\leaders\hrule height\circthick\hfil\ctr - \hskip\rskip}} -\def\cartbot{\hbox to \cartouter{\hskip\lskip - \cbl\leaders\hrule height\circthick\hfil\cbr - \hskip\rskip}} -% -\newskip\lskip\newskip\rskip - -\long\def\cartouche{% -\begingroup - \lskip=\leftskip \rskip=\rightskip - \leftskip=0pt\rightskip=0pt %we want these *outside*. - \cartinner=\hsize \advance\cartinner by-\lskip - \advance\cartinner by-\rskip - \cartouter=\hsize - \advance\cartouter by 18pt % allow for 3pt kerns on either -% side, and for 6pt waste from -% each corner char - \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip - % Flag to tell @lisp, etc., not to narrow margin. - \let\nonarrowing=\comment - \vbox\bgroup - \baselineskip=0pt\parskip=0pt\lineskip=0pt - \carttop - \hbox\bgroup - \hskip\lskip - \vrule\kern3pt - \vbox\bgroup - \hsize=\cartinner - \kern3pt - \begingroup - \baselineskip=\normbskip - \lineskip=\normlskip - \parskip=\normpskip - \vskip -\parskip -\def\Ecartouche{% - \endgroup - \kern3pt - \egroup - \kern3pt\vrule - \hskip\rskip - \egroup - \cartbot - \egroup -\endgroup -}} - - -% This macro is called at the beginning of all the @example variants, -% inside a group. -\def\nonfillstart{% - \aboveenvbreak - \inENV % This group ends at the end of the body - \hfuzz = 12pt % Don't be fussy - \sepspaces % Make spaces be word-separators rather than space tokens. - \singlespace - \let\par = \lisppar % don't ignore blank lines - \obeylines % each line of input is a line of output - \parskip = 0pt - \parindent = 0pt - \emergencystretch = 0pt % don't try to avoid overfull boxes - % @cartouche defines \nonarrowing to inhibit narrowing - % at next level down. - \ifx\nonarrowing\relax - \advance \leftskip by \lispnarrowing - \exdentamount=\lispnarrowing - \let\exdent=\nofillexdent - \let\nonarrowing=\relax - \fi -} - -% To ending an @example-like environment, we first end the paragraph -% (via \afterenvbreak's vertical glue), and then the group. That way we -% keep the zero \parskip that the environments set -- \parskip glue -% will be inserted at the beginning of the next paragraph in the -% document, after the environment. -% -\def\nonfillfinish{\afterenvbreak\endgroup}% - -% This macro is -\def\lisp{\begingroup - \nonfillstart - \let\Elisp = \nonfillfinish - \tt - \rawbackslash % have \ input char produce \ char from current font - \gobble -} - -% Define the \E... control sequence only if we are inside the -% environment, so the error checking in \end will work. -% -% We must call \lisp last in the definition, since it reads the -% return following the @example (or whatever) command. -% -\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} -\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp} -\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} - -% @smallexample and @smalllisp. This is not used unless the @smallbook -% command is given. Originally contributed by Pavel@xerox. -% -\def\smalllispx{\begingroup - \nonfillstart - \let\Esmalllisp = \nonfillfinish - \let\Esmallexample = \nonfillfinish - % - % Smaller interline space and fonts for small examples. - \setleading{10pt}% - \indexfonts \tt - \rawbackslash % make \ output the \ character from the current font (tt) - \gobble -} - -% This is @display; same as @lisp except use roman font. -% -\def\display{\begingroup - \nonfillstart - \let\Edisplay = \nonfillfinish - \gobble -} - -% This is @format; same as @display except don't narrow margins. -% -\def\format{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eformat = \nonfillfinish - \gobble -} - -% @flushleft (same as @format) and @flushright. -% -\def\flushleft{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eflushleft = \nonfillfinish - \gobble -} -\def\flushright{\begingroup - \let\nonarrowing = t - \nonfillstart - \let\Eflushright = \nonfillfinish - \advance\leftskip by 0pt plus 1fill - \gobble} - -% @quotation does normal linebreaking (hence we can't use \nonfillstart) -% and narrows the margins. -% -\def\quotation{% - \begingroup\inENV %This group ends at the end of the @quotation body - {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \singlespace - \parindent=0pt - % We have retained a nonzero parskip for the environment, since we're - % doing normal filling. So to avoid extra space below the environment... - \def\Equotation{\parskip = 0pt \nonfillfinish}% - % - % @cartouche defines \nonarrowing to inhibit narrowing at next level down. - \ifx\nonarrowing\relax - \advance\leftskip by \lispnarrowing - \advance\rightskip by \lispnarrowing - \exdentamount = \lispnarrowing - \let\nonarrowing = \relax - \fi -} - -\message{defuns,} -% Define formatter for defuns -% First, allow user to change definition object font (\df) internally -\def\setdeffont #1 {\csname DEF#1\endcsname} - -\newskip\defbodyindent \defbodyindent=.4in -\newskip\defargsindent \defargsindent=50pt -\newskip\deftypemargin \deftypemargin=12pt -\newskip\deflastargmargin \deflastargmargin=18pt - -\newcount\parencount -% define \functionparens, which makes ( and ) and & do special things. -% \functionparens affects the group it is contained in. -\def\activeparens{% -\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active -\catcode`\[=\active \catcode`\]=\active} - -% Make control sequences which act like normal parenthesis chars. -\let\lparen = ( \let\rparen = ) - -{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) - -% Be sure that we always have a definition for `(', etc. For example, -% if the fn name has parens in it, \boldbrax will not be in effect yet, -% so TeX would otherwise complain about undefined control sequence. -\global\let(=\lparen \global\let)=\rparen -\global\let[=\lbrack \global\let]=\rbrack - -\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } -\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} - -% Definitions of (, ) and & used in args for functions. -% This is the definition of ( outside of all parentheses. -\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested % -\global\advance\parencount by 1 } -% -% This is the definition of ( when already inside a level of parens. -\gdef\opnested{\char`\(\global\advance\parencount by 1 } -% -\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. -% also in that case restore the outer-level definition of (. -\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi -\global\advance \parencount by -1 } -% If we encounter &foo, then turn on ()-hacking afterwards -\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } -% -\gdef\normalparens{\boldbrax\let&=\ampnr} -} % End of definition inside \activeparens -%% These parens (in \boldbrax) actually are a little bolder than the -%% contained text. This is especially needed for [ and ] -\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&} -\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} - -% First, defname, which formats the header line itself. -% #1 should be the function name. -% #2 should be the type of definition, such as "Function". - -\def\defname #1#2{% -% Get the values of \leftskip and \rightskip as they were -% outside the @def... -\dimen2=\leftskip -\advance\dimen2 by -\defbodyindent -\dimen3=\rightskip -\advance\dimen3 by -\defbodyindent -\noindent % -\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% -\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line -\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations -\parshape 2 0in \dimen0 \defargsindent \dimen1 % -% Now output arg 2 ("Function" or some such) -% ending at \deftypemargin from the right margin, -% but stuck inside a box of width 0 so it does not interfere with linebreaking -{% Adjust \hsize to exclude the ambient margins, -% so that \rightline will obey them. -\advance \hsize by -\dimen2 \advance \hsize by -\dimen3 -\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% -% Make all lines underfull and no complaints: -\tolerance=10000 \hbadness=10000 -\advance\leftskip by -\defbodyindent -\exdentamount=\defbodyindent -{\df #1}\enskip % Generate function name -} - -% Actually process the body of a definition -% #1 should be the terminating control sequence, such as \Edefun. -% #2 should be the "another name" control sequence, such as \defunx. -% #3 should be the control sequence that actually processes the header, -% such as \defunheader. - -\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2{\begingroup\obeylines\activeparens\spacesplit#3}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup % -\catcode 61=\active % 61 is `=' -\obeylines\activeparens\spacesplit#3} - -\def\defmethparsebody #1#2#3#4 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} - -\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 ##2 {\def#4{##1}% -\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\activeparens\spacesplit{#3{#5}}} - -% These parsing functions are similar to the preceding ones -% except that they do not make parens into active characters. -% These are used for "variables" since they have no arguments. - -\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2{\begingroup\obeylines\spacesplit#3}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup % -\catcode 61=\active % -\obeylines\spacesplit#3} - -% This is used for \def{tp,vr}parsebody. It could probably be used for -% some of the others, too, with some judicious conditionals. -% -\def\parsebodycommon#1#2#3{% - \begingroup\inENV % - \medbreak % - % Define the end token that this defining construct specifies - % so that it will exit this group. - \def#1{\endgraf\endgroup\medbreak}% - \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% - \parindent=0in - \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent - \exdentamount=\defbodyindent - \begingroup\obeylines -} - -\def\defvrparsebody#1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \spacesplit{#3{#4}}% -} - -% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the -% type is just `struct', because we lose the braces in `{struct -% termios}' when \spacesplit reads its undelimited argument. Sigh. -% \let\deftpparsebody=\defvrparsebody -% -% So, to get around this, we put \empty in with the type name. That -% way, TeX won't find exactly `{...}' as an undelimited argument, and -% won't strip off the braces. -% -\def\deftpparsebody #1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \spacesplit{\parsetpheaderline{#3{#4}}}\empty -} - -% Fine, but then we have to eventually remove the \empty *and* the -% braces (if any). That's what this does, putting the result in \tptemp. -% -\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}% - -% After \spacesplit has done its work, this is called -- #1 is the final -% thing to call, #2 the type name (which starts with \empty), and #3 -% (which might be empty) the arguments. -% -\def\parsetpheaderline#1#2#3{% - \removeemptybraces#2\relax - #1{\tptemp}{#3}% -}% - -\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % -\medbreak % -% Define the end token that this defining construct specifies -% so that it will exit this group. -\def#1{\endgraf\endgroup\medbreak}% -\def#2##1 ##2 {\def#4{##1}% -\begingroup\obeylines\spacesplit{#3{##2}}}% -\parindent=0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=\defbodyindent -\begingroup\obeylines\spacesplit{#3{#5}}} - -% Split up #2 at the first space token. -% call #1 with two arguments: -% the first is all of #2 before the space token, -% the second is all of #2 after that space token. -% If #2 contains no space token, all of it is passed as the first arg -% and the second is passed as empty. - -{\obeylines -\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% -\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% -\ifx\relax #3% -#1{#2}{}\else #1{#2}{#3#4}\fi}} - -% So much for the things common to all kinds of definitions. - -% Define @defun. - -% First, define the processing that is wanted for arguments of \defun -% Use this to expand the args and terminate the paragraph they make up - -\def\defunargs #1{\functionparens \sl -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -\hyphenchar\tensl=0 -#1% -\hyphenchar\tensl=45 -\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi% -\interlinepenalty=10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\penalty 10000\vskip -\parskip\penalty 10000% -} - -\def\deftypefunargs #1{% -% Expand, preventing hyphenation at `-' chars. -% Note that groups don't affect changes in \hyphenchar. -\functionparens -\tclose{#1}% avoid \code because of side effects on active chars -\interlinepenalty=10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\penalty 10000\vskip -\parskip\penalty 10000% -} - -% Do complete processing of one @defun or @defunx line already parsed. - -% @deffn Command forward-char nchars - -\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} - -\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% -\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defun == @deffn Function - -\def\defun{\defparsebody\Edefun\defunx\defunheader} - -\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{Function}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @deftypefun int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} - -% #1 is the data type. #2 is the name and args. -\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} -% #1 is the data type, #2 the name, #3 the args. -\def\deftypefunheaderx #1#2 #3\relax{% -\doind {fn}{\code{#2}}% Make entry in function index -\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}% -\deftypefunargs {#3}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} - -% \defheaderxcond#1\relax$$$ -% puts #1 in @code, followed by a space, but does nothing if #1 is null. -\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} - -% #1 is the classification. #2 is the data type. #3 is the name and args. -\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} -% #1 is the classification, #2 the data type, #3 the name, #4 the args. -\def\deftypefnheaderx #1#2#3 #4\relax{% -\doind {fn}{\code{#3}}% Make entry in function index -\begingroup -\normalparens % notably, turn off `&' magic, which prevents -% at least some C++ text from working -\defname {\defheaderxcond#2\relax$$$#3}{#1}% -\deftypefunargs {#4}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defmac == @deffn Macro - -\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} - -\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{Macro}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% @defspec == @deffn Special Form - -\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} - -\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{Special Form}% -\defunargs {#2}\endgroup % -\catcode 61=\other % Turn off change made in \defparsebody -} - -% This definition is run if you use @defunx -% anywhere other than immediately after a @defun or @defunx. - -\def\deffnx #1 {\errmessage{@deffnx in invalid context}} -\def\defunx #1 {\errmessage{@defunx in invalid context}} -\def\defmacx #1 {\errmessage{@defmacx in invalid context}} -\def\defspecx #1 {\errmessage{@defspecx in invalid context}} -\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} -\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} - -% @defmethod, and so on - -% @defop {Funny Method} foo-class frobnicate argument - -\def\defop #1 {\def\defoptype{#1}% -\defopparsebody\Edefop\defopx\defopheader\defoptype} - -\def\defopheader #1#2#3{% -\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index -\begingroup\defname {#2}{\defoptype{} on #1}% -\defunargs {#3}\endgroup % -} - -% @defmethod == @defop Method - -\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} - -\def\defmethodheader #1#2#3{% -\dosubind {fn}{\code{#2}}{on #1}% entry in function index -\begingroup\defname {#2}{Method on #1}% -\defunargs {#3}\endgroup % -} - -% @defcv {Class Option} foo-class foo-flag - -\def\defcv #1 {\def\defcvtype{#1}% -\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} - -\def\defcvarheader #1#2#3{% -\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index -\begingroup\defname {#2}{\defcvtype{} of #1}% -\defvarargs {#3}\endgroup % -} - -% @defivar == @defcv {Instance Variable} - -\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} - -\def\defivarheader #1#2#3{% -\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index -\begingroup\defname {#2}{Instance Variable of #1}% -\defvarargs {#3}\endgroup % -} - -% These definitions are run if you use @defmethodx, etc., -% anywhere other than immediately after a @defmethod, etc. - -\def\defopx #1 {\errmessage{@defopx in invalid context}} -\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} -\def\defcvx #1 {\errmessage{@defcvx in invalid context}} -\def\defivarx #1 {\errmessage{@defivarx in invalid context}} - -% Now @defvar - -% First, define the processing that is wanted for arguments of @defvar. -% This is actually simple: just print them in roman. -% This must expand the args and terminate the paragraph they make up -\def\defvarargs #1{\normalparens #1% -\interlinepenalty=10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000} - -% @defvr Counter foo-count - -\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} - -\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% -\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} - -% @defvar == @defvr Variable - -\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} - -\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{Variable}% -\defvarargs {#2}\endgroup % -} - -% @defopt == @defvr {User Option} - -\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} - -\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{User Option}% -\defvarargs {#2}\endgroup % -} - -% @deftypevar int foobar - -\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} - -% #1 is the data type. #2 is the name. -\def\deftypevarheader #1#2{% -\doind {vr}{\code{#2}}% Make entry in variables index -\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% -\interlinepenalty=10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000 -\endgroup} - -% @deftypevr {Global Flag} int enable - -\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} - -\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% -\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} -\interlinepenalty=10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000 -\endgroup} - -% This definition is run if you use @defvarx -% anywhere other than immediately after a @defvar or @defvarx. - -\def\defvrx #1 {\errmessage{@defvrx in invalid context}} -\def\defvarx #1 {\errmessage{@defvarx in invalid context}} -\def\defoptx #1 {\errmessage{@defoptx in invalid context}} -\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} -\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} - -% Now define @deftp -% Args are printed in bold, a slight difference from @defvar. - -\def\deftpargs #1{\bf \defvarargs{#1}} - -% @deftp Class window height width ... - -\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} - -\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% -\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} - -% This definition is run if you use @deftpx, etc -% anywhere other than immediately after a @deftp, etc. - -\def\deftpx #1 {\errmessage{@deftpx in invalid context}} - -\message{cross reference,} -% Define cross-reference macros -\newwrite \auxfile - -\newif\ifhavexrefs % True if xref values are known. -\newif\ifwarnedxrefs % True if we warned once that they aren't known. - -% \setref{foo} defines a cross-reference point named foo. - -\def\setref#1{% -\dosetq{#1-title}{Ytitle}% -\dosetq{#1-pg}{Ypagenumber}% -\dosetq{#1-snt}{Ysectionnumberandtype}} - -\def\unnumbsetref#1{% -\dosetq{#1-title}{Ytitle}% -\dosetq{#1-pg}{Ypagenumber}% -\dosetq{#1-snt}{Ynothing}} - -\def\appendixsetref#1{% -\dosetq{#1-title}{Ytitle}% -\dosetq{#1-pg}{Ypagenumber}% -\dosetq{#1-snt}{Yappendixletterandtype}} - -% \xref, \pxref, and \ref generate cross-references to specified points. -% For \xrefX, #1 is the node name, #2 the name of the Info -% cross-reference, #3 the printed node name, #4 the name of the Info -% file, #5 the name of the printed manual. All but the node name can be -% omitted. -% -\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} -\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} -\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup - \def\printedmanual{\ignorespaces #5}% - \def\printednodename{\ignorespaces #3}% - \setbox1=\hbox{\printedmanual}% - \setbox0=\hbox{\printednodename}% - \ifdim \wd0 = 0pt - % No printed node name was explicitly given. - \ifx\SETxref-automatic-section-title\relax % - % Use the actual chapter/section title appear inside - % the square brackets. Use the real section title if we have it. - \ifdim \wd1>0pt% - % It is in another manual, so we don't have it. - \def\printednodename{\ignorespaces #1}% - \else - \ifhavexrefs - % We know the real title if we have the xref values. - \def\printednodename{\refx{#1-title}}% - \else - % Otherwise just copy the Info node name. - \def\printednodename{\ignorespaces #1}% - \fi% - \fi - \def\printednodename{#1-title}% - \else - % Use the node name inside the square brackets. - \def\printednodename{\ignorespaces #1}% - \fi - \fi - % - % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not - % insert empty discretionaries after hyphens, which means that it will - % not find a line break at a hyphen in a node names. Since some manuals - % are best written with fairly long node names, containing hyphens, this - % is a loss. Therefore, we give the text of the node name again, so it - % is as if TeX is seeing it for the first time. - \ifdim \wd1 > 0pt - \putwordsection{} ``\printednodename'' in \cite{\printedmanual}% - \else - % _ (for example) has to be the character _ for the purposes of the - % control sequence corresponding to the node, but it has to expand - % into the usual \leavevmode...\vrule stuff for purposes of - % printing. So we \turnoffactive for the \refx-snt, back on for the - % printing, back off for the \refx-pg. - {\turnoffactive \refx{#1-snt}{}}% - \space [\printednodename],\space - \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - \fi -\endgroup} - -% \dosetq is the interface for calls from other macros - -% Use \turnoffactive so that punctuation chars such as underscore -% work in node names. -\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat% -\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% -\next}} - -% \internalsetq {foo}{page} expands into -% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} -% When the aux file is read, ' is the escape character - -\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} - -% Things to be expanded by \internalsetq - -\def\Ypagenumber{\folio} - -\def\Ytitle{\thissection} - -\def\Ynothing{} - -\def\Ysectionnumberandtype{% -\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % -\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % -\else \ifnum \subsubsecno=0 % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % -\else % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % -\fi \fi \fi } - -\def\Yappendixletterandtype{% -\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% -\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % -\else \ifnum \subsubsecno=0 % -\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % -\else % -\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % -\fi \fi \fi } - -\gdef\xreftie{'tie} - -% Use TeX 3.0's \inputlineno to get the line number, for better error -% messages, but if we're using an old version of TeX, don't do anything. -% -\ifx\inputlineno\thisisundefined - \let\linenumber = \empty % Non-3.0. -\else - \def\linenumber{\the\inputlineno:\space} -\fi - -% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. -% If its value is nonempty, SUFFIX is output afterward. - -\def\refx#1#2{% - \expandafter\ifx\csname X#1\endcsname\relax - % If not defined, say something at least. - $\langle$un\-de\-fined$\rangle$% - \ifhavexrefs - \message{\linenumber Undefined cross reference `#1'.}% - \else - \ifwarnedxrefs\else - \global\warnedxrefstrue - \message{Cross reference values unknown; you must run TeX again.}% - \fi - \fi - \else - % It's defined, so just use it. - \csname X#1\endcsname - \fi - #2% Output the suffix in any case. -} - -% Read the last existing aux file, if any. No error if none exists. - -% This is the macro invoked by entries in the aux file. -\def\xrdef #1#2{ -{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}} - -\def\readauxfile{% -\begingroup -\catcode `\^^@=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\^^C=\other -\catcode `\^^D=\other -\catcode `\^^E=\other -\catcode `\^^F=\other -\catcode `\^^G=\other -\catcode `\^^H=\other -\catcode `\ =\other -\catcode `\^^L=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode `\=\other -\catcode 26=\other -\catcode `\^^[=\other -\catcode `\^^\=\other -\catcode `\^^]=\other -\catcode `\^^^=\other -\catcode `\^^_=\other -\catcode `\@=\other -\catcode `\^=\other -\catcode `\~=\other -\catcode `\[=\other -\catcode `\]=\other -\catcode`\"=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode `\$=\other -\catcode `\#=\other -\catcode `\&=\other -% `\+ does not work, so use 43. -\catcode 43=\other -% Make the characters 128-255 be printing characters -{% - \count 1=128 - \def\loop{% - \catcode\count 1=\other - \advance\count 1 by 1 - \ifnum \count 1<256 \loop \fi - }% -}% -% the aux file uses ' as the escape. -% Turn off \ as an escape so we do not lose on -% entries which were dumped with control sequences in their names. -% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ -% Reference to such entries still does not work the way one would wish, -% but at least they do not bomb out when the aux file is read in. -\catcode `\{=1 \catcode `\}=2 -\catcode `\%=\other -\catcode `\'=0 -\catcode`\^=7 % to make ^^e4 etc usable in xref tags -\catcode `\\=\other -\openin 1 \jobname.aux -\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue -\global\warnedobstrue -\fi -% Open the new aux file. Tex will close it automatically at exit. -\openout \auxfile=\jobname.aux -\endgroup} - - -% Footnotes. - -\newcount \footnoteno - -% The trailing space in the following definition for supereject is -% vital for proper filling; pages come out unaligned when you do a -% pagealignmacro call if that space before the closing brace is -% removed. -\def\supereject{\par\penalty -20000\footnoteno =0 } - -% @footnotestyle is meaningful for info output only.. -\let\footnotestyle=\comment - -\let\ptexfootnote=\footnote - -{\catcode `\@=11 -% -% Auto-number footnotes. Otherwise like plain. -\gdef\footnote{% - \global\advance\footnoteno by \@ne - \edef\thisfootno{$^{\the\footnoteno}$}% - % - % In case the footnote comes at the end of a sentence, preserve the - % extra spacing after we do the footnote number. - \let\@sf\empty - \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi - % - % Remove inadvertent blank space before typesetting the footnote number. - \unskip - \thisfootno\@sf - \footnotezzz -}% - -% Don't bother with the trickery in plain.tex to not require the -% footnote text as a parameter. Our footnotes don't need to be so general. -% -\long\gdef\footnotezzz#1{\insert\footins{% - % We want to typeset this text as a normal paragraph, even if the - % footnote reference occurs in (for example) a display environment. - % So reset some parameters. - \interlinepenalty\interfootnotelinepenalty - \splittopskip\ht\strutbox % top baseline for broken footnotes - \splitmaxdepth\dp\strutbox - \floatingpenalty\@MM - \leftskip\z@skip - \rightskip\z@skip - \spaceskip\z@skip - \xspaceskip\z@skip - \parindent\defaultparindent - % - % Hang the footnote text off the number. - \hang - \textindent{\thisfootno}% - % - % Don't crash into the line above the footnote text. Since this - % expands into a box, it must come within the paragraph, lest it - % provide a place where TeX can split the footnote. - \footstrut - #1\strut}% -} - -}%end \catcode `\@=11 - -% Set the baselineskip to #1, and the lineskip and strut size -% correspondingly. There is no deep meaning behind these magic numbers -% used as factors; they just match (closely enough) what Knuth defined. -% -\def\lineskipfactor{.08333} -\def\strutheightpercent{.70833} -\def\strutdepthpercent {.29167} -% -\def\setleading#1{% - \normalbaselineskip = #1\relax - \normallineskip = \lineskipfactor\normalbaselineskip - \normalbaselines - \setbox\strutbox =\hbox{% - \vrule width0pt height\strutheightpercent\baselineskip - depth \strutdepthpercent \baselineskip - }% -} - -% @| inserts a changebar to the left of the current line. It should -% surround any changed text. This approach does *not* work if the -% change spans more than two lines of output. To handle that, we would -% have adopt a much more difficult approach (putting marks into the main -% vertical list for the beginning and end of each change). -% -\def\|{% - % \vadjust can only be used in horizontal mode. - \leavevmode - % - % Append this vertical mode material after the current line in the output. - \vadjust{% - % We want to insert a rule with the height and depth of the current - % leading; that is exactly what \strutbox is supposed to record. - \vskip-\baselineskip - % - % \vadjust-items are inserted at the left edge of the type. So - % the \llap here moves out into the left-hand margin. - \llap{% - % - % For a thicker or thinner bar, change the `1pt'. - \vrule height\baselineskip width1pt - % - % This is the space between the bar and the text. - \hskip 12pt - }% - }% -} - -% For a final copy, take out the rectangles -% that mark overfull boxes (in case you have decided -% that the text looks ok even though it passes the margin). -% -\def\finalout{\overfullrule=0pt} - - -% End of control word definitions. - -\message{and turning on texinfo input format.} - -\def\openindices{% - \newindex{cp}% - \newcodeindex{fn}% - \newcodeindex{vr}% - \newcodeindex{tp}% - \newcodeindex{ky}% - \newcodeindex{pg}% -} - -% Set some numeric style parameters, for 8.5 x 11 format. - -%\hsize = 6.5in -\newdimen\defaultparindent \defaultparindent = 15pt -\parindent = \defaultparindent -\parskip 18pt plus 1pt -\setleading{15pt} -\advance\topskip by 1.2cm - -% Prevent underfull vbox error messages. -\vbadness=10000 - -% Following George Bush, just get rid of widows and orphans. -\widowpenalty=10000 -\clubpenalty=10000 - -% Use TeX 3.0's \emergencystretch to help line breaking, but if we're -% using an old version of TeX, don't do anything. We want the amount of -% stretch added to depend on the line length, hence the dependence on -% \hsize. This makes it come to about 9pt for the 8.5x11 format. -% -\ifx\emergencystretch\thisisundefined - % Allow us to assign to \emergencystretch anyway. - \def\emergencystretch{\dimen0}% -\else - \emergencystretch = \hsize - \divide\emergencystretch by 45 -\fi - -% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) -\def\smallbook{ - -% These values for secheadingskip and subsecheadingskip are -% experiments. RJC 7 Aug 1992 -\global\secheadingskip = 17pt plus 6pt minus 3pt -\global\subsecheadingskip = 14pt plus 6pt minus 3pt - -\global\lispnarrowing = 0.3in -\setleading{12pt} -\advance\topskip by -1cm -\global\parskip 3pt plus 1pt -\global\hsize = 5in -\global\vsize=7.5in -\global\tolerance=700 -\global\hfuzz=1pt -\global\contentsrightmargin=0pt -\global\deftypemargin=0pt -\global\defbodyindent=.5cm - -\global\pagewidth=\hsize -\global\pageheight=\vsize - -\global\let\smalllisp=\smalllispx -\global\let\smallexample=\smalllispx -\global\def\Esmallexample{\Esmalllisp} -} - -% Use @afourpaper to print on European A4 paper. -\def\afourpaper{ -\global\tolerance=700 -\global\hfuzz=1pt -\setleading{12pt} -\global\parskip 15pt plus 1pt - -\global\vsize= 53\baselineskip -\advance\vsize by \topskip -%\global\hsize= 5.85in % A4 wide 10pt -\global\hsize= 6.5in -\global\outerhsize=\hsize -\global\advance\outerhsize by 0.5in -\global\outervsize=\vsize -\global\advance\outervsize by 0.6in - -\global\pagewidth=\hsize -\global\pageheight=\vsize -} - -% Allow control of the text dimensions. Parameters in order: textheight; -% textwidth; \voffset; \hoffset (!); binding offset. All require a dimension; -% header is additional; added length extends the bottom of the page. - -\def\changepagesizes#1#2#3#4#5{ - \global\vsize= #1 - \advance\vsize by \topskip - \global\voffset= #3 - \global\hsize= #2 - \global\outerhsize=\hsize - \global\advance\outerhsize by 0.5in - \global\outervsize=\vsize - \global\advance\outervsize by 0.6in - \global\pagewidth=\hsize - \global\pageheight=\vsize - \global\normaloffset= #4 - \global\bindingoffset= #5} - -% This layout is compatible with Latex on A4 paper. - -\def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}} - -% Define macros to output various characters with catcode for normal text. -\catcode`\"=\other -\catcode`\~=\other -\catcode`\^=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode`\+=\other -\def\normaldoublequote{"} -\def\normaltilde{~} -\def\normalcaret{^} -\def\normalunderscore{_} -\def\normalverticalbar{|} -\def\normalless{<} -\def\normalgreater{>} -\def\normalplus{+} - -% This macro is used to make a character print one way in ttfont -% where it can probably just be output, and another way in other fonts, -% where something hairier probably needs to be done. -% -% #1 is what to print if we are indeed using \tt; #2 is what to print -% otherwise. Since all the Computer Modern typewriter fonts have zero -% interword stretch (and shrink), and it is reasonable to expect all -% typewriter fonts to have this, we can check that font parameter. -% -\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} - -% Turn off all special characters except @ -% (and those which the user can use as if they were ordinary). -% Most of these we simply print from the \tt font, but for some, we can -% use math or other variants that look better in normal text. - -\catcode`\"=\active -\def\activedoublequote{{\tt \char '042}} -\let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt \char '176}} -\chardef\hat=`\^ -\catcode`\^=\active -\def\auxhat{\def^{'hat}} -\def^{{\tt \hat}} - -\catcode`\_=\active -\def_{\ifusingtt\normalunderscore\_} -% Subroutine for the previous macro. -\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}} - -% \lvvmode is equivalent in function to \leavevmode. -% Using \leavevmode runs into trouble when written out to -% an index file due to the expansion of \leavevmode into ``\unhbox -% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our -% magic tricks with @. -\def\lvvmode{\vbox to 0pt{}} - -\catcode`\|=\active -\def|{{\tt \char '174}} -\chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} -\chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -%\catcode 27=\active -%\def^^[{$\diamondsuit$} - -% Set up an active definition for =, but don't enable it most of the time. -{\catcode`\==\active -\global\def={{\tt \char 61}}} - -\catcode`\@=0 - -% \rawbackslashxx output one backslash character in current font -\global\chardef\rawbackslashxx=`\\ -%{\catcode`\\=\other -%@gdef@rawbackslashxx{\}} - -% \rawbackslash redefines \ as input to do \rawbackslashxx. -{\catcode`\\=\active -@gdef@rawbackslash{@let\=@rawbackslashxx }} - -% \normalbackslash outputs one backslash in fixed width font. -\def\normalbackslash{{\tt\rawbackslashxx}} - -% Say @foo, not \foo, in error messages. -\escapechar=`\@ - -% \catcode 17=0 % Define control-q -\catcode`\\=\active - -% Used sometimes to turn off (effectively) the active characters -% even after parsing them. -@def@turnoffactive{@let"=@normaldoublequote -@let\=@realbackslash -@let~=@normaltilde -@let^=@normalcaret -@let_=@normalunderscore -@let|=@normalverticalbar -@let<=@normalless -@let>=@normalgreater -@let+=@normalplus} - -@def@normalturnoffactive{@let"=@normaldoublequote -@let\=@normalbackslash -@let~=@normaltilde -@let^=@normalcaret -@let_=@normalunderscore -@let|=@normalverticalbar -@let<=@normalless -@let>=@normalgreater -@let+=@normalplus} - -% If a .fmt file is being used, we don't want the `\input texinfo' to show up. -% That is what \eatinput is for; after that, the `\' should revert to printing -% a backslash. -% -@gdef@eatinput input texinfo{@fixbackslash} -@global@let\ = @eatinput - -% On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\{ in the file would cause an error. This macro tries to fix -% that, assuming it is called before the first `\' could plausibly occur. -% -@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi} - -%% These look ok in all fonts, so just make them not special. The @rm below -%% makes sure that the current font starts out as the newly loaded cmr10 -@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other - -@textfonts -@rm - -@c Local variables: -@c page-delimiter: "^\\\\message" -@c End: diff --git a/gnu/usr.bin/cvs/cvsinit.sh b/gnu/usr.bin/cvs/cvsinit.sh deleted file mode 100644 index f8c933e3974..00000000000 --- a/gnu/usr.bin/cvs/cvsinit.sh +++ /dev/null @@ -1,161 +0,0 @@ -#! /bin/sh -: -# -#ident "@(#)cvs:$Name: $:$Id: cvsinit.sh,v 1.1.1.2 1996/01/30 00:17:16 tholo Exp $" -# Copyright (c) 1992, Brian Berliner -# -# You may distribute under the terms of the GNU General Public License as -# specified in the README file that comes with the CVS 1.4 kit. - -# This script should be run for each repository you create to help you -# setup your site for CVS. You may also run it to update existing -# repositories if you install a new version of CVS. - -# this line is edited by Makefile when creating cvsinit.inst -CVSLIB="xLIBDIRx" - -CVS_VERSION="xVERSIONx" - -# All purpose usage message, also suffices for --help and --version. -if test $# -gt 0; then - echo "cvsinit version $CVS_VERSION" - echo "usage: $0" - echo "(set CVSROOT to the repository that you want to initialize)" - exit 0 -fi - -# Make sure that the CVSROOT variable is set -if [ "x$CVSROOT" = x ]; then - echo "The CVSROOT environment variable is not set." - echo "" - echo "You should choose a location for your source repository" - echo "that can be shared by many developers. It also helps to" - echo "place the source repository on a file system that has" - echo "plenty of free space." - echo "" - echo "Please enter the full path for your CVSROOT source repository:" - read CVSROOT junk - unset junk - remind_cvsroot=yes -else - remind_cvsroot=no -fi - -# Now, create the $CVSROOT if it is not already there -if [ ! -d $CVSROOT ]; then - echo "Creating $CVSROOT..." - path= - for comp in `echo $CVSROOT | sed -e 's,/, ,g'`; do - path=$path/$comp - if [ ! -d $path ]; then - mkdir $path - fi - done -else - true -fi - -# Next, check for $CVSROOT/CVSROOT -if [ ! -d $CVSROOT/CVSROOT ]; then - if [ -d $CVSROOT/CVSROOT.adm ]; then - echo "You have the old $CVSROOT/CVSROOT.adm directory." - echo "I will rename it to $CVSROOT/CVSROOT for you..." - mv $CVSROOT/CVSROOT.adm $CVSROOT/CVSROOT - else - echo "Creating the $CVSROOT/CVSROOT directory..." - mkdir $CVSROOT/CVSROOT - fi -else - true -fi -if [ ! -d $CVSROOT/CVSROOT ]; then - echo "Unable to create $CVSROOT/CVSROOT." - echo "I give up." - exit 1 -fi - -# Create the special control files and templates within $CVSROOT/CVSROOT - -EXAMPLES="checkoutlist commitinfo cvswrappers editinfo loginfo modules -rcsinfo rcstemplate taginfo wrap unwrap notify" - -NEWSAMPLE=false -for info in $EXAMPLES; do - if [ -f $CVSROOT/CVSROOT/${info},v ]; then - if [ ! -f $CVSROOT/CVSROOT/$info ]; then - echo "Checking out $CVSROOT/CVSROOT/$info" - echo " from $CVSROOT/CVSROOT/${info},v..." - (cd $CVSROOT/CVSROOT; co -q $info) - fi - else - NEWSAMPLE=true - if [ -f $CVSROOT/CVSROOT/$info ]; then - echo "Checking in $CVSROOT/CVSROOT/${info},v" - echo " from $CVSROOT/CVSROOT/$info..." - else - echo "Creating a sample $CVSROOT/CVSROOT/$info file..." - case $info in - modules) - sed -n -e '/END_REQUIRED_CONTENT/q' \ - -e p $CVSLIB/examples/modules > $CVSROOT/CVSROOT/modules - ;; - rcstemplate) - cp $CVSLIB/examples/$info $CVSROOT/CVSROOT/$info - ;; - wrap|unwrap) - cp $CVSLIB/examples/$info $CVSROOT/CVSROOT/$info - chmod +x $CVSROOT/CVSROOT/$info - ;; - *) - # comment out everything in all the other examples.... - sed -e 's/^\([^#]\)/#\1/' $CVSLIB/examples/$info > $CVSROOT/CVSROOT/$info - ;; - esac - fi - (cd $CVSROOT/CVSROOT; ci -q -u -t/dev/null -m"initial checkin of $info" $info) - fi -done - -if $NEWSAMPLE ; then - echo "NOTE: You may wish to check out the CVSROOT module and edit any new" - echo "configuration files to match your local requirements." - echo "" -fi - -# check to see if there are any references to the old CVSROOT.adm directory -if grep CVSROOT.adm $CVSROOT/CVSROOT/modules >/dev/null 2>&1; then - echo "Warning: your $CVSROOT/CVSROOT/modules file still" - echo " contains references to the old CVSROOT.adm directory" - echo " You should really change these to the new CVSROOT directory" - echo "" -fi - -# These files are generated from the contrib files. -# FIXME: Is it really wise to overwrite possible local changes like this? -# Normal folks will keep these up to date by modifying the source in -# their CVS module and re-installing CVS, but is everyone OK with that? -# -# -CONTRIBS="log commit_prep log_accum cln_hist" -# -for contrib in $CONTRIBS; do - echo "Copying the new version of '${contrib}'" - echo " to $CVSROOT/CVSROOT for you..." - cp $CVSLIB/contrib/$contrib $CVSROOT/CVSROOT/$contrib -done - -# XXX - also add a stub for the cvsignore file - -# Turn on history logging by default -if [ ! -f $CVSROOT/CVSROOT/history ]; then - echo "Enabling CVS history logging..." - touch $CVSROOT/CVSROOT/history - chmod g+w $CVSROOT/CVSROOT/history - echo "(Remove $CVSROOT/CVSROOT/history to disable.)" -fi - -# finish up by running mkmodules -echo "All done! Running 'mkmodules' as my final step..." -mkmodules $CVSROOT/CVSROOT - -exit 0 diff --git a/gnu/usr.bin/cvs/examples/.cvsignore b/gnu/usr.bin/cvs/examples/.cvsignore deleted file mode 100644 index f3c7a7c5da6..00000000000 --- a/gnu/usr.bin/cvs/examples/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -Makefile diff --git a/gnu/usr.bin/cvs/examples/ChangeLog b/gnu/usr.bin/cvs/examples/ChangeLog deleted file mode 100644 index 3d76f23c1f8..00000000000 --- a/gnu/usr.bin/cvs/examples/ChangeLog +++ /dev/null @@ -1,93 +0,0 @@ -Mon Feb 12 15:42:46 1996 Jim Kingdon - - * modules: Remove mkmodules stuff; mkmodules is no longer a - separate program. - -Tue Jan 30 15:24:52 1996 Vince Demarco - - * modules: change /usr/local/bin/mkmodules to - mkmodules (remove the abosolute path) just incase - the user doesn't install mkmodules, in /usr/local/bin - -Wed Jan 10 08:38:27 1996 Jim Kingdon - - * Makefile.in (DISTFILES): Include EXAMPLE_FILES rather than - duplicating the list. - (EXAMPLE_FILES): Add notify. - -Sun Dec 10 23:10:32 1995 Jim Kingdon - - * notify: New file. - -Tue Nov 14 18:19:22 1995 Greg A. Woods - - * commitinfo, editinfo, loginfo, rcsinfo: new rcs id - - * modules: - - new rcs id - - add mention of new CVSROOT admin files - - * taginfo: - - new rcs id - - leave the DEFAULT uncommented -- cvsinit comments it out - - * checkoutlist: add wrap & unwrap as useful examples - - * cvswrappers: - - renamed comb/uncom to wrap/unwrap - - re-formatted comments, etc. - - * Makefile.in: renamed comb/uncom to wrap/unwrap - - * unwrap, wrap: renamed from comb and uncom - -Mon Oct 9 09:25:23 1995 Norbert Kiesel - - * taginfo: document "mov" for tag -F - -Thu Aug 3 01:42:28 1995 Vince DeMarco - - * cvswrappers: Cleaned up old file to use $CVSROOT stuff and - shortened all of the lines to under 80 columns. File is now a - working example of a cvswrappers file. - -Mon Jul 24 17:08:25 1995 Vince DeMarco - - * Updated comb program to work when the user runs update/commit - etc from the top directory of a source tree. - -Fri Jul 21 10:35:10 1995 Vince DeMarco - - * Makefile.in (DISTFILES, EXAMPLE_FILES): Add cvswrappers uncom comb. - * cvswrappers uncom comb: New files. - -Sun Jul 9 21:21:35 1995 Karl Fogel - - Greg Woods' change: - - * checkoutlist, rcstemplate: new files. - -Sun Jul 9 19:03:00 1995 Greg A. Woods - - * modules: fix this up so cvsinit can use it for new - repositories - - * loginfo: fix comments to note current perl requirement - for log and log_accum - - * Makefile.in: add new template example files - (from previous local changes) - - * rcsinfo, loginfo, commitinfo: corrections to comments - - corrections to sample control lines (from previous local changes) - -Sat May 27 08:46:00 1995 Jim Meyering (meyering@comco.com) - - * Makefile.in (Makefile): Regenerate only Makefile in current - directory when Makefile.in is out of date. Depend on ../config.status. - -Fri Apr 28 22:48:03 1995 Jim Blandy - - * Makefile.in (DISTFILES): Updated. - (dist-dir): Renamed from dist, changed to work with DISTDIR value - passed from parent. diff --git a/gnu/usr.bin/cvs/examples/Makefile.in b/gnu/usr.bin/cvs/examples/Makefile.in deleted file mode 100644 index 4e3800e0e1c..00000000000 --- a/gnu/usr.bin/cvs/examples/Makefile.in +++ /dev/null @@ -1,93 +0,0 @@ -# Makefile for GNU CVS example files. -# Do not use this makefile directly, but only from `../Makefile'. -# Copyright (C) 1986, 1988-1990 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -# $CVSid: @(#)Makefile.in 1.4 94/10/22 $ - -SHELL = /bin/sh - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -# Where to install the executables. -bindir = $(exec_prefix)/bin - -# Where to put the system-wide .cvsrc file -libdir = $(prefix)/lib - -# Where to put the manual pages. -mandir = $(prefix)/man - -# Use cp if you don't have install. -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ - -EXAMPLE_FILES = commitinfo editinfo loginfo modules rcsinfo taginfo \ - rcstemplate checkoutlist cvswrappers wrap unwrap notify - -DISTFILES = \ - .cvsignore Makefile.in ChangeLog $(EXAMPLE_FILES) - -all: Makefile -.PHONY: all - -install: all $(libdir)/cvs/examples - for f in $(EXAMPLE_FILES) ; do\ - $(INSTALL_DATA) $(srcdir)/$$f $(libdir)/cvs/examples/$$f; \ - done - @echo "You might consider running 'cvsinit' to upgrade your repository(s)...." -.PHONY: install - -$(libdir)/cvs/examples: - $(srcdir)/../mkinstalldirs $(libdir)/cvs/examples - -tags: -.PHONY: tags - -TAGS: -.PHONY: TAGS - -ls: - @echo $(DISTFILES) -.PHONY: ls - -clean: - /bin/rm -f *.o core -.PHONY: clean - -distclean: clean - rm -f Makefile -.PHONY: distclean - -realclean: distclean -.PHONY: realclean - -dist-dir: - mkdir ${DISTDIR} - for i in ${DISTFILES}; do \ - ln $(srcdir)/$${i} ${DISTDIR}; \ - done -.PHONY: dist-dir - -subdir = examples -Makefile: ../config.status Makefile.in - cd .. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status diff --git a/gnu/usr.bin/cvs/examples/checkoutlist b/gnu/usr.bin/cvs/examples/checkoutlist deleted file mode 100644 index ce969ed756d..00000000000 --- a/gnu/usr.bin/cvs/examples/checkoutlist +++ /dev/null @@ -1,20 +0,0 @@ -# -#ident "@(#)cvs/examples:$Name: $:$Id: checkoutlist,v 1.1.1.2 1996/01/30 00:19:25 tholo Exp $" -# -# The "checkoutlist" file is used to support additional version controlled -# administrative files in $CVSROOT/CVSROOT, such as template files. -# -# The first entry on a line is a filename which will be checked out from -# the corresponding RCS file in the $CVSROOT/CVSROOT directory. -# The remainder of the line is an error message to use if the file cannot -# be checked out. -# -# File format: -# -# [] -# -# comment lines begin with '#' -# -rcstemplate -wrap -unwrap diff --git a/gnu/usr.bin/cvs/examples/commitinfo b/gnu/usr.bin/cvs/examples/commitinfo deleted file mode 100644 index 869358667b8..00000000000 --- a/gnu/usr.bin/cvs/examples/commitinfo +++ /dev/null @@ -1,27 +0,0 @@ -# -#ident "@(#)cvs/examples:$Name: $:$Id: commitinfo,v 1.1.1.2 1996/01/30 00:19:19 tholo Exp $" -# -# The "commitinfo" file is used to control pre-commit checks. -# The filter on the right is invoked with the repository and a list -# of files to check. A non-zero exit of the filter program will -# cause the commit to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". -# -# NOTE: contrib/commit_prep usage: -# -r - record directories affected by commit for use with contrib/log_accum -# -c - check for things like "$Id" near head of file, no "$Log", etc. -# -^apc $CVSROOT/CVSROOT/commit_prep -r -c -^misc $CVSROOT/CVSROOT/commit_prep -r -CVSROOT $CVSROOT/CVSROOT/commit_prep -r -c -DEFAULT $CVSROOT/CVSROOT/commit_prep diff --git a/gnu/usr.bin/cvs/examples/cvswrappers b/gnu/usr.bin/cvs/examples/cvswrappers deleted file mode 100644 index 68570f51510..00000000000 --- a/gnu/usr.bin/cvs/examples/cvswrappers +++ /dev/null @@ -1,29 +0,0 @@ -# -#ident "@(#)cvs/examples:$Name: $:$Id: cvswrappers,v 1.1.1.2 1996/01/30 00:19:25 tholo Exp $" -# -# This file describes wrappers and other binary files to CVS. -# -# Wrappers are the concept where directories of files are to be -# treated as a single file. The intended use is to wrap up a wrapper -# into a single tar such that the tar archive can be treated as a -# single binary file in CVS. -# -# To solve the problem effectively, it was also necessary to be able to -# prevent rcsmerge from merging these files. -# -# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) -# -# wildcard [option value][option value]... -# -# where option is one of -# -f from cvs filter value: path to filter -# -t to cvs filter value: path to filter -# -m update methodology value: MERGE or COPY -# -# and value is a single-quote delimited value. -# -# -*.nib -f '$CVSROOT/CVSROOT/unwrap %s' -t '$CVSROOT/CVSROOT/wrap %s %s' -*.rtfd -f '$CVSROOT/CVSROOT/unwrap %s' -t '$CVSROOT/CVSROOT/wrap %s %s' -*.draw -f '$CVSROOT/CVSROOT/unwrap %s' -t '$CVSROOT/CVSROOT/wrap %s %s' -*.tiff -m 'COPY' diff --git a/gnu/usr.bin/cvs/examples/editinfo b/gnu/usr.bin/cvs/examples/editinfo deleted file mode 100644 index 1f058e5245b..00000000000 --- a/gnu/usr.bin/cvs/examples/editinfo +++ /dev/null @@ -1,32 +0,0 @@ -# -#ident "@(#)cvs/examples:$Name: $:$Id: editinfo,v 1.1.1.2 1996/01/30 00:19:20 tholo Exp $" -# -# The "editinfo" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# Although these test could be handled by an interactive script being -# called via an entry in commitinfo, The information reported in -# such a script can't be easily merged into the report. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. -# -# Note there is no "edit" example script currently available.... -# -DEFAULT $CVSROOT/CVSROOT/edit "%s" diff --git a/gnu/usr.bin/cvs/examples/loginfo b/gnu/usr.bin/cvs/examples/loginfo deleted file mode 100644 index 0327962bb22..00000000000 --- a/gnu/usr.bin/cvs/examples/loginfo +++ /dev/null @@ -1,39 +0,0 @@ -# -#ident "@(#)cvs/examples:$Name: $:$Id: loginfo,v 1.1.1.2 1996/01/30 00:19:20 tholo Exp $" -# -# The "loginfo" file is used to control where "cvs commit" log information -# is sent. The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is a filter program that should expect log information on its standard -# input. -# -# If the repository name does not match any of the regular expressions in the -# first field of this file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". -# -# The filter program may use one and only one "%s" modifier (ala printf). If -# such a "%s" is specified in the filter program, a brief title is included -# (as one argument, enclosed in single quotes) showing the relative directory -# name and listing the modified file names. -# -# NOTE: contrib/log usage: (currently requires perl) -# -d - turn debugging on.... -# -m mailto - send mail to "mailto" (multiple -m's permitted) -# -f logfile - required arg: save messages to logfile -# %s - may follow other options at the end of the line -# -# NOTE: contrib/log_accum usage: (currently requires perl) -# (must have 'commit_prep -r' in commitinfo) -# -d - turn debugging on.... -# -M modulename - use this as the module name (necessary for sub-dirs) -# -m mailto - send mail to "mailto" (multiple -m's permitted) [optional] -# -f logfile - save messages to logfile [optional] -# %s - must follow other options at the end of the line -# -# without perl you could do this: -#DEFAULT (echo ""; who am i; date; cat) >> $CVSROOT/CVSROOT/commitlog -# -DEFAULT $CVSROOT/CVSROOT/log -f $CVSROOT/CVSROOT/commitlog %s diff --git a/gnu/usr.bin/cvs/examples/modules b/gnu/usr.bin/cvs/examples/modules deleted file mode 100644 index fba936eb982..00000000000 --- a/gnu/usr.bin/cvs/examples/modules +++ /dev/null @@ -1,581 +0,0 @@ -# -# The CVS Modules File -# -#ident "@(#)cvs/examples:$Name: $:$Id: modules,v 1.1.1.3 1996/04/27 19:43:05 tholo Exp $" -# -# Three different line formats are valid: -# key -a aliases... -# key [options] directory -# key [options] directory files... -# -# Where "options" are composed of: -# -i prog Run "prog" on "cvs commit" from top-level of module. -# -o prog Run "prog" on "cvs checkout" of module. -# -e prog Run "prog" on "cvs export" of module. -# -t prog Run "prog" on "cvs rtag" of module. -# -u prog Run "prog" on "cvs update" of module. -# -d dir Place module in directory "dir" instead of module name. -# -l Top-level directory only -- do not recurse. -# -# And "directory" is a path to a directory relative to $CVSROOT. -# -# The "-a" option specifies an alias. An alias is interpreted as if -# everything on the right of the "-a" had been typed on the command line. -# -# You can encode a module within a module by using the special '&' -# character to interpose another module into the current module. This -# can be useful for creating a module that consists of many directories -# spread out over the entire source repository. -# - -# Convenient aliases -world -a . - -# CVSROOT support -CVSROOT CVSROOT -commitinfo CVSROOT commitinfo -cvswrappers CVSROOT cvswrappers -editinfo CVSROOT editinfo -modules CVSROOT modules -loginfo CVSROOT loginfo -rcsinfo CVSROOT rcsinfo -rcstemplate CVSROOT rcstemplate -taginfo CVSROOT taginfo - -# Add more modules here -# -# END_REQUIRED_CONTENT (this comment for cvsinit) -# -# The remainder was for the Prisma OS sources -# - -# another convenient alias -kernel -a sys lang/adb sparcsim - -# The "sys" entry exists only to make symbolic links after checkout -sys -o sys/tools/make_links sys - -# Sub-directories of "bin" -awk bin/awk -csh bin/csh -diff bin/diff -make bin/make -sed bin/sed -sh bin/sh - -# Programs that live in "bin" -cat bin Makefile cat.c -chgrp bin Makefile chgrp.c -chmod bin Makefile chmod.c -cmp bin Makefile cmp.c -cp bin Makefile cp.c -date bin Makefile date.c -dd bin Makefile dd.c -df bin Makefile df.c -domainname bin Makefile domainname.c -du bin Makefile du.c -echo bin Makefile echo.c -ed bin Makefile ed.c -env bin Makefile env.c -expr bin Makefile expr.c -grep bin Makefile grep.c -hostid bin Makefile hostid.c -hostname bin Makefile hostname.c -kill bin Makefile kill.c -ldd bin Makefile ldd.c -line bin Makefile line.c -ln bin Makefile ln.c -login bin Makefile login.c -ls bin Makefile ls.c -mail bin Makefile mail.c -mkdir bin Makefile mkdir.c -mt bin Makefile mt.c -mv bin Makefile mv.c -newgrp bin Makefile newgrp.c -nice bin Makefile nice.c -od bin Makefile od.c -pagesize bin Makefile pagesize.c -passwd bin Makefile passwd.c -pr bin Makefile pr.c -ps bin Makefile ps.c -pwd bin Makefile pwd.c -rm bin Makefile rm.c -rmail bin Makefile rmail.c -rmdir bin Makefile rmdir.c -stty bin Makefile stty.c -su bin Makefile su.c -sync bin Makefile sync.c -tar bin Makefile tar.c -tee bin Makefile tee.c -test bin Makefile test.c -time bin Makefile time.c -wall bin Makefile wall.c -who bin Makefile who.c -write bin Makefile write.c - -# Sub-directories of "etc" -dump etc/dump -files etc/files -fsck etc/fsck -getty etc/getty -in.routed etc/in.routed -restore etc/restore -rpc.lockd etc/rpc.lockd -rpc.statd etc/rpc.statd - -# Programs that live in "etc" -arp etc Makefile arp.c -biod etc Makefile biod.c -chown etc Makefile chown.c -clri etc Makefile clri.c -dkinfo etc Makefile dkinfo.c -dmesg etc Makefile dmesg.c -fsirand etc Makefile fsirand.c -halt etc Makefile halt.c -ifconfig etc Makefile ifconfig.c -in.rlogind etc Makefile in.rlogind.c -in.rshd etc Makefile in.rshd.c -inetd etc Makefile inetd.c -init etc Makefile init.c -mkfs etc Makefile mkfs.c -mknod etc Makefile mknod.c -mount etc Makefile mount.c -newfs etc Makefile newfs.c -nfsd etc Makefile nfsd.c -portmap etc Makefile portmap.c -pstat etc Makefile pstat.c -reboot etc Makefile reboot.c -renice etc Makefile renice.c -rmt etc Makefile rmt.c -shutdown etc Makefile shutdown.c -syslogd etc Makefile syslogd.c -umount etc Makefile umount.c -update etc Makefile update.c -vipw etc Makefile vipw.c -ypbind etc Makefile ypbind.c - -# Sub-directories of "games" -adventure games/adventure -backgammon games/backgammon -battlestar games/battlestar -boggle games/boggle -chess games/chess -ching games/ching -cribbage games/cribbage -fortune games/fortune -hack games/hack -hangman games/hangman -hunt games/hunt -life games/life -mille games/mille -monop games/monop -quiz games/quiz -robots games/robots -sail games/sail -snake games/snake -trek games/trek - -# Programs that live in "games" -arithmetic games Makefile arithmetic.c -banner games Makefile banner.c -bcd games Makefile bcd.c -bj games Makefile bj.c -btlgammon games Makefile btlgammon.c -canfield games Makefile canfield.c -cfscores games Makefile cfscores.c -craps games Makefile craps.c -factor games Makefile factor.c -fish games Makefile fish.c -moo games Makefile moo.c -number games Makefile number.c -primes games Makefile primes.c -rain games Makefile rain.c -random games Makefile random.c -worm games Makefile worm.c -worms games Makefile worms.c -wump games Makefile wump.c - -# Sub-directories of "lang" -adb lang/adb -as lang/as -boot lang/boot -c2 lang/c2 -cgrdr lang/cgrdr -compile lang/compile -cpp lang/cpp -dbx lang/dbx -f77 lang/f77 -inline lang/inline -iropt lang/iropt -ld lang/ld -lint lang/lint -m4 lang/m4 -pascal lang/pascal -pcc lang/pcc -ratfor lang/ratfor -rtld lang/rtld -tcov lang/tcov -vroot lang/vroot - -# Programs that live in "lang" -ar lang Makefile ar.c -nm lang Makefile nm.c -ranlib lang Makefile ranlib.c -size lang Makefile size.c -strip lang Makefile strip.c -symorder lang Makefile symorder.c - -# Sub-directories of "lib" -csu lib/csu -libc lib/libc - -# Programs that live in "lib" -# NONE - -# Sub-directories of "lib/libc" -libc_compat lib/libc/compat -libc_crt lib/libc/crt -libc_des lib/libc/des -libc_gen lib/libc/gen -libc_net lib/libc/net -libc_inet lib/libc/inet -libc_rpc lib/libc/rpc -libc_stdio lib/libc/stdio -libc_sun lib/libc/sun -libc_sys lib/libc/sys -libc_yp lib/libc/yp - -# Programs that live in "lib/libc" -# NONE - -#Sub-directories of "local" -notes local/notes - -# Sub-directories of "man" -man1 man/man1 -man2 man/man2 -man3 man/man3 -man4 man/man4 -man5 man/man5 -man6 man/man6 -man7 man/man7 -man8 man/man8 -manl man/manl - -# Programs that live in "man" -# NONE - -# Sub-directories of "old" -old_compact old/compact -old_eyacc old/eyacc -old_filemerge old/filemerge -old_make old/make - -# Programs that live in "old" -old_analyze old Makefile analyze.c -old_prmail old Makefile prmail.c -old_pti old Makefile pti.c -old_syslog old Makefile syslog.c - -# Sub-directories of "ucb" -Mail ucb/Mail -compress ucb/compress -error ucb/error -ex ucb/ex -ftp ucb/ftp -gprof ucb/gprof -indent ucb/indent -lpr ucb/lpr -more ucb/more -msgs ucb/msgs -netstat ucb/netstat -rdist ucb/rdist -talk ucb/talk -tftp ucb/tftp -tset ucb/tset -vgrind ucb/vgrind - -# Programs that live in "ucb" -biff ucb Makefile biff.c -checknr ucb Makefile checknr.c -clear ucb Makefile clear.c -colcrt ucb Makefile colcrt.c -colrm ucb Makefile colrm.c -ctags ucb Makefile ctags.c -expand ucb Makefile expand.c -finger ucb Makefile finger.c -fold ucb Makefile fold.c -from ucb Makefile from.c -fsplit ucb Makefile fsplit.c -gcore ucb Makefile gcore.c -groups ucb Makefile groups.c -head ucb Makefile head.c -last ucb Makefile last.c -lastcomm ucb Makefile lastcomm.c -leave ucb Makefile leave.c -logger ucb Makefile logger.c -man_prog ucb Makefile man.c -mkstr ucb Makefile mkstr.c -printenv ucb Makefile printenv.c -quota ucb Makefile quota.c -rcp ucb Makefile rcp.c -rdate ucb Makefile rdate.c -rlogin ucb Makefile rlogin.c -rsh ucb Makefile rsh.c -rup ucb Makefile rup.c -ruptime ucb Makefile ruptime.c -rusers ucb Makefile rusers.c -rwho ucb Makefile rwho.c -sccs ucb Makefile sccs.c -script ucb Makefile script.c -soelim ucb Makefile soelim.c -strings ucb Makefile strings.c -tail ucb Makefile tail.c -tcopy ucb Makefile tcopy.c -telnet ucb Makefile telnet.c -ul ucb Makefile ul.c -unexpand ucb Makefile unexpand.c -unifdef ucb Makefile unifdef.c -users ucb Makefile users.c -vmstat ucb Makefile vmstat.c -w ucb Makefile w.c -wc ucb Makefile wc.c -what ucb Makefile what.c -whatis ucb Makefile whatis.c -whereis ucb Makefile whereis.c -whoami ucb Makefile whoami.c -whois ucb Makefile whois.c -xstr ucb Makefile xstr.c -yes ucb Makefile yes.c - -# Sub-directories of "usr.bin" -calendar usr.bin/calendar -cflow usr.bin/cflow -ctrace usr.bin/ctrace -cxref usr.bin/cxref -dc usr.bin/dc -des usr.bin/des -diff3 usr.bin/diff3 -sun_eqn usr.bin/eqn -file usr.bin/file -find usr.bin/find -graph usr.bin/graph -lex usr.bin/lex -sun_neqn usr.bin/neqn -sun_nroff usr.bin/nroff -sun_plot usr.bin/plot -prof usr.bin/prof -refer usr.bin/refer -rpcgen usr.bin/rpcgen -spell usr.bin/spell -sun_tbl usr.bin/tbl -tip usr.bin/tip -trace usr.bin/trace -sun_troff usr.bin/troff -uucp usr.bin/uucp -xsend usr.bin/xsend -yacc usr.bin/yacc - -# Programs that live in "usr.bin" -basename usr.bin Makefile basename.c -bc usr.bin Makefile bc.c -cal usr.bin Makefile cal.c -cb usr.bin Makefile cb.c -checkeq usr.bin Makefile checkeq.c -chkey usr.bin Makefile chkey.c -click usr.bin Makefile click.c -col usr.bin Makefile col.c -comm usr.bin Makefile comm.c -cpio usr.bin Makefile cpio.c -crypt usr.bin Makefile crypt.c -csplit usr.bin Makefile csplit.c -cut usr.bin Makefile cut.c -deroff usr.bin Makefile deroff.c -egrep usr.bin Makefile egrep.c -fgrep usr.bin Makefile fgrep.c -getopt usr.bin Makefile getopt.c -id usr.bin Makefile id.c -installcmd usr.bin Makefile installcmd.c -iostat usr.bin Makefile iostat.c -ipcrm usr.bin Makefile ipcrm.c -ipcs usr.bin Makefile ipcs.c -join usr.bin Makefile join.c -keylogin usr.bin Makefile keylogin.c -logname usr.bin Makefile logname.c -look usr.bin Makefile look.c -mesg usr.bin Makefile mesg.c -nl usr.bin Makefile nl.c -pack usr.bin Makefile pack.c -paste usr.bin Makefile paste.c -ptx usr.bin Makefile ptx.c -rev usr.bin Makefile rev.c -screenblank usr.bin Makefile screenblank.c -sdiff usr.bin Makefile sdiff.c -sleep usr.bin Makefile sleep.c -sort usr.bin Makefile sort.c -spline usr.bin Makefile spline.c -split usr.bin Makefile split.c -sum usr.bin Makefile sum.c -touch usr.bin Makefile touch.c -tr usr.bin Makefile tr.c -tsort usr.bin Makefile tsort.c -tty usr.bin Makefile tty.c -uniq usr.bin Makefile uniq.c -units usr.bin Makefile units.c -unpack usr.bin Makefile unpack.c -xargs usr.bin Makefile xargs.c -ypcat usr.bin Makefile ypcat.c -ypmatch usr.bin Makefile ypmatch.c -yppasswd usr.bin Makefile yppasswd.c -ypwhich usr.bin Makefile ypwhich.c - -# Sub-directories of "usr.etc" -automount usr.etc/automount -c2convert usr.etc/c2convert -config usr.etc/config -cron usr.etc/cron -eeprom usr.etc/eeprom -etherfind usr.etc/etherfind -format usr.etc/format -htable usr.etc/htable -implog usr.etc/implog -in.ftpd -a usr.etc/in.ftpd ucb/ftp -in.named usr.etc/in.named -in.rwhod usr.etc/in.rwhod -keyserv usr.etc/keyserv -ndbootd usr.etc/ndbootd -praudit usr.etc/praudit -rexd usr.etc/rexd -rpc.bootparamd usr.etc/rpc.bootparamd -termcap usr.etc/termcap -upgrade usr.etc/upgrade -yp usr.etc/yp -zic usr.etc/zic - -# Programs that live in "usr.etc" -ac usr.etc Makefile ac.c -accton usr.etc Makefile accton.c -audit usr.etc Makefile audit.c -auditd usr.etc Makefile auditd.c -catman usr.etc Makefile catman.c -chroot usr.etc Makefile chroot.c -dcheck usr.etc Makefile dcheck.c -devnm usr.etc Makefile devnm.c -dumpfs usr.etc Makefile dumpfs.c -edquota usr.etc Makefile edquota.c -exportfs usr.etc Makefile exportfs.c -foption usr.etc Makefile foption.c -gettable usr.etc Makefile gettable.c -grpck usr.etc Makefile grpck.c -icheck usr.etc Makefile icheck.c -in.comsat usr.etc Makefile in.comsat.c -in.fingerd usr.etc Makefile in.fingerd.c -in.rexecd usr.etc Makefile in.rexecd.c -in.telnetd usr.etc Makefile in.telnetd.c -in.tnamed usr.etc Makefile in.tnamed.c -kgmon usr.etc Makefile kgmon.c -link usr.etc Makefile link.c -mkfile usr.etc Makefile mkfile.c -mkproto usr.etc Makefile mkproto.c -mount_lo usr.etc Makefile mount_lo.c -ncheck usr.etc Makefile ncheck.c -nfsstat usr.etc Makefile nfsstat.c -ping usr.etc Makefile ping.c -pwck usr.etc Makefile pwck.c -quot usr.etc Makefile quot.c -quotacheck usr.etc Makefile quotacheck.c -quotaon usr.etc Makefile quotaon.c -rarpd usr.etc Makefile rarpd.c -repquota usr.etc Makefile repquota.c -route usr.etc Makefile route.c -rpc.etherd usr.etc Makefile rpc.etherd.c -rpc.mountd usr.etc Makefile rpc.mountd.c -rpc.pwdauthd usr.etc Makefile rpc.pwdauthd.c -rpc.rquotad usr.etc Makefile rpc.rquotad.c -rpc.rstatd usr.etc Makefile rpc.rstatd.c -rpc.rusersd usr.etc Makefile rpc.rusersd.c -rpc.rwalld usr.etc Makefile rpc.rwalld.c -rpc.sprayd usr.etc Makefile rpc.sprayd.c -rpc.yppasswdd usr.etc Makefile rpc.yppasswdd.c -rpc.ypupdated usr.etc Makefile rpc.ypupdated.c -rpcinfo usr.etc Makefile rpcinfo.c -rwall usr.etc Makefile rwall.c -sa usr.etc Makefile sa.c -savecore usr.etc Makefile savecore.c -showmount usr.etc Makefile showmount.c -spray usr.etc Makefile spray.c -swapon usr.etc Makefile swapon.c -trpt usr.etc Makefile trpt.c -tunefs usr.etc Makefile tunefs.c -unlink usr.etc Makefile unlink.c - -# Sub-directories of "usr.lib" -bb_count usr.lib/bb_count -fixedwidthfonts usr.lib/fixedwidthfonts -libcurses usr.lib/libcurses -libdbm usr.lib/libdbm -libg usr.lib/libg -libkvm usr.lib/libkvm -libln usr.lib/libln -liblwp usr.lib/liblwp -libm usr.lib/libm -libmp usr.lib/libmp -libpixrect usr.lib/libpixrect -libplot usr.lib/libplot -libresolv usr.lib/libresolv -librpcsvc usr.lib/librpcsvc -libtermlib usr.lib/libtermlib -liby usr.lib/liby -me usr.lib/me -ms usr.lib/ms -sendmail usr.lib/sendmail -sun_tmac usr.lib/tmac -vfont usr.lib/vfont - -# Programs that live in "usr.lib" -getNAME usr.lib Makefile getNAME -makekey usr.lib Makefile makekey - -# Sub-directories of "5bin" -5diff3 5bin/diff3 -5m4 5bin/m4 - -# Sub-directories of "5bin", but use sources from other places -5cxref -a 5bin/cxref usr.bin/cxref -5sed -a 5bin/sed bin/sed -5lint -a 5bin/lint lang/pcc lang/lint - -# Programs that live in "5bin" -5banner 5bin Makefile banner.c -5cat 5bin Makefile cat.c -5du 5bin Makefile du.c -5echo 5bin Makefile echo.c -5expr 5bin Makefile expr.c -5ls 5bin Makefile ls.c -5nohup 5bin Makefile nohup.c -5od 5bin Makefile od.c -5pg 5bin Makefile pg.c -5pr 5bin Makefile pr.c -5sum 5bin Makefile sum.c -5tabs 5bin Makefile tabs.c -5time 5bin Makefile time.c -5tr 5bin Makefile tr.c -5uname 5bin Makefile uname.c - -# Programs that live in "5bin", but use sources from other places -5chmod -a 5bin/Makefile bin/chmod.c -5date -a 5bin/Makefile bin/date.c -5grep -a 5bin/Makefile bin/grep.c -5stty -a 5bin/Makefile bin/stty.c -5col -a 5bin/Makefile usr.bin/col.c -5sort -a 5bin/Makefile usr.bin/sort.c -5touch -a 5bin/Makefile usr.bin/touch.c - -# Sub-directories of "5lib" -5compile 5lib/compile -5libcurses 5lib/libcurses -5liby 5lib/liby -5terminfo 5lib/terminfo - -# Programs that live in "5lib" -# NONE diff --git a/gnu/usr.bin/cvs/examples/notify b/gnu/usr.bin/cvs/examples/notify deleted file mode 100644 index 2be867e4f2e..00000000000 --- a/gnu/usr.bin/cvs/examples/notify +++ /dev/null @@ -1,11 +0,0 @@ -# The "notify" file controls where notifications from watches set by -# "cvs watch add" or "cvs edit" are sent. The first entry on a line is -# a regular expression which is tested against the directory that the -# change is being made to, relative to the $CVSROOT. If it matches, -# then the remainder of the line is a filter program that should contain -# one occurrence of %s for the user to notify, and information on its -# standard input. -# -# "ALL" or "DEFAULT" can be used in place of the regular expression. -# -ALL mail %s -s "CVS notification" diff --git a/gnu/usr.bin/cvs/examples/rcsinfo b/gnu/usr.bin/cvs/examples/rcsinfo deleted file mode 100644 index 1eb161089ca..00000000000 --- a/gnu/usr.bin/cvs/examples/rcsinfo +++ /dev/null @@ -1,18 +0,0 @@ -# -#ident "@(#)cvs/examples:$Name: $:$Id: rcsinfo,v 1.1.1.2 1996/01/30 00:19:22 tholo Exp $" -# -# The "rcsinfo" file is used to control templates with which the editor -# is invoked on commit and import. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is the name of the file that contains the template. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". -# -DEFAULT $CVSROOT/CVSROOT/rcstemplate diff --git a/gnu/usr.bin/cvs/examples/rcstemplate b/gnu/usr.bin/cvs/examples/rcstemplate deleted file mode 100644 index c9a2d1eb248..00000000000 --- a/gnu/usr.bin/cvs/examples/rcstemplate +++ /dev/null @@ -1,7 +0,0 @@ -CVS: -CVS: WARNING: You are commiting a change to the main source repository. -CVS: -CVS: This change will be immediately available to all other users -CVS: of this repository! Please be sure your changes have been -CVS: adequately tested. -CVS: diff --git a/gnu/usr.bin/cvs/examples/taginfo b/gnu/usr.bin/cvs/examples/taginfo deleted file mode 100644 index 04ebfddaac3..00000000000 --- a/gnu/usr.bin/cvs/examples/taginfo +++ /dev/null @@ -1,25 +0,0 @@ -# -#ident "@(#)cvs/examples:$Name: $:$Id: taginfo,v 1.1.1.2 1996/01/30 00:19:23 tholo Exp $" -# -# The "taginfo" file is used to control pre-tag checks. -# The filter on the right is invoked with the following arguments: -# -# $1 -- tagname -# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d -# $3 -- repository -# $4-> file revision [file revision ...] -# -# A non-zero exit of the filter program will cause the tag to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". -# -DEFAULT $CVSROOT/CVSROOT/tag_logging_program diff --git a/gnu/usr.bin/cvs/examples/unwrap b/gnu/usr.bin/cvs/examples/unwrap deleted file mode 100644 index 99d48acb996..00000000000 --- a/gnu/usr.bin/cvs/examples/unwrap +++ /dev/null @@ -1,21 +0,0 @@ -#! /bin/sh -# -# unwrap - extract the combined package (created with wrap) -# -#ident "@(#)cvs/examples:$Name: $:$Id: unwrap,v 1.1.1.1 1996/01/30 00:19:26 tholo Exp $" - -# move the file to a new name with an extension -rm -rf $1.cvswrap -mv $1 $1.cvswrap - -# untar the file - -if `gzip -t $1.cvswrap > /dev/null 2>&1` -then - gzcat -d $1.cvswrap | gnutar --preserve --sparse -x -f - -else - gnutar --preserve --sparse -x -f $1.cvswrap -fi - -# remove the original -rm -rf $1.cvswrap diff --git a/gnu/usr.bin/cvs/examples/wrap b/gnu/usr.bin/cvs/examples/wrap deleted file mode 100644 index 4448771a0a9..00000000000 --- a/gnu/usr.bin/cvs/examples/wrap +++ /dev/null @@ -1,21 +0,0 @@ -#! /bin/sh -# -# wrap - Combine a directory into a single tar package. -# -#ident "@(#)cvs/examples:$Name: $:$Id: wrap,v 1.1.1.1 1996/01/30 00:19:26 tholo Exp $" - -# This script is always called with the current directory set to -# where the file to be combined exists. but i may get called with a -# path to where cvs first started executing. (this probably should be -# fixed in cvs) so strip out all of the directory information. The -# first sed expression will only work if the path has a leading / -# if it doesn't the one in the if statement will work. -DIRNAME=`echo $1 | sed -e "s|/.*/||g"` -if [ ! -d $DIRNAME ] ; then - DIRNAME=`echo $1 | sed -e "s|.*/||g"` -fi -# -# Now tar up the directory but we now will only get a relative path -# even if the user did a cvs commit . at the top. -# -gnutar --preserve --sparse -cf - $DIRNAME | gzip --no-name --best -c > $2 diff --git a/gnu/usr.bin/cvs/lib/getdate.c b/gnu/usr.bin/cvs/lib/getdate.c index b0f9411cabb..20f442f1ceb 100644 --- a/gnu/usr.bin/cvs/lib/getdate.c +++ b/gnu/usr.bin/cvs/lib/getdate.c @@ -1,3 +1,26 @@ + +/* A Bison parser, made from ./getdate.y + by Bison version A2.5 (Andrew Consortium) + */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define tAGO 258 +#define tDAY 259 +#define tDAYZONE 260 +#define tID 261 +#define tMERIDIAN 262 +#define tMINUTE_UNIT 263 +#define tMONTH 264 +#define tMONTH_UNIT 265 +#define tSEC_UNIT 266 +#define tSNUMBER 267 +#define tUNUMBER 268 +#define tZONE 269 +#define tDST 270 + +#line 1 "./getdate.y" + /* ** Originally written by Steven M. Bellovin while ** at the University of North Carolina at Chapel Hill. Later tweaked by @@ -20,12 +43,6 @@ #endif #endif -#if STDC_HEADERS -#include -#else -char *malloc (), *realloc (); -#endif - /* Since the code of getdate.y is not included in the Emacs executable itself, there is no need to #define static in this file. Even if the code were included in the Emacs executable, it probably @@ -90,119 +107,1226 @@ struct timeb { #include #endif -/* Some old versions of bison generate parsers that use bcopy. - That loses on systems that don't provide the function, so we have - to redefine it here. */ -#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy) -#define bcopy(from, to, len) memcpy ((to), (from), (len)) +/* Some old versions of bison generate parsers that use bcopy. + That loses on systems that don't provide the function, so we have + to redefine it here. */ +#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy) +#define bcopy(from, to, len) memcpy ((to), (from), (len)) +#endif + +#if defined (STDC_HEADERS) +#include +#endif + +#if defined (HAVE_ALLOCA_H) +#include +#endif + +extern struct tm *gmtime(); +extern struct tm *localtime(); + +#define yyparse getdate_yyparse +#define yylex getdate_yylex +#define yyerror getdate_yyerror + +#if !defined(lint) && !defined(SABER) +static char RCS[] = "$CVSid: @(#)getdate.y 1.11 94/09/21 $"; +#endif /* !defined(lint) && !defined(SABER) */ + +static int yylex (); +static int yyerror (); + +#define EPOCH 1970 +#define HOUR(x) ((time_t)(x) * 60) +#define SECSPERDAY (24L * 60L * 60L) + + +/* +** An entry in the lexical lookup table. +*/ +typedef struct _TABLE { + char *name; + int type; + time_t value; +} TABLE; + + +/* +** Daylight-savings mode: on, off, or not yet known. +*/ +typedef enum _DSTMODE { + DSTon, DSToff, DSTmaybe +} DSTMODE; + +/* +** Meridian: am, pm, or 24-hour style. +*/ +typedef enum _MERIDIAN { + MERam, MERpm, MER24 +} MERIDIAN; + + +/* +** Global variables. We could get rid of most of these by using a good +** union as the yacc stack. (This routine was originally written before +** yacc had the %union construct.) Maybe someday; right now we only use +** the %union very rarely. +*/ +static char *yyInput; +static DSTMODE yyDSTmode; +static time_t yyDayOrdinal; +static time_t yyDayNumber; +static int yyHaveDate; +static int yyHaveDay; +static int yyHaveRel; +static int yyHaveTime; +static int yyHaveZone; +static time_t yyTimezone; +static time_t yyDay; +static time_t yyHour; +static time_t yyMinutes; +static time_t yyMonth; +static time_t yySeconds; +static time_t yyYear; +static MERIDIAN yyMeridian; +static time_t yyRelMonth; +static time_t yyRelSeconds; + + +#line 175 "./getdate.y" +typedef union { + time_t Number; + enum _MERIDIAN Meridian; +} YYSTYPE; +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 52 +#define YYFLAG -32768 +#define YYNTBASE 19 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 270 ? yytranslate[x] : 29) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 17, 2, 2, 18, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 1, 4, 6, 8, 10, 12, 14, 16, 19, + 24, 29, 36, 43, 45, 47, 50, 52, 55, 58, + 62, 68, 72, 76, 79, 84, 87, 91, 94, 96, + 99, 102, 104, 107, 110, 112, 115, 118, 120, 122, + 123 +}; + +static const short yyrhs[] = { -1, + 19, 20, 0, 21, 0, 22, 0, 24, 0, 23, + 0, 25, 0, 27, 0, 13, 7, 0, 13, 16, + 13, 28, 0, 13, 16, 13, 12, 0, 13, 16, + 13, 16, 13, 28, 0, 13, 16, 13, 16, 13, + 12, 0, 14, 0, 5, 0, 14, 15, 0, 4, + 0, 4, 17, 0, 13, 4, 0, 13, 18, 13, + 0, 13, 18, 13, 18, 13, 0, 13, 12, 12, + 0, 13, 9, 12, 0, 9, 13, 0, 9, 13, + 17, 13, 0, 13, 9, 0, 13, 9, 13, 0, + 26, 3, 0, 26, 0, 13, 8, 0, 12, 8, + 0, 8, 0, 12, 11, 0, 13, 11, 0, 11, + 0, 12, 10, 0, 13, 10, 0, 10, 0, 13, + 0, 0, 7, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 189, 190, 193, 196, 199, 202, 205, 208, 211, 217, + 223, 230, 236, 246, 250, 254, 261, 265, 269, 275, + 279, 284, 290, 296, 300, 305, 309, 316, 320, 323, + 326, 329, 332, 335, 338, 341, 344, 347, 352, 379, + 382 +}; +#endif + + +#if YYDEBUG != 0 + +static const char * const yytname[] = { "$","error","$undefined.","tAGO","tDAY", +"tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT", +"tSNUMBER","tUNUMBER","tZONE","tDST","':'","','","'/'","spec","item","time", +"zone","day","date","rel","relunit","number","o_merid", NULL +}; +#endif + +static const short yyr1[] = { 0, + 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, + 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, + 24, 24, 24, 24, 24, 24, 24, 25, 25, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 27, 28, + 28 +}; + +static const short yyr2[] = { 0, + 0, 2, 1, 1, 1, 1, 1, 1, 2, 4, + 4, 6, 6, 1, 1, 2, 1, 2, 2, 3, + 5, 3, 3, 2, 4, 2, 3, 2, 1, 2, + 2, 1, 2, 2, 1, 2, 2, 1, 1, 0, + 1 +}; + +static const short yydefact[] = { 1, + 0, 17, 15, 32, 0, 38, 35, 0, 39, 14, + 2, 3, 4, 6, 5, 7, 29, 8, 18, 24, + 31, 36, 33, 19, 9, 30, 26, 37, 34, 0, + 0, 0, 16, 28, 0, 23, 27, 22, 40, 20, + 25, 41, 11, 0, 10, 0, 40, 21, 13, 12, + 0, 0 +}; + +static const short yydefgoto[] = { 1, + 11, 12, 13, 14, 15, 16, 17, 18, 45 +}; + +static const short yypact[] = {-32768, + 0, -1,-32768,-32768, 4,-32768,-32768, 25, 11, -8, +-32768,-32768,-32768,-32768,-32768,-32768, 21,-32768,-32768, 9, +-32768,-32768,-32768,-32768,-32768,-32768, -10,-32768,-32768, 16, + 19, 24,-32768,-32768, 26,-32768,-32768,-32768, 18, 13, +-32768,-32768,-32768, 27,-32768, 28, -6,-32768,-32768,-32768, + 38,-32768 +}; + +static const short yypgoto[] = {-32768, +-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -5 +}; + + +#define YYLAST 42 + + +static const short yytable[] = { 51, + 42, 36, 37, 2, 3, 49, 33, 4, 5, 6, + 7, 8, 9, 10, 24, 19, 20, 25, 26, 27, + 28, 29, 30, 34, 42, 35, 31, 38, 32, 43, + 46, 39, 21, 44, 22, 23, 40, 52, 41, 47, + 48, 50 +}; + +static const short yycheck[] = { 0, + 7, 12, 13, 4, 5, 12, 15, 8, 9, 10, + 11, 12, 13, 14, 4, 17, 13, 7, 8, 9, + 10, 11, 12, 3, 7, 17, 16, 12, 18, 12, + 18, 13, 8, 16, 10, 11, 13, 0, 13, 13, + 13, 47 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/share/bison.simple" + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef alloca +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) +#include +#else /* not sparc */ +#if defined (MSDOS) && !defined (__TURBOC__) +#include +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +#include + #pragma alloca +#else /* not MSDOS, __TURBOC__, or _AIX */ +#ifdef __hpux +#ifdef __cplusplus +extern "C" { +void *alloca (unsigned int); +}; +#else /* not __cplusplus */ +void *alloca (); +#endif /* not __cplusplus */ +#endif /* __hpux */ +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc. */ +#endif /* not GNU C. */ +#endif /* alloca not defined. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT return(0) +#define YYABORT return(1) +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +int yyparse (void); +#endif + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (from, to, count) + char *from; + char *to; + int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *from, char *to, int count) +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 192 "/usr/share/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#else +#define YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#endif + +int +yyparse(YYPARSE_PARAM) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; + yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); + yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 3: +#line 193 "./getdate.y" +{ + yyHaveTime++; + ; + break;} +case 4: +#line 196 "./getdate.y" +{ + yyHaveZone++; + ; + break;} +case 5: +#line 199 "./getdate.y" +{ + yyHaveDate++; + ; + break;} +case 6: +#line 202 "./getdate.y" +{ + yyHaveDay++; + ; + break;} +case 7: +#line 205 "./getdate.y" +{ + yyHaveRel++; + ; + break;} +case 9: +#line 211 "./getdate.y" +{ + yyHour = yyvsp[-1].Number; + yyMinutes = 0; + yySeconds = 0; + yyMeridian = yyvsp[0].Meridian; + ; + break;} +case 10: +#line 217 "./getdate.y" +{ + yyHour = yyvsp[-3].Number; + yyMinutes = yyvsp[-1].Number; + yySeconds = 0; + yyMeridian = yyvsp[0].Meridian; + ; + break;} +case 11: +#line 223 "./getdate.y" +{ + yyHour = yyvsp[-3].Number; + yyMinutes = yyvsp[-1].Number; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60); + ; + break;} +case 12: +#line 230 "./getdate.y" +{ + yyHour = yyvsp[-5].Number; + yyMinutes = yyvsp[-3].Number; + yySeconds = yyvsp[-1].Number; + yyMeridian = yyvsp[0].Meridian; + ; + break;} +case 13: +#line 236 "./getdate.y" +{ + yyHour = yyvsp[-5].Number; + yyMinutes = yyvsp[-3].Number; + yySeconds = yyvsp[-1].Number; + yyMeridian = MER24; + yyDSTmode = DSToff; + yyTimezone = - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60); + ; + break;} +case 14: +#line 246 "./getdate.y" +{ + yyTimezone = yyvsp[0].Number; + yyDSTmode = DSToff; + ; + break;} +case 15: +#line 250 "./getdate.y" +{ + yyTimezone = yyvsp[0].Number; + yyDSTmode = DSTon; + ; + break;} +case 16: +#line 255 "./getdate.y" +{ + yyTimezone = yyvsp[-1].Number; + yyDSTmode = DSTon; + ; + break;} +case 17: +#line 261 "./getdate.y" +{ + yyDayOrdinal = 1; + yyDayNumber = yyvsp[0].Number; + ; + break;} +case 18: +#line 265 "./getdate.y" +{ + yyDayOrdinal = 1; + yyDayNumber = yyvsp[-1].Number; + ; + break;} +case 19: +#line 269 "./getdate.y" +{ + yyDayOrdinal = yyvsp[-1].Number; + yyDayNumber = yyvsp[0].Number; + ; + break;} +case 20: +#line 275 "./getdate.y" +{ + yyMonth = yyvsp[-2].Number; + yyDay = yyvsp[0].Number; + ; + break;} +case 21: +#line 279 "./getdate.y" +{ + yyMonth = yyvsp[-4].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + ; + break;} +case 22: +#line 284 "./getdate.y" +{ + /* ISO 8601 format. yyyy-mm-dd. */ + yyYear = yyvsp[-2].Number; + yyMonth = -yyvsp[-1].Number; + yyDay = -yyvsp[0].Number; + ; + break;} +case 23: +#line 290 "./getdate.y" +{ + /* e.g. 17-JUN-1992. */ + yyDay = yyvsp[-2].Number; + yyMonth = yyvsp[-1].Number; + yyYear = -yyvsp[0].Number; + ; + break;} +case 24: +#line 296 "./getdate.y" +{ + yyMonth = yyvsp[-1].Number; + yyDay = yyvsp[0].Number; + ; + break;} +case 25: +#line 300 "./getdate.y" +{ + yyMonth = yyvsp[-3].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + ; + break;} +case 26: +#line 305 "./getdate.y" +{ + yyMonth = yyvsp[0].Number; + yyDay = yyvsp[-1].Number; + ; + break;} +case 27: +#line 309 "./getdate.y" +{ + yyMonth = yyvsp[-1].Number; + yyDay = yyvsp[-2].Number; + yyYear = yyvsp[0].Number; + ; + break;} +case 28: +#line 316 "./getdate.y" +{ + yyRelSeconds = -yyRelSeconds; + yyRelMonth = -yyRelMonth; + ; + break;} +case 30: +#line 323 "./getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L; + ; + break;} +case 31: +#line 326 "./getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L; + ; + break;} +case 32: +#line 329 "./getdate.y" +{ + yyRelSeconds += yyvsp[0].Number * 60L; + ; + break;} +case 33: +#line 332 "./getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number; + ; + break;} +case 34: +#line 335 "./getdate.y" +{ + yyRelSeconds += yyvsp[-1].Number; + ; + break;} +case 35: +#line 338 "./getdate.y" +{ + yyRelSeconds++; + ; + break;} +case 36: +#line 341 "./getdate.y" +{ + yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; + ; + break;} +case 37: +#line 344 "./getdate.y" +{ + yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; + ; + break;} +case 38: +#line 347 "./getdate.y" +{ + yyRelMonth += yyvsp[0].Number; + ; + break;} +case 39: +#line 352 "./getdate.y" +{ + if (yyHaveTime && yyHaveDate && !yyHaveRel) + yyYear = yyvsp[0].Number; + else { + if(yyvsp[0].Number>10000) { + yyHaveDate++; + yyDay= (yyvsp[0].Number)%100; + yyMonth= (yyvsp[0].Number/100)%100; + yyYear = yyvsp[0].Number/10000; + } + else { + yyHaveTime++; + if (yyvsp[0].Number < 100) { + yyHour = yyvsp[0].Number; + yyMinutes = 0; + } + else { + yyHour = yyvsp[0].Number / 100; + yyMinutes = yyvsp[0].Number % 100; + } + yySeconds = 0; + yyMeridian = MER24; + } + } + ; + break;} +case 40: +#line 379 "./getdate.y" +{ + yyval.Meridian = MER24; + ; + break;} +case 41: +#line 382 "./getdate.y" +{ + yyval.Meridian = yyvsp[0].Meridian; + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 487 "/usr/share/bison.simple" + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); #endif -#if defined (STDC_HEADERS) -#include -#endif + yychar = YYEMPTY; + } -#if defined (HAVE_ALLOCA_H) -#include -#endif + /* Else will try to reuse lookahead token + after shifting the error token. */ -extern struct tm *gmtime(); -extern struct tm *localtime(); + yyerrstatus = 3; /* Each real token shifted decrements this */ -#define yyparse getdate_yyparse -#define yylex getdate_yylex -#define yyerror getdate_yyerror + goto yyerrhandle; -#if !defined(lint) && !defined(SABER) -static char RCS[] = "$CVSid: @(#)getdate.y 1.11 94/09/21 $"; -#endif /* !defined(lint) && !defined(SABER) */ +yyerrdefault: /* current state does not do anything special for the error token. */ -static int yylex (); -static int yyerror (); +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif -#define EPOCH 1970 -#define HOUR(x) ((time_t)(x) * 60) -#define SECSPERDAY (24L * 60L * 60L) +yyerrpop: /* pop the current state because it cannot handle the error token */ + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif -/* -** An entry in the lexical lookup table. -*/ -typedef struct _TABLE { - char *name; - int type; - time_t value; -} TABLE; +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif +yyerrhandle: -/* -** Daylight-savings mode: on, off, or not yet known. -*/ -typedef enum _DSTMODE { - DSTon, DSToff, DSTmaybe -} DSTMODE; + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; -/* -** Meridian: am, pm, or 24-hour style. -*/ -typedef enum _MERIDIAN { - MERam, MERpm, MER24 -} MERIDIAN; + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; -/* -** Global variables. We could get rid of most of these by using a good -** union as the yacc stack. (This routine was originally written before -** yacc had the %union construct.) Maybe someday; right now we only use -** the %union very rarely. -*/ -static char *yyInput; -static DSTMODE yyDSTmode; -static time_t yyDayOrdinal; -static time_t yyDayNumber; -static int yyHaveDate; -static int yyHaveDay; -static int yyHaveRel; -static int yyHaveTime; -static int yyHaveZone; -static time_t yyTimezone; -static time_t yyDay; -static time_t yyHour; -static time_t yyMinutes; -static time_t yyMonth; -static time_t yySeconds; -static time_t yyYear; -static MERIDIAN yyMeridian; -static time_t yyRelMonth; -static time_t yyRelSeconds; + if (yyn == YYFINAL) + YYACCEPT; +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif -typedef union { - time_t Number; - enum _MERIDIAN Meridian; -} YYSTYPE; -# define tAGO 257 -# define tDAY 258 -# define tDAYZONE 259 -# define tID 260 -# define tMERIDIAN 261 -# define tMINUTE_UNIT 262 -# define tMONTH 263 -# define tMONTH_UNIT 264 -# define tSEC_UNIT 265 -# define tSNUMBER 266 -# define tUNUMBER 267 -# define tZONE 268 -# define tDST 269 -#define yyclearin yychar = -1 -#define yyerrok yyerrflag = 0 -extern int yychar; -extern int yyerrflag; -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 150 + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; #endif -YYSTYPE yylval, yyval; -# define YYERRCODE 256 + yystate = yyn; + goto yynewstate; +} +#line 387 "./getdate.y" /* Month and day table. */ @@ -726,7 +1850,7 @@ get_date(p, now) yyInput = p; if (now == NULL) { now = &ftz; - (void)time(&nowtime); + (void)time (&nowtime); if (! (tm = gmtime (&nowtime))) return -1; @@ -818,800 +1942,3 @@ main(ac, av) /* NOTREACHED */ } #endif /* defined(TEST) */ -int yyexca[] ={ --1, 1, - 0, -1, - -2, 0, - }; -# define YYNPROD 42 -# define YYLAST 228 -int yyact[]={ - - 13, 11, 22, 28, 16, 12, 18, 17, 15, 9, - 10, 38, 39, 20, 48, 44, 47, 46, 36, 43, - 50, 32, 35, 34, 33, 29, 37, 31, 41, 45, - 40, 30, 14, 8, 7, 6, 5, 4, 3, 2, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 21, 0, 0, 19, 25, 24, 27, - 26, 23, 44, 0, 0, 0, 0, 42 }; -int yypact[]={ - - -1000, -258, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -45, - -266, -1000, -242, -13, -230, -241, -1000, -1000, -1000, -1000, - -245, -1000, -249, -240, -255, -1000, -1000, -1000, -1000, -14, - -1000, -1000, -1000, -1000, -1000, -39, -18, -1000, -1000, -1000, - -250, -1000, -1000, -251, -1000, -253, -1000, -246, -1000, -1000, - -1000 }; -int yypgo[]={ - - 0, 28, 40, 39, 38, 37, 36, 35, 34, 33, - 32 }; -int yyr1[]={ - - 0, 2, 2, 3, 3, 3, 3, 3, 3, 4, - 4, 4, 4, 4, 5, 5, 5, 7, 7, 7, - 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, - 1, 1 }; -int yyr2[]={ - - 0, 0, 4, 3, 3, 3, 3, 3, 2, 5, - 9, 9, 13, 13, 3, 3, 5, 3, 5, 5, - 7, 11, 7, 7, 5, 9, 5, 7, 5, 2, - 5, 5, 3, 5, 5, 3, 5, 5, 3, 3, - 1, 3 }; -int yychk[]={ - - -1000, -2, -3, -4, -5, -6, -7, -8, -9, 267, - 268, 259, 263, 258, -10, 266, 262, 265, 264, 261, - 58, 258, 47, 266, 263, 262, 265, 264, 269, 267, - 44, 257, 262, 265, 264, 267, 267, 266, 266, 267, - 44, -1, 266, 58, 261, 47, 267, 267, 267, -1, - 266 }; -int yydef[]={ - - 1, -2, 2, 3, 4, 5, 6, 7, 8, 39, - 14, 15, 0, 17, 29, 0, 32, 35, 38, 9, - 0, 19, 0, 0, 26, 30, 34, 37, 16, 24, - 18, 28, 31, 33, 36, 40, 20, 22, 23, 27, - 0, 10, 11, 0, 41, 0, 25, 40, 21, 12, - 13 }; -typedef struct { char *t_name; int t_val; } yytoktype; -#ifndef YYDEBUG -# define YYDEBUG 0 /* don't allow debugging */ -#endif - -#if YYDEBUG - -yytoktype yytoks[] = -{ - "tAGO", 257, - "tDAY", 258, - "tDAYZONE", 259, - "tID", 260, - "tMERIDIAN", 261, - "tMINUTE_UNIT", 262, - "tMONTH", 263, - "tMONTH_UNIT", 264, - "tSEC_UNIT", 265, - "tSNUMBER", 266, - "tUNUMBER", 267, - "tZONE", 268, - "tDST", 269, - "-unknown-", -1 /* ends search */ -}; - -char * yyreds[] = -{ - "-no such reduction-", - "spec : /* empty */", - "spec : spec item", - "item : time", - "item : zone", - "item : date", - "item : day", - "item : rel", - "item : number", - "time : tUNUMBER tMERIDIAN", - "time : tUNUMBER ':' tUNUMBER o_merid", - "time : tUNUMBER ':' tUNUMBER tSNUMBER", - "time : tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid", - "time : tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER", - "zone : tZONE", - "zone : tDAYZONE", - "zone : tZONE tDST", - "day : tDAY", - "day : tDAY ','", - "day : tUNUMBER tDAY", - "date : tUNUMBER '/' tUNUMBER", - "date : tUNUMBER '/' tUNUMBER '/' tUNUMBER", - "date : tUNUMBER tSNUMBER tSNUMBER", - "date : tUNUMBER tMONTH tSNUMBER", - "date : tMONTH tUNUMBER", - "date : tMONTH tUNUMBER ',' tUNUMBER", - "date : tUNUMBER tMONTH", - "date : tUNUMBER tMONTH tUNUMBER", - "rel : relunit tAGO", - "rel : relunit", - "relunit : tUNUMBER tMINUTE_UNIT", - "relunit : tSNUMBER tMINUTE_UNIT", - "relunit : tMINUTE_UNIT", - "relunit : tSNUMBER tSEC_UNIT", - "relunit : tUNUMBER tSEC_UNIT", - "relunit : tSEC_UNIT", - "relunit : tSNUMBER tMONTH_UNIT", - "relunit : tUNUMBER tMONTH_UNIT", - "relunit : tMONTH_UNIT", - "number : tUNUMBER", - "o_merid : /* empty */", - "o_merid : tMERIDIAN", -}; -#endif /* YYDEBUG */ -/* @(#)yaccpar 1.10 89/04/04 SMI; from S5R3 1.10 */ - -/* -** Skeleton parser driver for yacc output -*/ - -/* -** yacc user known macros and defines -*/ -#define YYERROR goto yyerrlab -#define YYACCEPT { free(yys); free(yyv); return(0); } -#define YYABORT { free(yys); free(yyv); return(1); } -#define YYBACKUP( newtoken, newvalue )\ -{\ - if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\ - {\ - yyerror( "syntax error - cannot backup" );\ - goto yyerrlab;\ - }\ - yychar = newtoken;\ - yystate = *yyps;\ - yylval = newvalue;\ - goto yynewstate;\ -} -#define YYRECOVERING() (!!yyerrflag) -#ifndef YYDEBUG -# define YYDEBUG 1 /* make debugging available */ -#endif - -/* -** user known globals -*/ -int yydebug; /* set to 1 to get debugging */ - -/* -** driver internal defines -*/ -#define YYFLAG (-1000) - -/* -** static variables used by the parser -*/ -static YYSTYPE *yyv; /* value stack */ -static int *yys; /* state stack */ - -static YYSTYPE *yypv; /* top of value stack */ -static int *yyps; /* top of state stack */ - -static int yystate; /* current state */ -static int yytmp; /* extra var (lasts between blocks) */ - -int yynerrs; /* number of errors */ - -int yyerrflag; /* error recovery flag */ -int yychar; /* current input token number */ - - -/* -** yyparse - return 0 if worked, 1 if syntax error not recovered from -*/ -int -yyparse() -{ - register YYSTYPE *yypvt; /* top of value stack for $vars */ - unsigned yymaxdepth = YYMAXDEPTH; - - /* - ** Initialize externals - yyparse may be called more than once - */ - yyv = (YYSTYPE*)malloc(yymaxdepth*sizeof(YYSTYPE)); - yys = (int*)malloc(yymaxdepth*sizeof(int)); - if (!yyv || !yys) - { - yyerror( "out of memory" ); - return(1); - } - yypv = &yyv[-1]; - yyps = &yys[-1]; - yystate = 0; - yytmp = 0; - yynerrs = 0; - yyerrflag = 0; - yychar = -1; - - goto yystack; - { - register YYSTYPE *yy_pv; /* top of value stack */ - register int *yy_ps; /* top of state stack */ - register int yy_state; /* current state */ - register int yy_n; /* internal state number info */ - - /* - ** get globals into registers. - ** branch to here only if YYBACKUP was called. - */ - yynewstate: - yy_pv = yypv; - yy_ps = yyps; - yy_state = yystate; - goto yy_newstate; - - /* - ** get globals into registers. - ** either we just started, or we just finished a reduction - */ - yystack: - yy_pv = yypv; - yy_ps = yyps; - yy_state = yystate; - - /* - ** top of for (;;) loop while no reductions done - */ - yy_stack: - /* - ** put a state and value onto the stacks - */ -#if YYDEBUG - /* - ** if debugging, look up token value in list of value vs. - ** name pairs. 0 and negative (-1) are special values. - ** Note: linear search is used since time is not a real - ** consideration while debugging. - */ - if ( yydebug ) - { - register int yy_i; - - (void)printf( "State %d, token ", yy_state ); - if ( yychar == 0 ) - (void)printf( "end-of-file\n" ); - else if ( yychar < 0 ) - (void)printf( "-none-\n" ); - else - { - for ( yy_i = 0; yytoks[yy_i].t_val >= 0; - yy_i++ ) - { - if ( yytoks[yy_i].t_val == yychar ) - break; - } - (void)printf( "%s\n", yytoks[yy_i].t_name ); - } - } -#endif /* YYDEBUG */ - if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */ - { - /* - ** reallocate and recover. Note that pointers - ** have to be reset, or bad things will happen - */ - int yyps_index = (yy_ps - yys); - int yypv_index = (yy_pv - yyv); - int yypvt_index = (yypvt - yyv); - yymaxdepth += YYMAXDEPTH; - yyv = (YYSTYPE*)realloc((char*)yyv, - yymaxdepth * sizeof(YYSTYPE)); - yys = (int*)realloc((char*)yys, - yymaxdepth * sizeof(int)); - if (!yyv || !yys) - { - yyerror( "yacc stack overflow" ); - return(1); - } - yy_ps = yys + yyps_index; - yy_pv = yyv + yypv_index; - yypvt = yyv + yypvt_index; - } - *yy_ps = yy_state; - *++yy_pv = yyval; - - /* - ** we have a new state - find out what to do - */ - yy_newstate: - if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG ) - goto yydefault; /* simple state */ -#if YYDEBUG - /* - ** if debugging, need to mark whether new token grabbed - */ - yytmp = yychar < 0; -#endif - if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) - yychar = 0; /* reached EOF */ -#if YYDEBUG - if ( yydebug && yytmp ) - { - register int yy_i; - - (void)printf( "Received token " ); - if ( yychar == 0 ) - (void)printf( "end-of-file\n" ); - else if ( yychar < 0 ) - (void)printf( "-none-\n" ); - else - { - for ( yy_i = 0; yytoks[yy_i].t_val >= 0; - yy_i++ ) - { - if ( yytoks[yy_i].t_val == yychar ) - break; - } - (void)printf( "%s\n", yytoks[yy_i].t_name ); - } - } -#endif /* YYDEBUG */ - if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) ) - goto yydefault; - if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/ - { - yychar = -1; - yyval = yylval; - yy_state = yy_n; - if ( yyerrflag > 0 ) - yyerrflag--; - goto yy_stack; - } - - yydefault: - if ( ( yy_n = yydef[ yy_state ] ) == -2 ) - { -#if YYDEBUG - yytmp = yychar < 0; -#endif - if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) - yychar = 0; /* reached EOF */ -#if YYDEBUG - if ( yydebug && yytmp ) - { - register int yy_i; - - (void)printf( "Received token " ); - if ( yychar == 0 ) - (void)printf( "end-of-file\n" ); - else if ( yychar < 0 ) - (void)printf( "-none-\n" ); - else - { - for ( yy_i = 0; - yytoks[yy_i].t_val >= 0; - yy_i++ ) - { - if ( yytoks[yy_i].t_val - == yychar ) - { - break; - } - } - (void)printf( "%s\n", yytoks[yy_i].t_name ); - } - } -#endif /* YYDEBUG */ - /* - ** look through exception table - */ - { - register int *yyxi = yyexca; - - while ( ( *yyxi != -1 ) || - ( yyxi[1] != yy_state ) ) - { - yyxi += 2; - } - while ( ( *(yyxi += 2) >= 0 ) && - ( *yyxi != yychar ) ) - ; - if ( ( yy_n = yyxi[1] ) < 0 ) - YYACCEPT; - } - } - - /* - ** check for syntax error - */ - if ( yy_n == 0 ) /* have an error */ - { - /* no worry about speed here! */ - switch ( yyerrflag ) - { - case 0: /* new error */ - yyerror( "syntax error" ); - goto skip_init; - yyerrlab: - /* - ** get globals into registers. - ** we have a user generated syntax type error - */ - yy_pv = yypv; - yy_ps = yyps; - yy_state = yystate; - yynerrs++; - skip_init: - case 1: - case 2: /* incompletely recovered error */ - /* try again... */ - yyerrflag = 3; - /* - ** find state where "error" is a legal - ** shift action - */ - while ( yy_ps >= yys ) - { - yy_n = yypact[ *yy_ps ] + YYERRCODE; - if ( yy_n >= 0 && yy_n < YYLAST && - yychk[yyact[yy_n]] == YYERRCODE) { - /* - ** simulate shift of "error" - */ - yy_state = yyact[ yy_n ]; - goto yy_stack; - } - /* - ** current state has no shift on - ** "error", pop stack - */ -#if YYDEBUG -# define _POP_ "Error recovery pops state %d, uncovers state %d\n" - if ( yydebug ) - (void)printf( _POP_, *yy_ps, - yy_ps[-1] ); -# undef _POP_ -#endif - yy_ps--; - yy_pv--; - } - /* - ** there is no state on stack with "error" as - ** a valid shift. give up. - */ - YYABORT; - case 3: /* no shift yet; eat a token */ -#if YYDEBUG - /* - ** if debugging, look up token in list of - ** pairs. 0 and negative shouldn't occur, - ** but since timing doesn't matter when - ** debugging, it doesn't hurt to leave the - ** tests here. - */ - if ( yydebug ) - { - register int yy_i; - - (void)printf( "Error recovery discards " ); - if ( yychar == 0 ) - (void)printf( "token end-of-file\n" ); - else if ( yychar < 0 ) - (void)printf( "token -none-\n" ); - else - { - for ( yy_i = 0; - yytoks[yy_i].t_val >= 0; - yy_i++ ) - { - if ( yytoks[yy_i].t_val - == yychar ) - { - break; - } - } - (void)printf( "token %s\n", - yytoks[yy_i].t_name ); - } - } -#endif /* YYDEBUG */ - if ( yychar == 0 ) /* reached EOF. quit */ - YYABORT; - yychar = -1; - goto yy_newstate; - } - }/* end if ( yy_n == 0 ) */ - /* - ** reduction by production yy_n - ** put stack tops, etc. so things right after switch - */ -#if YYDEBUG - /* - ** if debugging, print the string that is the user's - ** specification of the reduction which is just about - ** to be done. - */ - if ( yydebug ) - (void)printf( "Reduce by (%d) \"%s\"\n", - yy_n, yyreds[ yy_n ] ); -#endif - yytmp = yy_n; /* value to switch over */ - yypvt = yy_pv; /* $vars top of value stack */ - /* - ** Look in goto table for next state - ** Sorry about using yy_state here as temporary - ** register variable, but why not, if it works... - ** If yyr2[ yy_n ] doesn't have the low order bit - ** set, then there is no action to be done for - ** this reduction. So, no saving & unsaving of - ** registers done. The only difference between the - ** code just after the if and the body of the if is - ** the goto yy_stack in the body. This way the test - ** can be made before the choice of what to do is needed. - */ - { - /* length of production doubled with extra bit */ - register int yy_len = yyr2[ yy_n ]; - - if ( !( yy_len & 01 ) ) - { - yy_len >>= 1; - yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ - yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + - *( yy_ps -= yy_len ) + 1; - if ( yy_state >= YYLAST || - yychk[ yy_state = - yyact[ yy_state ] ] != -yy_n ) - { - yy_state = yyact[ yypgo[ yy_n ] ]; - } - goto yy_stack; - } - yy_len >>= 1; - yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ - yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + - *( yy_ps -= yy_len ) + 1; - if ( yy_state >= YYLAST || - yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) - { - yy_state = yyact[ yypgo[ yy_n ] ]; - } - } - /* save until reenter driver code */ - yystate = yy_state; - yyps = yy_ps; - yypv = yy_pv; - } - /* - ** code supplied by user is placed in this switch - */ - switch( yytmp ) - { - -case 3: -{ - yyHaveTime++; - } break; -case 4: -{ - yyHaveZone++; - } break; -case 5: -{ - yyHaveDate++; - } break; -case 6: -{ - yyHaveDay++; - } break; -case 7: -{ - yyHaveRel++; - } break; -case 9: -{ - yyHour = yypvt[-1].Number; - yyMinutes = 0; - yySeconds = 0; - yyMeridian = yypvt[-0].Meridian; - } break; -case 10: -{ - yyHour = yypvt[-3].Number; - yyMinutes = yypvt[-1].Number; - yySeconds = 0; - yyMeridian = yypvt[-0].Meridian; - } break; -case 11: -{ - yyHour = yypvt[-3].Number; - yyMinutes = yypvt[-1].Number; - yyMeridian = MER24; - yyDSTmode = DSToff; - yyTimezone = - (yypvt[-0].Number % 100 + (yypvt[-0].Number / 100) * 60); - } break; -case 12: -{ - yyHour = yypvt[-5].Number; - yyMinutes = yypvt[-3].Number; - yySeconds = yypvt[-1].Number; - yyMeridian = yypvt[-0].Meridian; - } break; -case 13: -{ - yyHour = yypvt[-5].Number; - yyMinutes = yypvt[-3].Number; - yySeconds = yypvt[-1].Number; - yyMeridian = MER24; - yyDSTmode = DSToff; - yyTimezone = - (yypvt[-0].Number % 100 + (yypvt[-0].Number / 100) * 60); - } break; -case 14: -{ - yyTimezone = yypvt[-0].Number; - yyDSTmode = DSToff; - } break; -case 15: -{ - yyTimezone = yypvt[-0].Number; - yyDSTmode = DSTon; - } break; -case 16: -{ - yyTimezone = yypvt[-1].Number; - yyDSTmode = DSTon; - } break; -case 17: -{ - yyDayOrdinal = 1; - yyDayNumber = yypvt[-0].Number; - } break; -case 18: -{ - yyDayOrdinal = 1; - yyDayNumber = yypvt[-1].Number; - } break; -case 19: -{ - yyDayOrdinal = yypvt[-1].Number; - yyDayNumber = yypvt[-0].Number; - } break; -case 20: -{ - yyMonth = yypvt[-2].Number; - yyDay = yypvt[-0].Number; - } break; -case 21: -{ - yyMonth = yypvt[-4].Number; - yyDay = yypvt[-2].Number; - yyYear = yypvt[-0].Number; - } break; -case 22: -{ - /* ISO 8601 format. yyyy-mm-dd. */ - yyYear = yypvt[-2].Number; - yyMonth = -yypvt[-1].Number; - yyDay = -yypvt[-0].Number; - } break; -case 23: -{ - /* e.g. 17-JUN-1992. */ - yyDay = yypvt[-2].Number; - yyMonth = yypvt[-1].Number; - yyYear = -yypvt[-0].Number; - } break; -case 24: -{ - yyMonth = yypvt[-1].Number; - yyDay = yypvt[-0].Number; - } break; -case 25: -{ - yyMonth = yypvt[-3].Number; - yyDay = yypvt[-2].Number; - yyYear = yypvt[-0].Number; - } break; -case 26: -{ - yyMonth = yypvt[-0].Number; - yyDay = yypvt[-1].Number; - } break; -case 27: -{ - yyMonth = yypvt[-1].Number; - yyDay = yypvt[-2].Number; - yyYear = yypvt[-0].Number; - } break; -case 28: -{ - yyRelSeconds = -yyRelSeconds; - yyRelMonth = -yyRelMonth; - } break; -case 30: -{ - yyRelSeconds += yypvt[-1].Number * yypvt[-0].Number * 60L; - } break; -case 31: -{ - yyRelSeconds += yypvt[-1].Number * yypvt[-0].Number * 60L; - } break; -case 32: -{ - yyRelSeconds += yypvt[-0].Number * 60L; - } break; -case 33: -{ - yyRelSeconds += yypvt[-1].Number; - } break; -case 34: -{ - yyRelSeconds += yypvt[-1].Number; - } break; -case 35: -{ - yyRelSeconds++; - } break; -case 36: -{ - yyRelMonth += yypvt[-1].Number * yypvt[-0].Number; - } break; -case 37: -{ - yyRelMonth += yypvt[-1].Number * yypvt[-0].Number; - } break; -case 38: -{ - yyRelMonth += yypvt[-0].Number; - } break; -case 39: -{ - if (yyHaveTime && yyHaveDate && !yyHaveRel) - yyYear = yypvt[-0].Number; - else { - if(yypvt[-0].Number>10000) { - yyHaveDate++; - yyDay= (yypvt[-0].Number)%100; - yyMonth= (yypvt[-0].Number/100)%100; - yyYear = yypvt[-0].Number/10000; - } - else { - yyHaveTime++; - if (yypvt[-0].Number < 100) { - yyHour = yypvt[-0].Number; - yyMinutes = 0; - } - else { - yyHour = yypvt[-0].Number / 100; - yyMinutes = yypvt[-0].Number % 100; - } - yySeconds = 0; - yyMeridian = MER24; - } - } - } break; -case 40: -{ - yyval.Meridian = MER24; - } break; -case 41: -{ - yyval.Meridian = yypvt[-0].Meridian; - } break; - } - goto yystack; /* reset registers in driver code */ -} diff --git a/gnu/usr.bin/cvs/man/cvsinit.8 b/gnu/usr.bin/cvs/man/cvsinit.8 deleted file mode 100644 index 4bdc465024e..00000000000 --- a/gnu/usr.bin/cvs/man/cvsinit.8 +++ /dev/null @@ -1,139 +0,0 @@ -.de Id -.ds Rv \\$4 -.ds Dt \\$5 -.. -.Id @(#)ccvs/man:$Name: $:$Id: cvsinit.8,v 1.1.1.3 1996/04/27 19:42:33 tholo Exp $ -.TH CVSINIT 8 "\*(Dt" -.\" Full space in nroff; half space in troff -.de SP -.if n .sp -.if t .sp .5 -.. -.\" quoted command -.de ` -.RB ` "\|\\$1\|" '\\$2 -.. -.\" -.SH "NAME" -cvsinit \- Concurrent Versions System repository initialization script -.SH "SYNOPSIS" -.TP -.B cvsinit -.\" -.SH "DESCRIPTION" -.\" -The -.B cvsinit -script initializes a repository in the location specified by the -.SM CVSROOT -environment variable. -.SH "FILES" -For more detailed information on -.B cvs -supporting files, see -.BR cvs ( 5 ). -.LP -Files in source repositories (created by -.BR cvsinit ): -.TP -$CVSROOT/CVSROOT -Directory of global administrative files for repository. -.TP -$CVSROOT/commitinfo,v -Records programs for filtering -.` "cvs commit" -requests. -.TP -$CVSROOT/history -Log file of \fBcvs\fP transactions. -.TP -$CVSROOT/modules,v -Definitions for modules in this repository. -.TP -$CVSROOT/loginfo,v -Records programs for piping -.` "cvs commit" -log entries. -.TP -$CVSROOT/rcsinfo,v -Records pathnames to templates used during a -.` "cvs commit" -operation. -.TP -$CVSROOT/editinfo,v -Records programs for editing/validating -.` "cvs commit" -log entries. -.TP -$CVSROOT/log -Sample logging script for use in -.IR loginfo . -.TP -$CVSROOT/commit_prep -Sample logging script for use in -.I commitinfo -with the -.I log_accum -script -.TP -$CVSROOT/log_accum -Sample loggin script for use in -.I loginfo -with the -.I commit_prep -script -.\" -.SH "ENVIRONMENT VARIABLES" -.TP -.SM CVSROOT -Should contain the full pathname to the root of the -.B cvs -source repository (where the -.SM RCS -files are kept). This information must be available to \fBcvs\fP for -most commands to execute; if -.SM CVSROOT -is not set, or if you wish to override it for one invocation, you can -supply it on the command line: -.` "cvs \-d \fIcvsroot cvs_command\fP\|.\|.\|." -You may not need to set -.SM CVSROOT -if your \fBcvs\fP binary has the right path compiled in; use -.` "cvs \-v" -to display all compiled-in paths. -.\" -.SH "AUTHORS" -.TP -Dick Grune -Original author of the -.B cvs -shell script version posted to -.B comp.sources.unix -in the volume6 release of December, 1986. -Credited with much of the -.B cvs -conflict resolution algorithms. -.TP -Brian Berliner -Coder and designer of the -.B cvs -program itself in April, 1989, based on the original work done by Dick. -.TP -Jeff Polk -Helped Brian with the design of the -.B cvs -module and vendor branch support and author of the -.BR checkin ( 1 ) -shell script (the ancestor of -.` "cvs import"). -.SH "SEE ALSO" -.BR ci ( 1 ), -.BR co ( 1 ), -.BR cvs ( 5 ), -.BR diff ( 1 ), -.BR grep ( 1 ), -.BR patch ( 1 ), -.BR rcs ( 1 ), -.BR rcsdiff ( 1 ), -.BR rcsmerge ( 1 ), -.BR rlog ( 1 ), diff --git a/gnu/usr.bin/cvs/src/commit.c b/gnu/usr.bin/cvs/src/commit.c index e30a9ac2993..ac81790e934 100644 --- a/gnu/usr.bin/cvs/src/commit.c +++ b/gnu/usr.bin/cvs/src/commit.c @@ -23,7 +23,7 @@ static Dtype check_direntproc PROTO((char *dir, char *repos, char *update_dir)); static int check_fileproc PROTO((struct file_info *finfo)); static int check_filesdoneproc PROTO((int err, char *repos, char *update_dir)); static int checkaddfile PROTO((char *file, char *repository, char *tag, - char *options, List *srcfiles)); + char *options, RCSNode **rcsnode)); static Dtype commit_direntproc PROTO((char *dir, char *repos, char *update_dir)); static int commit_dirleaveproc PROTO((char *dir, int err, char *update_dir)); static int commit_fileproc PROTO((struct file_info *finfo)); @@ -37,7 +37,7 @@ static int lockrcsfile PROTO((char *file, char *repository, char *rev)); static int precommit_list_proc PROTO((Node * p, void *closure)); static int precommit_proc PROTO((char *repository, char *filter)); static int remove_file PROTO((char *file, char *repository, char *tag, - char *message, List *entries, List *srcfiles)); + char *message, List *entries, RCSNode *rcsnode)); static void fix_rcs_modes PROTO((char *rcs, char *user)); static void fixaddfile PROTO((char *file, char *repository)); static void fixbranch PROTO((char *file, char *repository, char *branch)); @@ -109,29 +109,21 @@ find_fileproc (finfo) enum classify_type status; Node *node; struct find_data *args = find_data_static; - char *fullname; - - fullname = xmalloc (strlen (finfo->update_dir) + strlen (finfo->file) + 10); - fullname[0] = '\0'; - if (finfo->update_dir[0] != '\0') - { - strcat (fullname, finfo->update_dir); - strcat (fullname, "/"); - } - strcat (fullname, finfo->file); vers = Version_TS ((char *)NULL, (char *)NULL, (char *)NULL, (char *)NULL, - finfo->file, 0, 0, finfo->entries, (List *)NULL); + finfo->file, 0, 0, finfo->entries, (RCSNode *)NULL); if (vers->ts_user == NULL && vers->vn_user != NULL && vers->vn_user[0] == '-') status = T_REMOVED; - else if (vers->ts_user == NULL - && vers->vn_user == NULL) + else if (vers->vn_user == NULL) { - error (0, 0, "nothing known about `%s'", fullname); - free (fullname); + if (vers->ts_user == NULL) + error (0, 0, "nothing known about `%s'", finfo->fullname); + else + error (0, 0, "use `cvs add' to create an entry for %s", + finfo->fullname); return 1; } else if (vers->ts_user != NULL @@ -144,23 +136,15 @@ find_fileproc (finfo) status = T_MODIFIED; else { - /* This covers unmodified files, as well as a variety of other cases - (e.g. "touch foo", "cvs ci foo"). FIXME: we probably should be - printing a message and returning 1 for many of those cases (but - I'm not sure exactly which ones). */ - free (fullname); + /* This covers unmodified files, as well as a variety of other + cases. FIXME: we probably should be printing a message and + returning 1 for many of those cases (but I'm not sure + exactly which ones). */ return 0; } node = getnode (); - node->key = xmalloc (strlen (finfo->update_dir) + strlen (finfo->file) + 8); - node->key[0] = '\0'; - if (finfo->update_dir[0] != '\0') - { - strcpy (node->key, finfo->update_dir); - strcat (node->key, "/"); - } - strcat (node->key, finfo->file); + node->key = xstrdup (finfo->fullname); node->type = UPDATE; node->delproc = update_delproc; @@ -169,8 +153,6 @@ find_fileproc (finfo) ++args->argc; - free (fullname); - return 0; } @@ -287,6 +269,7 @@ commit (argc, argv) if (message) error (1, 0, "cannot specify both a message and a log file"); + /* FIXME: Why is this binary? Needs more investigation. */ if ((logfd = open (logfile, O_RDONLY | OPEN_BINARY)) < 0) error (1, errno, "cannot open log file %s", logfile); @@ -295,6 +278,8 @@ commit (argc, argv) message = xmalloc (statbuf.st_size + 1); + /* FIXME: Should keep reading until EOF, rather than assuming the + first read gets the whole thing. */ if ((n = read (logfd, message, statbuf.st_size + 1)) < 0) error (1, errno, "cannot read log message from %s", logfile); @@ -365,7 +350,7 @@ commit (argc, argv) check on those files. This is different from local CVS and previous versions of client/server CVS, but it probably is a Good Thing, or at least Not Such A Bad Thing. */ - send_file_names (find_args.argc, find_args.argv); + send_file_names (find_args.argc, find_args.argv, 0); send_files (find_args.argc, find_args.argv, local, 0); send_to_server ("ci\012", 0); @@ -461,7 +446,7 @@ check_fileproc (finfo) { status = Classify_File (finfo->file, (char *) NULL, (char *) NULL, (char *) NULL, 1, aflag, finfo->repository, - finfo->entries, finfo->srcfiles, &vers, finfo->update_dir, 0); + finfo->entries, finfo->rcs, &vers, finfo->update_dir, 0); if (status == T_UPTODATE || status == T_MODIFIED || status == T_ADDED) { @@ -470,7 +455,7 @@ check_fileproc (finfo) freevers_ts (&vers); xstatus = Classify_File (finfo->file, tag, (char *) NULL, (char *) NULL, 1, aflag, finfo->repository, - finfo->entries, finfo->srcfiles, &vers, finfo->update_dir, + finfo->entries, finfo->rcs, &vers, finfo->update_dir, 0); if (xstatus == T_REMOVE_ENTRY) status = T_MODIFIED; @@ -496,7 +481,7 @@ check_fileproc (finfo) } status = Classify_File (finfo->file, xtag, (char *) NULL, (char *) NULL, 1, aflag, finfo->repository, - finfo->entries, finfo->srcfiles, &vers, finfo->update_dir, 0); + finfo->entries, finfo->rcs, &vers, finfo->update_dir, 0); if ((status == T_REMOVE_ENTRY || status == T_CONFLICT) && (cp = strrchr (xtag, '.')) != NULL) { @@ -505,7 +490,7 @@ check_fileproc (finfo) freevers_ts (&vers); status = Classify_File (finfo->file, xtag, (char *) NULL, (char *) NULL, 1, aflag, finfo->repository, - finfo->entries, finfo->srcfiles, &vers, finfo->update_dir, + finfo->entries, finfo->rcs, &vers, finfo->update_dir, 0); if (status == T_UPTODATE || status == T_REMOVE_ENTRY) status = T_MODIFIED; @@ -518,7 +503,7 @@ check_fileproc (finfo) } else status = Classify_File (finfo->file, tag, (char *) NULL, (char *) NULL, - 1, 0, finfo->repository, finfo->entries, finfo->srcfiles, &vers, + 1, 0, finfo->repository, finfo->entries, finfo->rcs, &vers, finfo->update_dir, 0); noexec = save_noexec; quiet = save_quiet; @@ -541,11 +526,7 @@ check_fileproc (finfo) case T_NEEDS_MERGE: case T_CONFLICT: case T_REMOVE_ENTRY: - if (finfo->update_dir[0] == '\0') - error (0, 0, "Up-to-date check failed for `%s'", finfo->file); - else - error (0, 0, "Up-to-date check failed for `%s/%s'", - finfo->update_dir, finfo->file); + error (0, 0, "Up-to-date check failed for `%s'", finfo->fullname); freevers_ts (&vers); return (1); case T_MODIFIED: @@ -567,30 +548,18 @@ check_fileproc (finfo) { if (vers->date) { - if (finfo->update_dir[0] == '\0') - error (0, 0, - "cannot commit with sticky date for file `%s'", - finfo->file); - else - error - (0, 0, - "cannot commit with sticky date for file `%s/%s'", - finfo->update_dir, finfo->file); + error (0, 0, + "cannot commit with sticky date for file `%s'", + finfo->fullname); freevers_ts (&vers); return (1); } if (status == T_MODIFIED && vers->tag && - !RCS_isbranch (finfo->file, vers->tag, finfo->srcfiles)) + !RCS_isbranch (finfo->rcs, vers->tag)) { - if (finfo->update_dir[0] == '\0') - error (0, 0, - "sticky tag `%s' for file `%s' is not a branch", - vers->tag, finfo->file); - else - error - (0, 0, - "sticky tag `%s' for file `%s/%s' is not a branch", - vers->tag, finfo->update_dir, finfo->file); + error (0, 0, + "sticky tag `%s' for file `%s' is not a branch", + vers->tag, finfo->fullname); freevers_ts (&vers); return (1); } @@ -621,14 +590,9 @@ check_fileproc (finfo) #endif if (retcode == 0) { - if (finfo->update_dir[0] == '\0') - error (0, 0, + error (0, 0, "file `%s' had a conflict and has not been modified", - finfo->file); - else - error (0, 0, - "file `%s/%s' had a conflict and has not been modified", - finfo->update_dir, finfo->file); + finfo->fullname); freevers_ts (&vers); return (1); } @@ -644,25 +608,15 @@ check_fileproc (finfo) if (retcode == -1) { - if (finfo->update_dir[0] == '\0') - error (1, errno, - "fork failed while examining conflict in `%s'", - finfo->file); - else - error (1, errno, - "fork failed while examining conflict in `%s/%s'", - finfo->update_dir, finfo->file); + error (1, errno, + "fork failed while examining conflict in `%s'", + finfo->fullname); } else if (retcode == 0) { - if (finfo->update_dir[0] == '\0') - error (0, 0, - "file `%s' still contains conflict indicators", - finfo->file); - else - error (0, 0, - "file `%s/%s' still contains conflict indicators", - finfo->update_dir, finfo->file); + error (0, 0, + "file `%s' still contains conflict indicators", + finfo->fullname); freevers_ts (&vers); return (1); } @@ -670,14 +624,9 @@ check_fileproc (finfo) if (status == T_REMOVED && vers->tag && isdigit (*vers->tag)) { - if (finfo->update_dir[0] == '\0') - error (0, 0, + error (0, 0, "cannot remove file `%s' which has a numeric sticky tag of `%s'", - finfo->file, vers->tag); - else - error (0, 0, - "cannot remove file `%s/%s' which has a numeric sticky tag of `%s'", - finfo->update_dir, finfo->file, vers->tag); + finfo->fullname, vers->tag); freevers_ts (&vers); return (1); } @@ -690,28 +639,18 @@ check_fileproc (finfo) sprintf(rcs, "%s/%s%s", finfo->repository, finfo->file, RCSEXT); if (isreadable (rcs)) { - if (finfo->update_dir[0] == '\0') - error (0, 0, + error (0, 0, "cannot add file `%s' when RCS file `%s' already exists", - finfo->file, rcs); - else - error (0, 0, - "cannot add file `%s/%s' when RCS file `%s' already exists", - finfo->update_dir, finfo->file, rcs); + finfo->fullname, rcs); freevers_ts (&vers); return (1); } if (vers->tag && isdigit (*vers->tag) && numdots (vers->tag) > 1) { - if (finfo->update_dir[0] == '\0') - error (0, 0, + error (0, 0, "cannot add file `%s' with revision `%s'; must be on trunk", - finfo->file, vers->tag); - else - error (0, 0, - "cannot add file `%s/%s' with revision `%s'; must be on trunk", - finfo->update_dir, finfo->file, vers->tag); + finfo->fullname, vers->tag); freevers_ts (&vers); return (1); } @@ -763,7 +702,7 @@ check_fileproc (finfo) if (isdigit (*vers->tag)) ci->rev = xstrdup (vers->tag); else - ci->rev = RCS_whatbranch (finfo->file, vers->tag, finfo->srcfiles); + ci->rev = RCS_whatbranch (finfo->rcs, vers->tag); else ci->rev = (char *) NULL; ci->tag = xstrdup (vers->tag); @@ -772,10 +711,7 @@ check_fileproc (finfo) (void) addnode (cilist, p); break; case T_UNKNOWN: - if (finfo->update_dir[0] == '\0') - error (0, 0, "nothing known about `%s'", finfo->file); - else - error (0, 0, "nothing known about `%s/%s'", finfo->update_dir, finfo->file); + error (0, 0, "nothing known about `%s'", finfo->fullname); freevers_ts (&vers); return (1); case T_UPTODATE: @@ -949,7 +885,7 @@ commit_fileproc (finfo) else if (ci->status == T_ADDED) { if (checkaddfile (finfo->file, finfo->repository, ci->tag, ci->options, - finfo->srcfiles) != 0) + &finfo->rcs) != 0) { fixaddfile (finfo->file, finfo->repository); err = 1; @@ -962,7 +898,7 @@ commit_fileproc (finfo) if (ci->tag) { locate_rcs (finfo->file, finfo->repository, rcs); - ci->rev = RCS_whatbranch (finfo->file, ci->tag, finfo->srcfiles); + ci->rev = RCS_whatbranch (finfo->rcs, ci->tag); err = Checkin ('A', finfo->file, finfo->update_dir, finfo->repository, rcs, ci->rev, ci->tag, ci->options, message, finfo->entries); if (err != 0) @@ -1019,7 +955,7 @@ commit_fileproc (finfo) else if (ci->status == T_REMOVED) { err = remove_file (finfo->file, finfo->repository, ci->tag, message, - finfo->entries, finfo->srcfiles); + finfo->entries, finfo->rcs); #ifdef SERVER_SUPPORT if (server_active) { server_scratch_entry_only (); @@ -1246,13 +1182,13 @@ findmaxrev (p, closure) * link to keep it relative after we move it into the attic. */ static int -remove_file (file, repository, tag, message, entries, srcfiles) +remove_file (file, repository, tag, message, entries, rcsnode) char *file; char *repository; char *tag; char *message; List *entries; - List *srcfiles; + RCSNode *rcsnode; { mode_t omask; int retcode; @@ -1264,8 +1200,6 @@ remove_file (file, repository, tag, message, entries, srcfiles) char *corev; char *rev; char *prev_rev; - Node *p; - RCSNode *rcsfile; corev = NULL; rev = NULL; @@ -1276,7 +1210,7 @@ remove_file (file, repository, tag, message, entries, srcfiles) locate_rcs (file, repository, rcs); branch = 0; - if (tag && !(branch = RCS_isbranch (file, tag, srcfiles))) + if (tag && !(branch = RCS_isbranch (rcsnode, tag))) { /* a symbolic tag is specified; just remove the tag from the file */ if ((retcode = RCS_deltag (rcs, tag, 1)) != 0) @@ -1302,26 +1236,24 @@ remove_file (file, repository, tag, message, entries, srcfiles) { char *branchname; - rev = RCS_whatbranch (file, tag, srcfiles); + rev = RCS_whatbranch (rcsnode, tag); if (rev == NULL) { error (0, 0, "cannot find branch \"%s\".", tag); return (1); } - p = findnode (srcfiles, file); - if (p == NULL) + if (rcsnode == NULL) { error (0, 0, "boy, I'm confused."); return (1); } - rcsfile = (RCSNode *) p->data; - branchname = RCS_getbranch (rcsfile, rev, 1); + branchname = RCS_getbranch (rcsnode, rev, 1); if (branchname == NULL) { /* no revision exists on this branch. use the previous revision but do not lock. */ - corev = RCS_gettag (rcsfile, tag, 1, 0); + corev = RCS_gettag (rcsnode, tag, 1, 0); prev_rev = xstrdup(rev); lockflag = 0; } else @@ -1335,14 +1267,12 @@ remove_file (file, repository, tag, message, entries, srcfiles) { /* Get current head revision of file. */ - p = findnode (srcfiles, file); - if (p == NULL) + if (rcsnode == NULL) { error (0, 0, "could not find parsed rcsfile %s", file); return (1); } - rcsfile = (RCSNode *) p->data; - prev_rev = RCS_head (rcsfile); + prev_rev = RCS_head (rcsnode); } /* if removing without a tag or a branch, then make sure the default @@ -1532,12 +1462,12 @@ fixbranch (file, repository, branch) */ static int -checkaddfile (file, repository, tag, options, srcfiles) +checkaddfile (file, repository, tag, options, rcsnode) char *file; char *repository; char *tag; char *options; - List *srcfiles; + RCSNode **rcsnode; { char rcs[PATH_MAX]; char fname[PATH_MAX]; @@ -1562,7 +1492,6 @@ checkaddfile (file, repository, tag, options, srcfiles) /* file has existed in the past. Prepare to resurrect. */ char oldfile[PATH_MAX]; char *rev; - Node *p; RCSNode *rcsfile; if (tag == NULL) @@ -1583,14 +1512,12 @@ checkaddfile (file, repository, tag, options, srcfiles) } } - p = findnode (srcfiles, file); - if (p == NULL) + if ((rcsfile = *rcsnode) == NULL) { error (0, 0, "could not find parsed rcsfile %s", file); return (1); } - rcsfile = (RCSNode *) p->data; rev = RCS_getversion (rcsfile, tag, NULL, 1, 0); /* and lock it */ if (lock_RCS (file, rcs, rev, repository)) { @@ -1663,7 +1590,6 @@ checkaddfile (file, repository, tag, options, srcfiles) { /* when adding with a tag, we need to stub a branch, if it doesn't already exist. */ - Node *p; RCSNode *rcsfile; rcsfile = RCS_parse (file, repository); @@ -1673,7 +1599,7 @@ checkaddfile (file, repository, tag, options, srcfiles) return (1); } - if (!RCS_nodeisbranch (tag, rcsfile)) { + if (!RCS_nodeisbranch (rcsfile, tag)) { /* branch does not exist. Stub it. */ char *head; char *magicrev; @@ -1707,17 +1633,11 @@ checkaddfile (file, repository, tag, options, srcfiles) error (0, 0, "cannot lock `%s'.", rcs); return (1); } - } - - /* add (replace) this rcs file to our list */ - p = findnode (srcfiles, file); - - if (p != NULL) - freercsnode((RCSNode **) &p->data); - - delnode(p); + } - RCS_addnode (file, rcsfile, srcfiles); + if (rcsnode) + freercsnode(rcsnode); + *rcsnode = rcsfile; } fileattr_newfile (file); diff --git a/gnu/usr.bin/cvs/src/cvs.h b/gnu/usr.bin/cvs/src/cvs.h index d1f091529db..38fb5fb3c66 100644 --- a/gnu/usr.bin/cvs/src/cvs.h +++ b/gnu/usr.bin/cvs/src/cvs.h @@ -118,6 +118,23 @@ extern int errno; * Definitions for the CVS Administrative directory and the files it contains. * Here as #define's to make changing the names a simple task. */ + +#ifdef USE_VMS_FILENAMES +#define CVSADM "CVS" +#define CVSADM_ENT "CVS/Entries." +#define CVSADM_ENTBAK "CVS/Entries.Backup" +#define CVSADM_ENTLOG "CVS/Entries.Log" +#define CVSADM_ENTSTAT "CVS/Entries.Static" +#define CVSADM_REP "CVS/Repository." +#define CVSADM_ROOT "CVS/Root." +#define CVSADM_CIPROG "CVS/Checkin.prog" +#define CVSADM_UPROG "CVS/Update.prog" +#define CVSADM_TAG "CVS/Tag." +#define CVSADM_NOTIFY "CVS/Notify." +#define CVSADM_NOTIFYTMP "CVS/Notify.tmp" +#define CVSADM_BASE "CVS/Base" +#define CVSADM_TEMPLATE "CVS/Template." +#else /* USE_VMS_FILENAMES */ #define CVSADM "CVS" #define CVSADM_ENT "CVS/Entries" #define CVSADM_ENTBAK "CVS/Entries.Backup" @@ -133,6 +150,9 @@ extern int errno; /* A directory in which we store base versions of files we currently are editing with "cvs edit". */ #define CVSADM_BASE "CVS/Base" +/* File which contains the template for use in log messages. */ +#define CVSADM_TEMPLATE "CVS/Template" +#endif /* USE_VMS_FILENAMES */ /* This is the special directory which we use to store various extra per-directory information in the repository. It must be the same as @@ -167,10 +187,6 @@ extern int errno; #define CVSNULLREPOS "Emptydir" /* an empty directory */ -/* support for the modules file (CVSROOTADM_MODULES) */ -#define CVSMODULE_OPTS "ad:i:lo:e:s:t:u:"/* options in modules file */ -#define CVSMODULE_SPEC '&' /* special delimiter */ - /* Other CVS file names */ /* Files go in the attic if the head main branch revision is dead, @@ -181,7 +197,6 @@ extern int errno; #define CVSATTIC "Attic" #define CVSLCK "#cvs.lock" -#define CVSTFL "#cvs.tfl" #define CVSRFL "#cvs.rfl" #define CVSWFL "#cvs.wfl" #define CVSRFLPAT "#cvs.rfl.*" /* wildcard expr to match read locks */ @@ -195,10 +210,16 @@ extern int errno; #define CVSLCKAGE (60*60) /* 1-hour old lock files cleaned up */ #define CVSLCKSLEEP 30 /* wait 30 seconds before retrying */ #define CVSBRANCH "1.1.1" /* RCS branch used for vendor srcs */ + +#ifdef USE_VMS_FILENAMES +#define BAKPREFIX "_$" +#define DEVNULL "NLA0:" +#else /* USE_VMS_FILENAMES */ #define BAKPREFIX ".#" /* when rcsmerge'ing */ #ifndef DEVNULL #define DEVNULL "/dev/null" #endif +#endif /* USE_VMS_FILENAMES */ #define FALSE 0 #define TRUE 1 @@ -398,6 +419,7 @@ extern int logoff; /* Don't write history entry */ extern char hostname[]; /* Externs that are included directly in the CVS sources */ + int RCS_settag PROTO((const char *, const char *, const char *)); int RCS_deltag PROTO((const char *, const char *, int)); int RCS_setbranch PROTO((const char *, const char *)); @@ -423,7 +445,7 @@ int RCS_checkin PROTO ((char *rcsfile, char *workfile, char *message, DBM *open_module PROTO((void)); FILE *open_file PROTO((const char *, const char *)); -List *Find_Dirs PROTO((char *repository, int which)); +List *Find_Directories PROTO((char *repository, int which)); void Entries_Close PROTO((List *entries)); List *Entries_Open PROTO((int aflag)); char *Make_Date PROTO((char *rawdate)); @@ -436,7 +458,7 @@ char *gca PROTO((char *rev1, char *rev2)); char *getcaller PROTO((void)); char *time_stamp PROTO((char *file)); char *xmalloc PROTO((size_t bytes)); -char *xrealloc PROTO((char *ptr, size_t bytes)); +void *xrealloc PROTO((void *ptr, size_t bytes)); char *xstrdup PROTO((const char *str)); void strip_trailing_newlines PROTO((char *str)); int No_Difference PROTO((char *file, Vers_TS * vers, List * entries, @@ -447,7 +469,6 @@ int Reader_Lock PROTO((char *xrepository)); typedef RETSIGTYPE (*SIGCLEANUPPROC) PROTO(()); int SIG_register PROTO((int sig, SIGCLEANUPPROC sigcleanup)); int Writer_Lock PROTO((List * list)); -int ign_name PROTO((char *name)); int isdir PROTO((const char *file)); int isfile PROTO((const char *file)); int islink PROTO((const char *file)); @@ -492,6 +513,7 @@ void fperror PROTO((FILE * fp, int status, int errnum, char *message,...)); void free_names PROTO((int *pargc, char *argv[])); void freevers_ts PROTO((Vers_TS ** versp)); +extern int ign_name PROTO ((char *name)); void ign_add PROTO((char *ign, int hold)); void ign_add_file PROTO((char *file, int hold)); void ign_setup PROTO((void)); @@ -500,6 +522,7 @@ int ignore_directory PROTO((char *name)); typedef void (*Ignore_proc) PROTO ((char *, char *)); extern void ignore_files PROTO ((List *, char *, Ignore_proc)); extern int ign_inhibit_server; +extern int ign_case; #include "update.h" @@ -507,6 +530,16 @@ void line2argv PROTO((int *pargc, char *argv[], char *line)); void make_directories PROTO((const char *name)); void make_directory PROTO((const char *name)); void rename_file PROTO((const char *from, const char *to)); +/* Expand wildcards in each element of (ARGC,ARGV). This is according to the + files which exist in the current directory, and accordingly to OS-specific + conventions regarding wildcard syntax. It might be desirable to change the + former in the future (e.g. "cvs status *.h" including files which don't exist + in the working directory). The result is placed in *PARGC and *PARGV; + the *PARGV array itself and all the strings it contains are newly + malloc'd. It is OK to call it with PARGC == &ARGC or PARGV == &ARGV. */ +extern void expand_wild PROTO ((int argc, char **argv, + int *pargc, char ***pargv)); + void strip_path PROTO((char *path)); void strip_trailing_slashes PROTO((char *path)); void update_delproc PROTO((Node * p)); @@ -518,7 +551,7 @@ int Checkin PROTO((int type, char *file, char *update_dir, char *tag, char *options, char *message, List *entries)); Ctype Classify_File PROTO((char *file, char *tag, char *date, char *options, int force_tag_match, int aflag, char *repository, - List *entries, List *srcfiles, Vers_TS **versp, + List *entries, RCSNode *rcsnode, Vers_TS **versp, char *update_dir, int pipeout)); List *Find_Names PROTO((char *repository, int which, int aflag, List ** optentries)); @@ -528,7 +561,7 @@ void Update_Logfile PROTO((char *repository, char *xmessage, char *xrevision, FILE * xlogfp, List * xchanges)); Vers_TS *Version_TS PROTO((char *repository, char *options, char *tag, char *date, char *user, int force_tag_match, - int set_time, List * entries, List * xfiles)); + int set_time, List * entries, RCSNode * rcs)); void do_editor PROTO((char *dir, char **messagep, char *repository, List * changes)); @@ -550,6 +583,11 @@ struct file_info in which the command was issued, this is "". */ char *update_dir; + /* update_dir and file put together, with a slash between them as + necessary. This is the proper way to refer to the file in user + messages. */ + char *fullname; + /* Name of the directory corresponding to the repository which contains this file. */ char *repository; @@ -557,9 +595,7 @@ struct file_info /* The pre-parsed entries for this directory. */ List *entries; - /* The pre-parsed versions of the RCS files. This is filled in only - if dosrcs was passed as nonzero to start_recursion. */ - List *srcfiles; + RCSNode *rcs; }; typedef int (*FILEPROC) PROTO((struct file_info *finfo)); @@ -568,6 +604,7 @@ typedef Dtype (*DIRENTPROC) PROTO((char *dir, char *repos, char *update_dir)); typedef int (*DIRLEAVEPROC) PROTO((char *dir, int err, char *update_dir)); extern int mkmodules PROTO ((char *dir)); +extern int init PROTO ((int argc, char **argv)); int do_module PROTO((DBM * db, char *mname, enum mtype m_type, char *msg, CALLBACKPROC callback_proc, char *where, int shorten, @@ -585,7 +622,7 @@ int start_recursion PROTO((FILEPROC fileproc, FILESDONEPROC filesdoneproc, int dosrcs, int wd_is_repos)); void SIG_beginCrSect PROTO((void)); void SIG_endCrSect PROTO((void)); -void read_cvsrc PROTO((int *argc, char ***argv)); +void read_cvsrc PROTO((int *argc, char ***argv, char *cmdname)); char *make_message_rcslegal PROTO((char *message)); @@ -643,6 +680,7 @@ int edit PROTO ((int argc, char **argv)); int unedit PROTO ((int argc, char **argv)); int editors PROTO ((int argc, char **argv)); int watchers PROTO ((int argc, char **argv)); +extern int annotate PROTO ((int argc, char **argv)); #if defined(AUTH_CLIENT_SUPPORT) || defined(AUTH_SERVER_SUPPORT) char *scramble PROTO ((char *str)); diff --git a/gnu/usr.bin/cvs/src/ignore.c b/gnu/usr.bin/cvs/src/ignore.c index 5f150a802bc..7d947cb8941 100644 --- a/gnu/usr.bin/cvs/src/ignore.c +++ b/gnu/usr.bin/cvs/src/ignore.c @@ -22,7 +22,9 @@ static int ign_size; /* This many slots available (plus static int ign_hold = -1; /* Index where first "temporary" item * is held, -1 if none. */ -const char *ign_default = ". .. core RCSLOG tags TAGS RCS SCCS .make.state .nse_depinfo #* .#* cvslog.* ,* CVS CVS.adm .del-* *.a *.o *.obj *.so *.Z *~ *.old *.elc *.ln *.bak *.BAK *.orig *.rej"; +const char *ign_default = ". .. core RCSLOG tags TAGS RCS SCCS .make.state\ + .nse_depinfo #* .#* cvslog.* ,* CVS CVS.adm .del-* *.a *.olb *.o *.obj\ + *.so *.Z *~ *.old *.elc *.ln *.bak *.BAK *.orig *.rej *.exe _$* *$"; #define IGN_GROW 16 /* grow the list by 16 elements at a * time */ @@ -228,6 +230,10 @@ ign_add (ign, hold) } } +/* Set to 1 if ignore file patterns should be matched in a case-insensitive + fashion. */ +int ign_case; + /* Return 1 if the given filename should be ignored by update or import. */ int ign_name (name) @@ -238,12 +244,44 @@ ign_name (name) if (cpp == NULL) return (0); - while (*cpp) - if (fnmatch (*cpp++, name, 0) == 0) - return (1); - return (0); + if (ign_case) + { + /* We do a case-insensitive match by calling fnmatch on copies of + the pattern and the name which have been converted to + lowercase. */ + char *name_lower; + char *pat_lower; + char *p; + + name_lower = xstrdup (name); + for (p = name_lower; *p != '\0'; ++p) + *p = tolower (*p); + while (*cpp) + { + pat_lower = xstrdup (*cpp++); + for (p = pat_lower; *p != '\0'; ++p) + *p = tolower (*p); + if (fnmatch (pat_lower, name_lower, 0) == 0) + goto matched; + free (pat_lower); + } + free (name_lower); + return 0; + matched: + free (name_lower); + free (pat_lower); + return 1; + } + else + { + while (*cpp) + if (fnmatch (*cpp++, name, 0) == 0) + return 1; + return 0; + } } - + +/* FIXME: This list of dirs to ignore stuff seems not to be used. */ static char **dir_ign_list = NULL; static int dir_ign_max = 0; @@ -287,7 +325,7 @@ int ignore_directory (name) return 0; } - + /* * Process the current directory, looking for files not in ILIST and not on * the global ignore list for this directory. If we find one, call PROC diff --git a/gnu/usr.bin/cvs/src/lock.c b/gnu/usr.bin/cvs/src/lock.c index 89460baf744..5e1d22e2de9 100644 --- a/gnu/usr.bin/cvs/src/lock.c +++ b/gnu/usr.bin/cvs/src/lock.c @@ -19,7 +19,7 @@ static void set_lockers_name PROTO((struct stat *statp)); static int set_writelock_proc PROTO((Node * p, void *closure)); static int unlock_proc PROTO((Node * p, void *closure)); static int write_lock PROTO((char *repository)); -static void unlock PROTO((char *repository)); +static void lock_simple_remove PROTO((char *repository)); static void lock_wait PROTO((char *repository)); static int Check_Owner PROTO((char *lockdir)); @@ -42,7 +42,7 @@ Lock_Cleanup () /* clean up simple locks (if any) */ if (repository != NULL) { - unlock (repository); + lock_simple_remove (repository); repository = (char *) NULL; } @@ -62,7 +62,7 @@ unlock_proc (p, closure) Node *p; void *closure; { - unlock (p->key); + lock_simple_remove (p->key); return (0); } @@ -70,7 +70,7 @@ unlock_proc (p, closure) * Remove the lock files (without complaining if they are not there), */ static void -unlock (repository) +lock_simple_remove (repository) char *repository; { char tmp[PATH_MAX]; @@ -166,37 +166,15 @@ Reader_Lock (xrepository) if (readlock[0] == '\0') (void) sprintf (readlock, #ifdef HAVE_LONG_FILE_NAMES - "%s.%s.%d", CVSRFL, hostname, + "%s.%s.%ld", CVSRFL, hostname, #else - "%s.%d", CVSRFL, + "%s.%ld", CVSRFL, #endif - getpid ()); + (long) getpid ()); /* remember what we're locking (for lock_cleanup) */ repository = xrepository; -#ifdef BOGUS_UNLESS_PROVEN_OTHERWISE - /* make sure we can write the repository */ - (void) sprintf (tmp, -#ifdef HAVE_LONG_FILE_NAMES - "%s/%s.%s.%d", xrepository, CVSTFL, hostname, -#else - "%s/%s.%d", xrepository, CVSTFL, -#endif - getpid()); - if ((fp = fopen (tmp, "w+")) == NULL || fclose (fp) == EOF) - { - error (0, errno, "cannot create read lock in repository `%s'", - xrepository); - readlock[0] = '\0'; - if (unlink (tmp) < 0 && ! existence_error (errno)) - error (0, errno, "failed to remove lock %s", tmp); - return (1); - } - if (unlink (tmp) < 0) - error (0, errno, "failed to remove lock %s", tmp); -#endif - /* get the lock dir for our own */ if (set_lock (xrepository, 1) != L_OK) { @@ -307,32 +285,11 @@ write_lock (repository) if (writelock[0] == '\0') (void) sprintf (writelock, #ifdef HAVE_LONG_FILE_NAMES - "%s.%s.%d", CVSWFL, hostname, -#else - "%s.%d", CVSWFL, -#endif - getpid()); - -#ifdef BOGUS_UNLESS_PROVEN_OTHERWISE - /* make sure we can write the repository */ - (void) sprintf (tmp, -#ifdef HAVE_LONG_FILE_NAMES - "%s/%s.%s.%d", repository, CVSTFL, hostname, + "%s.%s.%ld", CVSWFL, hostname, #else - "%s/%s.%d", repository, CVSTFL, -#endif - getpid ()); - if ((fp = fopen (tmp, "w+")) == NULL || fclose (fp) == EOF) - { - error (0, errno, "cannot create write lock in repository `%s'", - repository); - if (unlink (tmp) < 0 && ! existence_error (errno)) - error (0, errno, "failed to remove lock %s", tmp); - return (L_ERROR); - } - if (unlink (tmp) < 0) - error (0, errno, "failed to remove lock %s", tmp); + "%s.%ld", CVSWFL, #endif + (long) getpid()); /* make sure the lock dir is ours (not necessarily unique to us!) */ status = set_lock (repository, 0); diff --git a/gnu/usr.bin/cvs/src/main.c b/gnu/usr.bin/cvs/src/main.c index 2b232585210..dafe689f85d 100644 --- a/gnu/usr.bin/cvs/src/main.c +++ b/gnu/usr.bin/cvs/src/main.c @@ -35,6 +35,12 @@ #include "cvs.h" +#ifdef HAVE_WINSOCK_H +#include +#else +extern int gethostname (); +#endif + #if HAVE_KERBEROS #include #include @@ -50,7 +56,7 @@ char *program_path; * Initialize comamnd_name to "cvs" so that the first call to * read_cvsrc tries to find global cvs options. */ -char *command_name = "cvs"; +char *command_name = ""; /* * Since some systems don't define this... @@ -127,6 +133,7 @@ const struct cmd CMD_ENTRY("add", "ad", "new", add, client_add), CMD_ENTRY("admin", "adm", "rcs", admin, client_admin), + CMD_ENTRY("annotate", NULL, NULL, annotate, client_annotate), CMD_ENTRY("checkout", "co", "get", checkout, client_checkout), CMD_ENTRY("commit", "ci", "com", commit, client_commit), CMD_ENTRY("diff", "di", "dif", diff, client_diff), @@ -135,6 +142,7 @@ const struct cmd CMD_ENTRY("export", "exp", "ex", checkout, client_export), CMD_ENTRY("history", "hi", "his", history, client_history), CMD_ENTRY("import", "im", "imp", import, client_import), + CMD_ENTRY("init", NULL, NULL, init, client_init), CMD_ENTRY("log", "lo", "rlog", cvslog, client_log), #ifdef AUTH_CLIENT_SUPPORT CMD_ENTRY("login", "logon", "lgn", login, login), @@ -194,6 +202,7 @@ static const char *const cmd_usage[] = "CVS commands are:\n", " add Adds a new file/directory to the repository\n", " admin Administration front end for rcs\n", + " annotate Show revision where each line was modified\n", " checkout Checkout sources for editing\n", " commit Checks files into the repository\n", " diff Runs diffs between revisions\n", @@ -244,7 +253,7 @@ main_cleanup (sig) break; } - error (1, 0, "received %s signal", name); + error (EXIT_FAILURE, 0, "received %s signal", name); } static void @@ -362,7 +371,7 @@ main (argc, argv) * Scan cvsrc file for global options. */ if (use_cvsrc) - read_cvsrc(&argc, &argv); + read_cvsrc (&argc, &argv, "cvs"); optind = 1; opterr = 1; @@ -486,7 +495,7 @@ main (argc, argv) { printf ("E Fatal error, aborting.\n\ error %s getpeername or getsockname failed\n", strerror (errno)); - exit (1); + exit (EXIT_FAILURE); } status = krb_recvauth (KOPT_DO_MUTUAL, STDIN_FILENO, &ticket, "rcmd", @@ -496,7 +505,7 @@ error %s getpeername or getsockname failed\n", strerror (errno)); { printf ("E Fatal error, aborting.\n\ error 0 kerberos: %s\n", krb_get_err_text(status)); - exit (1); + exit (EXIT_FAILURE); } /* Get the local name. */ @@ -505,7 +514,7 @@ error 0 kerberos: %s\n", krb_get_err_text(status)); { printf ("E Fatal error, aborting.\n\ error 0 kerberos: can't get local name: %s\n", krb_get_err_text(status)); - exit (1); + exit (EXIT_FAILURE); } pw = getpwnam (user); @@ -513,7 +522,7 @@ error 0 kerberos: can't get local name: %s\n", krb_get_err_text(status)); { printf ("E Fatal error, aborting.\n\ error 0 %s: no such user\n", user); - exit (1); + exit (EXIT_FAILURE); } initgroups (pw->pw_name, pw->pw_gid); @@ -643,16 +652,22 @@ error 0 %s: no such user\n", user); if (!isaccessible (path, R_OK | X_OK)) { save_errno = errno; + /* If this is "cvs init", the root need not exist yet. */ + if (strcmp (command_name, "init") != 0 #ifdef CLIENT_SUPPORT - if (strchr (CVSroot, ':') == NULL) - { + /* If we are a remote client, the root need not exist + on the client machine (FIXME: we should also skip + the check for CVSROOTADM_HISTORY being writable; + it shouldn't matter if there is a read-only file + which happens to have the same name on the client + machine). */ + && strchr (CVSroot, ':') == NULL) #endif + { error (0, 0, "Sorry, you don't have sufficient access to %s", CVSroot); error (1, save_errno, "%s", path); -#ifdef CLIENT_SUPPORT } -#endif } (void) strcat (path, "/"); (void) strcat (path, CVSROOTADM_HISTORY); @@ -766,7 +781,7 @@ error 0 %s: no such user\n", user); #endif if (use_cvsrc) - read_cvsrc(&argc, &argv); + read_cvsrc (&argc, &argv, command_name); #ifdef CLIENT_SUPPORT /* If cvsroot contains a colon, try to do it via the protocol. */ @@ -782,14 +797,10 @@ error 0 %s: no such user\n", user); #endif /* No CLIENT_SUPPORT */ } - /* - * If the command's error count is modulo 256, we need to change it - * so that we don't overflow the 8-bits we get to report exit status - */ - if (err && (err % 256) == 0) - err = 1; Lock_Cleanup (); - return (err); + if (err) + return (EXIT_FAILURE); + return 0; } char * @@ -824,5 +835,5 @@ usage (cpp) (void) fprintf (stderr, *cpp++, program_name, command_name); for (; *cpp; cpp++) (void) fprintf (stderr, *cpp); - exit (1); + exit (EXIT_FAILURE); } diff --git a/gnu/usr.bin/cvs/src/patch.c b/gnu/usr.bin/cvs/src/patch.c index 2878a1f2f7c..97977344e48 100644 --- a/gnu/usr.bin/cvs/src/patch.c +++ b/gnu/usr.bin/cvs/src/patch.c @@ -336,9 +336,8 @@ patch_fileproc (finfo) { struct utimbuf t; char *vers_tag, *vers_head; - char rcsspace[PATH_MAX]; - char *rcs = rcsspace; - Node *p; + char rcsspace[1][PATH_MAX]; + char *rcs = rcsspace[0]; RCSNode *rcsfile; FILE *fp1, *fp2, *fp3; int ret = 0; @@ -348,14 +347,12 @@ patch_fileproc (finfo) char *line1, *line2; size_t line1_chars_allocated; size_t line2_chars_allocated; - char *cp1, *cp2, *commap; + char *cp1, *cp2; FILE *fp; /* find the parsed rcs file */ - p = findnode (finfo->srcfiles, finfo->file); - if (p == NULL) + if ((rcsfile = finfo->rcs) == NULL) return (1); - rcsfile = (RCSNode *) p->data; if ((rcsfile->flags & VALID) && (rcsfile->flags & INATTIC)) isattic = 1; @@ -393,12 +390,12 @@ patch_fileproc (finfo) if (patch_short) { - (void) printf ("File "); + (void) printf ("File %s ", finfo->fullname); if (vers_tag == NULL) - (void) printf ("%s is new; current revision %s\n", rcs, vers_head); + (void) printf ("is new; current revision %s\n", vers_head); else if (vers_head == NULL) { - (void) printf ("%s is removed; not included in ", rcs); + (void) printf ("is removed; not included in "); if (rev2 != NULL) (void) printf ("release tag %s", rev2); else if (date2 != NULL) @@ -408,8 +405,8 @@ patch_fileproc (finfo) (void) printf ("\n"); } else - (void) printf ("%s changed from revision %s to %s\n", - rcs, vers_tag, vers_head); + (void) printf ("changed from revision %s to %s\n", + vers_tag, vers_head); return (0); } if ((fp1 = fopen (tmpnam (tmpfile1), "w+")) != NULL) @@ -486,10 +483,7 @@ patch_fileproc (finfo) /* Output an "Index:" line for patch to use */ (void) fflush (stdout); - if (finfo->update_dir[0]) - (void) printf ("Index: %s/%s\n", finfo->update_dir, finfo->file); - else - (void) printf ("Index: %s\n", finfo->file); + (void) printf ("Index: %s\n", finfo->fullname); (void) fflush (stdout); fp = open_file (tmpfile3, "r"); @@ -534,20 +528,20 @@ patch_fileproc (finfo) (void) strcpy (strippath, REPOS_STRIP); if (strncmp (rcs, strippath, strlen (strippath)) == 0) rcs += strlen (strippath); - commap = strrchr (rcs, ','); - *commap = '\0'; if (vers_tag != NULL) { - (void) sprintf (file1, "%s%s%s:%s", finfo->update_dir, - finfo->update_dir[0] ? "/" : "", rcs, vers_tag); + (void) sprintf (file1, "%s:%s", finfo->fullname, vers_tag); } else { (void) strcpy (file1, DEVNULL); } - (void) sprintf (file2, "%s%s%s:%s", finfo->update_dir, - finfo->update_dir[0] ? "/" : "", rcs, + (void) sprintf (file2, "%s:%s", finfo->fullname, vers_head ? vers_head : "removed"); + + /* Note that this prints "diff" not DIFF. The format of a diff + does not depend on the name of the program which happens to + have produced it. */ if (unidiff) { (void) printf ("diff -u %s %s\n", file1, file2); @@ -559,16 +553,14 @@ patch_fileproc (finfo) (void) printf ("*** %s%s--- ", file1, cp1); } - if (finfo->update_dir[0] != '\0') - (void) printf ("%s/", finfo->update_dir); - (void) printf ("%s%s", rcs, cp2); + (void) printf ("%s%s", finfo->fullname, cp2); /* spew the rest of the diff out */ while (getline (&line1, &line1_chars_allocated, fp) >= 0) (void) fputs (line1, stdout); (void) fclose (fp); break; default: - error (0, 0, "diff failed for %s", rcs); + error (0, 0, "diff failed for %s", finfo->fullname); } out: if (line1) diff --git a/gnu/usr.bin/cvs/src/server.c b/gnu/usr.bin/cvs/src/server.c index 1577e1571d5..0fc7ce00546 100644 --- a/gnu/usr.bin/cvs/src/server.c +++ b/gnu/usr.bin/cvs/src/server.c @@ -27,8 +27,10 @@ #ifdef AUTH_SERVER_SUPPORT /* For initgroups(). */ +#if HAVE_INITGROUPS #include -#endif +#endif /* HAVE_INITGROUPS */ +#endif /* AUTH_SERVER_SUPPORT */ /* Functions which the server calls. */ @@ -270,7 +272,7 @@ serve_valid_responses (arg) { printf ("E response `%s' not supported by client\nerror \n", rs->name); - exit (1); + exit (EXIT_FAILURE); } else if (rs->status == rs_optional) rs->status = rs_not_supported; @@ -676,7 +678,8 @@ receive_file (size, file, gzipped) if (gzip_pid) { if (waitpid (gzip_pid, &gzip_status, 0) != gzip_pid) - error (1, errno, "waiting for gunzip process %d", gzip_pid); + error (1, errno, "waiting for gunzip process %ld", + (long) gzip_pid); else if (gzip_status != 0) error (1, 0, "gunzip exited %d", gzip_status); } @@ -2185,6 +2188,15 @@ serve_questionable (arg) buf_output (&buf_to_net, "\n", 1); } } + +static void serve_case PROTO ((char *)); + +static void +serve_case (arg) + char *arg; +{ + ign_case = 1; +} static struct buffer protocol; @@ -2226,7 +2238,7 @@ error ENOMEM Virtual memory exhausted.\n"; /* If this gives an error, not much we could do. syslog() it? */ write (STDOUT_FILENO, msg, sizeof (msg) - 1); server_cleanup (0); - exit (1); + exit (EXIT_FAILURE); } static void @@ -3207,6 +3219,32 @@ serve_noop (arg) { do_cvs_command (noop); } + +static void serve_init PROTO ((char *)); + +static void +serve_init (arg) + char *arg; +{ + CVSroot = malloc (strlen (arg) + 1); + if (CVSroot == NULL) + { + pending_error = ENOMEM; + return; + } + strcpy (CVSroot, arg); + + do_cvs_command (init); +} + +static void serve_annotate PROTO ((char *)); + +static void +serve_annotate (arg) + char *arg; +{ + do_cvs_command (annotate); +} static void serve_co (arg) @@ -3382,6 +3420,10 @@ server_updated (file, update_dir, repository, updated, file_info, checksum) size = 0; if (sb.st_size > 0) { + /* Throughout this section we use binary mode to read the + file we are sending. The client handles any line ending + translation if necessary. */ + if (gzip_level /* * For really tiny files, the gzip process startup @@ -3394,11 +3436,11 @@ server_updated (file, update_dir, repository, updated, file_info, checksum) int status, fd, gzip_status; pid_t gzip_pid; - fd = open (file, O_RDONLY, 0); + fd = open (file, O_RDONLY | OPEN_BINARY, 0); if (fd < 0) error (1, errno, "reading %s", short_pathname); fd = filter_through_gzip (fd, 1, gzip_level, &gzip_pid); - f = fdopen (fd, "r"); + f = fdopen (fd, "rb"); status = buf_read_file_to_eof (f, &list, &last); size = buf_chain_length (list); if (status == -2) @@ -3409,7 +3451,8 @@ server_updated (file, update_dir, repository, updated, file_info, checksum) if (fclose (f) == EOF) error (1, errno, "reading %s", short_pathname); if (waitpid (gzip_pid, &gzip_status, 0) == -1) - error (1, errno, "waiting for gzip process %d", gzip_pid); + error (1, errno, "waiting for gzip process %ld", + (long) gzip_pid); else if (gzip_status != 0) error (1, 0, "gzip exited %d", gzip_status); /* Prepending length with "z" is flag for using gzip here. */ @@ -3420,7 +3463,7 @@ server_updated (file, update_dir, repository, updated, file_info, checksum) long status; size = sb.st_size; - f = fopen (file, "r"); + f = fopen (file, "rb"); if (f == NULL) error (1, errno, "reading %s", short_pathname); status = buf_read_file (f, sb.st_size, &list, &last); @@ -3561,7 +3604,76 @@ server_set_sticky (update_dir, repository, tag, date) } buf_send_counted (&protocol); } + +struct template_proc_data +{ + char *update_dir; + char *repository; +}; + +/* Here as a static until we get around to fixing Parse_Info to pass along + a void * for it. */ +static struct template_proc_data *tpd; + +static int +template_proc (repository, template) + char *repository; + char *template; +{ + FILE *fp; + char buf[1024]; + size_t n; + struct stat sb; + struct template_proc_data *data = tpd; + + if (!supported_response ("Template")) + /* Might want to warn the user that the rcsinfo feature won't work. */ + return 0; + buf_output0 (&protocol, "Template "); + output_dir (data->update_dir, data->repository); + buf_output0 (&protocol, "\n"); + + fp = fopen (template, "rb"); + if (fp == NULL) + { + error (0, errno, "Couldn't open rcsinfo template file %s", template); + return 1; + } + if (fstat (fileno (fp), &sb) < 0) + { + error (0, errno, "cannot stat rcsinfo template file %s", template); + return 1; + } + sprintf (buf, "%ld\n", (long) sb.st_size); + buf_output0 (&protocol, buf); + while (!feof (fp)) + { + n = fread (buf, 1, sizeof buf, fp); + buf_output (&protocol, buf, n); + if (ferror (fp)) + { + error (0, errno, "cannot read rcsinfo template file %s", template); + (void) fclose (fp); + return 1; + } + } + if (fclose (fp) < 0) + error (0, errno, "cannot close rcsinfo template file %s", template); + return 0; +} +void +server_template (update_dir, repository) + char *update_dir; + char *repository; +{ + struct template_proc_data data; + data.update_dir = update_dir; + data.repository = repository; + tpd = &data; + (void) Parse_Info (CVSROOTADM_RCSINFO, repository, template_proc, 1); +} + static void serve_gzip_contents (arg) char *arg; @@ -3786,6 +3898,7 @@ struct request requests[] = REQ_LINE("Unchanged", serve_unchanged, rq_optional), REQ_LINE("Notify", serve_notify, rq_optional), REQ_LINE("Questionable", serve_questionable, rq_optional), + REQ_LINE("Case", serve_case, rq_optional), REQ_LINE("Argument", serve_argument, rq_essential), REQ_LINE("Argumentx", serve_argumentx, rq_essential), REQ_LINE("Global_option", serve_global_option, rq_optional), @@ -3815,6 +3928,8 @@ struct request requests[] = REQ_LINE("watch-remove", serve_watch_remove, rq_optional), REQ_LINE("watchers", serve_watchers, rq_optional), REQ_LINE("editors", serve_editors, rq_optional), + REQ_LINE("init", serve_init, rq_optional), + REQ_LINE("annotate", serve_annotate, rq_optional), REQ_LINE("noop", serve_noop, rq_optional), REQ_LINE(NULL, NULL, rq_optional) @@ -4010,7 +4125,7 @@ server (argc, argv) { printf ("E Fatal server error, aborting.\n\ error ENOMEM Virtual memory exhausted.\n"); - exit (1); + exit (EXIT_FAILURE); } putenv (env); } @@ -4034,7 +4149,7 @@ error ENOMEM Virtual memory exhausted.\n"); */ printf ("E Fatal server error, aborting.\n\ error ENOMEM Virtual memory exhausted.\n"); - exit (1); + exit (EXIT_FAILURE); } strcpy (server_temp_dir, temp_dir); @@ -4051,7 +4166,7 @@ error ENOMEM Virtual memory exhausted.\n"); strcat (server_temp_dir, "/cvs-serv"); p = server_temp_dir + strlen (server_temp_dir); - sprintf (p, "%d", getpid ()); + sprintf (p, "%ld", (long) getpid ()); } (void) SIG_register (SIGHUP, server_cleanup); @@ -4074,7 +4189,7 @@ error ENOMEM Virtual memory exhausted.\n"); */ printf ("E Fatal server error, aborting.\n\ error ENOMEM Virtual memory exhausted.\n"); - exit (1); + exit (EXIT_FAILURE); } argument_count = 1; @@ -4243,50 +4358,51 @@ check_repository_password (username, password, repository, host_user_ptr) /* Return a hosting username if password matches, else NULL. */ char * check_password (username, password, repository) - char *username, *password, *repository; + char *username, *password, *repository; { - int rc; - char *host_user; + int rc; + char *host_user; - /* First we see if this user has a password in the CVS-specific - password file. If so, that's enough to authenticate with. If - not, we'll check /etc/passwd. */ + /* First we see if this user has a password in the CVS-specific + password file. If so, that's enough to authenticate with. If + not, we'll check /etc/passwd. */ - rc = check_repository_password (username, password, repository, &host_user); + rc = check_repository_password (username, password, repository, + &host_user); - if (rc == 1) - return host_user; - else if (rc == 2) - return 0; - else if (rc == 0) + if (rc == 1) + return host_user; + else if (rc == 2) + return 0; + else if (rc == 0) { - /* No cvs password found, so try /etc/passwd. */ + /* No cvs password found, so try /etc/passwd. */ - struct passwd *pw; - char *found_passwd; + struct passwd *pw; + char *found_passwd; - pw = getpwnam (username); - if (pw == NULL) + pw = getpwnam (username); + if (pw == NULL) { - printf ("E Fatal error, aborting.\n" - "error 0 %s: no such user\n", username); - exit (1); - } - found_passwd = pw->pw_passwd; - - if (found_passwd && *found_passwd) - return (! strcmp (found_passwd, crypt (password, found_passwd))) ? - username : NULL; - else if (password && *password) - return username; - else - return NULL; + printf ("E Fatal error, aborting.\n\ +error 0 %s: no such user\n", username); + exit (EXIT_FAILURE); + } + found_passwd = pw->pw_passwd; + + if (found_passwd && *found_passwd) + return ((! strcmp (found_passwd, crypt (password, found_passwd))) + ? username : NULL); + else if (password && *password) + return username; + else + return NULL; } - else + else { - /* Something strange happened. We don't know what it was, but - we certainly won't grant authorization. */ - return NULL; + /* Something strange happened. We don't know what it was, but + we certainly won't grant authorization. */ + return NULL; } } @@ -4395,7 +4511,7 @@ authenticate_connection () fflush (stdout); memset (descrambled_password, 0, strlen (descrambled_password)); free (descrambled_password); - exit (1); + exit (EXIT_FAILURE); } /* Don't go any farther if we're just responding to "cvs login". */ @@ -4411,7 +4527,10 @@ authenticate_connection () username); } +#if HAVE_INITGROUPS initgroups (pw->pw_name, pw->pw_gid); +#endif /* HAVE_INITGROUPS */ + setgid (pw->pw_gid); setuid (pw->pw_uid); /* Inhibit access by randoms. Don't want people randomly diff --git a/gnu/usr.bin/cvs/src/update.c b/gnu/usr.bin/cvs/src/update.c index 84d406ccb70..eddfe5a9971 100644 --- a/gnu/usr.bin/cvs/src/update.c +++ b/gnu/usr.bin/cvs/src/update.c @@ -42,10 +42,10 @@ #include "edit.h" static int checkout_file PROTO((char *file, char *repository, List *entries, - List *srcfiles, Vers_TS *vers_ts, char *update_dir)); + RCSNode *rcsnode, Vers_TS *vers_ts, char *update_dir)); #ifdef SERVER_SUPPORT static int patch_file PROTO((char *file, char *repository, List *entries, - List *srcfiles, Vers_TS *vers_ts, char *update_dir, + RCSNode*rcsnode, Vers_TS *vers_ts, char *update_dir, int *docheckout, struct stat *file_info, unsigned char *checksum)); #endif @@ -61,10 +61,10 @@ static int update_filesdone_proc PROTO((int err, char *repository, char *update_dir)); static int write_letter PROTO((char *file, int letter, char *update_dir)); #ifdef SERVER_SUPPORT -static void join_file PROTO((char *file, List *srcfiles, Vers_TS *vers_ts, +static void join_file PROTO((char *file, RCSNode *rcsnode, Vers_TS *vers_ts, char *update_dir, List *entries, char *repository)); #else -static void join_file PROTO((char *file, List *srcfiles, Vers_TS *vers_ts, +static void join_file PROTO((char *file, RCSNode *rcsnode, Vers_TS *vers_ts, char *update_dir, List *entries)); #endif @@ -257,7 +257,7 @@ update (argc, argv) if (failed_patches == NULL) { - send_file_names (argc, argv); + send_file_names (argc, argv, SEND_EXPAND_WILD); send_files (argc, argv, local, aflag); } else @@ -275,7 +275,7 @@ update (argc, argv) for (i = 0; i < failed_patches_count; i++) (void) unlink_file (failed_patches[i]); - send_file_names (failed_patches_count, failed_patches); + send_file_names (failed_patches_count, failed_patches, 0); send_files (failed_patches_count, failed_patches, local, aflag); } @@ -439,7 +439,7 @@ update_fileproc (finfo) Vers_TS *vers; status = Classify_File (finfo->file, tag, date, options, force_tag_match, - aflag, finfo->repository, finfo->entries, finfo->srcfiles, &vers, + aflag, finfo->repository, finfo->entries, finfo->rcs, &vers, finfo->update_dir, pipeout); if (pipeout) { @@ -469,7 +469,7 @@ update_fileproc (finfo) #ifdef SERVER_SUPPORT case T_PATCH: /* needs patch */ #endif - retval = checkout_file (finfo->file, finfo->repository, finfo->entries, finfo->srcfiles, + retval = checkout_file (finfo->file, finfo->repository, finfo->entries, finfo->rcs, vers, finfo->update_dir); break; @@ -505,7 +505,7 @@ update_fileproc (finfo) /* Should we be warning the user that we are * overwriting the user's copy of the file? */ retval = checkout_file (finfo->file, finfo->repository, finfo->entries, - finfo->srcfiles, vers, finfo->update_dir); + finfo->rcs, vers, finfo->update_dir); else retval = merge_file (finfo->file, finfo->repository, finfo->entries, vers, finfo->update_dir); @@ -549,14 +549,9 @@ update_fileproc (finfo) RUN_TTY,RUN_NORMAL); if (retcode == -1) { - if (finfo->update_dir[0] == '\0') - error (1, errno, + error (1, errno, "fork failed while examining conflict in `%s'", - finfo->file); - else - error (1, errno, - "fork failed while examining conflict in `%s/%s'", - finfo->update_dir, finfo->file); + finfo->fullname); } } if (!retcode) @@ -583,7 +578,7 @@ update_fileproc (finfo) struct stat file_info; unsigned char checksum[16]; - retval = patch_file (finfo->file, finfo->repository, finfo->entries, finfo->srcfiles, + retval = patch_file (finfo->file, finfo->repository, finfo->entries, finfo->rcs, vers, finfo->update_dir, &docheckout, &file_info, checksum); if (! docheckout) @@ -602,7 +597,7 @@ update_fileproc (finfo) /* Fall through. */ #endif case T_CHECKOUT: /* needs checkout */ - retval = checkout_file (finfo->file, finfo->repository, finfo->entries, finfo->srcfiles, + retval = checkout_file (finfo->file, finfo->repository, finfo->entries, finfo->rcs, vers, finfo->update_dir); #ifdef SERVER_SUPPORT if (server_active && retval == 0) @@ -637,9 +632,9 @@ update_fileproc (finfo) /* only try to join if things have gone well thus far */ if (retval == 0 && join_rev1) #ifdef SERVER_SUPPORT - join_file (finfo->file, finfo->srcfiles, vers, finfo->update_dir, finfo->entries, finfo->repository); + join_file (finfo->file, finfo->rcs, vers, finfo->update_dir, finfo->entries, finfo->repository); #else - join_file (finfo->file, finfo->srcfiles, vers, finfo->update_dir, finfo->entries); + join_file (finfo->file, finfo->rcs, vers, finfo->update_dir, finfo->entries); #endif /* if this directory has an ignore list, add this file to it */ @@ -746,7 +741,8 @@ update_dirent_proc (dir, repository, update_dir) Create_Admin (dir, update_dir, repository, tag, date); } } - else + /* Do we need to check noexec here? */ + else if (!pipeout) { char *cvsadmdir; @@ -910,11 +906,11 @@ scratch_file (file, repository, entries, update_dir) * check out a file - essentially returns the result of the fork on "co". */ static int -checkout_file (file, repository, entries, srcfiles, vers_ts, update_dir) +checkout_file (file, repository, entries, rcsnode, vers_ts, update_dir) char *file; char *repository; List *entries; - List *srcfiles; + RCSNode *rcsnode; Vers_TS *vers_ts; char *update_dir; { @@ -1043,23 +1039,9 @@ checkout_file (file, repository, entries, srcfiles, vers_ts, update_dir) wrap_fromcvs_process_file (file); xvers_ts = Version_TS (repository, options, tag, date, file, - force_tag_match, set_time, entries, srcfiles); + force_tag_match, set_time, entries, rcsnode); if (strcmp (xvers_ts->options, "-V4") == 0) xvers_ts->options[0] = '\0'; - /* If no keyword expansion was specified on command line, - use whatever was in the file. This is how we tell the client - whether a file is binary. */ - if (xvers_ts->options[0] == '\0') - { - if (vers_ts->srcfile->expand != NULL) - { - free (xvers_ts->options); - xvers_ts->options = - xmalloc (strlen (vers_ts->srcfile->expand) + 3); - strcpy (xvers_ts->options, "-k"); - strcat (xvers_ts->options, vers_ts->srcfile->expand); - } - } (void) time (&last_register_time); @@ -1142,12 +1124,12 @@ checkout_file (file, repository, entries, srcfiles, vers_ts, update_dir) * itself. */ static int -patch_file (file, repository, entries, srcfiles, vers_ts, update_dir, +patch_file (file, repository, entries, rcsnode, vers_ts, update_dir, docheckout, file_info, checksum) char *file; char *repository; List *entries; - List *srcfiles; + RCSNode *rcsnode; Vers_TS *vers_ts; char *update_dir; int *docheckout; @@ -1328,7 +1310,7 @@ patch_file (file, repository, entries, srcfiles, vers_ts, update_dir, /* This stuff is just copied blindly from checkout_file. I don't really know what it does. */ xvers_ts = Version_TS (repository, options, tag, date, file, - force_tag_match, 0, entries, srcfiles); + force_tag_match, 0, entries, rcsnode); if (strcmp (xvers_ts->options, "-V4") == 0) xvers_ts->options[0] = '\0'; @@ -1516,13 +1498,13 @@ merge_file (file, repository, entries, vers, update_dir) */ static void #ifdef SERVER_SUPPORT -join_file (file, srcfiles, vers, update_dir, entries, repository) +join_file (file, rcsnode, vers, update_dir, entries, repository) char *repository; #else -join_file (file, srcfiles, vers, update_dir, entries) +join_file (file, rcsnode, vers, update_dir, entries) #endif char *file; - List *srcfiles; + RCSNode *rcsnode; Vers_TS *vers; char *update_dir; List *entries; @@ -1746,7 +1728,7 @@ join_file (file, srcfiles, vers, update_dir, entries) return; } - baserev = RCS_whatbranch (file, join_rev1, srcfiles); + baserev = RCS_whatbranch (file, join_rev1, rcsnode); if (baserev) { char *cp; diff --git a/gnu/usr.bin/cvs/windows-NT/alloca.h b/gnu/usr.bin/cvs/windows-NT/alloca.h deleted file mode 100644 index 590b250fc73..00000000000 --- a/gnu/usr.bin/cvs/windows-NT/alloca.h +++ /dev/null @@ -1,26 +0,0 @@ -/* alloca.h --- Windows NT version of alloca.h - Jim Blandy --- July 1995 */ - -/* Here's the situation. - - CVS uses alloca. Not in many places, but that number is likely to grow - since the GNU coding standards give alloca official blessing, and - supposedly autoconf takes care of the portability problems. - - Windows NT has alloca, but calls it _alloca and declares it to return - void *. - - The autoconf manual provides a big wad of CPP cruft to place in files - that want to use alloca; it currently appears in lib/system.h, - lib/regex.c, and in src/cvs.h. This boilerplate wad says that if you - HAVE_ALLOCA but don't HAVE_ALLOCA_H, you should declare alloca as an - extern function returning char *. - - This may be fine for most systems, but it makes Visual C++ barf, - because the return types conflict. So the workaround is to - actually have an alloca.h file that declares things appropriately. - The boilerplate alloca wad says that if you HAVE_ALLOCA_H, let it - declare everything for you. Which suits us fine. */ - -#define alloca _alloca -extern void *alloca ();