This commit was generated by cvs2svn to compensate for changes in r44852,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
Peter Wemm 1999-03-18 09:21:42 +00:00
commit 6a2d2db53b
51 changed files with 4222 additions and 1443 deletions

View file

@ -15,20 +15,6 @@ similar file for the unix-like operating systems (not yet, at least).
This file also might contain some platform-specific bugs.
* One cannot specify some files as binary in a "cvs import" using
CVSROOT/cvswrappers (for why, note that client_process_import_file has
no way of knowing about CVSROOT/cvswrappers which is off on the
server).
* I don't think that "cvs add" honors any of the -k wrappers, at least
not in client/server mode. I would think it should. Getting
CVSROOT/cvswrappers to work would presumably best be done by keeping a
copy of it in the CVS directory on the client, as has also been
discussed for CVS/Template, &c. Getting a client-side .cvswrappers to
work is a separate issue.
* Need more work on the procedure for fixing it if a binary file is
accidentally added in text mode (sanity.sh test cases, better
documentation, probably update and/or admin -kb should update

View file

@ -1,3 +1,86 @@
1998-08-06 Jim Kingdon <kingdon@harvey.cyclic.com>
* INSTALL: Update for SCO OpenServer 5 (reported by Jeffery
Cann).
1998-08-01 Jim Kingdon <kingdon@harvey.cyclic.com>
* INSTALL: Add Unixware 7 (reported by Phillip Porch).
1998-07-29 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvsnt.mak: For rcscmds.c, also include files from the diff
directory. Plus of course the usual voluminous "because Visual
C++ 4.0 feels like it" changes.
Tue Jul 28 22:16:48 1998 Noel Cragg <noel@swish.red-bean.com>
* Makefile.in (dist): unset the GZIP shell variable before calling
gzip to avoid invocation problems.
Sun Jul 26 16:22:21 1998 Noel Cragg <noel@swish.red-bean.com>
* NEWS: add info about TopLevelAdmin.
1998-07-20 Jim Kingdon <kingdon@harvey.cyclic.com>
* INSTALL: Update entries for HPUX and AIX (based on a submission
from Andreas Ley).
1998-06-25 Jim Kingdon <kingdon@harvey.cyclic.com>
* README.VMS: We generally don't need GNU patch any more.
1998-06-03 Jim Kingdon <kingdon@harvey.cyclic.com>
* TESTS: Don't mention the version of Solaris; Mark Borges says
that it applies to Solaris 2.5 as well as 2.6.
1998-06-02 Assar Westerlund <assar@sics.se>
* configure.in: Test for GSS_C_NT_HOSTBASED_SERVICE in gssapi.h.
* acconfig.h: Add undef for HAVE_GSS_C_NT_HOSTBASED_SERVICE.
* configure, config.h.in: Rebuild.
1998-06-01 Assar Westerlund <assar@sics.se>
and Ian Lance Taylor <ian@cygnus.com>
* configure.in: Check for GSSAPI headers individually. Use a
different set of GSSPI libraries if gssapi.h rather than
gssapi/gssapi.h is found. Adds Heimdal support.
* configure, config.h.in: Rebuild.
1998-05-25 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.spec (%description): Rewrite to be slightly more verbose
about the basic features. Don't try to mention what CVS lacks.
1998-05-23 Jim Kingdon <kingdon@harvey.cyclic.com>
* BUGS: Remove items about binary file bugs which were fixed
approximately 6 months ago.
1998-04-28 Jim Kingdon <kingdon@harvey.cyclic.com>
* TESTS: Add note about Solaris sort program (reported by Mark
D. Baushke).
1998-03-16 Larry Jones <larry.jones@sdrc.com>
* configure.in: Simplify test for shadow password support since
the code now handles the case where shadow passwords are supported
but are not in use.
* configure: Regenerated.
1998-03-07 Jim Kingdon <kingdon@harvey.cyclic.com>
* TESTS: Remove note about SGI's XFS. Someone reports that it
works (I would assume due to the 13 Feb 1998, and earlier, changes
to sanity.sh).
* NEWS: Add item about PreservePermissions. Fix unclear wording
in gserver item.
1998-03-04 Jim Kingdon <kingdon@harvey.cyclic.com>
* acconfig.h, configure.in: Add PRESERVE_PERMISSIONS_SUPPORT and

View file

@ -118,14 +118,15 @@ HPPA:
HPPA running HP-UX 9 (1.8)
HPPA 1.1 running HP-UX A.09.03 (1.5.95) (footnote 8)
HPPA 1.1 running HP-UX A.09.04 (1.7.1)
HPPA 9000/735 running HP-UX A.09.05 (1.8.87)
HPPA running HP-UX 9.05 (1.9)
HPPA running HP-UX 10.01 (1.7)
HPPA running HP-UX 10.20 using gcc 2.7.2.2 (1.9.14)
HPPA running HP-UX 10.20 (1.9, 1.9.14)
NextSTEP 3.3 (1.7)
i386 family:
Solaris 2.4 using gcc (about 1.4A2)
UnixWare v1.1.1 using gcc (about 1.4A2)
Unixware 2.1 (1.8.86)
Unixware 7 (1.9.29)
ISC 4.0.1 (1.8.87)
Linux (kernel 1.2.x) (1.8.86)
Linux (kernel 2.0.x, RedHat 4.2) (1.9)
@ -133,7 +134,7 @@ i386 family:
FreeBSD 2.1.5-stable (1.8.87)
NextSTEP 3.3 (1.7)
SCO Unix 3.2.4.2, gcc 2.7.2 (1.8.87) (footnote 4)
SCO OpenServer 5 (1.8.86)
SCO OpenServer 5 (1.9.29)
Sequent Dynix/PTX 4.1.4 (1.9.20 or so + patches)
Lynx 2.3.0 080695 (1.6.86) (footnote 9)
Windows NT 3.51 (1.8.86 client; 1.8.3 local)
@ -164,7 +165,7 @@ MIPS:
PowerPC or RS/6000:
IBM RS/6000 running AIX 3.1 using gcc and cc (1.6.86)
IBM RS/6000 running AIX 3.2.5 (1.8)
IBM RS/6000 running AIX 4.1 using gcc and cc (about 1.4A2) (footnote 1)
IBM RS/6000 running AIX 4.1 (1.9)
Lynx 2.3.1 120495 (1.6.86) (footnote 9)
Lynx 2.5 (1.9) (footnote 10)
SPARC:
@ -179,11 +180,6 @@ VAX:
VAX running VMS 6.2 (1.9+patches, client-only)
(see README.VMS for information on necessary hacks).
(footnote 1)
AIX 4.1 systems fail to run "configure" due to bugs in their
"/bin/sh" implementation. You might want to try feeding the
configure script to "bash" ported to AIX 4.1. (about 1.4A2).
(footnote 2)
Some Irix 4.0 systems may core dump in malloc while running
CVS. We believe this is a bug in the Irix malloc. You can

View file

@ -222,7 +222,7 @@ dist: spec
${MAKE} dist-dir DISTDIR="$${DISTDIR}" \
); \
done
tar chf${TAR_VERBOSE} - `cat .fname` | ${GZIP} > "`cat .fname`.tar${GZIP_EXT}"
(unset GZIP; tar chf${TAR_VERBOSE} - `cat .fname` | ${GZIP} > "`cat .fname`.tar${GZIP_EXT}")
rm -rf `cat .fname` .fname .version
.PHONY: dist-dir

View file

@ -1,8 +1,19 @@
Changes since 1.9:
* There is a new feature, enabled by TopLevelAdmin in CVSROOT/config,
which tells CVS to modify the behavior of the "checkout" command. The
command now creates a CVS directory at the top level of the new
working directory, in addition to CVS directories created within
checked-out directories. See the Cederqvist for details.
* There is an optional set of features, enabled by PreservePermissions
in CVSROOT/config, which allow CVS to store unix-specific file
information such as permissions, file ownership, and links. See the
Cederqvist for details.
* One can now authenticate and encrypt using the GSSAPI network
security interface. For details see the description of :gserver: in
CVSROOT, and the -a global option.
security interface. For details see the Cederqvist's description of
specifying :gserver: in CVSROOT, and the -a global option.
* All access to RCS files is now implemented internally rather than by
calling RCS programs. The main user-visible consequence of this is
@ -50,10 +61,6 @@ cvs.texinfo for details, including a discussion of security issues.
Note that the requirement that read-only users be able to create locks
and write the history file still applies.
* The "checkout" command now creates a CVS directory at the top level
of the new working directory, in addition to CVS directories created
within checked-out directories.
* There is a new administrative file verifymsg which is like editinfo
but merely validates the message, rather than also getting it from the
user. It therefore works with client/server CVS or if one uses the -m

View file

@ -14,13 +14,14 @@ disks are slow or over-loaded.
The tests work in /tmp/cvs-sanity (which the tests create) by default.
If for some reason you want them to work in a different directory, you
can set the TESTDIR environment variable to the desired location
before running them. In particular, using SGI's Irix 6, the tests
will fail if TESTDIR is an XFS filesystem (which /tmp often is);
you'll want to set TESTDIR to a non-XFS filesystem.
before running them.
You will probably need GNU expr, which is part of the GNU sh-utils
package (this is just for running the tests; CVS itself doesn't use
expr).
package. You may also need sort from the GNU textutils; Solaris
in particular has been reported to have a sort program which does not
behave the way that the testsuite expects (with Solaris, lines
starting with tabs sort before blank lines). These programs are just
for running the tests; CVS itself doesn't require expr or sort.
If there is some unexpected output, that is a failure which can be
somewhat hard to track down. Finding out which test is producing the

View file

@ -4,6 +4,10 @@
/* Define if you have GSSAPI with MIT Kerberos version 5 available. */
#undef HAVE_GSSAPI
/* Define if GSS_C_NT_HOSTBASED_SERVICE is defined in the gssapi.h
header file. Only relevant when using GSSAPI. */
#undef HAVE_GSS_C_NT_HOSTBASED_SERVICE
/* Define if you want CVS to be able to be a remote repository client. */
#undef CLIENT_SUPPORT

View file

@ -74,6 +74,10 @@
/* Define if you have GSSAPI with MIT Kerberos version 5 available. */
#undef HAVE_GSSAPI
/* Define if GSS_C_NT_HOSTBASED_SERVICE is defined in the gssapi.h
header file. Only relevant when using GSSAPI. */
#undef HAVE_GSS_C_NT_HOSTBASED_SERVICE
/* Define if you want CVS to be able to be a remote repository client. */
#undef CLIENT_SUPPORT
@ -191,6 +195,15 @@
/* Define if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define if you have the <gssapi.h> header file. */
#undef HAVE_GSSAPI_H
/* Define if you have the <gssapi/gssapi.h> header file. */
#undef HAVE_GSSAPI_GSSAPI_H
/* Define if you have the <gssapi/gssapi_generic.h> header file. */
#undef HAVE_GSSAPI_GSSAPI_GENERIC_H
/* Define if you have the <io.h> header file. */
#undef HAVE_IO_H

189
contrib/cvs/configure vendored
View file

@ -2126,11 +2126,7 @@ EOF
fi
echo $ac_n "checking for evidence of shadow passwords""... $ac_c" 1>&6
if test -f /etc/shadow \
|| test -f /etc/security/passwd.adjunct ; then
found="yes"
echo $ac_n "checking for -lsec""... $ac_c" 1>&6
echo $ac_n "checking for -lsec""... $ac_c" 1>&6
ac_lib_var=`echo sec'_'getspnam | tr './+\055' '__p_'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2138,7 +2134,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lsec $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2142 "configure"
#line 2138 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2150,7 +2146,7 @@ int t() {
getspnam()
; return 0; }
EOF
if { (eval echo configure:2154: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2174,14 +2170,14 @@ else
echo "$ac_t""no" 1>&6
fi
for ac_func in getspnam
for ac_func in getspnam
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 <<EOF
#line 2185 "configure"
#line 2181 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@ -2205,7 +2201,7 @@ $ac_func();
; return 0; }
EOF
if { (eval echo configure:2209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@ -2227,10 +2223,6 @@ else
fi
done
else
found="no"
fi
echo "$ac_t""$found" 1>&6
echo $ac_n "checking whether utime accepts a null argument""... $ac_c" 1>&6
if eval "test \"`echo '$''{'ac_cv_func_utime_null'+set}'`\" = set"; then
@ -2242,7 +2234,7 @@ if test "$cross_compiling" = yes; then
ac_cv_func_utime_null=no
else
cat > conftest.$ac_ext <<EOF
#line 2246 "configure"
#line 2238 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/stat.h>
@ -2253,7 +2245,7 @@ exit(!(stat ("conftestdata", &s) == 0 && utime("conftestdata", (long *)0) == 0
&& t.st_mtime - s.st_mtime < 120));
}
EOF
{ (eval echo configure:2257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
{ (eval echo configure:2249: \"$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
@ -2317,7 +2309,7 @@ else
ccvs_cv_sys_working_fnmatch=no
else
cat > conftest.$ac_ext <<EOF
#line 2321 "configure"
#line 2313 "configure"
#include "confdefs.h"
#include <fnmatch.h>
@ -2329,7 +2321,7 @@ main ()
? 0 : 1);
}
EOF
{ (eval echo configure:2333: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
{ (eval echo configure:2325: \"$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
@ -2354,7 +2346,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 <<EOF
#line 2358 "configure"
#line 2350 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
@ -2378,7 +2370,7 @@ connect();
; return 0; }
EOF
if { (eval echo configure:2382: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2374: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
@ -2403,7 +2395,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lnsl_s $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2407 "configure"
#line 2399 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2415,7 +2407,7 @@ int t() {
printf()
; return 0; }
EOF
if { (eval echo configure:2419: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2450,7 +2442,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2454 "configure"
#line 2446 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2462,7 +2454,7 @@ int t() {
printf()
; return 0; }
EOF
if { (eval echo configure:2466: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2497,7 +2489,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lsocket $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2501 "configure"
#line 2493 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2509,7 +2501,7 @@ int t() {
connect()
; return 0; }
EOF
if { (eval echo configure:2513: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2544,7 +2536,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-linet $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2548 "configure"
#line 2540 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2556,7 +2548,7 @@ int t() {
connect()
; return 0; }
EOF
if { (eval echo configure:2560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2552: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2607,7 +2599,7 @@ if test "$cross_compiling" != yes && test -r $KRB4/include/krb.h; then
hold_cflags=$CFLAGS
CFLAGS="$CFLAGS -I$KRB4/include"
cat > conftest.$ac_ext <<EOF
#line 2611 "configure"
#line 2603 "configure"
#include "confdefs.h"
#include <krb.h>
int main() { return 0; }
@ -2615,14 +2607,14 @@ int t() {
int i;
; return 0; }
EOF
if { (eval echo configure:2619: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2611: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
krb_h=yes krb_incdir=$KRB4/include
else
rm -rf conftest*
CFLAGS=$hold_cflags
cat > conftest.$ac_ext <<EOF
#line 2626 "configure"
#line 2618 "configure"
#include "confdefs.h"
#include <krb.h>
int main() { return 0; }
@ -2630,7 +2622,7 @@ int t() {
int i;
; return 0; }
EOF
if { (eval echo configure:2634: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
krb_h=yes krb_incdir=
fi
@ -2642,7 +2634,7 @@ rm -f conftest*
CFLAGS=$hold_cflags
else
cat > conftest.$ac_ext <<EOF
#line 2646 "configure"
#line 2638 "configure"
#include "confdefs.h"
#include <krb.h>
int main() { return 0; }
@ -2650,7 +2642,7 @@ int t() {
int i;
; return 0; }
EOF
if { (eval echo configure:2654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
krb_h=yes krb_incdir=
fi
@ -2659,7 +2651,7 @@ rm -f conftest*
fi
if test -z "$krb_h"; then
cat > conftest.$ac_ext <<EOF
#line 2663 "configure"
#line 2655 "configure"
#include "confdefs.h"
#include <krb.h>
int main() { return 0; }
@ -2667,7 +2659,7 @@ int t() {
int i;
; return 0; }
EOF
if { (eval echo configure:2671: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2663: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
krb_h=yes krb_incdir=
else
@ -2676,7 +2668,7 @@ else
hold_cflags=$CFLAGS
CFLAGS="$CFLAGS -I$KRB4/include/kerberosIV"
cat > conftest.$ac_ext <<EOF
#line 2680 "configure"
#line 2672 "configure"
#include "confdefs.h"
#include <krb.h>
int main() { return 0; }
@ -2684,7 +2676,7 @@ int t() {
int i;
; return 0; }
EOF
if { (eval echo configure:2688: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
krb_h=yes krb_incdir=$KRB4/include/kerberosIV
fi
@ -2713,7 +2705,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lkrb $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2717 "configure"
#line 2709 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2725,7 +2717,7 @@ int t() {
printf()
; return 0; }
EOF
if { (eval echo configure:2729: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2752,7 +2744,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lkrb $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2756 "configure"
#line 2748 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2764,7 +2756,7 @@ int t() {
open()
; return 0; }
EOF
if { (eval echo configure:2768: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2760: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2794,7 +2786,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lkrb $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2798 "configure"
#line 2790 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2806,7 +2798,7 @@ int t() {
printf()
; return 0; }
EOF
if { (eval echo configure:2810: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2802: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2845,7 +2837,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldes $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2849 "configure"
#line 2841 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2857,7 +2849,7 @@ int t() {
printf()
; return 0; }
EOF
if { (eval echo configure:2861: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2853: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2888,7 +2880,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 <<EOF
#line 2892 "configure"
#line 2884 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@ -2912,7 +2904,7 @@ $ac_func();
; return 0; }
EOF
if { (eval echo configure:2916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:2908: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@ -2945,21 +2937,22 @@ fi
echo "default place for GSSAPI is $GSSAPI"
echo $ac_n "checking for gssapi.h""... $ac_c" 1>&6
hold_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$GSSAPI/include "
ac_safe=`echo "gssapi/gssapi.h" | tr './\055' '___'`
echo $ac_n "checking for gssapi/gssapi.h""... $ac_c" 1>&6
for ac_hdr in gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h
do
ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
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
#line 2958 "configure"
#line 2951 "configure"
#include "confdefs.h"
#include <gssapi/gssapi.h>
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2963: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:2956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
@ -2973,15 +2966,69 @@ rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
echo "$ac_t""yes" 1>&6
ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'`
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
else
echo "$ac_t""no" 1>&6
fi
done
CPPFLAGS=$hold_cppflags
if test "$ac_cv_header_gssapi_h" = "yes" || test "$ac_cv_header_gssapi_gssapi_h" = "yes"; then
cat >> confdefs.h <<\EOF
#define HAVE_GSSAPI 1
EOF
LIBS="$LIBS -L$GSSAPI/lib -lgssapi_krb5 -lkrb5 -lcrypto -lcom_err"
includeopt="${includeopt} -I$GSSAPI/include"
# This is necessary on Irix 5.3, in order to link against libkrb5 --
# there, an_to_ln.o refers to things defined only in -lgen.
echo $ac_n "checking for -lgen""... $ac_c" 1>&6
includeopt="${includeopt} -I$GSSAPI/include"
# FIXME: This is ugly, but these things don't seem to be standardized.
if test "$ac_cv_header_gssapi_h" = "yes"; then
LIBS="$LIBS -L$GSSAPI/lib -lgssapi -lkrb5 -lasn1 -ldes -lroken"
else
LIBS="$LIBS -L$GSSAPI/lib -lgssapi_krb5 -lkrb5 -lcrypto -lcom_err"
fi
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="-I$GSSAPI/include $CPPFLAGS"
if test "$ac_cv_header_gssapi_h" = "yes"; then
cat > conftest.$ac_ext <<EOF
#line 2998 "configure"
#include "confdefs.h"
#include <gssapi.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "GSS_C_NT_HOSTBASED_SERVICE" >/dev/null 2>&1; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1
EOF
fi
rm -f conftest*
else
cat > conftest.$ac_ext <<EOF
#line 3014 "configure"
#include "confdefs.h"
#include <gssapi/gssapi.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "GSS_C_NT_HOSTBASED_SERVICE" >/dev/null 2>&1; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1
EOF
fi
rm -f conftest*
fi
CPPFLAGS=$save_CPPFLAGS
# This is necessary on Irix 5.3, in order to link against libkrb5 --
# there, an_to_ln.o refers to things defined only in -lgen.
echo $ac_n "checking for -lgen""... $ac_c" 1>&6
ac_lib_var=`echo gen'_'compile | tr './+\055' '__p_'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2989,7 +3036,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lgen $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2993 "configure"
#line 3040 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -3001,7 +3048,7 @@ int t() {
compile()
; return 0; }
EOF
if { (eval echo configure:3005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:3052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -3025,12 +3072,8 @@ else
echo "$ac_t""no" 1>&6
fi
else
echo "$ac_t""no" 1>&6
fi
CPPFLAGS=$hold_cppflags
# Check whether --enable-encryption or --disable-encryption was given.
if test "${enable_encryption+set}" = set; then
enableval="$enable_encryption"
@ -3055,7 +3098,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 <<EOF
#line 3059 "configure"
#line 3102 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostname(); below. */
@ -3079,7 +3122,7 @@ gethostname();
; return 0; }
EOF
if { (eval echo configure:3083: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:3126: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_func_gethostname=yes"
else
@ -3156,7 +3199,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lcrypt $LIBS"
cat > conftest.$ac_ext <<EOF
#line 3160 "configure"
#line 3203 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -3168,7 +3211,7 @@ int t() {
crypt()
; return 0; }
EOF
if { (eval echo configure:3172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:3215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -3199,7 +3242,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 <<EOF
#line 3203 "configure"
#line 3246 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@ -3223,7 +3266,7 @@ $ac_func();
; return 0; }
EOF
if { (eval echo configure:3227: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:3270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@ -3264,7 +3307,7 @@ if eval "test \"`echo '$''{'ccvs_cv_sys_cygwin32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 3268 "configure"
#line 3311 "configure"
#include "confdefs.h"
int main() { return 0; }
@ -3272,7 +3315,7 @@ int t() {
return __CYGWIN32__;
; return 0; }
EOF
if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:3319: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ccvs_cv_sys_cygwin32=yes
else

