[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problem doing cvs co -pr tag

From: John Elgin
Subject: Problem doing cvs co -pr tag
Date: Sun, 14 Nov 2004 07:27:29 -0600

We are currently at 1.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;

tag_check_valid doesn't find the tag in CVSROOT/val-tags yet, so it proceeds
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);

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 */
       repository = NULL;
       repository = frame->repository;
      assert ( repository != NULL );
      assert ( strstr ( repository, "/./" ) == NULL );

BTW, this happens using both local access and pserver access.

John C. Elgin

reply via email to

[Prev in Thread] Current Thread [Next in Thread]