threads / discuss / 3548

cvsimport woes

Subject: cvsimport woes

## tl;dr

8 messages between Mar 4, 2006 and Mar 7, 2006.

replies: 7people: 4as markdown or json

Rajkumar S· Mar 4, 2006, 07:47 UTC · lore
Hi,

I am trying to track a cvs project using git. The idea is to use cvsimport to update my local git copy and make my changes in a separate branch. But for some reason after cvsimport the last update of cvs repository is not reflected in git. I have made a small script to test this behavior and am able to reproduce is consistently. I am working on FreeBSD 6.0-RELEASE, git version 1.2.4 and cvsps version 2.1

The first script is to init a cvs repository, add 3 files and cvsimport it into git repository, before which I remove the all directories and .cvsps

raj@beastie:~$ cat git_init.sh export CVSROOT=/home/raj/cvsroot rm -rf cvsroot/ git/ src/ /home/raj/.cvsps mkdir cvsroot git src cvs init cd src/ echo "Line one" > file.txt echo "Line one" > file1.txt echo "Line one" > file2.txt cvs import -m "Imported sources" src start realstart cd .. rm -rf src/ cvs co src git cvsimport -v -d /home/raj/cvsroot -C git/ src

on executing:

N src/file.txt N src/file1.txt N src/file2.txt

No conflicts created by this import

cvs checkout: Updating src U src/file.txt U src/file1.txt U src/file2.txt cvs_direct initialized to CVSROOT /home/raj/cvsroot cvs rlog: Logging src Fetching file.txt v 1.1 New file.txt: 9 bytes Fetching file1.txt v 1.1 New file1.txt: 9 bytes Fetching file2.txt v 1.1 New file2.txt: 9 bytes Tree ID b75643d0deaa77018b4dbaa2ff81756c4c1bebc1 Committed patch 1 (origin 2006-03-04 07:37:59) Committing initial tree b75643d0deaa77018b4dbaa2ff81756c4c1bebc1 Commit ID e800fd633e319b9a0b4c351f2964a03abf96b6e2 Fetching file.txt v 1.1.1.1 Update file.txt: 9 bytes Fetching file1.txt v 1.1.1.1 Update file1.txt: 9 bytes Fetching file2.txt v 1.1.1.1 Update file2.txt: 9 bytes Tree ID b75643d0deaa77018b4dbaa2ff81756c4c1bebc1 Parent ID e800fd633e319b9a0b4c351f2964a03abf96b6e2 Committed patch 2 (start 2006-03-04 07:37:59) Commit ID 21bd067b19310d11790e99ad421de6611b942fbd Created tag 'realstart' on 'start' DONE; creating master branch

Now edit two files, commit cvs and cvsupdate again.

raj@beastie:~$ cat git_test.sh export CVSROOT=/home/raj/cvsroot cd src/ echo "Line two" >> file.txt echo "Line two" >> file1.txt cvs commit -m "v2.0" cd .. git cvsimport -v -d /home/raj/cvsroot -C git/ src cd git git status cd .. echo cat git/file.txt cat git/file.txt echo cat src/file.txt cat src/file.txt

on executing:

cvs commit: Examining . Checking in file.txt; /home/raj/cvsroot/src/file.txt,v <-- file.txt new revision: 1.2; previous revision: 1.1 done Checking in file1.txt; /home/raj/cvsroot/src/file1.txt,v <-- file1.txt new revision: 1.2; previous revision: 1.1 done cvs_direct initialized to CVSROOT /home/raj/cvsroot cvs rlog: Logging src skip patchset 1: 1141457879 before 1141457879 skip patchset 2: 1141457879 before 1141457879 Switching from master to origin Fetching file.txt v 1.2 Update file.txt: 18 bytes Fetching file1.txt v 1.2 Update file1.txt: 18 bytes Tree ID 18d855d5b825ef1c0ecb9d26591e654cbe5c21df Parent ID e800fd633e319b9a0b4c351f2964a03abf96b6e2 Committed patch 3 (origin 2006-03-04 07:39:35) Commit ID 6e7129d186834d5b2941e78c1c67c5255f868e12 DONE # # Updated but not checked in: # (will commit) # # modified: file.txt # modified: file1.txt # cat git/file.txt Line one cat src/file.txt Line one Line two

As you can see the git/file.txt and src/file.txt are different. I have tried my best to 
read all documentation and follow them faithfully and I hope I am not making any obviously 
  stupid mistake.
raj
Martin Langhoff· Mar 6, 2006, 09:24 UTC · re: Rajkumar S · lore

Re: cvsimport woes

Hi Raj,

you don't seem to be making any silly mistake. Make sure you are using a recent git, and a recent cvsps. Actually you want the _latest_ cvsps (2.1 I think).

A good thing to check is what cvsps is telling cvsimport.
Now, here you are not showing us your cvsimport commandline:
> cvs_direct initialized to CVSROOT /home/raj/cvsroot
> cvs rlog: Logging src
> skip patchset 1: 1141457879 before 1141457879
> skip patchset 2: 1141457879 before 1141457879