View file

@ -91,24 +91,13 @@ AC_FUNC_VFORK
AC_FUNC_CLOSEDIR_VOID
dnl
dnl Look for shadow password files before we go ahead and set getspnam.
dnl On some systems (Linux), the C library has getspnam but shadow
dnl passwords might not be in use.
dnl Check for shadow password support.
dnl
dnl We used to check for the existence of the /etc/security directory
dnl here, but that's incorrect, since it's possible to have PAM installed
dnl without using shadow passwords.
dnl
AC_MSG_CHECKING([for evidence of shadow passwords])
if test -f /etc/shadow \
|| test -f /etc/security/passwd.adjunct ; then
found="yes"
AC_CHECK_LIB(sec, getspnam)
AC_CHECK_FUNCS(getspnam)
else
found="no"
fi
AC_MSG_RESULT([$found])
dnl We used to try to determine whether shadow passwords were actually in
dnl use or not, but the code has been changed to work right reguardless,
dnl so we can go back to a simple check.
AC_CHECK_LIB(sec, getspnam)
AC_CHECK_FUNCS(getspnam)
dnl We always use CVS's regular expression matcher.
dnl This is because:
@ -271,18 +260,33 @@ echo "default place for GSSAPI is $GSSAPI"
AC_SUBST(GSSAPI)])dnl
WITH_GSSAPI
AC_MSG_CHECKING([for gssapi.h])
hold_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS -I$GSSAPI/include "
AC_CHECK_HEADER(gssapi/gssapi.h,
[AC_DEFINE(HAVE_GSSAPI)
LIBS="$LIBS -L$GSSAPI/lib -lgssapi_krb5 -lkrb5 -lcrypto -lcom_err"
includeopt="${includeopt} -I$GSSAPI/include"
# This is necessary on Irix 5.3, in order to link against libkrb5 --
# there, an_to_ln.o refers to things defined only in -lgen.
AC_CHECK_LIB(gen, compile)])
AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h gssapi/gssapi_generic.h)
CPPFLAGS=$hold_cppflags
if test "$ac_cv_header_gssapi_h" = "yes" || test "$ac_cv_header_gssapi_gssapi_h" = "yes"; then
AC_DEFINE(HAVE_GSSAPI)
includeopt="${includeopt} -I$GSSAPI/include"
# FIXME: This is ugly, but these things don't seem to be standardized.
if test "$ac_cv_header_gssapi_h" = "yes"; then
LIBS="$LIBS -L$GSSAPI/lib -lgssapi -lkrb5 -lasn1 -ldes -lroken"
else
LIBS="$LIBS -L$GSSAPI/lib -lgssapi_krb5 -lkrb5 -lcrypto -lcom_err"
fi
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="-I$GSSAPI/include $CPPFLAGS"
if test "$ac_cv_header_gssapi_h" = "yes"; then
AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi.h, AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE))
else
AC_EGREP_HEADER(GSS_C_NT_HOSTBASED_SERVICE, gssapi/gssapi.h, AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE))
fi
CPPFLAGS=$save_CPPFLAGS
# This is necessary on Irix 5.3, in order to link against libkrb5 --
# there, an_to_ln.o refers to things defined only in -lgen.
AC_CHECK_LIB(gen, compile)
fi
dnl
dnl Use --with-encryption to turn on encryption support
dnl

View file

@ -1,3 +1,7 @@
1998-05-11 W. Bradley Rubenstein
* log.pl: Check for errors from open and exec.
Sat Feb 21 21:59:45 1998 Ian Lance Taylor <ian@cygnus.com>
* Makefile.in (clean): Change "/bin/rm" to "rm".

View file

@ -1,3 +1,56 @@
1998-08-06 David Masterson of kla-tencor.com
* util.c (flush_output): Don't prototype.
Thu Jul 2 16:34:38 1998 Ian Lance Taylor <ian@cygnus.com>
Simplify the callback interface:
* diffrun.h: Don't include <stdarg.h> or <varargs.h>.
(struct diff_callbacks): Remove printf_output field.
* util.c: Include <stdarg.h> or <varargs.h>.
(printf_output): Use vasprintf and write_output callback rather
than printf_output callback.
* diff3.c (read_diff): Don't set my_callbacks.printf_output.
Thu Jun 18 12:43:53 1998 Ian Lance Taylor <ian@cygnus.com>
* diffrun.h: New file.
* diff.h: Include diffrun.h.
(callbacks): New EXTERN variable.
(write_output, printf_output, flush_output): Declare.
* diff.c (diff_run): Add parameter callbacks_arg. Use callback
functions rather than writing to stdout. Don't open a file if
there is a write_output callback. Call perror_with_name rather
than perror.
(usage): Use callbacks if defined rather than writing to stdout.
(compare_files): Call flush_output rather than fflush (outfile).
* diff3.c: Include diffrun.h. Change several functions to use
output functions from util.c rather than direct printing. Use
diff_error and friends rather than printing to stderr. Set global
variable outfile.
(outfile, callbacks): Declare.
(write_output, printf_output, flush_output): Declare.
(diff3_run): Add parameter callbacks_arg. Use callback functions
rather than writing to stdout.
(usage): Use callbacks if defined rather than writing to stdout.
(read_diff): Preserve callbacks and outfile around call to
diff_run.
* util.c (perror_with_name): Use error callback if defined.
(pfatal_with_name, diff_error): Likewise.
(message5): Use printf_output and write_output.
(print_message_queue, print_1_line, output_1_line): Likewise.
(begin_output): Reject paginate_flag if there are output
callbacks.
(write_output, printf_output, flush_output): New functions.
* context.c: Change all output to outfile to use printf_output and
write_output.
* ed.c: Likewise.
* ifdef.c: Likewise.
* normal.c: Likewise.
* side.c: Likewise.
* Makefile.in (SOURCES): Add diffrun.h.
($(OBJECTS)): Depend upon diffrun.h.
Fri Jan 16 14:58:19 1998 Larry Jones <larry.jones@sdrc.com>
* diff.c, diff3.c: Plug memory leaks.

View file

@ -1,5 +1,5 @@
# Makefile for GNU DIFF
# Copyright (C) 1988,1989,1991,1992,1993,1994,1997 Free Software Foundation, Inc.
# Copyright (C) 1988,1989,1991,1992,1993,1994,1997,1998 Free Software Foundation, Inc.
#
# This file is part of GNU DIFF.
#
@ -43,7 +43,8 @@ SHELL = /bin/sh
# The source files for all of the programs.
SOURCES = diff.c diff3.c analyze.c cmpbuf.c cmpbuf.h io.c context.c ed.c \
normal.c ifdef.c util.c dir.c version.c diff.h side.c system.h
normal.c ifdef.c util.c dir.c version.c diff.h side.c system.h \
diffrun.h
OBJECTS = diff.o diff3.o analyze.o cmpbuf.o dir.o io.o util.o \
context.o ed.o ifdef.o normal.o side.o version.o
DISTFILES = $(SOURCES) ChangeLog build_diff.com Makefile.in
@ -66,7 +67,7 @@ libdiff libdiff.a: $(OBJECTS)
$(AR) cr libdiff.a $(OBJECTS)
-$(RANLIB) libdiff.a
$(OBJECTS): diff.h system.h
$(OBJECTS): diff.h diffrun.h system.h
analyze.o cmpbuf.o: cmpbuf.h
util.o: util.c

View file

@ -1,5 +1,5 @@
/* Context-format output routines for GNU DIFF.
Copyright (C) 1988,1989,1991,1992,1993,1994 Free Software Foundation, Inc.
Copyright (C) 1988,1989,1991,1992,1993,1994,1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -43,14 +43,14 @@ print_context_label (mark, inf, label)
char const *label;
{
if (label)
fprintf (outfile, "%s %s\n", mark, label);
printf_output ("%s %s\n", mark, label);
else
{
char const *ct = ctime (&inf->stat.st_mtime);
if (!ct)
ct = "?\n";
/* See Posix.2 section 4.17.6.1.4 for this format. */
fprintf (outfile, "%s %s\t%s", mark, inf->name, ct);
printf_output ("%s %s\t%s", mark, inf->name, ct);
}
}
@ -116,9 +116,9 @@ print_context_number_range (file, a, b)
In this case, we should print the line number before the range,
which is B. */
if (trans_b > trans_a)
fprintf (outfile, "%d,%d", trans_a, trans_b);
printf_output ("%d,%d", trans_a, trans_b);
else
fprintf (outfile, "%d", trans_b);
printf_output ("%d", trans_b);
}
/* Print a portion of an edit script in context format.
@ -137,7 +137,6 @@ pr_context_hunk (hunk)
char const *prefix;
char const *function;
size_t function_length;
FILE *out;
/* Determine range of line numbers involved in each file. */
@ -160,21 +159,20 @@ pr_context_hunk (hunk)
find_function (&files[0], first0, &function, &function_length);
begin_output ();
out = outfile;
/* If we looked for and found a function this is part of,
include its name in the header of the diff section. */
fprintf (out, "***************");
printf_output ("***************");
if (function)
{
fprintf (out, " ");
fwrite (function, 1, min (function_length - 1, 40), out);
printf_output (" ");
write_output (function, min (function_length - 1, 40));
}
fprintf (out, "\n*** ");
printf_output ("\n*** ");
print_context_number_range (&files[0], first0, last0);
fprintf (out, " ****\n");
printf_output (" ****\n");
if (show_from)
{
@ -201,9 +199,9 @@ pr_context_hunk (hunk)
}
}
fprintf (out, "--- ");
printf_output ("--- ");
print_context_number_range (&files[1], first1, last1);
fprintf (out, " ----\n");
printf_output (" ----\n");
if (show_to)
{
@ -250,9 +248,9 @@ print_unidiff_number_range (file, a, b)
In this case, we should print the line number before the range,
which is B. */
if (trans_b <= trans_a)
fprintf (outfile, trans_b == trans_a ? "%d" : "%d,0", trans_b);
printf_output (trans_b == trans_a ? "%d" : "%d,0", trans_b);
else
fprintf (outfile, "%d,%d", trans_a, trans_b - trans_a + 1);
printf_output ("%d,%d", trans_a, trans_b - trans_a + 1);
}
/* Print a portion of an edit script in unidiff format.
@ -270,7 +268,6 @@ pr_unidiff_hunk (hunk)
struct change *next;
char const *function;
size_t function_length;
FILE *out;
/* Determine range of line numbers involved in each file. */
@ -293,23 +290,22 @@ pr_unidiff_hunk (hunk)
find_function (&files[0], first0, &function, &function_length);
begin_output ();
out = outfile;
fprintf (out, "@@ -");
printf_output ("@@ -");
print_unidiff_number_range (&files[0], first0, last0);
fprintf (out, " +");
printf_output (" +");
print_unidiff_number_range (&files[1], first1, last1);
fprintf (out, " @@");
printf_output (" @@");
/* If we looked for and found a function this is part of,
include its name in the header of the diff section. */
if (function)
{
putc (' ', out);
fwrite (function, 1, min (function_length - 1, 40), out);
write_output (" ", 1);
write_output (function, min (function_length - 1, 40));
}
putc ('\n', out);
write_output ("\n", 1);
next = hunk;
i = first0;
@ -322,7 +318,7 @@ pr_unidiff_hunk (hunk)
if (!next || i < next->line0)
{
putc (tab_align_flag ? '\t' : ' ', out);
write_output (tab_align_flag ? "\t" : " ", 1);
print_1_line (0, &files[0].linbuf[i++]);
j++;
}
@ -333,9 +329,9 @@ pr_unidiff_hunk (hunk)
k = next->deleted;
while (k--)
{
putc ('-', out);
write_output ("-", 1);
if (tab_align_flag)
putc ('\t', out);
write_output ("\t", 1);
print_1_line (0, &files[0].linbuf[i++]);
}
@ -344,9 +340,9 @@ pr_unidiff_hunk (hunk)
k = next->inserted;
while (k--)
{
putc ('+', out);
write_output ("+", 1);
if (tab_align_flag)
putc ('\t', out);
write_output ("\t", 1);
print_1_line (0, &files[1].linbuf[j++]);
}

View file

@ -1,5 +1,5 @@
/* GNU DIFF entry routine.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -231,10 +231,11 @@ static struct option const longopts[] =
};
int
diff_run (argc, argv, out)
diff_run (argc, argv, out, callbacks_arg)
int argc;
char *argv[];
char *out;
const struct diff_callbacks *callbacks_arg;
{
int val;
int c;
@ -242,6 +243,9 @@ diff_run (argc, argv, out)
int width = DEFAULT_WIDTH;
int show_c_function = 0;
int optind_old;
int opened_file = 0;
callbacks = callbacks_arg;
/* Do our initializations. */
initialize_main (&argc, &argv);
@ -476,7 +480,14 @@ diff_run (argc, argv, out)
break;
case 'v':
printf ("diff - GNU diffutils version %s\n", diff_version_string);
if (callbacks && callbacks->write_stdout)
{
(*callbacks->write_stdout) ("diff - GNU diffutils version ");
(*callbacks->write_stdout) (diff_version_string);
(*callbacks->write_stdout) ("\n");
}
else
printf ("diff - GNU diffutils version %s\n", diff_version_string);
return 0;
case 'w':
@ -555,7 +566,8 @@ diff_run (argc, argv, out)
case 141:
usage ();
check_output (stdout);
if (! callbacks || ! callbacks->write_stdout)
check_output (stdout);
return 0;
case 142:
@ -645,23 +657,35 @@ diff_run (argc, argv, out)
switch_string = option_list (argv + 1, optind - 1);
if (out == NULL)
outfile = stdout;
if (callbacks && callbacks->write_output)
{
if (out != NULL)
{
diff_error ("write callback with output file", 0, 0);
return 2;
}
}
else
{
#if HAVE_SETMODE
/* A diff which is full of ^Z and such isn't going to work
very well in text mode. */
if (binary_I_O)
outfile = fopen (out, "wb");
if (out == NULL)
outfile = stdout;
else
{
#if HAVE_SETMODE
/* A diff which is full of ^Z and such isn't going to work
very well in text mode. */
if (binary_I_O)
outfile = fopen (out, "wb");
else
#endif
outfile = fopen (out, "w");
if (outfile == NULL)
{
perror_with_name ("could not open output file");
return 2;
}
outfile = fopen (out, "w");
if (outfile == NULL)
{
perror_with_name ("could not open output file");
return 2;
}
opened_file = 1;
}
}
/* Set the jump buffer, so that diff may abort execution without
@ -669,7 +693,7 @@ diff_run (argc, argv, out)
if ((val = setjmp (diff_abort_buf)) != 0)
{
optind = optind_old;
if (outfile != stdout)
if (opened_file)
fclose (outfile);
return val;
}
@ -682,10 +706,14 @@ diff_run (argc, argv, out)
free (switch_string);
optind = optind_old;
check_output (outfile);
if (outfile != stdout)
if (! callbacks || ! callbacks->write_output)
check_output (outfile);
if (opened_file)
if (fclose (outfile) != 0)
perror ("close error on output file");
perror_with_name ("close error on output file");
return val;
}
@ -799,10 +827,27 @@ usage ()
{
char const * const *p;
printf ("Usage: %s [OPTION]... FILE1 FILE2\n\n", diff_program_name);
for (p = option_help; *p; p++)
printf (" %s\n", *p);
printf ("\nIf FILE1 or FILE2 is `-', read standard input.\n");
if (callbacks && callbacks->write_stdout)
{
(*callbacks->write_stdout) ("Usage: ");
(*callbacks->write_stdout) (diff_program_name);
(*callbacks->write_stdout) (" [OPTION]... FILE1 FILE2\n\n");
for (p = option_help; *p; p++)
{
(*callbacks->write_stdout) (" ");
(*callbacks->write_stdout) (*p);
(*callbacks->write_stdout) ("\n");
}
(*callbacks->write_stdout)
("\nIf FILE1 or FILE2 is `-', read standard input.\n");
}
else
{
printf ("Usage: %s [OPTION]... FILE1 FILE2\n\n", diff_program_name);
for (p = option_help; *p; p++)
printf (" %s\n", *p);
printf ("\nIf FILE1 or FILE2 is `-', read standard input.\n");
}
}
static int
@ -1147,7 +1192,7 @@ compare_files (dir0, name0, dir1, name1, depth)
inf[0].name, inf[1].name);
}
else
fflush (outfile);
flush_output ();
if (free0)
free (free0);

View file

@ -1,5 +1,5 @@
/* Shared definitions for GNU DIFF
Copyright (C) 1988, 89, 91, 92, 93, 97 Free Software Foundation, Inc.
Copyright (C) 1988, 89, 91, 92, 93, 97, 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -21,6 +21,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <setjmp.h>
#include "regex.h"
#include "diffrun.h"
#define TAB_WIDTH 8
@ -32,6 +33,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define EXTERN
#endif
/* The callbacks to use for output. */
EXTERN const struct diff_callbacks *callbacks;
enum output_style {
/* Default output style. */
OUTPUT_NORMAL,
@ -329,6 +333,13 @@ void debug_script PARAMS((struct change *));
void diff_error PARAMS((char const *, char const *, char const *));
void fatal PARAMS((char const *));
void finish_output PARAMS((void));
void write_output PARAMS((char const *, size_t));
void printf_output PARAMS((char const *, ...))
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 6)
__attribute__ ((__format__ (__printf__, 1, 2)))
#endif
;
void flush_output PARAMS((void));
void message PARAMS((char const *, char const *, char const *));
void message5 PARAMS((char const *, char const *, char const *, char const *, char const *));
void output_1_line PARAMS((char const *, char const *, char const *, char const *));

View file

