summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2008-01-13 06:20:11 +0000
committerobrien <obrien@FreeBSD.org>2008-01-13 06:20:11 +0000
commite4554e6a56eca9e4a09f3ecaa9055e96d1630d42 (patch)
tree30006d677baaa93162f2c363425ae6c368affeb7
parent6cd2d594840608c749c654193ef59742e9ea2db6 (diff)
downloadFreeBSD-src-e4554e6a56eca9e4a09f3ecaa9055e96d1630d42.zip
FreeBSD-src-e4554e6a56eca9e4a09f3ecaa9055e96d1630d42.tar.gz
We use the stock versions of these files.
Reviewed/begged-for by: peter
-rwxr-xr-xcontrib/cvs/contrib/sccs2rcs.in12
-rw-r--r--contrib/cvs/src/buffer.c68
-rw-r--r--contrib/cvs/src/commit.c190
-rw-r--r--contrib/cvs/src/import.c71
-rw-r--r--contrib/cvs/src/login.c12
-rw-r--r--contrib/cvs/src/mkmodules.c23
-rw-r--r--contrib/cvs/src/patch.c72
-rw-r--r--contrib/cvs/src/rcscmds.c174
-rw-r--r--contrib/cvs/src/recurse.c161
9 files changed, 479 insertions, 304 deletions
diff --git a/contrib/cvs/contrib/sccs2rcs.in b/contrib/cvs/contrib/sccs2rcs.in
index b00ca88..3be8e53 100755
--- a/contrib/cvs/contrib/sccs2rcs.in
+++ b/contrib/cvs/contrib/sccs2rcs.in
@@ -1,4 +1,16 @@
#! @CSH@ -f
+
+# Copyright (C) 1995-2005 The Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
#
# Sccs2rcs is a script to convert an existing SCCS
# history into an RCS history without losing any of
diff --git a/contrib/cvs/src/buffer.c b/contrib/cvs/src/buffer.c
index d53a5c6..db2bea0 100644
--- a/contrib/cvs/src/buffer.c
+++ b/contrib/cvs/src/buffer.c
@@ -1,3 +1,17 @@
+/*
+ * Copyright (C) 1996-2005 The Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
/* Code for the buffer data structure. */
/* $FreeBSD$ */
@@ -112,11 +126,13 @@ allocate_buffer_datas ()
/* Allocate buffer_data structures in blocks of 16. */
#define ALLOC_COUNT (16)
- alc = ((struct buffer_data *)
- xmalloc (ALLOC_COUNT * sizeof (struct buffer_data)));
+ alc = xmalloc (ALLOC_COUNT * sizeof (struct buffer_data));
space = (char *) valloc (ALLOC_COUNT * BUFFER_DATA_SIZE);
- if (alc == NULL || space == NULL)
+ if (!space)
+ {
+ free (alc);
return;
+ }
for (i = 0; i < ALLOC_COUNT; i++, alc++, space += BUFFER_DATA_SIZE)
{
alc->next = free_buffer_data;
@@ -1408,10 +1424,16 @@ stdio_buffer_shutdown (buf)
{
struct stdio_buffer_closure *bc = buf->closure;
struct stat s;
- int closefp = 1;
+ int closefp, statted;
- /* Must be a pipe or a socket. What could go wrong? */
- assert (fstat (fileno (bc->fp), &s) != -1);
+ /* Must be a pipe or a socket. What could go wrong?
+ * Well, apparently for disconnected clients under AIX, the
+ * fstat() will return -1 on the server if the client has gone
+ * away.
+ */
+ if (fstat(fileno(bc->fp), &s) == -1) statted = 0;
+ else statted = 1;
+ closefp = statted;
/* Flush the buffer if we can */
if (buf->flush)
@@ -1434,7 +1456,7 @@ stdio_buffer_shutdown (buf)
# ifndef NO_SOCKET_TO_FD
{
/* shutdown() sockets */
- if (S_ISSOCK (s.st_mode))
+ if (statted && S_ISSOCK (s.st_mode))
shutdown (fileno (bc->fp), 0);
}
# endif /* NO_SOCKET_TO_FD */
@@ -1442,7 +1464,7 @@ stdio_buffer_shutdown (buf)
/* Can't be set with SHUTDOWN_SERVER defined */
else if (pclose (bc->fp) == EOF)
{
- error (1, errno, "closing connection to %s",
+ error (0, errno, "closing connection to %s",
current_parsed_root->hostname);
closefp = 0;
}
@@ -1462,7 +1484,7 @@ stdio_buffer_shutdown (buf)
# endif
# ifndef NO_SOCKET_TO_FD
/* shutdown() sockets */
- if (S_ISSOCK (s.st_mode))
+ if (statted && S_ISSOCK (s.st_mode))
shutdown (fileno (bc->fp), 1);
# else
{
@@ -1475,19 +1497,19 @@ stdio_buffer_shutdown (buf)
buf->output = NULL;
}
- if (closefp && fclose (bc->fp) == EOF)
+ if (statted && closefp && fclose (bc->fp) == EOF)
{
- if (0
-# ifdef SERVER_SUPPORT
- || server_active
-# endif /* SERVER_SUPPORT */
- )
+ if (server_active)
{
/* Syslog this? */
}
# ifdef CLIENT_SUPPORT
+ /* We are already closing the connection.
+ * On error, print a warning and try to
+ * continue to avoid infinte loops.
+ */
else
- error (1, errno,
+ error (0, errno,
"closing down connection to %s",
current_parsed_root->hostname);
# endif /* CLIENT_SUPPORT */
@@ -1501,8 +1523,13 @@ stdio_buffer_shutdown (buf)
do
w = waitpid (bc->child_pid, (int *) 0, 0);
while (w == -1 && errno == EINTR);
+
+ /* We are already closing the connection.
+ * On error, print a warning and try to
+ * continue to avoid infinte loops.
+ */
if (w == -1)
- error (1, errno, "waiting for process %d", bc->child_pid);
+ error (0, errno, "waiting for process %d", bc->child_pid);
}
return 0;
}
@@ -1835,7 +1862,7 @@ packetizing_buffer_output (closure, data, have, wrote)
struct packetizing_buffer *pb = (struct packetizing_buffer *) closure;
char inbuf[BUFFER_DATA_SIZE + 2];
char stack_outbuf[BUFFER_DATA_SIZE + PACKET_SLOP + 4];
- struct buffer_data *outdata;
+ struct buffer_data *outdata = NULL;
char *outbuf;
int size, status, translated;
@@ -1890,6 +1917,11 @@ packetizing_buffer_output (closure, data, have, wrote)
buf_output (pb->buf, outbuf, translated + 2);
else
{
+ /* if ((have + PACKET_SLOP + 4) > BUFFER_DATA_SIZE), then
+ outdata may be NULL. */
+ if (outdata == NULL)
+ abort ();
+
outdata->size = translated + 2;
buf_append_data (pb->buf, outdata, outdata);
}
diff --git a/contrib/cvs/src/commit.c b/contrib/cvs/src/commit.c
index 1edb95d..b3ba47b 100644
--- a/contrib/cvs/src/commit.c
+++ b/contrib/cvs/src/commit.c
@@ -1,6 +1,11 @@
/*
- * Copyright (c) 1992, Brian Berliner and Jeff Polk
- * Copyright (c) 1989-1992, Brian Berliner
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
+ * Portions Copyright (C) 1989-1992, Brian Berliner
*
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with the CVS source distribution.
@@ -384,12 +389,8 @@ commit (argc, argv)
/* FIXME: Shouldn't this check be much more closely related to the
readonly user stuff (CVSROOT/readers, &c). That is, why should
root be able to "cvs init", "cvs import", &c, but not "cvs ci"? */
- if (geteuid () == (uid_t) 0
-# ifdef CLIENT_SUPPORT
- /* Who we are on the client side doesn't affect logging. */
- && !current_parsed_root->isremote
-# endif
- )
+ /* Who we are on the client side doesn't affect logging. */
+ if (geteuid () == (uid_t) 0 && !current_parsed_root->isremote)
{
struct passwd *pw;
@@ -412,6 +413,7 @@ commit (argc, argv)
/* Silently ignore -n for compatibility with old
* clients.
*/
+ if (!server_active) error(0, 0, "the `-n' option is obsolete");
break;
#endif /* SERVER_SUPPORT */
case 'm':
@@ -642,7 +644,8 @@ commit (argc, argv)
fp = cvs_temp_file (&fname);
if (fp == NULL)
- error (1, 0, "cannot create temporary file %s", fname);
+ error (1, 0, "cannot create temporary file %s",
+ fname ? fname : "(null)");
if (fwrite (saved_message, 1, strlen (saved_message), fp)
!= strlen (saved_message))
error (1, errno, "cannot write temporary file %s", fname);
@@ -713,10 +716,8 @@ commit (argc, argv)
Lock_Cleanup ();
dellist (&mulist);
-#ifdef SERVER_SUPPORT
if (server_active)
return err;
-#endif
/* see if we need to sleep before returning to avoid time-stamp races */
if (last_register_time)
@@ -871,11 +872,11 @@ check_fileproc (callerdat, finfo)
case T_CHECKOUT:
case T_PATCH:
case T_NEEDS_MERGE:
- case T_CONFLICT:
case T_REMOVE_ENTRY:
error (0, 0, "Up-to-date check failed for `%s'", finfo->fullname);
freevers_ts (&vers);
return 1;
+ case T_CONFLICT:
case T_MODIFIED:
case T_ADDED:
case T_REMOVED:
@@ -913,40 +914,30 @@ check_fileproc (callerdat, finfo)
return 1;
}
}
- if (status == T_MODIFIED && !force_ci && vers->ts_conflict)
+ if (status == T_CONFLICT && !force_ci)
{
- /*
- * We found a "conflict" marker.
- *
- * If the timestamp on the file is the same as the
- * timestamp stored in the Entries file, we block the commit.
- */
- if ( file_has_conflict ( finfo, vers->ts_conflict ) )
- {
- error (0, 0,
- "file `%s' had a conflict and has not been modified",
- finfo->fullname);
- freevers_ts (&vers);
- return 1;
- }
-
- if (file_has_markers (finfo))
- {
- /* Make this a warning, not an error, because we have
- no way of knowing whether the "conflict indicators"
- are really from a conflict or whether they are part
- of the document itself (cvs.texinfo and sanity.sh in
- CVS itself, for example, tend to want to have strings
- like ">>>>>>>" at the start of a line). Making people
- kludge this the way they need to kludge keyword
- expansion seems undesirable. And it is worse than
- keyword expansion, because there is no -ko
- analogue. */
- error (0, 0,
- "\
+ error (0, 0,
+ "file `%s' had a conflict and has not been modified",
+ finfo->fullname);
+ freevers_ts (&vers);
+ return 1;
+ }
+ if (status == T_MODIFIED && !force_ci && file_has_markers (finfo))
+ {
+ /* Make this a warning, not an error, because we have
+ no way of knowing whether the "conflict indicators"
+ are really from a conflict or whether they are part
+ of the document itself (cvs.texinfo and sanity.sh in
+ CVS itself, for example, tend to want to have strings
+ like ">>>>>>>" at the start of a line). Making people
+ kludge this the way they need to kludge keyword
+ expansion seems undesirable. And it is worse than
+ keyword expansion, because there is no -ko
+ analogue. */
+ error (0, 0,
+ "\
warning: file `%s' seems to still contain conflict indicators",
- finfo->fullname);
- }
+ finfo->fullname);
}
if (status == T_REMOVED)
@@ -1285,11 +1276,7 @@ commit_fileproc (callerdat, finfo)
if (!got_message)
{
got_message = 1;
- if (
-#ifdef SERVER_SUPPORT
- !server_active &&
-#endif
- use_editor)
+ if (!server_active && use_editor)
do_editor (finfo->update_dir, &saved_message,
finfo->repository, ulist);
do_verify (&saved_message, finfo->repository);
@@ -1475,6 +1462,8 @@ commit_filesdoneproc (callerdat, err, repository, update_dir, entries)
Node *p;
List *ulist;
+ assert (repository);
+
p = findnode (mulist, update_dir);
if (p == NULL)
return err;
@@ -1565,11 +1554,7 @@ commit_direntproc (callerdat, dir, repos, update_dir, entries)
/* get commit message */
real_repos = Name_Repository (dir, update_dir);
got_message = 1;
- if (
-#ifdef SERVER_SUPPORT
- !server_active &&
-#endif
- use_editor)
+ if (!server_active && use_editor)
do_editor (update_dir, &saved_message, real_repos, ulist);
do_verify (&saved_message, real_repos);
free (real_repos);
@@ -1753,18 +1738,22 @@ remove_file (finfo, tag, message)
if (corev != NULL)
free (corev);
- retcode = RCS_checkin (finfo->rcs, finfo->file, message, rev,
+ retcode = RCS_checkin (finfo->rcs, finfo->file, message, rev, 0,
RCS_FLAGS_DEAD | RCS_FLAGS_QUIET);
if (retcode != 0)
{
if (!quiet)
error (0, retcode == -1 ? errno : 0,
"failed to commit dead revision for `%s'", finfo->fullname);
+ if (prev_rev != NULL)
+ free (prev_rev);
return 1;
}
/* At this point, the file has been committed as removed. We should
probably tell the history file about it */
- history_write ('R', NULL, finfo->rcs->head, finfo->file, finfo->repository);
+ corev = rev ? RCS_getbranch (finfo->rcs, rev, 1) : RCS_head (finfo->rcs);
+ history_write ('R', NULL, corev, finfo->file, finfo->repository);
+ free (corev);
if (rev != NULL)
free (rev);
@@ -2086,7 +2075,8 @@ checkaddfile (file, repository, tag, options, rcsnode)
/* and lock it */
if (lock_RCS (file, rcs, rev, repository))
{
- error (0, 0, "cannot lock `%s'.", rcs->path);
+ error (0, 0, "cannot lock revision %s in `%s'.",
+ rev ? rev : tag ? tag : "HEAD", rcs->path);
if (rev != NULL)
free (rev);
goto out;
@@ -2124,13 +2114,14 @@ checkaddfile (file, repository, tag, options, rcsnode)
/* commit a dead revision. */
(void) sprintf (tmp, "file %s was initially added on branch %s.",
file, tag);
- retcode = RCS_checkin (rcs, NULL, tmp, NULL,
+ retcode = RCS_checkin (rcs, NULL, tmp, NULL, 0,
RCS_FLAGS_DEAD | RCS_FLAGS_QUIET);
free (tmp);
if (retcode != 0)
{
error (retcode == -1 ? 1 : 0, retcode == -1 ? errno : 0,
"could not create initial dead revision %s", rcs->path);
+ free (fname);
goto out;
}
@@ -2143,7 +2134,7 @@ checkaddfile (file, repository, tag, options, rcsnode)
rcs = RCS_parse (file, repository);
if (rcs == NULL)
{
- error (0, 0, "could not read %s", rcs->path);
+ error (0, 0, "could not read %s in %s", file, repository);
goto out;
}
*rcsnode = rcs;
@@ -2151,7 +2142,8 @@ checkaddfile (file, repository, tag, options, rcsnode)
/* and lock it once again. */
if (lock_RCS (file, rcs, NULL, repository))
{
- error (0, 0, "cannot lock `%s'.", rcs->path);
+ error (0, 0, "cannot lock initial revision in `%s'.",
+ rcs->path);
goto out;
}
}
@@ -2164,12 +2156,25 @@ checkaddfile (file, repository, tag, options, rcsnode)
char *head;
char *magicrev;
int retcode;
+ time_t headtime = -1;
+ char *revnum, *tmp;
+ FILE *fp;
+ time_t t = -1;
+ struct tm *ct;
fixbranch (rcs, sbranch);
head = RCS_getversion (rcs, NULL, NULL, 0, (int *) NULL);
+ if (!head)
+ error (1, 0, "No head revision in archive file `%s'.",
+ rcs->path);
magicrev = RCS_magicrev (rcs, head);
+ /* If this is not a new branch, then we will want a dead
+ version created before this one. */
+ if (!newfile)
+ headtime = RCS_getrevtime (rcs, head, 0, 0);
+
retcode = RCS_settag (rcs, tag, magicrev);
RCS_rewrite (rcs, NULL, NULL);
@@ -2182,13 +2187,76 @@ checkaddfile (file, repository, tag, options, rcsnode)
"could not stub branch %s for %s", tag, rcs->path);
goto out;
}
+ /* We need to add a dead version here to avoid -rtag -Dtime
+ checkout problems between when the head version was
+ created and now. */
+ if (!newfile && headtime != -1)
+ {
+ /* move the new file out of the way. */
+ fname = xmalloc (strlen (file) + sizeof (CVSADM)
+ + sizeof (CVSPREFIX) + 10);
+ (void) sprintf (fname, "%s/%s%s", CVSADM, CVSPREFIX, file);
+ rename_file (file, fname);
+
+ /* Create empty FILE. Can't use copy_file with a DEVNULL
+ argument -- copy_file now ignores device files. */
+ fp = fopen (file, "w");
+ if (fp == NULL)
+ error (1, errno, "cannot open %s for writing", file);
+ if (fclose (fp) < 0)
+ error (0, errno, "cannot close %s", file);
+
+ /* As we will be hacking the delta date, put the time
+ this was added into the log message. */
+ t = time(NULL);
+ ct = gmtime(&t);
+ tmp = xmalloc (strlen (file) + strlen (tag) + 80);
+
+ (void) sprintf (tmp,
+ "file %s was added on branch %s on %d-%02d-%02d %02d:%02d:%02d +0000",
+ file, tag,
+ ct->tm_year + (ct->tm_year < 100 ? 0 : 1900),
+ ct->tm_mon + 1, ct->tm_mday,
+ ct->tm_hour, ct->tm_min, ct->tm_sec);
+
+ /* commit a dead revision. */
+ revnum = RCS_whatbranch (rcs, tag);
+ retcode = RCS_checkin (rcs, NULL, tmp, revnum, headtime,
+ RCS_FLAGS_DEAD |
+ RCS_FLAGS_QUIET |
+ RCS_FLAGS_USETIME);
+ free (revnum);
+ free (tmp);
+
+ if (retcode != 0)
+ {
+ error (retcode == -1 ? 1 : 0, retcode == -1 ? errno : 0,
+ "could not created dead stub %s for %s", tag,
+ rcs->path);
+ goto out;
+ }
+
+ /* put the new file back where it was */
+ rename_file (fname, file);
+ free (fname);
+
+ /* double-check that the file was written correctly */
+ freercsnode (&rcs);
+ rcs = RCS_parse (file, repository);
+ if (rcs == NULL)
+ {
+ error (0, 0, "could not read %s", rcs->path);
+ goto out;
+ }
+ *rcsnode = rcs;
+ }
}
else
{
/* lock the branch. (stubbed branches need not be locked.) */
if (lock_RCS (file, rcs, NULL, repository))
{
- error (0, 0, "cannot lock `%s'.", rcs->path);
+ error (0, 0, "cannot lock head revision in `%s'.", rcs->path);
goto out;
}
}
diff --git a/contrib/cvs/src/import.c b/contrib/cvs/src/import.c
index b962ebc..d4e2f24 100644
--- a/contrib/cvs/src/import.c
+++ b/contrib/cvs/src/import.c
@@ -1,6 +1,11 @@
/*
- * Copyright (c) 1992, Brian Berliner and Jeff Polk
- * Copyright (c) 1989-1992, Brian Berliner
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
+ * Portions Copyright (C) 1989-1992, Brian Berliner
*
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with the CVS source distribution.
@@ -86,17 +91,14 @@ import (argc, argv)
{
case 'Q':
case 'q':
-#ifdef SERVER_SUPPORT
/* The CVS 1.5 client sends these options (in addition to
Global_option requests), so we must ignore them. */
if (!server_active)
-#endif
error (1, 0,
"-q or -Q must be specified before \"%s\"",
cvs_cmd_name);
break;
case 'd':
-#ifdef SERVER_SUPPORT
if (server_active)
{
/* CVS 1.10 and older clients will send this, but it
@@ -106,7 +108,6 @@ import (argc, argv)
"warning: not setting the time of import from the file");
error (0, 0, "due to client limitations");
}
-#endif
use_file_modtime = 1;
break;
case 'b':
@@ -119,6 +120,7 @@ import (argc, argv)
#else
use_editor = 0;
#endif
+ if (message) free (message);
message = xstrdup(optarg);
break;
case 'I':
@@ -145,7 +147,6 @@ import (argc, argv)
if (argc < 3)
usage (import_usage);
-#ifdef SERVER_SUPPORT
/* This is for handling the Checkin-time request. It might seem a
bit odd to enable the use_file_modtime code even in the case
where Checkin-time was not sent for a particular file. The
@@ -157,7 +158,6 @@ import (argc, argv)
if (server_active)
use_file_modtime = 1;
-#endif
/* Don't allow "CVS" as any directory in module path.
*
@@ -214,11 +214,22 @@ import (argc, argv)
* support branching to a single level, so the specified vendor branch
* must only have two dots in it (like "1.1.1").
*/
- for (cp = vbranch; *cp != '\0'; cp++)
- if (!isdigit ((unsigned char) *cp) && *cp != '.')
- error (1, 0, "%s is not a numeric branch", vbranch);
- if (numdots (vbranch) != 2)
- error (1, 0, "Only branches with two dots are supported: %s", vbranch);
+ {
+ regex_t pat;
+ int ret = regcomp (&pat, "^[1-9][0-9]*\\.[1-9][0-9]*\\.[1-9][0-9]*$",
+ REG_EXTENDED);
+ assert (!ret);
+ if (regexec (&pat, vbranch, 0, NULL, 0))
+ {
+ error (1, 0,
+"Only numeric branch specifications with two dots are\n"
+"supported by import, not `%s'. For example: `1.1.1'.",
+ vbranch);
+ }
+ regfree (&pat);
+ }
+
+ /* Set vhead to the branch's parent. */
vhead = xstrdup (vbranch);
cp = strrchr (vhead, '.');
*cp = '\0';
@@ -232,17 +243,10 @@ import (argc, argv)
}
#endif
- if (
-#ifdef SERVER_SUPPORT
- !server_active &&
-#endif
- use_editor)
+ if (!server_active && use_editor)
{
do_editor ((char *) NULL, &message,
-#ifdef CLIENT_SUPPORT
- current_parsed_root->isremote ? (char *) NULL :
-#endif
- repository,
+ current_parsed_root->isremote ? (char *) NULL : repository,
(List *) NULL);
}
do_verify (&message, repository);
@@ -315,7 +319,8 @@ import (argc, argv)
/* Create the logfile that will be logged upon completion */
if ((logfp = cvs_temp_file (&tmpfile)) == NULL)
- error (1, errno, "cannot create temporary file `%s'", tmpfile);
+ error (1, errno, "cannot create temporary file `%s'",
+ tmpfile ? tmpfile : "(null)");
/* On systems where we can unlink an open file, do so, so it will go
away no matter how we exit. FIXME-maybe: Should be checking for
errors but I'm not sure which error(s) we get if we are on a system
@@ -436,6 +441,9 @@ import_descend (message, vtag, targc, targv)
ign_add_file (CVSDOTIGNORE, 1);
wrap_add_file (CVSDOTWRAPPER, 1);
+ if (!current_parsed_root->isremote)
+ lock_dir_for_write (repository);
+
if ((dirp = CVS_OPENDIR (".")) == NULL)
{
error (0, errno, "cannot open directory");
@@ -448,13 +456,13 @@ import_descend (message, vtag, targc, targv)
{
if (strcmp (dp->d_name, ".") == 0 || strcmp (dp->d_name, "..") == 0)
goto one_more_time_boys;
-#ifdef SERVER_SUPPORT
+
/* CVS directories are created in the temp directory by
server.c because it doesn't special-case import. So
don't print a message about them, regardless of -I!. */
if (server_active && strcmp (dp->d_name, CVSADM) == 0)
goto one_more_time_boys;
-#endif
+
if (ign_name (dp->d_name))
{
add_log ('I', dp->d_name);
@@ -518,6 +526,9 @@ import_descend (message, vtag, targc, targv)
(void) CVS_CLOSEDIR (dirp);
}
+ if (!current_parsed_root->isremote)
+ Lock_Cleanup ();
+
if (dirlist != NULL)
{
Node *head, *p;
@@ -750,7 +761,7 @@ add_rev (message, rcs, vfile, vers)
tocvsPath = wrap_tocvs_process_file (vfile);
status = RCS_checkin (rcs, tocvsPath == NULL ? vfile : tocvsPath,
- message, vbranch,
+ message, vbranch, 0,
(RCS_FLAGS_QUIET | RCS_FLAGS_KEEPFILE
| (use_file_modtime ? RCS_FLAGS_MODTIME : 0)));
ierrno = errno;
@@ -1586,11 +1597,7 @@ import_descend_dir (message, dir, vtag, targc, targv)
repository = new;
}
-#ifdef CLIENT_SUPPORT
if (!quiet && !current_parsed_root->isremote)
-#else
- if (!quiet)
-#endif
error (0, 0, "Importing %s", repository);
if ( CVS_CHDIR (dir) < 0)
@@ -1601,11 +1608,7 @@ import_descend_dir (message, dir, vtag, targc, targv)
err = 1;
goto out;
}
-#ifdef CLIENT_SUPPORT
if (!current_parsed_root->isremote && !isdir (repository))
-#else
- if (!isdir (repository))
-#endif
{
rcs = xmalloc (strlen (repository) + sizeof (RCSEXT) + 5);
(void) sprintf (rcs, "%s%s", repository, RCSEXT);
diff --git a/contrib/cvs/src/login.c b/contrib/cvs/src/login.c
index 86705ea..3222228 100644
--- a/contrib/cvs/src/login.c
+++ b/contrib/cvs/src/login.c
@@ -1,5 +1,10 @@
/*
- * Copyright (c) 1995, Cyclic Software, Bloomington, IN, USA
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (c) 1995, Cyclic Software, Bloomington, IN, USA
*
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with CVS.
@@ -384,7 +389,8 @@ process:
/* create and open a temp file */
if ((tmp_fp = cvs_temp_file (&tmp_name)) == NULL)
- error (1, errno, "unable to open temp file %s", tmp_name);
+ error (1, errno, "unable to open temp file %s",
+ tmp_name ? tmp_name : "(null)");
line = 0;
while ((line_length = getline (&linebuf, &linebuf_len, fp)) >= 0)
@@ -457,7 +463,7 @@ process:
if (fprintf (fp, "/1 %s %s\n", cvsroot_canonical, newpassword) == EOF)
error (1, errno, "cannot write %s", passfile);
if (fclose (fp) < 0)
- error (0, errno, "cannot close %s", passfile);
+ error (1, errno, "cannot close %s", passfile);
}
/* Utter, total, raving paranoia, I know. */
diff --git a/contrib/cvs/src/mkmodules.c b/contrib/cvs/src/mkmodules.c
index 0c91387..cdd766e 100644
--- a/contrib/cvs/src/mkmodules.c
+++ b/contrib/cvs/src/mkmodules.c
@@ -1,6 +1,11 @@
/*
- * Copyright (c) 1992, Brian Berliner and Jeff Polk
- * Copyright (c) 1989-1992, Brian Berliner
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
+ * Portions Copyright (C) 1989-1992, Brian Berliner
*
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with the CVS kit.
@@ -284,7 +289,7 @@ static const char *const modules_contents[] = {
static const char *const config_contents[] = {
"# Set this to \"no\" if pserver shouldn't check system users/passwords\n",
- "#SystemAuth=no\n",
+ "#SystemAuth=yes\n",
"\n",
"# Put CVS lock files in this directory rather than directly in the repository.\n",
"#LockDir=/var/lock/cvs\n",
@@ -305,7 +310,7 @@ static const char *const config_contents[] = {
"#LogHistory=" ALL_HISTORY_REC_TYPES "\n",
"\n",
"# Set `RereadLogAfterVerify' to `always' (the default) to allow the verifymsg\n",
- "# script to change the log message. Set it to `stat' to force CVS to verify",
+ "# script to change the log message. Set it to `stat' to force CVS to verify\n",
"# that the file has changed before reading it (this can take up to an extra\n",
"# second per directory being committed, so it is not recommended for large\n",
"# repositories. Set it to `never' (the previous CVS behavior) to prevent\n",
@@ -579,7 +584,17 @@ checkout_file (file, temp)
free (rcs);
return (1);
}
+
rcsnode = RCS_parsercsfile (rcs);
+ if (!rcsnode)
+ {
+ /* Probably not necessary (?); RCS_parsercsfile already printed a
+ message. */
+ error (0, 0, "Failed to parse `%s'.", rcs);
+ free (rcs);
+ return 1;
+ }
+
retcode = RCS_checkout (rcsnode, NULL, NULL, NULL, NULL, temp,
(RCSCHECKOUTPROC) NULL, (void *) NULL);
if (retcode != 0)
diff --git a/contrib/cvs/src/patch.c b/contrib/cvs/src/patch.c
index 7d99f29..65f5051 100644
--- a/contrib/cvs/src/patch.c
+++ b/contrib/cvs/src/patch.c
@@ -1,6 +1,11 @@
/*
- * Copyright (c) 1992, Brian Berliner and Jeff Polk
- * Copyright (c) 1989-1992, Brian Berliner
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
+ * Portions Copyright (C) 1989-1992, Brian Berliner
*
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with the CVS source distribution.
@@ -44,7 +49,7 @@ static int unidiff = 0;
static const char *const patch_usage[] =
{
- "Usage: %s %s [-flR] [-c|-u] [-s|-t] [-V %%d]\n",
+ "Usage: %s %s [-flR] [-c|-u] [-s|-t] [-V %%d] [-k kopt]\n",
" -r rev|-D date [-r rev2 | -D date2] modules...\n",
"\t-f\tForce a head revision match if tag/date not found.\n",
"\t-l\tLocal directory only, not recursive\n",
@@ -53,9 +58,10 @@ static const char *const patch_usage[] =
"\t-u\tUnidiff format.\n",
"\t-s\tShort patch - one liner per file.\n",
"\t-t\tTop two diffs - last change made to the file.\n",
+ "\t-V vers\tUse RCS Version \"vers\" for keyword expansion.\n",
+ "\t-k kopt\tSpecify keyword expansion mode.\n",
"\t-D date\tDate.\n",
"\t-r rev\tRevision - symbolic or numeric.\n",
- "\t-V vers\tUse RCS Version \"vers\" for keyword expansion.\n",
"(Specify the --help global option for a list of other help options)\n",
NULL
};
@@ -83,11 +89,9 @@ patch (argc, argv)
{
case 'Q':
case 'q':
-#ifdef SERVER_SUPPORT
/* The CVS 1.5 client sends these options (in addition to
Global_option requests), so we must ignore them. */
if (!server_active)
-#endif
error (1, 0,
"-q or -Q must be specified before \"%s\"",
cvs_cmd_name);
@@ -340,6 +344,7 @@ patch_proc (argc, argv, xwhere, mwhere, mfile, shorten, local_specified,
{
error (0, errno, "cannot chdir to %s", repository);
free (repository);
+ free (where);
return 1;
}
@@ -402,6 +407,9 @@ patch_fileproc (callerdat, finfo)
char *cp1, *cp2;
FILE *fp;
int line_length;
+ int dargc = 0;
+ size_t darg_allocated = 0;
+ char **dargv = NULL;
line1 = NULL;
line1_chars_allocated = 0;
@@ -512,7 +520,8 @@ patch_fileproc (callerdat, finfo)
*/
if ((fp1 = cvs_temp_file (&tmpfile1)) == NULL)
{
- error (0, errno, "cannot create temporary file %s", tmpfile1);
+ error (0, errno, "cannot create temporary file %s",
+ tmpfile1 ? tmpfile1 : "(null)");
ret = 1;
goto out;
}
@@ -521,7 +530,8 @@ patch_fileproc (callerdat, finfo)
error (0, errno, "warning: cannot close %s", tmpfile1);
if ((fp2 = cvs_temp_file (&tmpfile2)) == NULL)
{
- error (0, errno, "cannot create temporary file %s", tmpfile2);
+ error (0, errno, "cannot create temporary file %s",
+ tmpfile2 ? tmpfile2 : "(null)");
ret = 1;
goto out;
}
@@ -530,7 +540,8 @@ patch_fileproc (callerdat, finfo)
error (0, errno, "warning: cannot close %s", tmpfile2);
if ((fp3 = cvs_temp_file (&tmpfile3)) == NULL)
{
- error (0, errno, "cannot create temporary file %s", tmpfile3);
+ error (0, errno, "cannot create temporary file %s",
+ tmpfile3 ? tmpfile3 : "(null)");
ret = 1;
goto out;
}
@@ -581,8 +592,10 @@ patch_fileproc (callerdat, finfo)
(void)utime (tmpfile2, &t);
}
- switch (diff_exec (tmpfile1, tmpfile2, NULL, NULL, unidiff ? "-u" : "-c",
- tmpfile3))
+ if (unidiff) run_add_arg_p (&dargc, &darg_allocated, &dargv, "-u");
+ else run_add_arg_p (&dargc, &darg_allocated, &dargv, "-c");
+ switch (diff_exec (tmpfile1, tmpfile2, NULL, NULL, dargc, dargv,
+ tmpfile3))
{
case -1: /* fork/wait failure */
error (1, errno, "fork for diff failed on %s", rcs);
@@ -744,16 +757,33 @@ failed to read diff file header %s for %s: end of file", tmpfile3, rcs);
free (line1);
if (line2)
free (line2);
- if (CVS_UNLINK (tmpfile1) < 0)
- error (0, errno, "cannot unlink %s", tmpfile1);
- if (CVS_UNLINK (tmpfile2) < 0)
- error (0, errno, "cannot unlink %s", tmpfile2);
- if (CVS_UNLINK (tmpfile3) < 0)
- error (0, errno, "cannot unlink %s", tmpfile3);
- free (tmpfile1);
- free (tmpfile2);
- free (tmpfile3);
- tmpfile1 = tmpfile2 = tmpfile3 = NULL;
+ if (tmpfile1 != NULL)
+ {
+ if (CVS_UNLINK (tmpfile1) < 0)
+ error (0, errno, "cannot unlink %s", tmpfile1);
+ free (tmpfile1);
+ tmpfile1 = NULL;
+ }
+ if (tmpfile2 != NULL)
+ {
+ if (CVS_UNLINK (tmpfile2) < 0)
+ error (0, errno, "cannot unlink %s", tmpfile2);
+ free (tmpfile2);
+ tmpfile2 = NULL;
+ }
+ if (tmpfile3 != NULL)
+ {
+ if (CVS_UNLINK (tmpfile3) < 0)
+ error (0, errno, "cannot unlink %s", tmpfile3);
+ free (tmpfile3);
+ tmpfile3 = NULL;
+ }
+
+ if (dargc)
+ {
+ run_arg_free_p (dargc, dargv);
+ free (dargv);
+ }
out2:
if (vers_tag != NULL)
diff --git a/contrib/cvs/src/rcscmds.c b/contrib/cvs/src/rcscmds.c
index df91ff8..18182ff 100644
--- a/contrib/cvs/src/rcscmds.c
+++ b/contrib/cvs/src/rcscmds.c
@@ -1,6 +1,11 @@
/*
- * Copyright (c) 1992, Brian Berliner and Jeff Polk
- * Copyright (c) 1989-1992, Brian Berliner
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
+ * Portions Copyright (C) 1989-1992, Brian Berliner
*
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with the CVS source distribution.
@@ -53,8 +58,8 @@
On a related note, see the comments at diff_exec, later in this file,
for more on the diff library. */
-static void RCS_output_diff_options PROTO ((const char *, const char *,
- const char *, const char *));
+static void RCS_output_diff_options PROTO ((int, char *const *, const char *,
+ const char *, const char *));
/* Stuff to deal with passing arguments the way libdiff.a wants to deal
@@ -66,17 +71,18 @@ static void RCS_output_diff_options PROTO ((const char *, const char *,
argument will be parsed into whitespace separated words and added
to the global call_diff_argv list.
- Then, optionally, call call_diff_arg for each additional argument
+ Then, optionally, call call_diff_add_arg for each additional argument
that you'd like to pass to the diff library.
Finally, call call_diff or call_diff3 to produce the diffs. */
static char **call_diff_argv;
static int call_diff_argc;
-static int call_diff_argc_allocated;
+static size_t call_diff_argc_allocated;
static void call_diff_add_arg PROTO ((const char *));
-static void call_diff_setup PROTO ((const char *prog));
+static void call_diff_setup PROTO ((const char *prog,
+ int argc, char * const *argv));
static int call_diff PROTO ((const char *out));
static int call_diff3 PROTO ((char *out));
@@ -85,62 +91,37 @@ static void call_diff_flush_output PROTO((void));
static void call_diff_write_stdout PROTO((const char *));
static void call_diff_error PROTO((const char *, const char *, const char *));
+
+
+static void
+call_diff_add_arg (s)
+ const char *s;
+{
+ run_add_arg_p (&call_diff_argc, &call_diff_argc_allocated, &call_diff_argv,
+ s);
+}
+
+
+
/* VARARGS */
static void
-call_diff_setup (prog)
+call_diff_setup (prog, argc, argv)
const char *prog;
+ int argc;
+ char * const *argv;
{
- char *cp;
int i;
- char *call_diff_prog;
/* clean out any malloc'ed values from call_diff_argv */
- for (i = 0; i < call_diff_argc; i++)
- {
- if (call_diff_argv[i])
- {
- free (call_diff_argv[i]);
- call_diff_argv[i] = (char *) 0;
- }
- }
+ run_arg_free_p (call_diff_argc, call_diff_argv);
call_diff_argc = 0;
- call_diff_prog = xstrdup (prog);
-
/* put each word into call_diff_argv, allocating it as we go */
- for (cp = strtok (call_diff_prog, " \t");
- cp != NULL;
- cp = strtok ((char *) NULL, " \t"))
- call_diff_add_arg (cp);
- free (call_diff_prog);
-}
-
-static void
-call_diff_arg (s)
- const char *s;
-{
- call_diff_add_arg (s);
+ call_diff_add_arg (prog);
+ for (i = 0; i < argc; i++)
+ call_diff_add_arg (argv[i]);
}
-static void
-call_diff_add_arg (s)
- const char *s;
-{
- /* allocate more argv entries if we've run out */
- if (call_diff_argc >= call_diff_argc_allocated)
- {
- call_diff_argc_allocated += 50;
- call_diff_argv = (char **)
- xrealloc ((char *) call_diff_argv,
- call_diff_argc_allocated * sizeof (char **));
- }
-
- if (s)
- call_diff_argv[call_diff_argc++] = xstrdup (s);
- else
- /* Not post-incremented on purpose! */
- call_diff_argv[call_diff_argc] = (char *) 0;
-}
/* Callback function for the diff library to write data to the output
file. This is used when we are producing output to stdout. */
@@ -213,6 +194,8 @@ static int
call_diff (out)
const char *out;
{
+ call_diff_add_arg (NULL);
+
if (out == RUN_TTY)
return diff_run (call_diff_argc, call_diff_argv, NULL,
&call_diff_stdout_callbacks);
@@ -264,6 +247,7 @@ RCS_merge(rcs, path, workfile, options, rev1, rev2)
symbolic). */
xrev1 = RCS_gettag (rcs, rev1, 0, NULL);
xrev2 = RCS_gettag (rcs, rev2, 0, NULL);
+ assert (xrev1 && xrev2);
/* Check out chosen revisions. The error message when RCS_checkout
fails is not very informative -- it is taken verbatim from RCS 5.7,
@@ -304,21 +288,21 @@ RCS_merge(rcs, path, workfile, options, rev1, rev2)
/* Remember that the first word in the `call_diff_setup' string is used now
only for diagnostic messages -- CVS no longer forks to run diff3. */
diffout = cvs_temp_name();
- call_diff_setup ("diff3");
- call_diff_arg ("-E");
- call_diff_arg ("-am");
-
- call_diff_arg ("-L");
- call_diff_arg (workfile);
- call_diff_arg ("-L");
- call_diff_arg (xrev1);
- call_diff_arg ("-L");
- call_diff_arg (xrev2);
-
- call_diff_arg ("--");
- call_diff_arg (workfile);
- call_diff_arg (tmp1);
- call_diff_arg (tmp2);
+ call_diff_setup ("diff3", 0, NULL);
+ call_diff_add_arg ("-E");
+ call_diff_add_arg ("-am");
+
+ call_diff_add_arg ("-L");
+ call_diff_add_arg (workfile);
+ call_diff_add_arg ("-L");
+ call_diff_add_arg (xrev1);
+ call_diff_add_arg ("-L");
+ call_diff_add_arg (xrev2);
+
+ call_diff_add_arg ("--");
+ call_diff_add_arg (workfile);
+ call_diff_add_arg (tmp1);
+ call_diff_add_arg (tmp2);
retval = call_diff3 (diffout);
@@ -384,10 +368,11 @@ RCS_merge(rcs, path, workfile, options, rev1, rev2)
about this--any such features are undocumented in the context of
CVS, and I'm not sure how important to users. */
int
-RCS_exec_rcsdiff(rcsfile, opts, options, rev1, rev1_cache, rev2,
- label1, label2, workfile )
+RCS_exec_rcsdiff (rcsfile, diff_argc, diff_argv, options, rev1, rev1_cache,
+ rev2, label1, label2, workfile)
RCSNode *rcsfile;
- const char *opts;
+ int diff_argc;
+ char * const *diff_argv;
const char *options;
const char *rev1;
const char *rev1_cache;
@@ -467,8 +452,9 @@ RCS file: ", 0);
use_file2 = tmpfile2;
}
- RCS_output_diff_options (opts, rev1, rev2, workfile);
- status = diff_exec( use_file1, use_file2, label1, label2, opts, RUN_TTY );
+ RCS_output_diff_options (diff_argc, diff_argv, rev1, rev2, workfile);
+ status = diff_exec (use_file1, use_file2, label1, label2,
+ diff_argc, diff_argv, RUN_TTY);
if (status >= 0)
{
retval = status;
@@ -547,16 +533,15 @@ RCS file: ", 0);
message on stderr. */
int
-diff_exec (file1, file2, label1, label2, options, out)
+diff_exec (file1, file2, label1, label2, dargc, dargv, out)
const char *file1;
const char *file2;
const char *label1;
const char *label2;
- const char *options;
+ int dargc;
+ char * const *dargv;
const char *out;
{
- char *args;
-
#ifdef PRESERVE_PERMISSIONS_SUPPORT
/* If either file1 or file2 are special files, pretend they are
/dev/null. Reason: suppose a file that represents a block
@@ -590,18 +575,15 @@ diff_exec (file1, file2, label1, label2, options, out)
}
#endif
- args = xmalloc (strlen (options) + 10);
- /* The first word in this string is used only for error reporting. */
- sprintf (args, "diff %s", options);
- call_diff_setup (args);
+ /* The first arg to call_diff_setup is used only for error reporting. */
+ call_diff_setup ("diff", dargc, dargv);
if (label1)
- call_diff_arg (label1);
+ call_diff_add_arg (label1);
if (label2)
- call_diff_arg (label2);
- call_diff_arg ("--");
- call_diff_arg (file1);
- call_diff_arg (file2);
- free (args);
+ call_diff_add_arg (label2);
+ call_diff_add_arg ("--");
+ call_diff_add_arg (file1);
+ call_diff_add_arg (file2);
return call_diff (out);
}
@@ -613,19 +595,23 @@ diff_exec (file1, file2, label1, label2, options, out)
that I have seen. */
static void
-RCS_output_diff_options (opts, rev1, rev2, workfile)
- const char *opts;
+RCS_output_diff_options (diff_argc, diff_argv, rev1, rev2, workfile)
+ int diff_argc;
+ char * const *diff_argv;
const char *rev1;
const char *rev2;
const char *workfile;
{
- char *tmp;
-
- tmp = (char *) xmalloc (strlen (opts) + strlen (rev1) + 10);
-
- sprintf (tmp, "diff%s -r%s", opts, rev1);
- cvs_output (tmp, 0);
- free (tmp);
+ int i;
+
+ cvs_output ("diff", 0);
+ for (i = 0; i < diff_argc; i++)
+ {
+ cvs_output (" ", 1);
+ cvs_output (diff_argv[i], 0);
+ }
+ cvs_output (" -r", 3);
+ cvs_output (rev1, 0);
if (rev2)
{
diff --git a/contrib/cvs/src/recurse.c b/contrib/cvs/src/recurse.c
index 20a0f9b..1fb33c1 100644
--- a/contrib/cvs/src/recurse.c
+++ b/contrib/cvs/src/recurse.c
@@ -1,5 +1,11 @@
/*
- * Copyright (c) 1992, Brian Berliner and Jeff Polk
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
+ * Portions Copyright (C) 1989-1992, Brian Berliner
*
* You may distribute under the terms of the GNU General Public License as
* specified in the README file that comes with the CVS source distribution.
@@ -135,6 +141,25 @@ start_recursion (fileproc, filesdoneproc, direntproc, dirleaveproc, callerdat,
frame.aflag = aflag;
frame.locktype = locktype;
frame.dosrcs = dosrcs;
+
+ /* If our repository_in has a trailing "/.", remove it before storing it
+ * for do_recursion().
+ *
+ * FIXME: This is somewhat of a hack in the sense that many of our callers
+ * painstakingly compute and add the trailing '.' we now remove.
+ */
+ while (repository_in && strlen (repository_in) >= 2
+ && repository_in[strlen (repository_in) - 2] == '/'
+ && repository_in[strlen (repository_in) - 1] == '.')
+ {
+ /* Beware the case where the string is exactly "/." or "//.".
+ * Paths with a leading "//" are special on some early UNIXes.
+ */
+ if (strlen (repository_in) == 2 || strlen (repository_in) == 3)
+ repository_in[strlen (repository_in) - 1] = '\0';
+ else
+ repository_in[strlen (repository_in) - 2] = '\0';
+ }
frame.repository = repository_in;
expand_wild (argc, argv, &argc, &argv);
@@ -172,21 +197,24 @@ start_recursion (fileproc, filesdoneproc, direntproc, dirleaveproc, callerdat,
&& CVSroot_cmdline == NULL
&& current_parsed_root->isremote)
{
- char *root = Name_Root (NULL, update_dir);
- if (root && strcmp (root, current_parsed_root->original) != 0)
- /* We're skipping this directory because it is for
- a different root. Therefore, we just want to
- do the subdirectories only. Processing files would
- cause a working directory from one repository to be
- processed against a different repository, which could
- cause all kinds of spurious conflicts and such.
-
- Question: what about the case of "cvs update foo"
- where we process foo/bar and not foo itself? That
- seems to be handled somewhere (else) but why should
- it be a separate case? Needs investigation... */
- just_subdirs = 1;
- free (root);
+ cvsroot_t *root = Name_Root (NULL, update_dir);
+ if (root)
+ {
+ if (strcmp (root->original, current_parsed_root->original))
+ /* We're skipping this directory because it is for
+ * a different root. Therefore, we just want to
+ * do the subdirectories only. Processing files would
+ * cause a working directory from one repository to be
+ * processed against a different repository, which could
+ * cause all kinds of spurious conflicts and such.
+ *
+ * Question: what about the case of "cvs update foo"
+ * where we process foo/bar and not foo itself? That
+ * seems to be handled somewhere (else) but why should
+ * it be a separate case? Needs investigation... */
+ just_subdirs = 1;
+ free_cvsroot_t (root);
+ }
}
#endif
@@ -307,11 +335,8 @@ start_recursion (fileproc, filesdoneproc, direntproc, dirleaveproc, callerdat,
addfile (&files_by_dir, dir, comp);
else if (isdir (dir))
{
- if ((which & W_LOCAL) && isdir (CVSADM)
-#ifdef CLIENT_SUPPORT
- && !current_parsed_root->isremote
-#endif
- )
+ if ((which & W_LOCAL) && isdir (CVSADM) &&
+ !current_parsed_root->isremote)
{
/* otherwise, look for it in the repository. */
char *tmp_update_dir;
@@ -567,7 +592,7 @@ do_recursion (frame)
* generating data, to give the buffers a chance to drain to the
* remote client. We should not have locks active at this point,
* but if there are writelocks around, we cannot pause here. */
- if (server_active && locktype != CVS_LOCK_NONE)
+ if (server_active && locktype != CVS_LOCK_WRITE)
server_pause_check();
#endif
@@ -583,43 +608,41 @@ do_recursion (frame)
directories, since we're guaranteed to have only one CVSROOT --
our own. */
- if (
- /* If -d was specified, it should override CVS/Root.
-
- In the single-repository case, it is long-standing CVS behavior
- and makes sense - the user might want another access method,
- another server (which mounts the same repository), &c.
+ /* If -d was specified, it should override CVS/Root.
- In the multiple-repository case, -d overrides all CVS/Root
- files. That is the only plausible generalization I can
- think of. */
- CVSroot_cmdline == NULL
+ In the single-repository case, it is long-standing CVS behavior
+ and makes sense - the user might want another access method,
+ another server (which mounts the same repository), &c.
-#ifdef SERVER_SUPPORT
- && ! server_active
-#endif
- )
+ In the multiple-repository case, -d overrides all CVS/Root
+ files. That is the only plausible generalization I can
+ think of. */
+ if (CVSroot_cmdline == NULL && !server_active)
{
- char *this_root = Name_Root ((char *) NULL, update_dir);
+ cvsroot_t *this_root = Name_Root ((char *) NULL, update_dir);
if (this_root != NULL)
{
- if (findnode (root_directories, this_root) == NULL)
+ if (findnode (root_directories, this_root->original))
+ {
+ process_this_directory = !strcmp (current_parsed_root->original,
+ this_root->original);
+ free_cvsroot_t (this_root);
+ }
+ else
{
/* Add it to our list. */
Node *n = getnode ();
n->type = NT_UNKNOWN;
- n->key = xstrdup (this_root);
+ n->key = xstrdup (this_root->original);
+ n->data = this_root;
if (addnode (root_directories, n))
- error (1, 0, "cannot add new CVSROOT %s", this_root);
-
- }
-
- process_this_directory =
- (strcmp (current_parsed_root->original, this_root) == 0);
+ error (1, 0, "cannot add new CVSROOT %s",
+ this_root->original);
- free (this_root);
+ process_this_directory = 0;
+ }
}
}
@@ -682,7 +705,8 @@ do_recursion (frame)
if (repository == NULL)
{
Name_Repository ((char *) NULL, update_dir);
- assert (!"Not reached. Please report this problem to <bug-cvs@gnu.org>");
+ assert (!"Not reached. Please report this problem to <"
+ PACKAGE_BUGREPORT ">");
}
/* find the files and fill in entries if appropriate */
@@ -1031,42 +1055,41 @@ but CVS uses %s for its own purposes; skipping %s directory",
/* Only process this directory if the root matches. This nearly
duplicates code in do_recursion. */
- if (
- /* If -d was specified, it should override CVS/Root.
-
- In the single-repository case, it is long-standing CVS behavior
- and makes sense - the user might want another access method,
- another server (which mounts the same repository), &c.
+ /* If -d was specified, it should override CVS/Root.
- In the multiple-repository case, -d overrides all CVS/Root
- files. That is the only plausible generalization I can
- think of. */
- CVSroot_cmdline == NULL
+ In the single-repository case, it is long-standing CVS behavior
+ and makes sense - the user might want another access method,
+ another server (which mounts the same repository), &c.
-#ifdef SERVER_SUPPORT
- && ! server_active
-#endif
- )
+ In the multiple-repository case, -d overrides all CVS/Root
+ files. That is the only plausible generalization I can
+ think of. */
+ if (CVSroot_cmdline == NULL && !server_active)
{
- char *this_root = Name_Root (dir, update_dir);
+ cvsroot_t *this_root = Name_Root (dir, update_dir);
if (this_root != NULL)
{
- if (findnode (root_directories, this_root) == NULL)
+ if (findnode (root_directories, this_root->original))
+ {
+ process_this_directory = !strcmp (current_parsed_root->original,
+ this_root->original);
+ free_cvsroot_t (this_root);
+ }
+ else
{
/* Add it to our list. */
Node *n = getnode ();
n->type = NT_UNKNOWN;
- n->key = xstrdup (this_root);
+ n->key = xstrdup (this_root->original);
+ n->data = this_root;
if (addnode (root_directories, n))
- error (1, 0, "cannot add new CVSROOT %s", this_root);
+ error (1, 0, "cannot add new CVSROOT %s",
+ this_root->original);
+ process_this_directory = 0;
}
-
- process_this_directory = (strcmp (current_parsed_root->original, this_root) == 0);
-
- free (this_root);
}
}
OpenPOWER on IntegriCloud