Ahhh... ok, you are doing it all very fast. Is this a script you are running? add sleep 1 before you call cvsimport.

cheers,
martin
Martin Langhoff· Mar 6, 2006, 09:37 UTC · re: Martin Langhoff · lore

Re: cvsimport woes

On 3/6/06, Martin Langhoff <martin.langhoff@gmail.com> wrote:
> you don't seem to be making any silly mistake. Make sure you are using
> a recent git, and a recent cvsps. Actually you want the _latest_ cvsps
> (2.1 I think).

Scratch this bit, naturally. I wasn't 100% paying attention. Still, the rest of the answer should kinda/sorta make sense.

sorry!
martin
Rajkumar S· Mar 6, 2006, 16:52 UTC · re: Martin Langhoff · lore

Re: cvsimport woes

Martin Langhoff wrote:
Show 7 quoted lines
> On 3/6/06, Martin Langhoff <martin.langhoff@gmail.com> wrote:
>> you don't seem to be making any silly mistake. Make sure you are using
>> a recent git, and a recent cvsps. Actually you want the _latest_ cvsps
>> (2.1 I think).
> 
> Scratch this bit, naturally. I wasn't 100% paying attention. Still,
> the rest of the answer should kinda/sorta make sense.
Thanks for your kind replies.

I was also talking to Matthias Urlichs (the author of cvsimport) What he says is that the first version is still checked out because the import does not do the fast-forward/merge by itself.

I am wondering how can I do the fast-forward. I had a long chat in irc but did not find any solution to this particular issue. I tried git merge, but that does not work as the command needs more arguments. (I am a git newbie and git concepts are still bit fuzzy for me)

I would appreciate a lot if some one can point me in the right direction.

If you are not following this thread, the problem I am talking about is that when I do a cvsimport for a second time (ie do a git cvsimport; update the cvs; do a cvsimport again) the second updates are not visible in the current directory, though they are present in the git database.

You can use this script to reproduce this problem.

export CVSROOT=/home/raj/cvsroot rm -rf cvsroot/ git/ src/ /home/raj/.cvsps mkdir cvsroot git src cvs init cd src/ echo "Line one" > file.txt echo "Line one" > file1.txt echo "Line one" > file2.txt cvs import -m "Imported sources" src start realstart cd .. rm -rf src/ cvs co src git cvsimport -v -k -u -m -d $CVSROOT -C git/ src cd git git status cd .. cd src/ echo "Line two" >> file.txt echo "Line two" >> file1.txt cvs commit -m "v2.0" cd .. git cvsimport -v -k -u -m -d $CVSROOT -C git/ src cd git git status cd ..

Now the cvs version of file.txt and git version are different.
Thanks and regards,
raj
Martin Langhoff· Mar 7, 2006, 03:06 UTC · re: Rajkumar S · lore

Re: cvsimport woes

On 3/7/06, Rajkumar S <rajkumars@asianetindia.com> wrote:
> You can use this script to reproduce this problem.

Rajkumar, does it work better if you add "sleep 10" before each invocation of git-cvsimport?

cheers,
martin
Junio C Hamano· Mar 7, 2006, 05:34 UTC · re: Rajkumar S · lore

Re: cvsimport woes

I've run your reproduction recipe and also looked at #git log from yesterday.

Here is what I see immediately after the initial cvs import:
$ git show-branch
* [master] Initial revision
 ! [origin] Initial revision
  ! [start] Imported sources
---
  + [start] Imported sources
*++ [master] Initial revision
And here is what I get immediately after the second one:
$ git show-branch
* [master] v2.0
 ! [origin] v2.0
  ! [start] Imported sources
---
*+  [master] v2.0
  + [start] Imported sources
*++ [master^] Initial revision
$ git diff --cached --abbrev -r
:100644 100644 b8b933b... e251870... M  file.txt
:100644 100644 b8b933b... e251870... M  file1.txt

I think what is happening is that cvsimport updates origin and master branch HEAD without updating the working tree. I am not sure what the cvsimport command line you used is intended to do:

	git cvsimport -v -k -u -m -d $CVSROOT -C git/ src

Specifically, what branch, if any, is used as the "tracking branch" (i.e. stores the unmodified copy from CVS)? I presume it is "origin", in which case, I would have expected to see something like this instead.

$ git show-branch
* [master] Initial revision
 ! [origin] v2.0
  ! [start] Imported sources
---
 +  [origin] v2.0
  + [start] Imported sources
*++ [master^] Initial revision
$ git diff --cached --abbrev -r
(empty)

Then I would understand what cvsimport author means by "it does not do fast forward, you have to do it yourself". What it means is that the import only updates the tracking branch but does not update your working tree; merging the updates to the tracking branch made from the foreign SCM into your working branch is left for you to perform whenever it is convenient for you to do (meaning, you may have some intermediate change in your master branch in which case you would first commit them first and then merge from CVS). And if that is they way cvsimport is intended to be used, then you would at this point do:

