threads / patch / 4460

patchcvsimport: ignore CVSPS_NO_BRANCH and impossible branches

Subject: [PATCH] cvsimport: ignore CVSPS_NO_BRANCH and impossible branches

## tl;dr

4 messages between Jun 11, 2006 and Jun 19, 2006. Diffs are folded; open one to read it.

replies: 3people: 4as markdown or json

Martin Langhoff· Jun 11, 2006, 08:12 UTC · lore

cvsps output often contains references to CVSPS_NO_BRANCH, commits that it could not trace to a branch. Ignore that branch.

Additionally, cvsps will sometimes draw circular relationships between
branches -- where two branches are recorded as opening from the other.
In those cases, and where the ancestor branch hasn't been seen, ignore
it.
Signed-off-by: Martin Langhoff <martin@catalyst.net.nz>
---
 git-cvsimport.perl |   17 ++++++++++++++++-
 1 files changed, 16 insertions(+), 1 deletions(-)
Show changes to git-cvsimport.perl +16 −1
diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index 76f6246..07b3203 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -595,7 +595,11 @@ sub write_tree () {
 }
 
 my($patchset,$date,$author_name,$author_email,$branch,$ancestor,$tag,$logmsg);
-my(@old,@new,@skipped);
+my(@old,@new,@skipped,%ignorebranch);
+
+# commits that cvsps cannot place anywhere...
+$ignorebranch{'#CVSPS_NO_BRANCH'} = 1; 
+
 sub commit {
 	update_index(@old, @new);
 	@old = @new = ();
@@ -751,7 +755,16 @@ while(<CVS>) {
 			$state = 11;
 			next;
 		}
+		if (exists $ignorebranch{$branch}) {
+			print STDERR "Skipping $branch\n";
+			$state = 11;
+			next;
+		}
 		if($ancestor) {
+			if($ancestor eq $branch) {
+				print STDERR "Branch $branch erroneously stems from itself -- changed ancestor to $opt_o\n";
+				$ancestor = $opt_o;
+			}
 			if(-f "$git_dir/refs/heads/$branch") {
 				print STDERR "Branch $branch already exists!\n";
 				$state=11;
@@ -759,6 +772,7 @@ while(<CVS>) {
 			}
 			unless(open(H,"$git_dir/refs/heads/$ancestor")) {
 				print STDERR "Branch $ancestor does not exist!\n";
+				$ignorebranch{$branch} = 1;
 				$state=11;
 				next;
 			}
@@ -766,6 +780,7 @@ while(<CVS>) {
 			close(H);
 			unless(open(H,"> $git_dir/refs/heads/$branch")) {
 				print STDERR "Could not create branch $branch: $!\n";
+				$ignorebranch{$branch} = 1;
 				$state=11;
 				next;
 			}
-- 
1.4.0.gcda2
Junio C Hamano· Jun 17, 2006, 21:00 UTC · re: Martin Langhoff · lore

Re: [PATCH] cvsimport: ignore CVSPS_NO_BRANCH and impossible branches

Martin Langhoff <martin@catalyst.net.nz> writes:
Show 7 quoted lines
> cvsps output often contains references to CVSPS_NO_BRANCH, commits that it
> could not trace to a branch. Ignore that branch.
>
> Additionally, cvsps will sometimes draw circular relationships between
> branches -- where two branches are recorded as opening from the other.
> In those cases, and where the ancestor branch hasn't been seen, ignore
> it.

This sounds more like an workaround than a real fix to me, although I'd apply it for now. I see Yann is collecting cvsps patches but maybe there will be a real fix soonish?

Yann Dirson· Jun 17, 2006, 21:27 UTC · re: Junio C Hamano · lore

Re: [PATCH] cvsimport: ignore CVSPS_NO_BRANCH and impossible branches

On Sat, Jun 17, 2006 at 02:00:10PM -0700, Junio C Hamano wrote:
Show 13 quoted lines
> Martin Langhoff <martin@catalyst.net.nz> writes:
> 
> > cvsps output often contains references to CVSPS_NO_BRANCH, commits that it
> > could not trace to a branch. Ignore that branch.
> >
> > Additionally, cvsps will sometimes draw circular relationships between
> > branches -- where two branches are recorded as opening from the other.
> > In those cases, and where the ancestor branch hasn't been seen, ignore
> > it.
> 
> This sounds more like an workaround than a real fix to me,
> although I'd apply it for now.  I see Yann is collecting cvsps
> patches but maybe there will be a real fix soonish?

I have not dig yet into the cases that trigger CVSPS_NO_BRANCH so can't make any promise, unless someone comes in with a patch already written :)

Since the patch seems to ensure the user gets warned when a branch gets ignored this way, allowing it in could probably allow at least some people to have cvsimport does a partial job, rather than failing midway. Maybe a final warning when all patchsets could not be imported could be issued, so the existing ones do not get simply lost in the verbose output.

Best regards,
-- 
Yann Dirson    <ydirson@altern.org> |
Debian-related: <dirson@debian.org> |   Support Debian GNU/Linux:
                                    |  Freedom, Power, Stability, Gratis
     http://ydirson.free.fr/        | Check <http://www.debian.org/>
Salikh Zakirov· Jun 19, 2006, 16:20 UTC · re: Junio C Hamano · lore

Re: [PATCH] cvsimport: ignore CVSPS_NO_BRANCH and impossible branches

Junio C Hamano wrote:
Show 13 quoted lines
> Martin Langhoff <martin@catalyst.net.nz> writes:
> 
>> cvsps output often contains references to CVSPS_NO_BRANCH, commits that it
>> could not trace to a branch. Ignore that branch.
>>
>> Additionally, cvsps will sometimes draw circular relationships between
>> branches -- where two branches are recorded as opening from the other.
>> In those cases, and where the ancestor branch hasn't been seen, ignore
>> it.
> 
> This sounds more like an workaround than a real fix to me,
> although I'd apply it for now.  I see Yann is collecting cvsps
> patches but maybe there will be a real fix soonish?

#CVSPS_NO_BRANCH is the identifier that CVSPS gives to the unnamed branches. Unnamed branches appear when the branch tag is removed or moved forcefully. The following short script reproduces the CVS repository with unnamed branches.

In my opinion, ignoring #CVSPS_NO_BRANCH in git-cvsimport is the most sensible thing to do, because the branch was abandoned in the CVS in the first place. I had to preprocess cvsps output to cut out CVSPS_NO_BRANCH commits anyway.

I vote for including the Martin's patch.

Creating CVS repository with unnamed branch --8<-- export CVSROOT=$PWD/cvsroot cvs init cvs checkout . mkdir a cvs add a cd a vim a.txt cvs add a.txt cvs commit -m "added a.txt" a.txt cvs tag -b br1 cvs update -r br1 echo "br1 update" >> a.txt cvs commit -m "br1 update" a.txt cvs update -A echo "HEAD update" >> a.txt cvs commit -m "HEAD update" a.txt cvs tag -d br1 cvs tag -b br1 cvs tag -d -B br1 cvs tag -b br1 cvs update -r br1 echo "branch update, once more" >> a.txt cvs commit -m "2nd branch update" a.txt ------

and corresponding CVSPS output is
--8<--
$ cvsps -A
WARNING: revision 1.1.2.1 of file a.txt on unnamed branch
---------------------
PatchSet 1 
Date: 2006/06/19 20:10:09
Author: sszakiro
Branch: HEAD
Tag: (none) 
Log:
added a.txt
Members: 
        a.txt:INITIAL->1.1 
---------------------
PatchSet 2 
Date: 2006/06/19 20:10:45
Author: sszakiro
Branch: #CVSPS_NO_BRANCH
Ancestor branch: HEAD
Tag: (none) 
Log:
br1 update
Members: 
        a.txt:1.1->1.1.2.1 
---------------------
PatchSet 3 
Date: 2006/06/19 20:11:18
Author: sszakiro
Branch: HEAD
Tag: (none) 
Log:
HEAD update
Members: 
        a.txt:1.1->1.2 
---------------------
PatchSet 4 
Date: 2006/06/19 20:12:07
Author: sszakiro
Branch: br1
Ancestor branch: HEAD
Tag: (none) 
Log:
2nd branch update
Members: 
        a.txt:1.2->1.2.2.1 
------

← back to recent threads