[development] CVS issues

Derek Wright drupal at dwwright.net
Thu Mar 29 17:21:47 UTC 2007

On Mar 29, 2007, at 6:11 AM, Richard Morse wrote:

> Is there any way to tell CVS to just undo everything I did yesterday?

yes, but it's a lot of work.

> I want to roll back all the commits, untag everything I did, and  
> undo the branches I made.

all possible, assuming either myself or killes had 1/2 hour or more  
to waste doing this for you.

i know the docs can be daunting, and CVS can seem arcane, but as we  
always say at my day job "it's easier to ask for permission than  
forgiveness". ;)  i.e. i would have much rather spent 10 minutes  
answering your questions than 3 or 5 times that much effort undoing  
your mistakes.

> I've gotten things very messed up because of CVSs weird sticky  
> issues -- I was trying to do development on both 4.7 and 5 at the  
> same time

shouldn't be a problem, i do it all the time.

> (I thought if I had completely different CVS checkouts, in  
> different roots, it would keep track of which tag was proper, but  
> it doesn't).

i don't know what CVS client you're using, and some of them might be  
stupider than others.  however, using the CLI, if you checkout like so:

mkdir drupal-5
cd drupal-5
cvs -d[blah-blah] co -r DRUPAL-5 contributions/modules/foo
cd ..

mkdir drupal-4-7
cd drupal-4-7
cvs -d[blah-blah] co -r DRUPAL-4-7 contributions/modules/foo
cd ..

mkdir drupal-HEAD
cd drupal-HEAD
cvs -d[blah-blah] co contributions/modules/foo

(where "[blah-blah]" is really ":pserver:..." -- i assume everyone's  
familiar with this part -- or, you can just set that in your CVSROOT  
environment variable).

each copy of foo will have a sticky tag that remembers what branch  
it's from (or, in the case of drupal-HEAD, no sticky tag at all,  
which means it's sticky to HEAD).  assuming all future cvs commands  
don't specify "-r", you should never have any problems with this.  if  
you're in one of these workspaces and you do a "cvs update -r  
something" or "cvs update -A", you just undid your sticky tag, so  
don't do that unless you're sure you know what you're doing.

if you're using some GUI, you're at the mercy of the foolish GUI  
writer, who might think they know how to use CVS better than you do.   
i've heard of CVS GUIs that add all sorts of extra garbage to the  
underlying CVS commands that get spit out, which is one of the  
reasons i never use them at all.  so, it's possible your GUI  
"remembered" the last checkout or update command you typed into the  
box, and keeps appending the "-r" all the time, regardless of what  
directory you're in, thereby undoing the entire functionality of  
sticky tags.  personally, i'd rather just learn the tool and then  
have complete control over what's going on.

> Also, is there any way to delete a file from head, but not from the  
> various branches?

sure.  assuming the file exists in the repository and is properly  
added to the other branches, you just do this:

mkdir HEAD
cvs -d[blah-blah] co contributions/modules/foo
cd contributions/modules/foo
rm file-for-branches.txt
cvs rm file-for-branches.txt
cvs commit -m "file-for-branches.txt shouldn't be in HEAD"

for all it's faults on renaming files, cvs is actually smart about  
the fact that removing a file is an operation specific to a given  
branch.  so, once it's been branched, you have to independently  
remove it from any/all branches where you don't want it anymore.

so, back to your "how do i undo all of this?" question -- i guess the  
next step is finding the appropriate bribe to appease killes or  
myself. ;)  perhaps you should take that part of the discussion off- 
line... ;)

-derek (dww)

p.s. yes, yes, it's possible to use another "-d [local-directory]"  
command later along the command line to checkout stuff in more fancy  
ways that avoids all the "mkdir" and "cd" parts of my instructions  
above.  but that's more confusing and i'm trying to keep this advice  
as simple as possible.

More information about the development mailing list