$ git pull . origin
to do the fast forward.

I do not understand what cvsimport is trying to do here; I _suspect_ the part that updates the "master" branch head might be a bug.

Smurf, mind clarifying what is happening here for me please?
smurf@smurf.noris.de· Mar 7, 2006, 09:08 UTC · re: Junio C Hamano · lore

[PATCH] cvsimport: Remove master-updating code

The code which tried to update the master branch was somewhat broken. => People should do that manually, with "git merge".

Signed-off-by: Matthias Urlichs <smurf@smurf.noris.de>
---
Junio C Hamano:
> I do not understand what cvsimport is trying to do here; I
> _suspect_ the part that updates the "master" branch head might
> be a bug.
> 
This should fix it.
---
 Documentation/git-cvsimport.txt |    6 ++++++
 git-cvsimport.perl              |   27 ++-------------------------
 2 files changed, 8 insertions(+), 25 deletions(-)
4c28ef8000d68a0736084022a047019dca96c823
diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt
index dfe86ce..57027b4 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.txt
@@ -22,6 +22,12 @@ repository, or incrementally import into
 Splitting the CVS log into patch sets is done by 'cvsps'.
 At least version 2.1 is required.
 
+You should *never* do any work of your own on the branches that are
+created by git-cvsimport. The initial import will create and populate a
+"master" branch from the CVS repository's main branch which you're free
+to work with; after that, you need to 'git merge' incremental imports, or
+any CVS branches, yourself.
+
 OPTIONS
 -------
 -d <CVSROOT>::
diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index b46469a..02d1928 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -452,7 +452,6 @@ chdir($git_tree);
 
 my $last_branch = "";
 my $orig_branch = "";
-my $forward_master = 0;
 my %branch_date;
 
 my $git_dir = $ENV{"GIT_DIR"} || ".git";
@@ -488,21 +487,6 @@ unless(-d $git_dir) {
 		$last_branch = "master";
 	}
 	$orig_branch = $last_branch;
-	if (-f "$git_dir/CVS2GIT_HEAD") {
-		die <<EOM;
-CVS2GIT_HEAD exists.
-Make sure your working directory corresponds to HEAD and remove CVS2GIT_HEAD.
-You may need to run
-
-    git read-tree -m -u CVS2GIT_HEAD HEAD
-EOM
-	}
-	system('cp', "$git_dir/HEAD", "$git_dir/CVS2GIT_HEAD");
-
-	$forward_master =
-	    $opt_o ne 'master' && -f "$git_dir/refs/heads/master" &&
-	    system('cmp', '-s', "$git_dir/refs/heads/master", 
-				"$git_dir/refs/heads/$opt_o") == 0;
 
 	# populate index
 	system('git-read-tree', $last_branch);
@@ -889,17 +873,11 @@ if (defined $orig_git_index) {
 
 # Now switch back to the branch we were in before all of this happened
 if($orig_branch) {
-	print "DONE\n" if $opt_v;
-	system("cp","$git_dir/refs/heads/$opt_o","$git_dir/refs/heads/master")
-		if $forward_master;
-	unless ($opt_i) {
-		system('git-read-tree', '-m', '-u', 'CVS2GIT_HEAD', 'HEAD');
-		die "read-tree failed: $?\n" if $?;
-	}
+	print "DONE; you may need to merge manually.\n" if $opt_v;
 } else {
 	$orig_branch = "master";
 	print "DONE; creating $orig_branch branch\n" if $opt_v;
-	system("cp","$git_dir/refs/heads/$opt_o","$git_dir/refs/heads/master")
+	system("git-update-ref", "refs/heads/master", "refs/heads/$opt_o")
 		unless -f "$git_dir/refs/heads/master";
 	system('git-update-ref', 'HEAD', "$orig_branch");
 	unless ($opt_i) {
@@ -907,4 +885,3 @@ if($orig_branch) {
 		die "checkout failed: $?\n" if $?;
 	}
 }
-unlink("$git_dir/CVS2GIT_HEAD");
-- 
1.2.GIT


-- 
Matthias Urlichs   |   {M:U} IT Design @ m-u-it.de   |  smurf@smurf.noris.de
Disclaimer: The quote was selected randomly. Really. | http://smurf.noris.de
 - -
You will be run over by a bus.
Rajkumar S· Mar 7, 2006, 13:42 UTC · re: smurf@smurf.noris.de · lore

Re: [PATCH] cvsimport: Remove master-updating code

smurf@smurf.noris.de wrote:
Show 8 quoted lines
> Junio C Hamano:
> 
>>I do not understand what cvsimport is trying to do here; I
>>_suspect_ the part that updates the "master" branch head might
>>be a bug.
>>
> 
> This should fix it.
It's working fine for me. Thanks!
raj

← back to recent threads