@ -1,5 +1,5 @@
/* Three way file comparison program (diff3) for Project GNU.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1997, 1998 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
@ -22,6 +22,7 @@
#include <stdio.h>
#include <setjmp.h>
#include "getopt.h"
#include "diffrun.h"
/* diff3.c has a real initialize_main function. */
#ifdef initialize_main
@ -30,6 +31,18 @@
extern char const diff_version_string[];
extern FILE *outfile;
extern const struct diff_callbacks *callbacks;
void write_output PARAMS((char const *, size_t));
void printf_output PARAMS((char const *, ...))
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 6)
__attribute__ ((__format__ (__printf__, 1, 2)))
#endif
;
void flush_output PARAMS((void));
/*
* Internal data structures and macros for the diff3 program; includes
* data structures for both diff3 diffs and normal diffs.
@ -186,9 +199,9 @@ static char *scan_diff_line PARAMS((char *, char **, size_t *, char *, int));
static enum diff_type process_diff_control PARAMS((char **, struct diff_block *));
static int compare_line_list PARAMS((char * const[], size_t const[], char * const[], size_t const[], int));
static int copy_stringlist PARAMS((char * const[], size_t const[], char *[], size_t[], int));
static int dotlines PARAMS((FILE *, struct diff3_block *, int));
static int output_diff3_edscript PARAMS((FILE *, struct diff3_block *, int const[3], int const[3], char const *, char const *, char const *));
static int output_diff3_merge PARAMS((FILE *, FILE *, struct diff3_block *, int const[3], int const[3], char const *, char const *, char const *));
static int dotlines PARAMS((struct diff3_block *, int));
static int output_diff3_edscript PARAMS((struct diff3_block *, int const[3], int const[3], char const *, char const *, char const *));
static int output_diff3_merge PARAMS((FILE *, struct diff3_block *, int const[3], int const[3], char const *, char const *, char const *));
static size_t myread PARAMS((int, char *, size_t));
static struct diff3_block *create_diff3_block PARAMS((int, int, int, int, int, int));
static struct diff3_block *make_3way_diff PARAMS((struct diff_block *, struct diff_block *));
@ -197,17 +210,16 @@ static struct diff3_block *using_to_diff3_block PARAMS((struct diff_block *[2],
static struct diff_block *process_diff PARAMS((char const *, char const *, struct diff_block **, char **));
static void check_output PARAMS((FILE *));
static void diff3_fatal PARAMS((char const *));
static void output_diff3 PARAMS((FILE *, struct diff3_block *, int const[3], int const[3]));
static void output_diff3 PARAMS((struct diff3_block *, int const[3], int const[3]));
static void diff3_perror_with_exit PARAMS((char const *));
static int try_help PARAMS((char const *));
static void undotlines PARAMS((FILE *, int, int, int));
static void undotlines PARAMS((int, int, int));
static void usage PARAMS((void));
static void initialize_main PARAMS((int *, char ***));
static void free_diff_blocks PARAMS((struct diff_block *));
static void free_diff3_blocks PARAMS((struct diff3_block *));
/* Functions provided in libdiff.a or other external sources. */
int diff_run PARAMS((int, char **, char *));
VOID *xmalloc PARAMS((size_t));
VOID *xrealloc PARAMS((VOID *, size_t));
void perror_with_name PARAMS((char const *));
@ -238,10 +250,11 @@ static struct option const longopts[] =
* combines the two diffs, and outputs them.
*/
int
diff3_run (argc, argv, outfile)
diff3_run (argc, argv, out, callbacks_arg)
int argc;
char **argv;
char *outfile;
char *out;
const struct diff_callbacks *callbacks_arg;
{
int c, i;
int mapping[3];
@ -258,7 +271,9 @@ diff3_run (argc, argv, outfile)
char **file;
struct stat statb;
int optind_old;
FILE *outstream;
int opened_file = 0;
callbacks = callbacks_arg;
initialize_main (&argc, &argv);
@ -303,11 +318,19 @@ diff3_run (argc, argv, outfile)
tab_align_flag = 1;
break;
case 'v':
printf ("diff3 - GNU diffutils version %s\n", diff_version_string);
if (callbacks && callbacks->write_stdout)
{
(*callbacks->write_stdout) ("diff3 - GNU diffutils version ");
(*callbacks->write_stdout) (diff_version_string);
(*callbacks->write_stdout) ("\n");
}
else
printf ("diff3 - GNU diffutils version %s\n", diff_version_string);
return 0;
case 129:
usage ();
check_output (stdout);
if (! callbacks || ! callbacks->write_stdout)
check_output (stdout);
return 0;
case 'L':
/* Handle up to three -L options. */
@ -383,22 +406,33 @@ diff3_run (argc, argv, outfile)
}
else if (S_ISDIR(statb.st_mode))
{
fprintf (stderr, "%s: %s: Is a directory\n",
diff_program_name, file[i]);
diff_error ("%s: Is a directory", file[i], 0);
return 2;
}
}
if (outfile == NULL)
outstream = stdout;
if (callbacks && callbacks->write_output)
{
if (out != NULL)
{
diff_error ("write callback with output file", 0, 0);
return 2;
}
}
else
{
outstream = fopen (outfile, "w");
if (outstream == NULL)
{
perror_with_name ("could not open output file");
return 2;
}
if (out == NULL)
outfile = stdout;
else
{
outfile = fopen (out, "w");
if (outfile == NULL)
{
perror_with_name ("could not open output file");
return 2;
}
opened_file = 1;
}
}
/* Set the jump buffer, so that diff may abort execution without
@ -421,21 +455,21 @@ diff3_run (argc, argv, outfile)
diff3 = make_3way_diff (thread0, thread1);
if (edscript)
conflicts_found
= output_diff3_edscript (outstream, diff3, mapping, rev_mapping,
= output_diff3_edscript (diff3, mapping, rev_mapping,
tag_strings[0], tag_strings[1], tag_strings[2]);
else if (merge)
{
if (! freopen (file[rev_mapping[FILE0]], "r", stdin))
diff3_perror_with_exit (file[rev_mapping[FILE0]]);
conflicts_found
= output_diff3_merge (stdin, outstream, diff3, mapping, rev_mapping,
= output_diff3_merge (stdin, diff3, mapping, rev_mapping,
tag_strings[0], tag_strings[1], tag_strings[2]);
if (ferror (stdin))
diff3_fatal ("read error");
}
else
{
output_diff3 (outstream, diff3, mapping, rev_mapping);
output_diff3 (diff3, mapping, rev_mapping);
conflicts_found = 0;
}
@ -445,10 +479,13 @@ diff3_run (argc, argv, outfile)
free_diff_blocks(thread1);
free_diff3_blocks(diff3);
check_output (outstream);
if (outstream != stdout)
if (fclose (outstream) != 0)
perror ("close error on output file");
if (! callbacks || ! callbacks->write_output)
check_output (outfile);
if (opened_file)
if (fclose (outfile) != 0)
perror_with_name ("close error on output file");
return conflicts_found;
}
@ -457,9 +494,8 @@ try_help (reason)
char const *reason;
{
if (reason)
fprintf (stderr, "%s: %s\n", diff_program_name, reason);
fprintf (stderr, "%s: Try `%s --help' for more information.\n",
diff_program_name, diff_program_name);
diff_error ("%s", reason, 0);
diff_error ("Try `%s --help' for more information.", diff_program_name, 0);
return 2;
}
@ -477,25 +513,52 @@ check_output (stream)
static void
usage ()
{
printf ("Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n\n", diff_program_name);
if (callbacks && callbacks->write_stdout)
{
(*callbacks->write_stdout) ("Usage: ");
(*callbacks->write_stdout) (diff_program_name);
(*callbacks->write_stdout) (" [OPTION]... MYFILE OLDFILE YOURFILE\n\n");
printf ("%s", "\
(*callbacks->write_stdout) ("\
-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE.\n\
-E --show-overlap Output unmerged changes, bracketing conflicts.\n\
-A --show-all Output all changes, bracketing conflicts.\n\
-x --overlap-only Output overlapping changes.\n\
-X Output overlapping changes, bracketing them.\n\
-3 --easy-only Output unmerged nonoverlapping changes.\n\n");
printf ("%s", "\
(*callbacks->write_stdout) ("\
-m --merge Output merged file instead of ed script (default -A).\n\
-L LABEL --label=LABEL Use LABEL instead of file name.\n\
-i Append `w' and `q' commands to ed scripts.\n\
-a --text Treat all files as text.\n\
-T --initial-tab Make tabs line up by prepending a tab.\n\n");
printf ("%s", "\
(*callbacks->write_stdout) ("\
-v --version Output version info.\n\
--help Output this help.\n\n");
printf ("If a FILE is `-', read standard input.\n");
(*callbacks->write_stdout) ("If a FILE is `-', read standard input.\n");
}
else
{
printf ("Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n\n", diff_program_name);
printf ("%s", "\
-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE.\n\
-E --show-overlap Output unmerged changes, bracketing conflicts.\n\
-A --show-all Output all changes, bracketing conflicts.\n\
-x --overlap-only Output overlapping changes.\n\
-X Output overlapping changes, bracketing them.\n\
-3 --easy-only Output unmerged nonoverlapping changes.\n\n");
printf ("%s", "\
-m --merge Output merged file instead of ed script (default -A).\n\
-L LABEL --label=LABEL Use LABEL instead of file name.\n\
-i Append `w' and `q' commands to ed scripts.\n\
-a --text Treat all files as text.\n\
-T --initial-tab Make tabs line up by prepending a tab.\n\n");
printf ("%s", "\
-v --version Output version info.\n\
--help Output this help.\n\n");
printf ("If a FILE is `-', read standard input.\n");
}
}
/*
@ -1011,12 +1074,13 @@ process_diff (filea, fileb, last_block, diff_contents)
dt = process_diff_control (&scan_diff, bptr);
if (dt == ERROR || *scan_diff != '\n')
{
fprintf (stderr, "%s: diff error: ", diff_program_name);
do
{
putc (*scan_diff, stderr);
}
while (*scan_diff++ != '\n');
char *serr;
for (serr = scan_diff; *serr != '\n'; serr++)
;
*serr = '\0';
diff_error ("diff error: %s", scan_diff, 0);
*serr = '\n';
DIFF3_ABORT (2);
}
scan_diff++;
@ -1185,6 +1249,10 @@ read_diff (filea, fileb, output_placement)
size_t bytes, current_chunk_size, total;
int fd, wstatus;
struct stat pipestat;
FILE *outfile_hold;
const struct diff_callbacks *callbacks_hold;
struct diff_callbacks my_callbacks;
struct diff_callbacks *my_callbacks_arg;
/* 302 / 1000 is log10(2.0) rounded up. Subtract 1 for the sign bit;
add 1 for integer division truncation; add 1 more for a minus sign. */
@ -1207,7 +1275,30 @@ read_diff (filea, fileb, output_placement)
*ap = 0;
diffout = tmpnam(NULL);
wstatus = diff_run (ap - argv, (char **) argv, diffout);
outfile_hold = outfile;
callbacks_hold = callbacks;
/* We want to call diff_run preserving any stdout and stderr
callbacks, but discarding any callbacks to handle file output,
since we want the file output to go to our temporary file.
FIXME: We should use callbacks to just read it into a memory
buffer; that's we do with the temporary file just below anyhow. */
if (callbacks == NULL)
my_callbacks_arg = NULL;
else
{
my_callbacks = *callbacks;
my_callbacks.write_output = NULL;
my_callbacks.flush_output = NULL;
my_callbacks_arg = &my_callbacks;
}
wstatus = diff_run (ap - argv, (char **) argv, diffout, my_callbacks_arg);
outfile = outfile_hold;
callbacks = callbacks_hold;
if (wstatus == 2)
diff3_fatal ("subsidiary diff failed");
@ -1282,17 +1373,25 @@ scan_diff_line (scan_ptr, set_start, set_length, limit, leadingchar)
*set_length = line_ptr - *set_start;
if (line_ptr < limit && *line_ptr == '\\')
{
if (edscript)
fprintf (stderr, "%s:", diff_program_name);
else
--*set_length;
line_ptr++;
do
if (! edscript)
{
if (edscript)
putc (*line_ptr, stderr);
--*set_length;
line_ptr++;
while (*line_ptr++ != '\n')
;
}
else
{
char *serr;
line_ptr++;
serr = line_ptr;
while (*line_ptr++ != '\n')
;
line_ptr[-1] = '\0';
diff_error ("%s", serr, 0);
line_ptr[-1] = '\n';
}
while (*line_ptr++ != '\n');
}
return line_ptr;
@ -1310,8 +1409,7 @@ scan_diff_line (scan_ptr, set_start, set_length, limit, leadingchar)
* REV_MAPPING is the inverse of MAPPING.
*/
static void
output_diff3 (outputfile, diff, mapping, rev_mapping)
FILE *outputfile;
output_diff3 (diff, mapping, rev_mapping)
struct diff3_block *diff;
int const mapping[3], rev_mapping[3];
{
@ -1348,7 +1446,7 @@ output_diff3 (outputfile, diff, mapping, rev_mapping)
default:
diff3_fatal ("internal error: invalid diff type passed to output");
}
fprintf (outputfile, "====%s\n", x);
printf_output ("====%s\n", x);
/* Go 0, 2, 1 if the first and third outputs are equivalent. */
for (i = 0; i < 3;
@ -1359,17 +1457,17 @@ output_diff3 (outputfile, diff, mapping, rev_mapping)
lowt = D_LOWLINE (ptr, realfile),
hight = D_HIGHLINE (ptr, realfile);
fprintf (outputfile, "%d:", i + 1);
printf_output ("%d:", i + 1);
switch (lowt - hight)
{
case 1:
fprintf (outputfile, "%da\n", lowt - 1);
printf_output ("%da\n", lowt - 1);
break;
case 0:
fprintf (outputfile, "%dc\n", lowt);
printf_output ("%dc\n", lowt);
break;
default:
fprintf (outputfile, "%d,%dc\n", lowt, hight);
printf_output ("%d,%dc\n", lowt, hight);
break;
}
@ -1380,14 +1478,14 @@ output_diff3 (outputfile, diff, mapping, rev_mapping)
line = 0;
do
{
fprintf (outputfile, line_prefix);
printf_output (line_prefix);
cp = D_RELNUM (ptr, realfile, line);
length = D_RELLEN (ptr, realfile, line);
fwrite (cp, sizeof (char), length, outputfile);
write_output (cp, length);
}
while (++line < hight - lowt + 1);
if (cp[length - 1] != '\n')
fprintf (outputfile, "\n\\ No newline at end of file\n");
printf_output ("\n\\ No newline at end of file\n");
}
}
}
@ -1395,12 +1493,11 @@ output_diff3 (outputfile, diff, mapping, rev_mapping)
/*
* Output to OUTPUTFILE the lines of B taken from FILENUM.
* Output the lines of B taken from FILENUM.
* Double any initial '.'s; yield nonzero if any initial '.'s were doubled.
*/
static int
dotlines (outputfile, b, filenum)
FILE *outputfile;
dotlines (b, filenum)
struct diff3_block *b;
int filenum;
{
@ -1415,10 +1512,9 @@ dotlines (outputfile, b, filenum)
if (line[0] == '.')
{
leading_dot = 1;
fprintf (outputfile, ".");
write_output (".", 1);
}
fwrite (line, sizeof (char),
D_RELLEN (b, filenum, i), outputfile);
write_output (line, D_RELLEN (b, filenum, i));
}
return leading_dot;
@ -1430,16 +1526,15 @@ dotlines (outputfile, b, filenum)
* starting with line START and continuing for NUM lines.
*/
static void
undotlines (outputfile, leading_dot, start, num)
FILE *outputfile;
undotlines (leading_dot, start, num)
int leading_dot, start, num;
{
fprintf (outputfile, ".\n");
write_output (".\n", 2);
if (leading_dot)
if (num == 1)
fprintf (outputfile, "%ds/^\\.//\n", start);
printf_output ("%ds/^\\.//\n", start);
else
fprintf (outputfile, "%d,%ds/^\\.//\n", start, start + num - 1);
printf_output ("%d,%ds/^\\.//\n", start, start + num - 1);
}
/*
@ -1465,9 +1560,7 @@ undotlines (outputfile, leading_dot, start, num)
*/
static int
output_diff3_edscript (outputfile, diff, mapping, rev_mapping,
file0, file1, file2)
FILE *outputfile;
output_diff3_edscript (diff, mapping, rev_mapping, file0, file1, file2)
struct diff3_block *diff;
int const mapping[3], rev_mapping[3];
char const *file0, *file1, *file2;
@ -1502,22 +1595,22 @@ output_diff3_edscript (outputfile, diff, mapping, rev_mapping,
/* Mark end of conflict. */
fprintf (outputfile, "%da\n", D_HIGHLINE (b, mapping[FILE0]));
printf_output ("%da\n", D_HIGHLINE (b, mapping[FILE0]));
leading_dot = 0;
if (type == DIFF_ALL)
{
if (show_2nd)
{
/* Append lines from FILE1. */
fprintf (outputfile, "||||||| %s\n", file1);
leading_dot = dotlines (outputfile, b, mapping[FILE1]);
printf_output ("||||||| %s\n", file1);
leading_dot = dotlines (b, mapping[FILE1]);
}
/* Append lines from FILE2. */
fprintf (outputfile, "=======\n");
leading_dot |= dotlines (outputfile, b, mapping[FILE2]);
printf_output ("=======\n");
leading_dot |= dotlines (b, mapping[FILE2]);
}
fprintf (outputfile, ">>>>>>> %s\n", file2);
undotlines (outputfile, leading_dot,
printf_output (">>>>>>> %s\n", file2);
undotlines (leading_dot,
D_HIGHLINE (b, mapping[FILE0]) + 2,
(D_NUMLINES (b, mapping[FILE1])
+ D_NUMLINES (b, mapping[FILE2]) + 1));
@ -1525,17 +1618,17 @@ output_diff3_edscript (outputfile, diff, mapping, rev_mapping,
/* Mark start of conflict. */
fprintf (outputfile, "%da\n<<<<<<< %s\n",
D_LOWLINE (b, mapping[FILE0]) - 1,
type == DIFF_ALL ? file0 : file1);
printf_output ("%da\n<<<<<<< %s\n",
D_LOWLINE (b, mapping[FILE0]) - 1,
type == DIFF_ALL ? file0 : file1);
leading_dot = 0;
if (type == DIFF_2ND)
{
/* Prepend lines from FILE1. */
leading_dot = dotlines (outputfile, b, mapping[FILE1]);
fprintf (outputfile, "=======\n");
leading_dot = dotlines (b, mapping[FILE1]);
printf_output ("=======\n");
}
undotlines (outputfile, leading_dot,
undotlines (leading_dot,
D_LOWLINE (b, mapping[FILE0]) + 1,
D_NUMLINES (b, mapping[FILE1]));
}
@ -1543,12 +1636,11 @@ output_diff3_edscript (outputfile, diff, mapping, rev_mapping,
/* Write out a delete */
{
if (D_NUMLINES (b, mapping[FILE0]) == 1)
fprintf (outputfile, "%dd\n",
D_LOWLINE (b, mapping[FILE0]));
printf_output ("%dd\n", D_LOWLINE (b, mapping[FILE0]));
else
fprintf (outputfile, "%d,%dd\n",
D_LOWLINE (b, mapping[FILE0]),
D_HIGHLINE (b, mapping[FILE0]));
printf_output ("%d,%dd\n",
D_LOWLINE (b, mapping[FILE0]),
D_HIGHLINE (b, mapping[FILE0]));
}
else
/* Write out an add or change */
@ -1556,33 +1648,32 @@ output_diff3_edscript (outputfile, diff, mapping, rev_mapping,
switch (D_NUMLINES (b, mapping[FILE0]))
{
case 0:
fprintf (outputfile, "%da\n",
D_HIGHLINE (b, mapping[FILE0]));
printf_output ("%da\n", D_HIGHLINE (b, mapping[FILE0]));
break;
case 1:
fprintf (outputfile, "%dc\n",
D_HIGHLINE (b, mapping[FILE0]));
printf_output ("%dc\n", D_HIGHLINE (b, mapping[FILE0]));
break;
default:
fprintf (outputfile, "%d,%dc\n",
D_LOWLINE (b, mapping[FILE0]),
D_HIGHLINE (b, mapping[FILE0]));
printf_output ("%d,%dc\n",
D_LOWLINE (b, mapping[FILE0]),
D_HIGHLINE (b, mapping[FILE0]));
break;
}
undotlines (outputfile, dotlines (outputfile, b, mapping[FILE2]),
undotlines (dotlines (b, mapping[FILE2]),
D_LOWLINE (b, mapping[FILE0]),
D_NUMLINES (b, mapping[FILE2]));
}
}
if (finalwrite) fprintf (outputfile, "w\nq\n");
if (finalwrite) printf_output ("w\nq\n");
return conflicts_found;
}
/*
* Read from INFILE and output to OUTPUTFILE a set of diff3_ blocks DIFF
* as a merged file. This acts like 'ed file0 <[output_diff3_edscript]',
* except that it works even for binary data or incomplete lines.
* Read from INFILE and output to the standard output file a set of
* diff3_ blocks DIFF as a merged file. This acts like 'ed file0
* <[output_diff3_edscript]', except that it works even for binary
* data or incomplete lines.
*
* As before, MAPPING maps from arg list file number to diff file number,
* REV_MAPPING is its inverse,
@ -1592,14 +1683,15 @@ output_diff3_edscript (outputfile, diff, mapping, rev_mapping,
*/
static int
output_diff3_merge (infile, outputfile, diff, mapping, rev_mapping,
output_diff3_merge (infile, diff, mapping, rev_mapping,
file0, file1, file2)
FILE *infile, *outputfile;
FILE *infile;
struct diff3_block *diff;
int const mapping[3], rev_mapping[3];
char const *file0, *file1, *file2;
{
int c, i;
char cc;
int conflicts_found = 0, conflict;
struct diff3_block *b;
int linesread = 0;
@ -1638,7 +1730,8 @@ output_diff3_merge (infile, outputfile, diff, mapping, rev_mapping,
diff3_perror_with_exit ("input file");
else if (feof (infile))
diff3_fatal ("input file shrank");
putc (c, outputfile);
cc = c;
write_output (&cc, 1);
}
while (c != '\n');
@ -1649,37 +1742,37 @@ output_diff3_merge (infile, outputfile, diff, mapping, rev_mapping,
if (type == DIFF_ALL)
{
/* Put in lines from FILE0 with bracket. */
fprintf (outputfile, "<<<<<<< %s\n", file0);
printf_output ("<<<<<<< %s\n", file0);
for (i = 0;
i < D_NUMLINES (b, mapping[FILE0]);
i++)
fwrite (D_RELNUM (b, mapping[FILE0], i), sizeof (char),
D_RELLEN (b, mapping[FILE0], i), outputfile);
write_output (D_RELNUM (b, mapping[FILE0], i),
D_RELLEN (b, mapping[FILE0], i));
}
if (show_2nd)
{
/* Put in lines from FILE1 with bracket. */
fprintf (outputfile, format_2nd, file1);
printf_output (format_2nd, file1);
for (i = 0;
i < D_NUMLINES (b, mapping[FILE1]);
i++)
fwrite (D_RELNUM (b, mapping[FILE1], i), sizeof (char),
D_RELLEN (b, mapping[FILE1], i), outputfile);
write_output (D_RELNUM (b, mapping[FILE1], i),
D_RELLEN (b, mapping[FILE1], i));
}
fprintf (outputfile, "=======\n");
printf_output ("=======\n");
}
/* Put in lines from FILE2. */
for (i = 0;
i < D_NUMLINES (b, mapping[FILE2]);
i++)
fwrite (D_RELNUM (b, mapping[FILE2], i), sizeof (char),
D_RELLEN (b, mapping[FILE2], i), outputfile);
write_output (D_RELNUM (b, mapping[FILE2], i),
D_RELLEN (b, mapping[FILE2], i));
if (conflict)
fprintf (outputfile, ">>>>>>> %s\n", file2);
printf_output (">>>>>>> %s\n", file2);
/* Skip I lines in file 0. */
i = D_NUMLINES (b, FILE0);
@ -1698,7 +1791,10 @@ output_diff3_merge (infile, outputfile, diff, mapping, rev_mapping,
}
/* Copy rest of common file. */
while ((c = getc (infile)) != EOF || !(ferror (infile) | feof (infile)))
putc (c, outputfile);
{
cc = c;
write_output (&cc, 1);
}
return conflicts_found;
}
@ -1737,7 +1833,7 @@ static void
diff3_fatal (string)
char const *string;
{
fprintf (stderr, "%s: %s\n", diff_program_name, string);
diff_error ("%s", string, 0);
DIFF3_ABORT (2);
}
@ -1745,10 +1841,7 @@ static void
diff3_perror_with_exit (string)
char const *string;
{
int e = errno;
fprintf (stderr, "%s: ", diff_program_name);
errno = e;
perror (string);
perror_with_name (string);
DIFF3_ABORT (2);
}
@ -1768,6 +1861,7 @@ initialize_main (argcp, argvp)
finalwrite = 0;
merge = 0;
diff_program_name = (*argvp)[0];
outfile = NULL;
}
static void

View file

@ -0,0 +1,69 @@
/* Interface header file for GNU DIFF library.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
GNU DIFF 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 DIFF 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 DIFF; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef DIFFRUN_H
#define DIFFRUN_H
/* This header file defines the interfaces used by the diff library.
It should be included by programs which use the diff library. */
#include <sys/types.h>
#if defined __STDC__ && __STDC__
#define DIFFPARAMS(args) args
#else
#define DIFFPARAMS(args) ()
#endif
/* The diff_callbacks structure is used to handle callbacks from the
diff library. All output goes through these callbacks. When a
pointer to this structure is passed in, it may be NULL. Also, any
of the individual callbacks may be NULL. This means that the
default action should be taken. */
struct diff_callbacks
{
/* Write output. This function just writes a string of a given
length to the output file. The default is to fwrite to OUTFILE.
If this callback is defined, flush_output must also be defined. */
void (*write_output) DIFFPARAMS((char const *, size_t));
/* Flush output. The default is to fflush OUTFILE. If this
callback is defined, write_output must also be defined. */
void (*flush_output) DIFFPARAMS((void));
/* Write to stdout. This is called for version and help messages. */
void (*write_stdout) DIFFPARAMS((char const *));
/* Print an error message. The first argument is a printf format,
and the next two are parameters. The default is to print a
message on stderr. */
void (*error) DIFFPARAMS((char const *, char const *, char const *));
};
/* Run a diff. */
extern int diff_run DIFFPARAMS((int, char **, char *,
const struct diff_callbacks *));
/* Run a diff3. */
extern int diff3_run DIFFPARAMS((int, char **, char *,
const struct diff_callbacks *));
#undef DIFFPARAMS
#endif /* DIFFRUN_H */

View file

@ -1,5 +1,5 @@
/* Output routines for ed-script format.
Copyright (C) 1988, 89, 91, 92, 93 Free Software Foundation, Inc.
Copyright (C) 1988, 89, 91, 92, 93, 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -57,7 +57,7 @@ print_ed_hunk (hunk)
/* Print out the line number header for this hunk */
print_number_range (',', &files[0], f0, l0);
fprintf (outfile, "%c\n", change_letter (inserts, deletes));
printf_output ("%c\n", change_letter (inserts, deletes));
/* Print new/changed lines from second file, if needed */
if (inserts)
@ -68,8 +68,8 @@ print_ed_hunk (hunk)
{
/* Resume the insert, if we stopped. */
if (! inserting)
fprintf (outfile, "%da\n",
i - f1 + translate_line_number (&files[0], f0) - 1);
printf_output ("%da\n",
i - f1 + translate_line_number (&files[0], f0) - 1);
inserting = 1;
/* If the file's line is just a dot, it would confuse `ed'.
@ -80,11 +80,11 @@ print_ed_hunk (hunk)
if (files[1].linbuf[i][0] == '.'
&& files[1].linbuf[i][1] == '\n')
{
fprintf (outfile, "..\n");
fprintf (outfile, ".\n");
printf_output ("..\n");
printf_output (".\n");
/* Now change that double dot to the desired single dot. */
fprintf (outfile, "%ds/^\\.\\././\n",
i - f1 + translate_line_number (&files[0], f0));
printf_output ("%ds/^\\.\\././\n",
i - f1 + translate_line_number (&files[0], f0));
inserting = 0;
}
else
@ -94,7 +94,7 @@ print_ed_hunk (hunk)
/* End insert mode, if we are still in it. */
if (inserting)
fprintf (outfile, ".\n");
printf_output (".\n");
}
}
@ -124,9 +124,9 @@ pr_forward_ed_hunk (hunk)
begin_output ();
fprintf (outfile, "%c", change_letter (inserts, deletes));
printf_output ("%c", change_letter (inserts, deletes));
print_number_range (' ', files, f0, l0);
fprintf (outfile, "\n");
printf_output ("\n");
/* If deletion only, print just the number range. */
@ -139,7 +139,7 @@ pr_forward_ed_hunk (hunk)
for (i = f1; i <= l1; i++)
print_1_line ("", &files[1].linbuf[i]);
fprintf (outfile, ".\n");
printf_output (".\n");
}
/* Print in a format somewhat like ed commands
@ -175,23 +175,23 @@ print_rcs_hunk (hunk)
if (deletes)
{
fprintf (outfile, "d");
printf_output ("d");
/* For deletion, print just the starting line number from file 0
and the number of lines deleted. */
fprintf (outfile, "%d %d\n",
tf0,
(tl0 >= tf0 ? tl0 - tf0 + 1 : 1));
printf_output ("%d %d\n",
tf0,
(tl0 >= tf0 ? tl0 - tf0 + 1 : 1));
}
if (inserts)
{
fprintf (outfile, "a");
printf_output ("a");
/* Take last-line-number from file 0 and # lines from file 1. */
translate_range (&files[1], f1, l1, &tf1, &tl1);
fprintf (outfile, "%d %d\n",
tl0,
(tl1 >= tf1 ? tl1 - tf1 + 1 : 1));
printf_output ("%d %d\n",
tl0,
(tl1 >= tf1 ? tl1 - tf1 + 1 : 1));
/* Print the inserted lines. */
for (i = f1; i <= l1; i++)

View file

@ -1,5 +1,5 @@
/* #ifdef-format output routines for GNU DIFF.
Copyright (C) 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
Copyright (C) 1989, 1991, 1992, 1993, 1994, 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -27,13 +27,13 @@ struct group
int from, upto; /* start and limit lines for this group of lines */
};
static char *format_group PARAMS((FILE *, char *, int, struct group const *));
static char *format_group PARAMS((int, char *, int, struct group const *));
static char *scan_char_literal PARAMS((char *, int *));
static char *scan_printf_spec PARAMS((char *));
static int groups_letter_value PARAMS((struct group const *, int));
static void format_ifdef PARAMS((char *, int, int, int, int));
static void print_ifdef_hunk PARAMS((struct change *));
static void print_ifdef_lines PARAMS((FILE *, char *, struct group const *));
static void print_ifdef_lines PARAMS((int, char *, struct group const *));
static int next_line;
@ -103,18 +103,18 @@ format_ifdef (format, beg0, end0, beg1, end1)
groups[1].file = &files[1];
groups[1].from = beg1;
groups[1].upto = end1;
format_group (outfile, format, '\0', groups);
format_group (1, format, '\0', groups);
}
/* Print to file OUT a set of lines according to FORMAT.
/* If DOIT is non-zero, output a set of lines according to FORMAT.
The format ends at the first free instance of ENDCHAR.
Yield the address of the terminating character.
GROUPS specifies which lines to print.
If OUT is zero, do not actually print anything; just scan the format. */
static char *
format_group (out, format, endchar, groups)
register FILE *out;
format_group (doit, format, endchar, groups)
int doit;
char *format;
int endchar;
struct group const *groups;
@ -137,7 +137,7 @@ format_group (out, format, endchar, groups)
/* Print if-then-else format e.g. `%(n=1?thenpart:elsepart)'. */
{
int i, value[2];
FILE *thenout, *elseout;
int thendoit, elsedoit;
for (i = 0; i < 2; i++)
{
@ -159,13 +159,13 @@ format_group (out, format, endchar, groups)
goto bad_format;
}
if (value[0] == value[1])
thenout = out, elseout = 0;
thendoit = doit, elsedoit = 0;
else
thenout = 0, elseout = out;
f = format_group (thenout, f, ':', groups);
thendoit = 0, elsedoit = doit;
f = format_group (thendoit, f, ':', groups);
if (*f)
{
f = format_group (elseout, f + 1, ')', groups);
f = format_group (elsedoit, f + 1, ')', groups);
if (*f)
f++;
}
@ -174,17 +174,17 @@ format_group (out, format, endchar, groups)
case '<':
/* Print lines deleted from first file. */
print_ifdef_lines (out, line_format[OLD], &groups[0]);
print_ifdef_lines (doit, line_format[OLD], &groups[0]);
continue;
case '=':
/* Print common lines. */
print_ifdef_lines (out, line_format[UNCHANGED], &groups[0]);
print_ifdef_lines (doit, line_format[UNCHANGED], &groups[0]);
continue;
case '>':
/* Print lines inserted from second file. */
print_ifdef_lines (out, line_format[NEW], &groups[1]);
print_ifdef_lines (doit, line_format[NEW], &groups[1]);
continue;
default:
@ -211,11 +211,11 @@ format_group (out, format, endchar, groups)
goto bad_format;
break;
}
if (out)
if (doit)
{
/* Temporarily replace e.g. "%3dnx" with "%3d\0x". */
*speclim = 0;
fprintf (out, spec - 1, value);
printf_output (spec - 1, value);
/* Undo the temporary replacement. */
*speclim = c;
}
@ -228,8 +228,12 @@ format_group (out, format, endchar, groups)
break;
}
}
if (out)
putc (c, out);
if (doit)
{
/* Don't take the address of a register variable. */
char cc = c;
write_output (&cc, 1);
}
}
return f;
}
@ -257,11 +261,11 @@ groups_letter_value (g, letter)
}
}
/* Print to file OUT, using FORMAT to print the line group GROUP.
But do nothing if OUT is zero. */
/* Output using FORMAT to print the line group GROUP.
But do nothing if DOIT is zero. */
static void
print_ifdef_lines (out, format, group)
register FILE *out;
print_ifdef_lines (doit, format, group)
int doit;
char *format;
struct group const *group;
{
@ -269,7 +273,7 @@ print_ifdef_lines (out, format, group)
char const * const *linbuf = file->linbuf;
int from = group->from, upto = group->upto;
if (!out)
if (!doit)
return;
/* If possible, use a single fwrite; it's faster. */
@ -277,15 +281,15 @@ print_ifdef_lines (out, format, group)
{
if (format[1] == 'l' && format[2] == '\n' && !format[3])
{
fwrite (linbuf[from], sizeof (char),
linbuf[upto] + (linbuf[upto][-1] != '\n') - linbuf[from],
out);
write_output (linbuf[from],
(linbuf[upto] + (linbuf[upto][-1] != '\n')
- linbuf[from]));
return;
}
if (format[1] == 'L' && !format[2])
{
fwrite (linbuf[from], sizeof (char),
linbuf[upto] - linbuf[from], out);
write_output (linbuf[from],
linbuf[upto] - linbuf[from]);
return;
}
}
@ -294,6 +298,7 @@ print_ifdef_lines (out, format, group)
{
register char c;
register char *f = format;
char cc;
while ((c = *f++) != 0)
{
@ -342,7 +347,7 @@ print_ifdef_lines (out, format, group)
}
/* Temporarily replace e.g. "%3dnx" with "%3d\0x". */
*speclim = 0;
fprintf (out, spec - 1, value);
printf_output (spec - 1, value);
/* Undo the temporary replacement. */
*speclim = c;
}
@ -354,7 +359,10 @@ print_ifdef_lines (out, format, group)
break;
}
}
putc (c, out);
/* Don't take the address of a register variable. */
cc = c;
write_output (&cc, 1);
}
}
}

