[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
cvs co -pr
From: |
John Elgin |
Subject: |
cvs co -pr |
Date: |
Sat, 13 Nov 2004 11:29:02 -0600 |
We are currently at 11.11.14 and are experiencing a problem when we try to
use the -p and -r flags on checkout against a file with a tag that has not
been added to CVSROOT/val-tags yet.
We end up taking the assert in do_recursion which checks to validate that
repository != NULL after getting it from frame.repository.
I am wondering if this has been fixed in the 1.11.17 or 1.11.18 releases.
I traced a bit and this is what I saw: checkout_proc calls tag_check_valid
and passes a NULL for the repository. This is in the code snippet below:
/*
* If we are going to be updating to stdout, we need to cd to the
* repository directory so the recursion processor can use the current
* directory as the place to find repository information
*/
if (pipeout)
{
if ( CVS_CHDIR (repository) < 0)
{
error (0, errno, "cannot chdir to %s", repository);
err = 1;
goto out;
}
which = W_REPOS;
if (tag != NULL && !tag_validated)
{
tag_check_valid (tag, argc - 1, argv + 1, 0, aflag, NULL);
tag_validated = 1;
}
}
else
...
tag_check_valid doesn't find the tag in CVSROOT/val-tags yet, so it needs to
check the files. It calls start_recursion passing the NULL repository and
which set to W_REPOS | W_ATTIC.
start_recursion saves the NULL repository in frame.repository. The
following snippet is then called:
/* At this point we have looped over all named arguments and built
a coupla lists. Now we unroll the lists, setting up and
calling do_recursion. */
err += walklist (files_by_dir, unroll_files_proc, (void *) &frame);
dellist(&files_by_dir);
unroll_files_proc calls do_recursion passing the frame with frame.repository
being NULL and frame.which being W_REPOS | W_ATTIC.
do_recursion then takes the else side of the following snippet and asserts.
/*
* Fill in repository with the current repository
*/
if (frame->which & W_LOCAL)
{
if (isdir (CVSADM))
{
repository = Name_Repository ((char *) NULL, update_dir);
srepository = repository; /* remember what to free */
}
else
repository = NULL;
}
else
{
repository = frame->repository;
assert ( repository != NULL );
assert ( strstr ( repository, "/./" ) == NULL );
}
BTW, this happens using both local access and pserver access.
John C. Elgin
John@JCElgin.com
- cvs co -pr,
John Elgin <=