bug-cvs
[Top][All Lists]
Advanced

[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






reply via email to

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