View file

@ -1,5 +1,5 @@
/* Normal-format output routines for GNU DIFF.
Copyright (C) 1988, 1989, 1993 Free Software Foundation, Inc.
Copyright (C) 1988, 1989, 1993, 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -52,9 +52,9 @@ print_normal_hunk (hunk)
/* Print out the line number header for this hunk */
print_number_range (',', &files[0], first0, last0);
fprintf (outfile, "%c", change_letter (inserts, deletes));
printf_output ("%c", change_letter (inserts, deletes));
print_number_range (',', &files[1], first1, last1);
fprintf (outfile, "\n");
printf_output ("\n");
/* Print the lines that the first file has. */
if (deletes)
@ -62,7 +62,7 @@ print_normal_hunk (hunk)
print_1_line ("<", &files[0].linbuf[i]);
if (inserts && deletes)
fprintf (outfile, "---\n");
printf_output ("---\n");
/* Print the lines that the second file has. */
if (inserts)

View file

@ -1,5 +1,5 @@
/* sdiff-format output routines for GNU DIFF.
Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
Copyright (C) 1991, 1992, 1993, 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -50,17 +50,16 @@ static unsigned
tab_from_to (from, to)
unsigned from, to;
{
FILE *out = outfile;
unsigned tab;
if (! tab_expand_flag)
for (tab = from + TAB_WIDTH - from % TAB_WIDTH; tab <= to; tab += TAB_WIDTH)
{
putc ('\t', out);
write_output ("\t", 1);
from = tab;
}
while (from++ < to)
putc (' ', out);
write_output (" ", 1);
return to;
}
@ -74,7 +73,6 @@ print_half_line (line, indent, out_bound)
char const * const *line;
unsigned indent, out_bound;
{
FILE *out = outfile;
register unsigned in_position = 0, out_position = 0;
register char const
*text_pointer = line[0],
@ -83,6 +81,9 @@ print_half_line (line, indent, out_bound)
while (text_pointer < text_limit)
{
register unsigned char c = *text_pointer++;
/* We use CC to avoid taking the address of the register
variable C. */
char cc;
switch (c)
{
@ -97,13 +98,14 @@ print_half_line (line, indent, out_bound)
if (out_bound < tabstop)
tabstop = out_bound;
for (; out_position < tabstop; out_position++)
putc (' ', out);
write_output (" ", 1);
}
else
if (tabstop < out_bound)
{
out_position = tabstop;
putc (c, out);
cc = c;
write_output (&cc, 1);
}
}
in_position += spaces;
@ -112,7 +114,8 @@ print_half_line (line, indent, out_bound)
case '\r':
{
putc (c, out);
cc = c;
write_output (&cc, 1);
tab_from_to (0, indent);
in_position = out_position = 0;
}
@ -123,11 +126,12 @@ print_half_line (line, indent, out_bound)
if (out_position <= in_position)
/* Add spaces to make up for suppressed tab past out_bound. */
for (; out_position < in_position; out_position++)
putc (' ', out);
write_output (" ", 1);
else
{
out_position = in_position;
putc (c, out);
cc = c;
write_output (&cc, 1);
}
break;
@ -135,7 +139,10 @@ print_half_line (line, indent, out_bound)
case '\v':
control_char:
if (in_position < out_bound)
putc (c, out);
{
cc = c;
write_output (&cc, 1);
}
break;
default:
@ -146,7 +153,8 @@ print_half_line (line, indent, out_bound)
if (in_position++ < out_bound)
{
out_position = in_position;
putc (c, out);
cc = c;
write_output (&cc, 1);
}
break;
@ -170,7 +178,6 @@ print_1sdiff_line (left, sep, right)
int sep;
char const * const *right;
{
FILE *out = outfile;
unsigned hw = sdiff_half_width, c2o = sdiff_column2_offset;
unsigned col = 0;
int put_newline = 0;
@ -184,10 +191,13 @@ print_1sdiff_line (left, sep, right)
if (sep != ' ')
{
char cc;
col = tab_from_to (col, (hw + c2o - 1) / 2) + 1;
if (sep == '|' && put_newline != (right[1][-1] == '\n'))
sep = put_newline ? '/' : '\\';
putc (sep, out);
cc = sep;
write_output (&cc, 1);
}
if (right)
@ -202,7 +212,7 @@ print_1sdiff_line (left, sep, right)
}
if (put_newline)
putc ('\n', out);
write_output ("\n", 1);
}
/* Print lines common to both files in side-by-side format. */
@ -215,7 +225,7 @@ print_sdiff_common_lines (limit0, limit1)
if (! sdiff_skip_common_lines && (i0 != limit0 || i1 != limit1))
{
if (sdiff_help_sdiff)
fprintf (outfile, "i%d,%d\n", limit0 - i0, limit1 - i1);
printf_output ("i%d,%d\n", limit0 - i0, limit1 - i1);
if (! sdiff_left_only)
{
@ -252,7 +262,7 @@ print_sdiff_hunk (hunk)
print_sdiff_common_lines (first0, first1);
if (sdiff_help_sdiff)
fprintf (outfile, "c%d,%d\n", last0 - first0 + 1, last1 - first1 + 1);
printf_output ("c%d,%d\n", last0 - first0 + 1, last1 - first1 + 1);
/* Print ``xxx | xxx '' lines */
if (inserts && deletes)

View file

@ -1,5 +1,5 @@
/* Support routines for GNU DIFF.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
This file is part of GNU DIFF.
@ -19,6 +19,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "diff.h"
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#ifndef strerror
extern char *strerror ();
#endif
/* Queue up one-line messages to be printed at the end,
when -l is specified. Each message is recorded with a `struct msg'. */
@ -48,9 +58,15 @@ perror_with_name (text)
char const *text;
{
int e = errno;
fprintf (stderr, "%s: ", diff_program_name);
errno = e;
perror (text);
if (callbacks && callbacks->error)
(*callbacks->error) ("%s: %s", text, strerror (e));
else
{
fprintf (stderr, "%s: ", diff_program_name);
errno = e;
perror (text);
}
}
/* Use when a system call returns non-zero status and that is fatal. */
@ -61,9 +77,14 @@ pfatal_with_name (text)
{
int e = errno;
print_message_queue ();
fprintf (stderr, "%s: ", diff_program_name);
errno = e;
perror (text);
if (callbacks && callbacks->error)
(*callbacks->error) ("%s: %s", text, strerror (e));
else
{
fprintf (stderr, "%s: ", diff_program_name);
errno = e;
perror (text);
}
DIFF_ABORT (2);
}
@ -74,9 +95,14 @@ void
diff_error (format, arg, arg1)
char const *format, *arg, *arg1;
{
fprintf (stderr, "%s: ", diff_program_name);
fprintf (stderr, format, arg, arg1);
fprintf (stderr, "\n");
if (callbacks && callbacks->error)
(*callbacks->error) (format, arg, arg1);
else
{
fprintf (stderr, "%s: ", diff_program_name);
fprintf (stderr, format, arg, arg1);
fprintf (stderr, "\n");
}
}
/* Print an error message containing the string TEXT, then exit. */
@ -119,8 +145,8 @@ message5 (format, arg1, arg2, arg3, arg4)
else
{
if (sdiff_help_sdiff)
putc (' ', outfile);
fprintf (outfile, format, arg1, arg2, arg3, arg4);
write_output (" ", 1);
printf_output (format, arg1, arg2, arg3, arg4);
}
}
@ -132,7 +158,7 @@ print_message_queue ()
struct msg *m;
for (m = msg_chain; m; m = m->next)
fprintf (outfile, m->format, m->arg1, m->arg2, m->arg3, m->arg4);
printf_output (m->format, m->arg1, m->arg2, m->arg3, m->arg4);
}
/* Call before outputting the results of comparing files NAME0 and NAME1
@ -180,6 +206,9 @@ begin_output ()
This requirement is silly and does not match historical practice. */
sprintf (name, "diff%s %s %s", switch_string, current_name0, current_name1);
if (paginate_flag && callbacks && callbacks->write_output)
fatal ("can't paginate when using library callbacks");
if (paginate_flag)
{
/* Make OUTFILE a pipe to a subsidiary `pr'. */
@ -243,7 +272,7 @@ begin_output ()
/* If handling multiple files (because scanning a directory),
print which files the following output is about. */
if (current_depth > 0)
fprintf (outfile, "%s\n", name);
printf_output ("%s\n", name);
}
free (name);
@ -293,6 +322,68 @@ finish_output ()
output_in_progress = 0;
}
/* Write something to the output file. */
void
write_output (text, len)
char const *text;
size_t len;
{
if (callbacks && callbacks->write_output)
(*callbacks->write_output) (text, len);
else if (len == 1)
putc (*text, outfile);
else
fwrite (text, sizeof (char), len, outfile);
}
/* Printf something to the output file. */
#ifdef __STDC__
#define VA_START(args, lastarg) va_start(args, lastarg)
#else /* ! __STDC__ */
#define VA_START(args, lastarg) va_start(args)
#endif /* __STDC__ */
void
#if defined (__STDC__)
printf_output (const char *format, ...)
#else
printf_output (format, va_alist)
char const *format;
va_dcl
#endif
{
va_list args;
VA_START (args, format);
if (callbacks && callbacks->write_output)
{
char *p;
p = NULL;
vasprintf (&p, format, args);
if (p == NULL)
fatal ("out of memory");
(*callbacks->write_output) (p, strlen (p));
free (p);
}
else
vfprintf (outfile, format, args);
va_end (args);
}
/* Flush the output file. */
void
flush_output ()
{
if (callbacks && callbacks->flush_output)
(*callbacks->flush_output) ();
else
fflush (outfile);
}
/* Compare two lines (typically one from each input file)
according to the command line options.
@ -469,7 +560,6 @@ print_1_line (line_flag, line)
char const * const *line;
{
char const *text = line[0], *limit = line[1]; /* Help the compiler. */
FILE *out = outfile; /* Help the compiler some more. */
char const *flag_format = 0;
/* If -T was specified, use a Tab between the line-flag and the text.
@ -479,13 +569,13 @@ print_1_line (line_flag, line)
if (line_flag && *line_flag)
{
flag_format = tab_align_flag ? "%s\t" : "%s ";
fprintf (out, flag_format, line_flag);
printf_output (flag_format, line_flag);
}
output_1_line (text, limit, flag_format, line_flag);
if ((!line_flag || line_flag[0]) && limit[-1] != '\n')
fprintf (out, "\n\\ No newline at end of file\n");
printf_output ("\n\\ No newline at end of file\n");
}
/* Output a line from TEXT up to LIMIT. Without -t, output verbatim.
@ -498,13 +588,15 @@ output_1_line (text, limit, flag_format, line_flag)
char const *text, *limit, *flag_format, *line_flag;
{
if (!tab_expand_flag)
fwrite (text, sizeof (char), limit - text, outfile);
write_output (text, limit - text);
else
{
register FILE *out = outfile;
register unsigned char c;
register char const *t = text;
register unsigned column = 0;
/* CC is used to avoid taking the address of the register
variable C. */
char cc;
while (t < limit)
switch ((c = *t++))
@ -514,15 +606,15 @@ output_1_line (text, limit, flag_format, line_flag)
unsigned spaces = TAB_WIDTH - column % TAB_WIDTH;
column += spaces;
do
putc (' ', out);
write_output (" ", 1);
while (--spaces);
}
break;
case '\r':
putc (c, out);
write_output ("\r", 1);
if (flag_format && t < limit && *t != '\n')
fprintf (out, flag_format, line_flag);
printf_output (flag_format, line_flag);
column = 0;
break;
@ -530,13 +622,14 @@ output_1_line (text, limit, flag_format, line_flag)
if (column == 0)
continue;
column--;
putc (c, out);
write_output ("\b", 1);
break;
default:
if (ISPRINT (c))
column++;
putc (c, out);
cc = c;
write_output (&cc, 1);
break;
}
}
@ -598,9 +691,9 @@ print_number_range (sepchar, file, a, b)
In this case, we should print the line number before the range,
which is B. */
if (trans_b > trans_a)
fprintf (outfile, "%d%c%d", trans_a, sepchar, trans_b);
printf_output ("%d%c%d", trans_a, sepchar, trans_b);
else
fprintf (outfile, "%d", trans_b);
printf_output ("%d", trans_b);
}
/* Look at a hunk of edit script and report the range of lines in each file

View file

@ -1,3 +1,122 @@
Sun Jul 26 02:42:20 1998 Noel Cragg <noel@swish.red-bean.com>
* cvs.texinfo (config): TopLevelAdmin variable.
* cvsclient.texi (Requests): fix typo.
1998-07-14 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvsclient.texi (Requests): "remove" is like "add" in the sense
that it is the "ci" request which does most of the work.
1998-06-23 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Excluding directories): Fix order of
"!first-dir/sdir" and "first-dir" to match what CVS actually
accepts. Reported by Tim McIntosh of sterling.com.
1998-06-09 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Using keywords): Rewrite to be less specific to
source code in C. The old text was worse than that; it was
specific to certain versions of GCC (not even current GCC's, I
don't think) (reported most recently by Mitchell Perilstein;
if memory serves by others before that).
1998-06-08 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Concurrency): Also mention #cvs.lock. Don't
mention #cvs.tfl; it is quite old (before CVS 1.5).
(Locks, Backing up, Concurrency): Add more index entries.
1998-06-03 Ian Lance Taylor <ian@cygnus.com>
* cvs.texinfo (Tracking sources): Clarify that the vendor branch
is only made the head revision when you import a new file, not any
time you import a file.
1998-05-23 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (What is CVS?): info-cvs-request is now at gnu.org
and is no longer handled by a human (hallelujah).
1998-05-12 Jim Meyering <meyering@ascend.com>
* cvs.texinfo: Add an info dir entry.
Remove trailing white space.
1998-05-05 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Wrappers): Be more explicit that -m 'COPY' has no
effect on binary files.
1998-05-02 Jim Kingdon <kingdon@harvey.cyclic.com>
* RCSFILES: Add more discussion of the order of the revisions.
1998-04-27 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (loginfo example): Also give example of sending
mail. Use internal variable $USER rather than expecting CVS to
set the environment variable $USER. Change unnecessary 'sed'
invocation to 'cat' (it suffered from the same problem in terms of
internal variables versus environment variables).
* cvs.texinfo (Error messages): Add "conflict: removed FILE was
modified by second party".
1998-04-20 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Common options): Update comment about meaning of
HEAD in cvs diff.
1998-04-12 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvsclient.texi (Dates): Also mention log -d.
* cvs.texinfo (Invoking CVS): No space is allowed between -r or -w
and its argument, for the log command.
1998-04-11 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvsclient.texi (Dates): New section, explaining the deal with
date formats.
1998-04-09 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Global options, Invoking CVS): Fix typo
("files files" -> "files").
(Invoking CVS): Make -q and -Q more concise.
(Invoking CVS): Use @var for metavariables in "diff -r".
1998-03-17 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (~/.cvsrc): In example, put "checkout" rather than
"co" into .cvsrc; we just finished explaining that only the former
works! Thanks to Lenny Foner for reporting this.
* cvs.texinfo (Copying): Remove this node. This basically
restores the status quo prior to 18 Oct 1996 (before then the node
existed but was empty).
(before Top): Adjust copyright notice accordingly.
1998-03-12 Tim Pierce <twp@skepsis.com>
* RCSFILES: Updated description of `hardlinks' newphrases.
1998-03-07 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Tags, Sticky tags, Creating a branch, Accessing
branches): Rename release-0-1 tag to rel-0-1 and likewise for
release-0-1-patches and release-0-4. This fixes an overfull hbox.
(diff options): Reformat table to fix underfull hboxes and such.
1998-03-07 Tim Pierce <twp@skepsis.com>
* cvs.texinfo (Editing files, Special Files): Document hardlinks.
Various cleanups to PreservePermissions text.
* RCSFILES: Document PreservePermissions newphrases.
1998-03-04 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Special Files): Add notes about client/server CVS
@ -213,13 +332,13 @@ Sun Nov 30 20:38:17 1997 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (Wrappers): Add comment: we don't document %s.
Mon Nov 24 23:00:09 1997 Karl Fogel <kfogel@floss.red-bean.com>
Mon Nov 24 23:00:09 1997 Karl Fogel <kfogel@floss.red-bean.com>
and Jim Kingdon <kingdon@harvey.cyclic.com>
* cvsclient.texi: Move Protocol Notes node to the end.
* cvsclient.texi (Request intro): new node/section.
(Protocol): added some introductory material.
(Protocol): added some introductory material.
Rearranged menu into General Conventions, Protocol specification,
and Example etc sections.
(File Modes): replaces Modes, for consistency.
@ -418,7 +537,7 @@ Sat Sep 6 11:29:15 1997 Jim Kingdon <kingdon@harvey.cyclic.com>
Fri Sep 5 14:42:39 1997 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo (BUGS): Remove mention of unsupported resources page
on http://www.cyclic.com, as it might go away in a future
on http://www.cyclic.com, as it might go away in a future
reorganization.
* DIFFUTILS-2.7-BUG: Further info from Eggert.
@ -1229,7 +1348,7 @@ Tue Mar 18 15:50:47 1997 Jim Kingdon <kingdon@harvey.cyclic.com>
(A sample session): Add comment about how we need an introduction
and what might go into one. Also bring in the paragraph from
Basic concepts introducing modules, but comment it out.
(Viewing differences): Add comment about
(Viewing differences): Add comment about
(Basic concepts): Removed; its content has been farmed out as
described above, and as the comment said, it was fundamentally
flawed.
@ -1544,7 +1663,7 @@ Thu Nov 14 10:22:58 1996 Jim Kingdon <kingdon@harvey.cyclic.com>
chunks, and about atomicity to be focused more on the protocol
than the current implementation.
(Notes): Remove this node. The attempt to describe the basic
model has pretty much been replaced by the Introduction.
model has pretty much been replaced by the Introduction.
The material about how to start the client is incomplete and
better left to cvs.texinfo. And the item about the lack of
SERVER_FLOWCONTROL is obsolete now that SERVER_FLOWCONTROL is the
@ -1700,7 +1819,7 @@ Mon Sep 30 18:17:34 1996 Greg A. Woods <woods@most.weird.com>
GREPBIN.
(export examples): add one.
(import options): describe the effect of '-b 1'.
Mon Sep 30 08:09:53 1996 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.texinfo: Adjust comments concerning A4 vs. US letter,
@ -2404,14 +2523,14 @@ Sun Dec 31 10:53:47 1995 Jim Kingdon <kingdon@harvey.cyclic.com>
Sun Dec 24 02:37:51 1995 Karl Fogel <kfogel@floss.cyclic.com>
* cvs.texinfo (Using the client with password authentication):
* cvs.texinfo (Using the client with password authentication):
tixed fypos.
Sun Dec 24 00:00:16 1995 Karl Fogel <kfogel@floss.cyclic.com>
* cvs.texinfo (Remote repositories): use @code{rsh} most places,
because it is the name of a program, and because I am a pedant.
Refer to new node "Password authenticated".
Refer to new node "Password authenticated".
(Password authenticated): new node.
(Setting up the server for password authentication): new node.
(Using the client with password authentication): new node.

View file

@ -24,12 +24,33 @@ several other output formats. If you just want some source code to
look at, the part of CVS which applies these is RCS_deltas in
src/rcs.c.
The first time I read rcsfile.5 I didn't really notice the part about
the order of the revisions. This order _is_ important and CVS relies
on it. It is documented but it would be clearer if the example in
rcsfile.5 also showed the order of the revisions (and the "next" and
"branch" fields and anything else where it would be useful to have an
example of how a revision tree is represented in an RCS file).
The rcsfile.5 documentation only _very_ briefly touches on the order
of the revisions. The order _is_ important and CVS relies on it.
Here is an example of what I was able to find, based on the join3
sanity.sh testcase (and the behavior I am documenting here seems to be
the same for RCS 5.7 and CVS 1.9.27):
1.1 -----------------> 1.2
\---> 1.1.2.1 \---> 1.2.2.1
Here is how this shows up in the RCS file (omitting irrelevant parts):
admin: head 1.2;
deltas:
1.2 branches 1.2.2.1; next 1.1;
1.1 branches 1.1.2.1; next;
1.1.2.1 branches; next;
1.2.2.1 branches; next;
deltatexts:
1.2
1.2.2.1
1.1
1.1.2.1
Yes, the order seems to differ between the deltas and the deltatexts.
I have no idea how much of this should actually be considered part of
the RCS file format, and how much programs reading it should expect to
encounter any order.
The rcsfile.5 grammar shows the {num} after "next" as optional; if it
is omitted then there is no next delta node (for example 1.1 or the
@ -62,6 +83,38 @@ rules.
the current CVS death support, which uses a state "dead"
rather than a "dead" newphrase.
CVS does use newphrases to implement the `PreservePermissions'
extension introduced in CVS 1.9.26. The following new keywords are
defined when PreservePermissions=yes:
owner
group
permissions
special
symlink
hardlinks
The contents of the `owner' and `group' field should be a numeric uid
and a numeric gid, respectively, representing the user and group who
own the file. The `permissions' field contains an octal integer,
representing the permissions that should be applied to the file. The
`special' field contains two words; the first must be either `block'
or `character', and the second is the file's device number. The
`symlink' field should be present only in files which are symbolic
links to other files, and absent on all regular files. The
`hardlinks' field contains a list of filenames to which the current
file is linked, in alphabetical order. Because files often contain
characters special to RCS, like `.' and sometimes even contain spaces
or eight-bit characters, the filenames in the hardlinks field will
usually be enclosed in RCS strings. For example:
hardlinks README @install.txt@ @Installation Notes@;
The hardlinks field should always include the name of the current
file. That is, in the repository file README,v, any hardlinks fields
in the delta nodes should include `README'; CVS will not operate
properly if this is not done.
The rules regarding keyword expansion are not documented along with
the rest of the RCS file format; they are documented in the co(1)
manpage in the RCS 5.7 distribution. See also the "Keyword

File diff suppressed because it is too large Load diff

View file

@ -320,6 +320,7 @@ General protocol conventions:
* Filenames:: Conventions regarding filenames
* File transmissions:: How file contents are transmitted
* Strings:: Strings in various requests and responses
* Dates:: Times and dates
The protocol itself:
@ -468,6 +469,32 @@ existing practice is probably to just transmit whatever the user
specifies, and hope that everyone involved agrees which character set is
in use, or sticks to a common subset.
@node Dates
@section Dates
The protocol contains times and dates in various places.
For the @samp{-D} option to the @code{annotate}, @code{co}, @code{diff},
@code{export}, @code{history}, @code{rdiff}, @code{rtag}, @code{tag},
and @code{update} requests, the server should support two formats:
@example
26 May 1997 13:01:40 GMT ; @r{RFC 822 as modified by RFC 1123}
5/26/1997 13:01:40 GMT ; @r{traditional}
@end example
The former format is preferred; the latter however is sent by the CVS
command line client (versions 1.5 through at least 1.9).
For the @samp{-d} option to the @code{log} request, servers should at
least support RFC 822/1123 format. Clients are encouraged to use this
format too (traditionally the command line CVS client has just passed
along the date format specified by the user, however).
For @code{Mod-time}, see the description of that response.
For @code{Notify}, see the description of that request.
@node Request intro
@section Request intro
@ -517,7 +544,7 @@ for the original directory, then the command.
The @var{local-directory} is relative to
the top level at which the command is occurring (i.e. the last
@code{Directory} which is sent before the command);
to indicate that top level, @samp{.} should be send for
to indicate that top level, @samp{.} should be sent for
@var{local-directory}.
Here is an example of where a client gets @var{repository} and
@ -892,7 +919,6 @@ directory.
@itemx tag \n
@itemx status \n
@itemx log \n
@itemx remove \n
@itemx admin \n
@itemx history \n
@itemx watchers \n
@ -1034,6 +1060,23 @@ directories, as described above), use @samp{.} for
@var{local-directory} may not get an error, but it will get you strange
@code{Checked-in} responses from the buggy servers.
@item remove \n
Response expected: yes. Remove a file. This uses any
previous @code{Argument}, @code{Directory}, @code{Entry}, or
@code{Modified} requests, if they have been sent. The
last @code{Directory} sent specifies the working directory at the time
of the operation.
Note that this request does not actually do anything to the repository;
the only effect of a successful @code{remove} request is to supply the
client with a new entries line containing @samp{-} to indicate a removed
file. In fact, the client probably could perform this operation without
contacting the server, although using @code{remove} may cause the server
to perform a few more checks.
The client sends a subsequent @code{ci} request to actually record the
removal in the repository.
@item watch-on \n
@itemx watch-off \n
@itemx watch-add \n

View file

@ -1,3 +1,7 @@
Tue Mar 24 16:08:00 1998 Ian Lance Taylor <ian@cygnus.com>
* Makefile.in (CFLAGS): Set to @CFLAGS@, not -g.
1998-02-20 Jim Kingdon <kingdon@harvey.cyclic.com>
* regex.c: Partial merge with version from emacs 20.2. Brings

View file

@ -77,7 +77,7 @@ DEFS = @DEFS@
RANLIB = @RANLIB@
CC = @CC@
CFLAGS = -g
CFLAGS = @CFLAGS@
CPPFLAGS=
YACC = @YACC@

View file

@ -1,3 +1,8 @@
1998-06-28 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.1: Update various items which were out of date. Mostly
these related to CVS no longer calling external RCS programs.
Mon Jan 12 11:10:21 1998 Jim Kingdon <kingdon@harvey.cyclic.com>
* cvs.1: Refer to Cederqvist as Cederqvist not as cvs.texinfo.

View file

@ -1,5 +1,709 @@
Thu Aug 13 11:15:24 1998 Noel Cragg <noel@swish.red-bean.com>
* version.c: Change version number to 1.10 and name to `Halibut'.
* sanity.sh (rcslib): new tests to check behavior of symlinks in
the repository.
Wed Aug 12 15:39:38 1998 Noel Cragg <noel@swish.red-bean.com>
* main.c (lookup_command_attribute): the `annotate' command
shouldn't require access to the repository. Add comment about
commands that do not use the working directory.
Mon Aug 10 10:26:38 1998 Noel Cragg <noel@swish.red-bean.com>
* version.c: Change version number to 1.9.30.
Thu Aug 6 17:44:50 1998 Noel Cragg <noel@swish.red-bean.com>
* server.c (serve_rdiff): change the name of the command (for
error reporting, etc.) from "patch" to "rdiff."
(serve_remove): rename from "cvsremove" to "remove."
* main.c (lookup_command_attribute): the `rdiff' command shouldn't
require write access to the repository.
1998-08-06 David Masterson of kla-tencor.com
and Jim Kingdon
* commit.c (commit_filesdoneproc): Don't call strlen ("CVSROOT")
from within the assert statement. Apparently HP's cc compiler on
HPUX 10.20 has trouble with that.
1998-08-06 Jim Kingdon <kingdon@harvey.cyclic.com>
* rcs.c (RCS_checkin): When adding branch, if there is a lock on
the branchpoint owned by someone else, leave it alone. This
restores CVS 1.9 (RCS 5.7) behavior, fixing a core dump.
* sanity.sh (reserved): New tests reserved-16 through reserved-19
test for this fix.
1998-08-05 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (unedit-without-baserev): Use ${QUESTION} not "?".
This makes it work with GNU expr 1.12 as well as 1.16.
Sun Aug 2 20:27:44 1998 Noel Cragg <noel@swish.red-bean.com>
* mkmodules.c: add comment about TopLevelAdmin for the initial
contents of CVSROOT/config.
1998-07-29 Jim Kingdon <kingdon@harvey.cyclic.com>
* rcs.c (RCS_checkin): Only try to call xreadlink if HAVE_READLINK
is defined.
Tue Jul 28 19:33:08 1998 Noel Cragg <noel@swish.red-bean.com>
* version.c: Change version number to 1.9.29.
* rcs.c (RCS_checkin): add code to follow symbolic links in the
repository.
Sun Jul 26 05:14:41 1998 Noel Cragg <noel@swish.red-bean.com>
* This set of changes reverts the code to pre-1.9.2 behavior and
does not create CVS directories at top-level (except for the
obvious "cvs co ."). Added a new configuration option to switch
between 1.9 and 1.9.2 behavior.
* recurse.c (do_argument_proc): new function.
(start_recursion): in the case that we've done a command from
top-level but have no CVS directory there, the behavior should be
the same as "cvs <cmd> dir1 dir2 dir3...". Make sure that the
appropriate "Argument" commands are sent to the server by calling
walklist with do_argument_proc.
* client.c (call_in_directory): only create the top-level CVS
directory when we're checking out "." explicitly. The server will
force creation of this directory in all other cases.
* checkout.c (checkout_proc): only generate the top-level
directory when the TopLevelAdmin=yes. Also send a message to the
client to do the same.
* parseinfo.c (parse_config): handle TopLevelAdmin option. Set
top_level_admin.
* main.c: add new variable top_level_admin.
* cvs.h: add extern definition for above.
* sanity.sh: since we're reverting to pre 1.9.2 behavior for
top-level CVS directories, I needed to make changes to a bunch of
tests that made assumptions about said directories.
(preamble): make sure to add read and execute access to everything
in TMPDIR before removing, since some tests make things read-only.
(basicb-1a, basicb-1b, basicb-9a, basicb-9b): use dotest_fail
because these tests check for the non-existant top-level CVS
directory.
(basicc-3, emptydir-6, emptydir-7, crerepos-6): use "rm -rf" so it
won't complain when trying to remove the non-existant top-level
CVS directory.
(106.5): remove imported-f2-orig.tmp.
(modules2-10, emptydir-4, abspath-1ba, abspath-1bb): cd into the
directory where files exist before using the "add" command so cvs
can find CVSROOT in CVS/Root.
(cvsadm-2): look at a different CVS/Repository file, since the
top-level one doesn't exist.
(taginfo-3): create the directory in the repository directly
rather than relying on the fact that the top-level CVS directory
was created in a previous test.
(serverpatch-6): update first-dir explicity, rather than relying
on the non-existant top-level CVS/Entries file.
(crerepos-18): look at CVS/Repository in a subdirectory rather
than in the non-existant top-level CVS directory.
(toplevel): add code to set TopLevelAdmin=yes.
(toplevel2): new tests -- same as toplevel, but TopLevelAdmin=no.
1998-07-21 Jim Meyering <meyering@ascend.com>
* rcs.c (RCS_checkout): Hoist frees of rev and value.
Warn and return 1 in several cases rather than exiting via
`error (1, ...'. The latter could abort a multi-file commit
in mid-stream, leaving stale locks in the repository.
1998-07-16 Jim Kingdon <kingdon@harvey.cyclic.com>
* build_src.com (rcscmds.c): Also look for include files in
[-.diff], just like Ian's 1998-06-18 change to Makefile.in
1998-07-14 Jim Kingdon <kingdon@harvey.cyclic.com>
* tag.c (pretag_proc), rtag.c (pretag_proc): Don't pass RUN_REALLY
to run_exec. This means that taginfo does not get executed if the
global -n option is specified. Which makes it like loginfo, -i,
-e, -o, -t, -u in modules, editinfo, and verifymsg and unlike
commitinfo. The old behavior was pretty bad in the sense that it
doesn't provide any way to log only the tags which actually
happen.
* sanity.sh (taginfo): New tests taginfo-11 to taginfo-13, for this.
1998-07-12 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (ann-id): Write the test so that it tests for the
current (buggy) behavior.
* sanity.sh (taginfo): Also clean up cvsroot/first-dir.
1998-07-12 Jim Meyering <meyering@ascend.com>
* sanity.sh (ann-id): New (currently failing) test for bug in how
rcs keywords are expanded in the output of `cvs annotate'.
1998-07-12 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (taginfo): Write the TESTDIR into the script rather
than having the script look at the environment. This means that
it will work if TESTDIR is set by sanity.sh as well as if
sanity.sh finds TESTDIR in the environment.
1998-07-11 Jim Kingdon <kingdon@harvey.cyclic.com>
* tag.c (check_fileproc): Calculate the revision to be tagged the
same way that tag_fileproc does.
* sanity.sh (taginfo): New tests, test for this (before this fix,
brtag had said 1.1 not 1.1.2.1).
1998-07-10 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (unedit-without-baserev): Also clean up "2" directory.
1998-07-08 Jim Kingdon <kingdon@harvey.cyclic.com>
* edit.c (unedit_fileproc): If the Baserev file is missing, don't
get the working file from CVS/Base. The previous code could get
you version 1.1 of the working file and put 1.2 in CVS/Entries.
* sanity.sh (unedit-without-baserev): New tests test for this.
1998-07-02 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (unedit-without-baserev): Move the test itself to be
in the same order as in the "tests" variable.
1998-07-02 Ian Lance Taylor <ian@cygnus.com>
* rcscmds.c: Don't include <stdarg.h> or <vasprintf.h>. Don't
declare vasprintf.
(call_diff_printf_output): Remove.
(call_diff_stdout_callbacks): Don't initialize printf_output
field--it has been removed from the interface.
(call_diff_file_callbacks): Likewise.
1998-07-01 Jim Meyering <meyering@ascend.com>
* edit.c (unedit_fileproc): Handle the case in which base_get
returns a NULL baserev. That happens when a file being `unedit'ed
exists in the CVS/Base directory, but isn't listed in the CVS/Baserev
file. The one case I've seen had no Baserev file at all. The symptom
(if you're lucky) is a segmentation fault upon unedit. If you use
SunOS4.1.4 for which printf prints NULL pointers as `(null)', your
unedit command will complete normally, but it will have corrupted
your CVS/Entries file and a subsequent update may result in an
assertion failure, a core dump, and a stale lock in the repository.
* sanity.sh (unedit-without-baserev): New test for this.
1998-07-01 Andy Mortimer of aeat.co.uk
and Jim Kingdon <kingdon@harvey.cyclic.com>
* server.c (server_updated): Use a prototype if we are using them
for declarations.
1998-06-29 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (commit-readonly): Protect keyword against expansion
in sanity.sh itself. Keep the keyword in the file which we check
in (or else this fails to test for the RCS_checkout change).
1998-06-27 Jim Meyering <meyering@ascend.com>
* rcs.c (RCS_checkout): If opening the local workfile fails due to
lack of write access, try to chmod the file and retry the open.
Before, a commit could fail part way through merely because the
open to rewrite with newly expanded rcs keywords would fail. It's
easy to make this happen if you use `cvs -r' or CVSREAD and you
apply a patch to one of your read-only source files -- patch
preserves the read-only setting for the file and your next commit
will fail after committing that file, but before rewriting
(checking out) your working copy.
* sanity.sh (commit-readonly): New test for this.
1998-06-25 Jim Kingdon <kingdon@harvey.cyclic.com>
* update.c (patch_file): Update comments regarding context diffs
to reflect diff library.
1998-06-23 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (modules4): Add tests for reversing the order of the
"!first-dir/sdir" and "first-dir".
1998-06-23 Jim Kingdon <kingdon@harvey.cyclic.com>
and Dave Wolfe@Motorola.
* sanity.sh (modes2): Touch the file before chmod'ing it.
1998-06-21 Ian Lance Taylor <ian@cygnus.com>
* update.c (merge_files): Revert changes of 1998-06-19. Instead,
register a merged file with a dummy time stamp. Only set
last_register_time if we need to.
(join_file): Likewise. Always register a merged file, not just
when the merge fails.
1998-06-21 Jim Kingdon <kingdon@harvey.cyclic.com>
* call_diff_write_output, call_diff_printf_output,
call_diff_flush_output, call_diff_write_stdout, call_diff_error,
call_diff_stdout_callbacks, call_diff_file_callbacks): Re-indent.
1998-06-19 Ian Lance Taylor <ian@cygnus.com>
* update.c (merge_file): Make sure the time stamp of the file is
different from the time stamp we register in the Entries file.
(join_file): Likewise.
1998-06-18 Ian Lance Taylor <ian@cygnus.com>
* rcscmds.c: Include <stdio.h>. Include either <stdarg.h> or
<varargs.h>. Declare vasprintf.
(call_diff_write_output): New static function.
(call_diff_printf_output): New static function.
(call_diff_flush_output): New static function.
(call_diff_write_stdout): New static function.
(call_diff_error): New static function.
(call_diff_stdout_callbacks): New static variable.
(call_diff_file_callbacks): New static variable.
(call_diff): Don't sleep. Use a callback structure when calling
the diff library.
(call_diff3): Likewise.
* rcscmds.c: Include diffrun.h.
(call_diff, call_diff3): Pass NULL callback parameter.
(diff_run, diff3_run): Don't declare.
* Makefile.in (rcscmds.o): New target, to use -I for diff
directory.
(zlib.o): Depend upon zlib.h.
1998-06-09 Mike Sutton@SAIC
Make it compile with Sun's bundled K&R C compiler:
* rcs.c (count_delta_actions): Change to static to match
declaration.
* client.c (handle_wrapper_rcs_option): Rename error label to
handle_error to avoid clash with function name.
1998-06-09 Jim Kingdon <kingdon@harvey.cyclic.com>
* rcs.c (RCS_delete_revs): If we are trying to delete all
revisions, give an error rather than assertion failed.
* sanity.sh (basicb): New tests basicb-o* test for this.
1998-06-04 Jim Kingdon <kingdon@harvey.cyclic.com>
* add.c (add): Only send "Directory" requests if we need to.
1998-06-02 Assar Westerlund <assar@sics.se>
* client.c: Check for HAVE_GSS_C_NT_HOSTBASED_SERVICE rather than
assuming that GSS_C_NT_HOSTBASED_SERVICE is a macro.
* server.c: Likewise.
1998-06-02 Jim Kingdon <kingdon@harvey.cyclic.com>
* fileattr.c (fileattr_read): Check for NULL return from strchr.
* sanity.sh (devcom3): New test devcom3-10 checks for this.
1998-06-01 Assar Westerlund <assar@sics.se>
and Ian Lance Taylor <ian@cygnus.com>
* client.c: If HAVE_GSSAPI_H, include <gssapi.h>. Only include
<gssapi/gssapi.h> if HAVE_GSSAPI_GSSAPI_H. Only include
<gssapi/gssapi_generic.h> if HAVE_GSSAPI_GSSAPI_GENERIC_H.
(GSS_C_NT_HOSTBASED_SERVICE): Define if not defined.
(connect_to_gserver): Use GSS_C_NT_HOSTBASED_SERVICE instead of
gss_nt_service_name.
* server.c: Same header file changes.
(GSS_C_NT_HOSTBASED_SERVICE): Define if not defined.
(gserver_authenticate_connection): Use GSS_C_NT_HOSTBASED_SERVICE
instead of gss_nt_service_name.
1998-06-01 Jim Meyering <meyering@ascend.com>
* sanity.sh (tag8k): Add a test for the 1998-05-02 rcs.c bug fix.
1998-05-26 Jim Kingdon <kingdon@harvey.cyclic.com>
* rcs.c (annotate): Call tag_check_valid like the other functions
which have a -r option.
* sanity.sh (ann): New test ann-14 tests for this.
1998-05-24 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (importc): New tests importc-5 through importc-8 test
for a (fairly obscure) regression from CVS 1.9.
1998-05-23 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (modules2): Add comment listing cvs release tests.
(info): New test info-cleanup-0 tests "cvs -n release".
* rcs.c (rcsbuf_getid): Remove semicolon at end of #undef. I'm
kind of surprised that compilers accepted this at all, but
removing it squelches a warning for some compilers.
* version.c: Change version number to 1.9.28.1.
* Version 1.9.28.
1998-05-22 Jim Kingdon <kingdon@harvey.cyclic.com>
* rcs.c (RCS_cmp_file): Check for errors from CVS_FOPEN. This
restores the CVS 1.9 behavior (fatal error if we can't open the
file), and corrects an apparent oversight in Ian's 13 Apr 1997
change.
* sanity.sh (modes2): New test, tests for this.
1998-05-22 Ian Lance Taylor <ian@cygnus.com>
* server.c (server_updated): Correct test for whether to unlink
the file.
1998-05-20 Jim Kingdon <kingdon@harvey.cyclic.com>
* wrapper.c (wrap_add): Disable -t/-f wrappers at least until the
serious bug can be fixed.
1998-05-15 Jim Kingdon <kingdon@harvey.cyclic.com>
* checkout.c (checkout): Call server_pathname_check on the
argument to "cvs co -d".
* server.c (server_pathname_check): Add comment about how we could
be handling absolute pathnames.
* sanity.sh (abspath): Rewrite the tests which run "cvs co -d /foo"
for remote, to reflect this.
* sanity.sh (abspath): Also do the "cannot rename" work-around for
abspath-7d.
1998-05-13 Jim Kingdon <kingdon@harvey.cyclic.com>
* commit.c (commit_filesdoneproc): Free admin_dir when done with it.
1998-05-13 Jim Meyering <meyering@ascend.com>
* sanity.sh (editor): Change bogus sed command, `s/^/x&/g', to `s/^/x/'.
The former exercised a bug in GNU sed-3.01-beta3.
(emptydir-8): Add `Rebuilding administrative file database' message,
since now it does that.
* commit.c (commit_filesdoneproc): Pass only the admin directory
pathname to mkmodules.
Remove #if 0, now that it's fixed.
* status.c (cvsstatus): Rename from `status' to avoid shadowing
lots of locals and parameters by the same name.
* server.c (serve_status): Update caller.
* main.c (cmds[]): Update table entry.
* cvs.h: Update prototype.
* commit.c (commit_filesdoneproc): Remove trailing blanks.
(commit) [CLIENT_SUPPORT]: Remove unnecessary (and local-shadowing)
declaration of `err'.
Rename global `tag' to `saved_tag' to avoid overshadowing `tag'
parameters of three functions.
Rename global `message' to `saved_message' to avoid overshadowing
`message' parameter of a function.
Rename global `ulist' to `saved_ulist' and move dcl up with others.
1998-05-12 Jim Kingdon <kingdon@harvey.cyclic.com>
* commit.c (commit_filesdoneproc): #if 0 the new code until it can
be fixed.
* commit.c (commit_filesdoneproc): Add comment explaining last
change.
1998-05-12 Jim Meyering <meyering@ascend.com>
* commit.c (commit_filesdoneproc): Call mkmodules not just when
committing a file directly under CVSROOT, but also when committing
files in subdirectories of CVSROOT.
1998-05-08 Jim Meyering <meyering@ascend.com>
* filesubr.c (xreadlink): NUL-terminate the symbolic link name.
Use a much smaller initial buffer length.
Test errno only if readlink fails.
Use xstrdup then free the original link name so we don't waste space.
1998-05-02 Jim Meyering <meyering@ascend.com>
* rcs.c (rcsbuf_getword): Fix off-by-one error that would result in
an abort (the first one in rcsbuf_getkey) when operating on on some
,v files with over 8192 bytes of tag and branch info.
1998-05-04 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (ann): New tests ann-12 and ann-13 test for specifying
a numeric branch.
1998-05-02 Jim Kingdon <kingdon@harvey.cyclic.com>
* rcs.c: Add comments about getting rid of rcsbuf_getid,
rcsbuf_getword, and rcsbuf_getstring.
* sanity.sh (abspath): Revise the workarounds to deal with exit
status.
1998-04-30 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (abspath): Work around the "cannot rename" bug.
1998-04-27 Jim Kingdon <kingdon@harvey.cyclic.com>
* classify.c (Classify_File): Add comments about checking whether
command name is "update".
1998-04-22 Jim Kingdon <kingdon@harvey.cyclic.com>
* version.c: Change version number to 1.9.27.1.
* Version 1.9.27.
1998-04-20 Jim Kingdon <kingdon@harvey.cyclic.com>
(This diff was run by devel-cvs and everyone seemed to like it).
* diff.c (diff_file_nodiff): Make HEAD mean the head of the branch
which contains the sticky tag, not the sticky tag itself.
* rcs.c, rcs.h (RCS_branch_head): New function.
* sanity.sh (head): Update for this changed behavior.
1998-04-19 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh: Move emptydir tests from basicb to new test emptydir.
This is because we now need a module definition to create Emptydir;
"co -d" doesn't cut it anymore.
1998-04-17 Petri Virkkula
* server.c (mkdir_p): Ignore EROFS error (like for EACCES).
1998-04-16 Jim Kingdon <kingdon@harvey.cyclic.com>
* checkout.c (checkout_proc): Don't create directories above the
last one specified in "co -d".
(build_dirs_and_chdir): Revert Noel's change of 17 Feb 1998.
(struct dir_to_build): New field just_chdir.
(build_dirs_and_chdir): Test it.
* sanity.sh (abspath): New tests abspath-7* test for a bug which
we fix, in which CVS would create bogus "D/////" entries in
CVS/Entries.
(abspath): Revise abspath-3* tests to test for the fact that we no
longer create directories above the last one specified in "co -d".
I checked that CVS 1.9 gives an error on this, so changing this
behavior back should be OK.
(cvsadm-2d3): Likewise (also checked CVS 1.9 for this case).
(cvsadm-2d3d): Likewise (also checked CVS 1.9 for this case).
(cvsadm-2d{4,5,6,7,8}, cvsadm-N2d{3,4,5,6,7,8}): Adjust for new
behavior (same case as cvsadm-2d3).
(cvsadm-2d{4,5,6,7,8}d, cvsadm-N2d{3,4,5,6,7,8}d): Remove test
(same case as cvsadm-2d3d).
(cvsadm): For remote, skip most these tests.
(abspath): When cleaning up, delete mod1 and mod2 rather than mod1
twice (longstanding bug, apparently only becomes visible if you
run the tests in a certain order).
1998-04-14 Wilfredo Sanchez <wsanchez@apple.com>
* rcs.c: variable "lockfile" was being referenced after being
free'd. Bad. Moved the free() call down.
1998-04-12 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (rcs): Add test for annotate and the year 2000.
* server.c (do_cvs_command): If there are partial lines left when
the child process is done, send them along.
* sanity.sh (rcs, rcs2): Enable all tests for remote; tests for
this fix.
1998-04-11 Jim Kingdon <kingdon@harvey.cyclic.com>
* client.c (client_senddate): Pass SDATEFORM not DATEFORM to
sscanf. This fixes a Y2K bug.
* history.c (history, select_hrec): Change since_date from time_t
to RCS format. Use the usual machinery (in particular, Make_Date
and client_senddate) so that it will work on VMS too.
* main.c, cvs.h (date_from_time_t): New function.
* sanity.sh (history): New test, to test that this didn't break
anything (also tests client_senddate fix).
1998-04-11 Norbert Kiesel <nk@iname.com>
* server.c (cvs_output_binary): Shut up "gcc -Wall" by removing
unnecessary else if test.
* server.c (check_password): Fix uninitialized memory read if
shadow passwords are used. Also added some comments.
* rcs.c (RCS_checkout): Make sure to call chown with -1 for uid or
gid if they should not be changed
1998-04-10 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh (rcs2): New test, tests for various Y2K cases.
* rcs.c (getdelta): Value for "state" keyword is optional (bug
discovered incidentally in writing rcs2 test).
1998-04-09 Jim Kingdon <kingdon@harvey.cyclic.com>
* filesubr.c, cvs.h (link_file): Remove; no longer used.
1998-04-08 Jim Kingdon <kingdon@harvey.cyclic.com>
* recurse.c (do_dir_proc): Restore update_dir rather than a
computation which appears to, but does not necessarily, restore it
(reported by various people; this fix is from Greg Hudson).
* sanity.sh (importc): New test, tests for this fix.
1998-03-27 Jim Kingdon <kingdon@harvey.cyclic.com>
* rcs.c (RCS_lock): If the revision is already locked, give an
error rather than dumping core.
* sanity.sh (reserved): New test reserved-13c tests for this.
1998-03-25 Loren J. Rittle
* import.c (add_rev): Rewrite to use RCS_FLAGS_KEEPFILE option
of RCS_checkin() to avoid damage to imported files instead of
externally undoing damage after the fact. The side effect is
that callers of add_rev() may now incrementally walk the
entries of the current directory without seeing gratuitous
changes to the directory structure (under at least one file
system under at least one OS).
1998-03-18 Jim Kingdon <kingdon@harvey.cyclic.com>
* error.c (error): Save and restore errno. Should fix test case
conflicts3-23 on SCO 5.0.2. Reported by Steve Cameron.
* sanity.sh (admin): Rename admin-26-o* to admin-26-*; the "o"
stands for "cvs admin -o". Add comment about length of tests.
Use ${PLUS}.
1998-03-05 Dan Wilder <dan@gasboy.com>
* Fix problem with cvs admin in which -ntag:branch
option associated tag with the branch's head revision.
Should have used branch number. Entailed in this fix,
the following.
* Add new functions "RCS_exist_rev", "RCS_exist_tag",
"RCS_tag2rev", and "RCS_valid_rev" to rcs.c. RCS_tag2rev
is similar to RCS_gettag, but does less interpretation.
* Plug a small memory leak.
* Add tests admin-26 through admin-29 to sanity.sh,
to test "cvs admin -n".
1998-03-17 Samuel Tardieu <sam@inf.enst.fr>
* server.c (server_register): protect dereferencing timestamp in
the trace message when it is null, to avoid a segmentation fault.
1998-03-16 Jim Kingdon <kingdon@harvey.cyclic.com>
* options.h.in (MY_NDBM): Rewrite the comment explaining this
option. It was not clear to everyone who "my" referred to, for
example.
* hardlink.c (list_linked_files_on_disk): Remove unused variables
err and p.
(list_linked_files_on_disk): Add comment about memory allocation
of return value.
* rcs.c (rcsbuf_getword): Shut up gcc -Wall with a "return 0".
(RCS_checkin): Remove unused variable fullpath.
* sanity.sh (hardlinks): Remove comment about spurious warnings;
the warnings are gone.
1998-03-12 Tim Pierce <twp@skepsis.com>
New functions for parsing and writing hardlink fields.
* rcs.c [PRESERVE_PERMISSIONS_SUPPORT] (puthardlink_proc): New
function.
(putdelta) [PRESERVE_PERMISSIONS_SUPPORT]: Use it.
(rcsbuf_getid, rcsbuf_getstring, rcsbuf_getword): New functions.
(getdelta): Call them, storing `hardlinks' field in vnode->hardlinks.
(RCS_reparsercsfile): When setting rdata->desc, xstrdup value
rather than rcsbuf_valcopying it (due to changes in how getdelta
handles keys and values in newphrases).
* sanity.sh (hardlinks): Use uglier filenames. Checking out
hardlinked files no longer produces the same spurious diagnostics,
so fix that test.
(hardlinks-2.3): Renamed from hardlinks-2.2 (duplicate test name).
New infrastructure for managing hardlink lists internally...
* hardlink.c, hardlink.h (list_linked_files_on_disk,
compare_linkage_lists, find_checkedout_proc): New functions.
* rcs.h (struct rcsversnode) [PRESERVE_PERMISSIONS_SUPPORT]: New
member `hardlinks'.
* update.c (special_file_mismatch): Get hardlinks from
vp->hardlinks instead of from vp->other_delta.
* rcs.c (free_rcsvers_contents): Comment about freeing hardlinks
member.
(RCS_checkout) [PRESERVE_PERMISSIONS_SUPPORT]: Get hardlinks from
vers->hardlinks list instead of vers->other_delta.
... and removed obsolete code from earlier revs.
* hardlink.c, hardlink.h (list_files_linked_to,
cache_hardlinks_proc, list_files_proc, set_hardlink_field_proc):
Removed.
* hardlink.h: Removed `links' member from hardlink_info struct.
* commit.c (commit): Remove the call to cache_hardlinks_proc.
(check_fileproc) [PRESERVE_PERMISSIONS_SUPPORT]: Removed reference
to hlinfo->links.
* hardlink.c (update_hardlink_info): Same.
* update.c (get_linkinfo_proc): Same.
* rcs.c (RCS_checkout) [PRESERVE_PERMISSIONS_SUPPORT]: Use
vp->hardlinks and find_checkedout_proc to find recently-updated
files that may be hardlinked.
* update.c (special_file_mismatch): Use List * structures and
compare_linkage_lists for rev1_hardlinks and rev2_hardlinks.
1998-03-16 Larry Jones <larry.jones@sdrc.com>
* server.c (check_password): If shadow passwords are supported but no
entry is found in the shadow file, check the regular password file.
1998-03-07 Jim Kingdon <kingdon@harvey.cyclic.com>
* sanity.sh: Rename permissions test to perms since that is what
each of its individual tests are named.
* sanity.sh (perms symlinks hardlinks): Change CVSROOT to
CVSROOT_DIRNAME where appropriate.
(perms symlinks hardlinks): Disable/adjust the meat of the tests for
remote.
(symlinks): Link to ${TESTDIR}/fumble rather than
/fumble/mumble/grumble. We shouldn't be making assumptions about
what might exist in random directories outside ${TESTDIR}.
* hardlink.c (cache_hardlinks_proc): Add comment about trimming
whitespace.
1998-03-07 Tim Pierce <twp@skepsis.com>
* rcs.c (RCS_checkout): Negation bug when checking out symlinks:
existence_error should be !existence_error.
* sanity.sh (permissions symlinks hardlinks): New tests, for
PreservePermissions.
1998-03-04 Jim Kingdon <kingdon@harvey.cyclic.com>
* version.c: Change version number to 1.9.26.1.
* Version 1.9.26.
* entries.c, cvs.h (Entries_Open): New argument update_dir; use it
in error message.
* add.c, checkout.c, client.c, find_names.c, import.c, recurse.c,
@ -30,7 +734,7 @@
* update.c (special_file_mismatch): Compare the hard links of the
two revisions.
* rcs.c (RCS_checkout):
* rcs.c (RCS_checkout):
* hardlink.c, hardlink.h: New files.
(hardlink_info): New struct.
@ -235,7 +939,7 @@ Tue Feb 17 02:32:21 1998 Noel Cragg <noel@swish.red-bean.com>
[These mods make "checkout" work with "-d /absolute/pathname"
once again.]
* checkout.c (checkout_proc): the -d flag on the command line
should override the -d flag in the modules file if the latter is
an absolute path. The loop that assembles the list of directories
@ -255,7 +959,7 @@ Tue Feb 17 02:32:21 1998 Noel Cragg <noel@swish.red-bean.com>
* create_adm.c (Create_Admin): include the directory in the error
message.
1998-02-16 Jim Kingdon <kingdon@harvey.cyclic.com>
* diff.c (diff_fileproc), import.c (import, add_rcs_file), rcs.c
@ -294,7 +998,7 @@ Tue Feb 17 02:32:21 1998 Noel Cragg <noel@swish.red-bean.com>
Support for device special files, symbolic links, user and group
ownerships, and file permissions.
* parseinfo.c: (parse_config): Handle new config variable
`PreservePermissions'.
* mkmodules.c (config_contents): Add new PreservePermissions var.

View file

@ -177,7 +177,10 @@ cvsbug: cvsbug.sh $(srcdir)/version.c
$(OBJECTS): $(HEADERS) options.h
zlib.o: zlib.c
rcscmds.o: rcscmds.c $(top_srcdir)/diff/diffrun.h
$(CC) $(CPPFLAGS) $(INCLUDES) -I$(top_srcdir)/diff $(DEFS) $(CFLAGS) -c $(srcdir)/rcscmds.c
zlib.o: zlib.c $(top_srcdir)/zlib/zlib.h
$(CC) $(CPPFLAGS) $(INCLUDES) -I$(top_srcdir)/zlib $(DEFS) $(CFLAGS) -c $(srcdir)/zlib.c
subdir = src

View file

@ -56,6 +56,9 @@ add (argc, argv)
List *entries;
Vers_TS *vers;
struct saved_cwd cwd;
/* Nonzero if we found a slash, and are thus adding files in a
subdirectory. */
int found_slash = 0;
if (argc == 1 || argc == -1)
usage (add_usage);
@ -108,6 +111,20 @@ add (argc, argv)
error (0, 0, "cannot add special file `%s'; skipping", argv[i]);
skip_file = 1;
}
else
{
char *p;
p = argv[i];
while (*p != '\0')
{
if (ISDIRSEP (*p))
{
found_slash = 1;
break;
}
++p;
}
}
if (skip_file)
{
@ -143,9 +160,16 @@ add (argc, argv)
if (options) send_arg(options);
option_with_arg ("-m", message);
repository = Name_Repository (NULL, NULL);
send_a_repository ("", repository, "");
free (repository);
/* If !found_slash, refrain from sending "Directory", for
CVS 1.9 compatibility. If we only tried to deal with servers
which are at least CVS 1.9.26 or so, we wouldn't have to
special-case this. */
if (found_slash)
{
repository = Name_Repository (NULL, NULL);
send_a_repository ("", repository, "");
free (repository);
}
for (i = 0; i < argc; ++i)
/* FIXME: Does this erroneously call Create_Admin in error
@ -194,7 +218,8 @@ add (argc, argv)
Create_Admin (p, argv[i], rcsdir, tag, date,
nonbranch, 0);
send_a_repository ("", repository, update_dir);
if (found_slash)
send_a_repository ("", repository, update_dir);
if (restore_cwd (&cwd, NULL))
error_exit ();

View file

@ -701,15 +701,27 @@ admin_fileproc (callerdat, finfo)
rcs->path,
tag, n->data);
status = 1;
free (tag);
continue;
}
}
/* Expand rev if necessary. */
rev = RCS_gettag (rcs, p, 0, NULL);
RCS_settag (rcs, tag, rev);
if (rev != NULL)
/* Attempt to perform the requested tagging. */
if ((*p == 0 && (rev = RCS_head (rcs)))
|| (rev = RCS_tag2rev (rcs, p))) /* tag2rev may exit */
{
RCS_check_tag (tag); /* exit if not a valid tag */
RCS_settag (rcs, tag, rev);
free (rev);
}
else
{
error (0, 0,
"%s: Symbolic name or revision %s is undefined",
rcs->path, p);
status = 1;
}
free (tag);
break;
case 's':

View file

@ -242,6 +242,13 @@ checkout (argc, argv)
error (1, 0, "tag `%s' must be a symbolic tag", tag);
}
#ifdef SERVER_SUPPORT
if (server_active && where != NULL)
{
server_pathname_check (where);
}
#endif
if (!safe_location()) {
error(1, 0, "Cannot check out files into the repository itself");
}
@ -428,11 +435,15 @@ struct dir_to_build
/* The path to the directory. */
char *dirpath;
/* If set, don't build the directory, just change to it.
The caller will also want to set REPOSITORY to NULL. */
int just_chdir;
struct dir_to_build *next;
};
static int build_dirs_and_chdir PROTO ((struct dir_to_build *list,
int sticky, int check_existing_dirs));
int sticky));
static void build_one_dir PROTO ((char *, char *, int));
@ -723,6 +734,7 @@ internal error: %s doesn't start with %s in checkout_proc",
head->repository = NULL;
head->dirpath = xstrdup (where);
head->next = NULL;
head->just_chdir = 0;
/* Make a copy of the repository name to play with. */
@ -760,7 +772,26 @@ internal error: %s doesn't start with %s in checkout_proc",
assert (strlen (where));
strcpy (new->dirpath, "/");
}
new->next = head;
head = new;
/* If where consists of multiple pathname components,
then we want to just cd into it, without creating
directories or modifying CVS directories as we go.
In CVS 1.9 and earlier, the code actually does a
CVS_CHDIR up-front; I'm not going to try to go back
to that exact code but this is somewhat similar
in spirit. */
if (where_orig != NULL
&& cp - where < strlen (where_orig))
{
new->repository = NULL;
new->just_chdir = 1;
continue;
}
new->just_chdir = 0;
/* Now figure out what repository directory to generate.
The most complete case would be something like this:
@ -771,12 +802,13 @@ internal error: %s doesn't start with %s in checkout_proc",
cvs co -d what/ever -N foo
The results in the CVS/Repository files should be:
. -> . (this is where we executed the cmd)
what -> Emptydir (generated dir -- not in repos)
. -> (don't touch CVS/Repository)
(I think this case might be buggy currently)
what -> (don't touch CVS/Repository)
ever -> . (same as "cd what/ever; cvs co -N foo")
bar -> Emptydir (generated dir -- not in repos)
baz -> quux (finally!) */
if (strcmp (reposcopy, CVSroot_directory) == 0)
{
/* We can't walk up past CVSROOT. Instead, the
@ -835,9 +867,6 @@ internal error: %s doesn't start with %s in checkout_proc",
}
}
}
new->next = head;
head = new;
}
/* clean up */
@ -852,12 +881,29 @@ internal error: %s doesn't start with %s in checkout_proc",
may not have a thing to do with where the sources are
being checked out. If it does, build_dirs_and_chdir
will take care of creating adm files here. */
if (! where_is_absolute)
/* FIXME: checking where_is_absolute is a horrid kludge;
I suspect we probably can just skip the call to
build_one_dir whenever the -d command option was specified
to checkout. */
if (! where_is_absolute && top_level_admin)
{
/* It may be argued that we shouldn't set any sticky
bits for the top-level repository. FIXME? */
build_one_dir (CVSroot_directory, ".", *pargc <= 1);
#ifdef SERVER_SUPPORT
/* We _always_ want to have a top-level admin
directory. If we're running in client/server mode,
send a "Clear-static-directory" command to make
sure it is created on the client side. (See 5.10
in cvsclient.dvi to convince yourself that this is
OK.) If this is a duplicate command being sent, it
will be ignored on the client side. */
if (server_active)
server_clear_entstat (".", CVSroot_directory);
#endif
}
@ -866,8 +912,7 @@ internal error: %s doesn't start with %s in checkout_proc",
contain a CVS subdir yet, but all the others contain
CVS and Entries.Static files */
if (build_dirs_and_chdir (head, *pargc <= 1,
where_is_absolute) != 0)
if (build_dirs_and_chdir (head, *pargc <= 1) != 0)
{
error (0, 0, "ignoring module %s", omodule);
err = 1;
@ -1101,22 +1146,13 @@ emptydir_name ()
return repository;
}
/* Build all the dirs along the path to DIRS with CVS subdirs with
appropriate repositories. If ->repository is NULL, do not create a
CVSADM directory for that subdirectory; just CVS_CHDIR into it. If
check_existing_dirs is nonzero, don't create directories if they
already exist, and don't try to write adm files in directories
where we don't have write permission. We use this last option
primarily when a user has specified an absolute path for checkout
-- we will often not have permission to top-level directories, so
we shouldn't complain. */
/* Build all the dirs along the path to DIRS with CVS subdirs with appropriate
repositories. If ->repository is NULL, do not create a CVSADM directory
for that subdirectory; just CVS_CHDIR into it. */
static int
build_dirs_and_chdir (dirs, sticky, check_existing_dirs)
build_dirs_and_chdir (dirs, sticky)
struct dir_to_build *dirs;
int sticky;
int check_existing_dirs;
{
int retval = 0;
struct dir_to_build *nextdir;
@ -1124,16 +1160,12 @@ build_dirs_and_chdir (dirs, sticky, check_existing_dirs)
while (dirs != NULL)
{
char *dir = last_component (dirs->dirpath);
int dir_is_writeable;
if ((! check_existing_dirs) || (! isdir (dir)))
if (!dirs->just_chdir)
{
mkdir_if_needed (dir);
Subdir_Register (NULL, NULL, dir);
/* This is an expensive call -- only make it if necessary. */
if (check_existing_dirs)
dir_is_writeable = iswritable (dir);
Subdir_Register (NULL, NULL, dir);
}
if (CVS_CHDIR (dir) < 0)
{
@ -1141,14 +1173,11 @@ build_dirs_and_chdir (dirs, sticky, check_existing_dirs)
retval = 1;
goto out;
}
if ((dirs->repository != NULL)
&& ((! check_existing_dirs) || dir_is_writeable))
if (dirs->repository != NULL)
{
build_one_dir (dirs->repository, dirs->dirpath, sticky);
free (dirs->repository);
}
nextdir = dirs->next;
free (dirs->dirpath);
free (dirs);

View file

@ -288,6 +288,14 @@ conflict: %s created independently by second party",
* There is no user file, so note that it was lost and
* extract a new version
*/
/* Comparing the command_name against "update", in
addition to being an ugly way to operate, means
that this message does not get printed by the
server. That might be considered just a straight
bug, although there is one subtlety: that case also
gets hit when a patch fails and the client fetches
a file. I'm not sure there is currently any way
for the server to distinguish those two cases. */
if (strcmp (command_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);
@ -367,6 +375,8 @@ conflict: %s created independently by second party",
{
/* There is no user file, so just get it */
/* See comment at other "update" compare, for more
thoughts on this comparison. */
if (strcmp (command_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);

View file

@ -78,8 +78,19 @@ static Key_schedule sched;
#ifdef HAVE_GSSAPI
#ifdef HAVE_GSSAPI_H
#include <gssapi.h>
#endif
#ifdef HAVE_GSSAPI_GSSAPI_H
#include <gssapi/gssapi.h>
#endif
#ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H
#include <gssapi/gssapi_generic.h>
#endif
#ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE
#define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name
#endif
/* This is needed for GSSAPI encryption. */
static gss_ctx_id_t gcontext;
@ -949,17 +960,24 @@ call_in_directory (pathname, func, data)
error (1, errno, "could not chdir to %s", toplevel_wd);
newdir = 0;
/* Create the CVS directory at the top level if needed.
The isdir seems like an unneeded system call, but it *does*
need to be called both if the CVS_CHDIR below succeeds (e.g.
"cvs co .") or if it fails (e.g. basicb-1a in testsuite). */
/* Create the CVS directory at the top level if needed. The
isdir seems like an unneeded system call, but it *does*
need to be called both if the CVS_CHDIR below succeeds
(e.g. "cvs co .") or if it fails (e.g. basicb-1a in
testsuite). We only need to do this for the "." case,
since the server takes care of forcing this directory to be
created in all other cases. If we don't create CVSADM
here, the call to Entries_Open below will fail. FIXME:
perhaps this means that we should change our algorithm
below that calls Create_Admin instead of having this code
here? */
if (/* I think the reposdirname_absolute case has to do with
things like "cvs update /foo/bar". In any event, the
code below which tries to put toplevel_repos into
CVS/Repository is almost surely unsuited to
the reposdirname_absolute case. */
!reposdirname_absolute
&& (strcmp (dir_name, ".") == 0)
&& ! isdir (CVSADM))
{
char *repo;
@ -2909,19 +2927,19 @@ handle_wrapper_rcs_option (args, len)
as free-form as it looks. */
p = strchr (args, ' ');
if (p == NULL)
goto error;
goto handle_error;
if (*++p != '-'
|| *++p != 'k'
|| *++p != ' '
|| *++p != '\'')
goto error;
goto handle_error;
if (strchr (p, '\'') == NULL)
goto error;
goto handle_error;
/* Add server-side cvswrappers line to our wrapper list. */
wrap_add (args, 0);
return;
error:
handle_error:
error (0, errno, "protocol error: ignoring invalid wrappers %s", args);
}
@ -3861,7 +3879,8 @@ connect_to_gserver (sock, hostinfo)
sprintf (buf, "cvs@%s", hostinfo->h_name);
tok_in.length = strlen (buf);
tok_in.value = buf;
gss_import_name (&stat_min, &tok_in, gss_nt_service_name, &server_name);
gss_import_name (&stat_min, &tok_in, GSS_C_NT_HOSTBASED_SERVICE,
&server_name);
tok_in_ptr = GSS_C_NO_BUFFER;
gcontext = GSS_C_NO_CONTEXT;
@ -5442,13 +5461,16 @@ option_with_arg (option, arg)
send_arg (arg);
}
/*
* Send a date to the server. This will passed a string which is the
* result of Make_Date, and looks like YY.MM.DD.HH.MM.SS, where all
* the letters are single digits. The time will be GMT. getdate on
* the server can't parse that, so we turn it back into something
* which it can parse.
*/
/* Send a date to the server. The input DATE is in RCS format.
The time will be GMT.
We then convert that to the format required in the protocol
(including the "-D" option) and send it. According to
cvsclient.texi, RFC 822/1123 format is preferred, but for now we
use the format that we always have, for
conservatism/laziness/paranoia. As far as I know all servers
support the RFC 822/1123 format, so probably there would be no
particular danger in switching. */
void
client_senddate (date)
@ -5457,10 +5479,10 @@ client_senddate (date)
int year, month, day, hour, minute, second;
char buf[100];
if (sscanf (date, DATEFORM, &year, &month, &day, &hour, &minute, &second)
if (sscanf (date, SDATEFORM, &year, &month, &day, &hour, &minute, &second)
!= 6)
{
error (1, 0, "diff_client_senddate: sscanf failed on date");
error (1, 0, "client_senddate: sscanf failed on date");
}
sprintf (buf, "%d/%d/%d %d:%d:%d GMT", month, day, year,

View file

@ -521,6 +521,26 @@ unedit_fileproc (callerdat, finfo)
if (node != NULL)
{
entdata = (Entnode *) node->data;
if (baserev == NULL)
{
/* This can only happen if the CVS/Baserev file got
corrupted. We suspect it might be possible if the
user interrupts CVS, although I haven't verified
that. */
error (0, 0, "%s not mentioned in %s", finfo->fullname,
CVSADM_BASEREV);
/* Since we don't know what revision the file derives from,
keeping it around would be asking for trouble. */
if (unlink_file (finfo->file) < 0)
error (0, errno, "cannot remove %s", finfo->fullname);
/* This is cheesy, in a sense; why shouldn't we do the
update for the user? However, doing that would require
contacting the server, so maybe this is OK. */
error (0, 0, "run update to complete the unedit");
return 0;
}
Register (finfo->entries, finfo->file, baserev, entdata->timestamp,
entdata->options, entdata->tag, entdata->date,
entdata->conflict);

View file

@ -89,7 +89,15 @@ error_exit PROTO ((void))
thing for the server, whether the normal server_active (child process)
case or the error_use_protocol (parent process) case. The one exception
is that STATUS nonzero for error_use_protocol probably doesn't work yet;
in that case still need to use the pending_error machinery in server.c. */
in that case still need to use the pending_error machinery in server.c.
error() does not molest errno; some code (e.g. Entries_Open) depends
on being able to say something like:
error (0, 0, "foo");
error (0, errno, "bar");
*/
/* VARARGS */
void
#if defined (HAVE_VPRINTF) && defined (__STDC__)
@ -102,6 +110,9 @@ error (status, errnum, message, va_alist)
va_dcl
#endif
{
/* Prevent strtoul (via int_vasprintf) from clobbering it. */
int save_errno = errno;
#ifdef HAVE_VPRINTF
if (message[0] != '\0')
{
@ -211,6 +222,7 @@ error (status, errnum, message, va_alist)
if (status)
error_exit ();
errno = save_errno;
}
/* Print the program name and error message MESSAGE, which is a printf-style

View file

@ -111,6 +111,10 @@ fileattr_read ()
Node *newnode;
p = strchr (line, '\t');
if (p == NULL)
error (1, 0,
"file attribute database corruption: tab missing in %s",
fname);
*p++ = '\0';
newnode = getnode ();
newnode->type = FILEATTR;
@ -130,6 +134,10 @@ fileattr_read ()
/* Currently nothing to skip here, but for future expansion,
ignore anything located here. */
p = strchr (line, '\t');
if (p == NULL)
error (1, 0,
"file attribute database corruption: tab missing in %s",
fname);
++p;
fileattr_default_attrs = xstrdup (p);
}

View file

@ -41,96 +41,6 @@ List *hardlist; /* Record hardlink information for working files */
char *working_dir; /* The top-level working directory, used for
constructing full pathnames. */
/* For check_link_proc: list all of the files named in an inode list. */
static int
list_files_proc (node, vstrp)
Node *node;
void *vstrp;
{
char **strp, *file;
int len;
/* Get the file's basename. This is because -- VERY IMPORTANT --
the `hardlinks' field is presently defined only to include links
within a directory. So the hardlinks field might be `foo' or
`mumble grump flink', but not `foo bar com/baz' or `wham ../bam
../thank/you'. Someday it would be nice to extend this to
permit cross-directory links, but the issues involved are
hideous. */
file = strrchr (node->key, '/');
if (file)
++file;
else
file = node->key;
/* Is it safe to cast vstrp to (char **) here, and then play with
the contents? I think so, since vstrp will have started out
a char ** to begin with, so we should not have alignment bugs. */
strp = (char **) vstrp;
len = (*strp == NULL ? 0 : strlen (*strp));
*strp = (char *) xrealloc (*strp, len + strlen (file) + 2);
if (*strp == NULL)
{
error (0, errno, "could not allocate memory");
return 1;
}
if (sprintf (*strp + len, "%s ", file) < 0)
{
error (0, errno, "could not compile file list");
return 1;
}
return 0;
}
/* Set the link field of each hardlink_info node to `data', which is a
list of linked files. */
static int
set_hardlink_field_proc (node, data)
Node *node;
void *data;
{
struct hardlink_info *hlinfo = (struct hardlink_info *) node->data;
hlinfo->links = xstrdup ((char *) data);
return 0;
}
/* For each file being checked in, compile a list of the files linked
to it, and cache the list in the file's hardlink_info field. */
int
cache_hardlinks_proc (node, data)
Node *node;
void *data;
{
List *inode_links;
char *p, *linked_files = NULL;
int err;
inode_links = (List *) node->data;
/* inode->data is a list of hardlink_info structures: all the
files linked to this inode. We compile a string of each file
named in this list, in alphabetical order, separated by spaces.
Then store this string in the `links' field of each
hardlink_info structure, so that RCS_checkin can easily add
it to the `hardlinks' field of a new delta node. */
sortlist (inode_links, fsortcmp);
err = walklist (inode_links, list_files_proc, &linked_files);
if (err)
return err;
/* Trim trailing whitespace. */
p = linked_files + strlen(linked_files) - 1;
while (p > linked_files && isspace (*p))
*p-- = '\0';
err = walklist (inode_links, set_hardlink_field_proc, linked_files);
return err;
}
/* Return a pointer to FILEPATH's node in the hardlist. This means
looking up its inode, retrieving the list of files linked to that
inode, and then looking up FILE in that list. If the file doesn't
@ -237,26 +147,28 @@ update_hardlink_info (file)
hlinfo = (struct hardlink_info *) n->data;
hlinfo->status = T_UPTODATE;
hlinfo->checked_out = 1;
hlinfo->links = NULL;
}
/* Return a string listing all the files known to be linked to FILE in
/* Return a List with all the files known to be linked to FILE in
the working directory. Used by special_file_mismatch, to determine
whether it is safe to merge two files. */
char *
list_files_linked_to (file)
const char *file;
whether it is safe to merge two files.
FIXME: What is the memory allocation for the return value? We seem
to sometimes allocate a new list (getlist() call below) and sometimes
return an existing list (where we return n->data). */
List *
list_linked_files_on_disk (file)
char *file;
{
char *inodestr, *filelist, *path;
char *inodestr, *path;
struct stat sb;
Node *n;
int err;
/* If hardlist is NULL, we have not been doing an operation that
would permit us to know anything about the file's hardlinks
(cvs update, cvs commit, etc). Return an empty string. */
(cvs update, cvs commit, etc). Return an empty list. */
if (hardlist == NULL)
return xstrdup ("");
return getlist();
/* Get the full pathname of file (assuming the working directory) */
if (file[0] == '/')
@ -288,11 +200,107 @@ list_files_linked_to (file)
n = findnode (hardlist, inodestr);
sortlist ((List *) n->data, fsortcmp);
filelist = NULL;
err = walklist ((List *) n->data, list_files_proc, &filelist);
if (err)
error (1, 0, "cannot get list of hardlinks for %s", file);
free (inodestr);
return filelist;
return (List *) n->data;
}
/* Compare the files in the `key' fields of two lists, returning 1 if
the lists are equivalent and 0 otherwise.
Only the basenames of each file are compared. This is an awful hack
that exists because list_linked_files_on_disk returns full paths
and the `hardlinks' structure of a RCSVers node contains only
basenames. That in turn is a result of the awful hack that only
basenames are stored in the RCS file. If anyone ever solves the
problem of correctly managing cross-directory hardlinks, this
function (along with most functions in this file) must be fixed. */
int
compare_linkage_lists (links1, links2)
List *links1;
List *links2;
{
Node *n1, *n2;
char *p1, *p2;
sortlist (links1, fsortcmp);
sortlist (links2, fsortcmp);
n1 = links1->list->next;
n2 = links2->list->next;
while (n1 != links1->list && n2 != links2->list)
{
/* Get the basenames of both files. */
p1 = strrchr (n1->key, '/');
if (p1 == NULL)
p1 = n1->key;
else
++p1;
p2 = strrchr (n2->key, '/');
if (p2 == NULL)
p2 = n2->key;
else
++p2;
/* Compare the files' basenames. */
if (strcmp (p1, p2) != 0)
return 0;
n1 = n1->next;
n2 = n2->next;
}
/* At this point we should be at the end of both lists; if not,
one file has more links than the other, and return 1. */
return (n1 == links1->list && n2 == links2->list);
}
/* Find a checked-out file in a list of filenames. Used by RCS_checkout
when checking out a new hardlinked file, to decide whether this file
can be linked to any others that already exist. The return value
is not currently used. */
int
find_checkedout_proc (node, data)
Node *node;
void *data;
{
Node **uptodate = (Node **) data;
Node *link;
char *dir = xgetwd();
char *path;
struct hardlink_info *hlinfo;
/* If we have already found a file, don't do anything. */
if (*uptodate != NULL)
return 0;
/* Look at this file in the hardlist and see whether the checked_out
field is 1, meaning that it has been checked out during this CVS run. */
path = (char *)
xmalloc (sizeof(char) * (strlen (dir) + strlen (node->key) + 2));
sprintf (path, "%s/%s", dir, node->key);
link = lookup_file_by_inode (path);
free (path);
free (dir);
if (link == NULL)
{
/* We haven't seen this file -- maybe it hasn't been checked
out yet at all. */
return 0;
}
hlinfo = (struct hardlink_info *) link->data;
if (hlinfo->checked_out)
{
/* This file has been checked out recently, so it's safe to
link to it. */
*uptodate = link;
}
return 0;
}

View file

@ -21,13 +21,13 @@ struct hardlink_info
{
Ctype status; /* as returned from Classify_File() */
int checked_out; /* has this file been checked out lately? */
char *links; /* contents of `hardlinks' RCS field */
};
extern List *hardlist;
extern char *working_dir;
int cache_hardlinks_proc PROTO ((Node *, void *));
Node *lookup_file_by_inode PROTO ((const char *));
void update_hardlink_info PROTO ((const char *));
char *list_files_linked_to PROTO ((const char *));
List *list_linked_files_on_disk PROTO ((char *));
int compare_linkage_lists PROTO ((List *, List *));
int find_checkedout_proc PROTO ((Node *, void *));

View file

@ -200,7 +200,6 @@ static int accept_hrec PROTO((struct hrec * hr, struct hrec * lr));
static int select_hrec PROTO((struct hrec * hr));
static int sort_order PROTO((const PTR l, const PTR r));
static int within PROTO((char *find, char *string));
static time_t date_and_time PROTO((char *date_str));
static void expand_modules PROTO((void));
static void read_hrecs PROTO((char *fname));
static void report_hrecs PROTO((void));
@ -242,8 +241,8 @@ static char *tz_name = "+0000";
static char *since_rev;
static char *since_tag;
static char *backto;
/* -D option, or 0 if not specified. */
static time_t since_date;
/* -D option, or 0 if not specified. RCS format. */
static char * since_date;
static struct hrec *last_since_tag;
static struct hrec *last_backto;
@ -364,18 +363,6 @@ sort_order (l, r)
return (left->idx - right->idx);
}
static time_t
date_and_time (date_str)
char *date_str;
{
time_t t;
t = get_date (date_str, (struct timeb *) NULL);
if (t == (time_t) - 1)
error (1, 0, "Can't parse date/time: %s", date_str);
return (t);
}
int
history (argc, argv)
int argc;
@ -432,14 +419,16 @@ history (argc, argv)
error (0, 0, "date overriding rev/tag/backto");
*since_rev = *since_tag = *backto = '\0';
}
since_date = date_and_time (optarg);
since_date = Make_Date (optarg);
break;
case 'b': /* Since specified file/Repos */
if (since_date || *since_rev || *since_tag)
{
error (0, 0, "backto overriding date/rev/tag");
*since_rev = *since_tag = '\0';
since_date = 0;
if (since_date != NULL)
free (since_date);
since_date = NULL;
}
free (backto);
backto = xstrdup (optarg);
@ -461,7 +450,9 @@ history (argc, argv)
{
error (0, 0, "rev overriding date/tag/backto");
*since_tag = *backto = '\0';
since_date = 0;
if (since_date != NULL)
free (since_date);
since_date = NULL;
}
free (since_rev);
since_rev = xstrdup (optarg);
@ -471,7 +462,9 @@ history (argc, argv)
{
error (0, 0, "tag overriding date/marker/file/repos");
*since_rev = *backto = '\0';
since_date = 0;
if (since_date != NULL)
free (since_date);
since_date = NULL;
}
free (since_tag);
since_tag = xstrdup (optarg);
@ -564,7 +557,7 @@ history (argc, argv)
if (histfile)
send_arg("-X");
if (since_date)
option_with_arg ("-D", asctime (gmtime (&since_date)));
client_senddate (since_date);
if (backto[0] != '\0')
option_with_arg ("-b", backto);
for (f1 = file_list; f1 < &file_list[file_count]; ++f1)
@ -683,6 +676,8 @@ history (argc, argv)
qsort ((PTR) hrec_head, hrec_count, sizeof (struct hrec), sort_order);
report_hrecs ();
free (fname);
if (since_date != NULL)
free (since_date);
free (since_rev);
free (since_tag);
free (backto);
@ -1157,7 +1152,7 @@ select_hrec (hr)
/* "Since" checking: The argument parser guarantees that only one of the
* following four choices is set:
*
* 1. If "since_date" is set, it contains a Unix time_t specified on the
* 1. If "since_date" is set, it contains the date specified on the
* command line. hr->date fields earlier than "since_date" are ignored.
* 2. If "since_rev" is set, it contains either an RCS "dotted" revision
* number (which is of limited use) or a symbolic TAG. Each RCS file
@ -1177,8 +1172,12 @@ select_hrec (hr)
*/
if (since_date)
{
if (hr->date < since_date)
char *ourdate = date_from_time_t (hr->date);
if (RCS_datecmp (ourdate, since_date) < 0)
return (0);
free (ourdate);
}
else if (*since_rev)
{

View file

@ -15,13 +15,12 @@
* or the configure script directly. Sorry.
*/
/*
* For portability and heterogeneity reasons, CVS is shipped by
* default using my own text-file version of the ndbm database library
* in the src/myndbm.c file. If you want better performance and are
* not concerned about heterogeneous hosts accessing your modules
* file, turn this option off.
*/
/* By default, CVS stores its modules and other such items in flat
text files (MY_NDBM enables this). Turning off MY_NDBM causes CVS
to look for a system-supplied ndbm database library and use it
instead. That may speed things up, but the default setting
generally works fine too. */
#ifndef MY_NDBM
#define MY_NDBM
#endif

View file

@ -346,6 +346,18 @@ warning: this CVS does not support PreservePermissions");
goto error_return;
}
}
else if (strcmp (line, "TopLevelAdmin") == 0)
{
if (strcmp (p, "no") == 0)
top_level_admin = 0;
else if (strcmp (p, "yes") == 0)
top_level_admin = 1;
else
{
error (0, 0, "unrecognized value '%s' for TopLevelAdmin", p);
goto error_return;
}
}
else
{
/* We may be dealing with a keyword which was added in a

View file

@ -477,7 +477,7 @@ pretag_proc(repository, filter)
run_arg (delete_flag ? "del" : force_tag_move ? "mov" : "add");
run_arg (repository);
walklist(tlist, pretag_list_proc, NULL);
return (run_exec(RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY));
return (run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL));
}
static void

File diff suppressed because it is too large Load diff

View file

@ -31,7 +31,7 @@ static const char *const status_usage[] =
};
int
status (argc, argv)
cvsstatus (argc, argv)
int argc;
char **argv;
{

View file

@ -275,8 +275,17 @@ check_fileproc (callerdat, finfo)
error (0, 0, "nothing known about %s", finfo->file);
return (1);
}
p->data = RCS_getversion(vers->srcfile, numtag, date, force_tag_match,
(int *) NULL);
/* Here we duplicate the calculation in tag_fileproc about which
version we are going to tag. There probably are some subtle races
(e.g. numtag is "foo" which gets moved between here and
tag_fileproc). */
if (numtag == NULL && date == NULL)
p->data = xstrdup (vers->vn_user);
else
p->data = RCS_getversion (vers->srcfile, numtag, date,
force_tag_match, NULL);
if (p->data != NULL)
{
int addit = 1;
@ -377,7 +386,7 @@ pretag_proc(repository, filter)
run_arg (delete_flag ? "del" : force_tag_move ? "mov" : "add");
run_arg (repository);
walklist(tlist, pretag_list_proc, NULL);
return (run_exec(RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY));
return (run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL));
}
static void

View file

@ -12,7 +12,8 @@
#include "cvs.h"
char *version_string = "\nConcurrent Versions System (CVS) 1.9.26";
/* NOTE: remember to remove `Halibut' when patching this code. */
char *version_string = "\nConcurrent Versions System (CVS) 1.10 `Halibut'";
#ifdef CLIENT_SUPPORT
#ifdef SERVER_SUPPORT

View file

@ -395,6 +395,11 @@ wrap_add (line, isTemp)
*line='\0';
switch(opt){
case 'f':
/* Before this is reenabled, need to address the problem in
commit.c (see http://www.cyclic.com/cvs/dev-wrap.txt). */
error (1, 0,
"-t/-f wrappers not supported by this version of CVS");
if(e.fromcvsFilter)
free(e.fromcvsFilter);
/* FIXME: error message should say where the bad value
@ -404,6 +409,11 @@ wrap_add (line, isTemp)
error (1, 0, "Correct above errors first");
break;
case 't':
/* Before this is reenabled, need to address the problem in
commit.c (see http://www.cyclic.com/cvs/dev-wrap.txt). */
error (1, 0,
"-t/-f wrappers not supported by this version of CVS");
if(e.tocvsFilter)
free(e.tocvsFilter);
/* FIXME: error message should say where the bad value