threads / patch / 1737

patchgit-cvsimport-script: handling of tags

Subject: [PATCH] git-cvsimport-script: handling of tags

## tl;dr

10 messages between Sep 6, 2005 and Sep 7, 2005. Diffs are folded; open one to read it.

replies: 9people: 3as markdown or json

H. Peter Anvin· Sep 6, 2005, 17:36 UTC · lore

This patch changes git-cvsimport-script so that it creates tag objects instead of refs to commits, and adds an option, -u, to convert underscores in branch and tag names to dots (since CVS doesn't allow dots in branches and tags.)

Pullable tree at master.kernel.org:/home/hpa/git/cvsimport.git/
	-hpa
Show changes to 2 files +39 −11

Documentation/git-cvsimport-script.txt, git-cvsimport-script

diff --git a/Documentation/git-cvsimport-script.txt b/Documentation/git-cvsimport-script.txt
--- a/Documentation/git-cvsimport-script.txt
+++ b/Documentation/git-cvsimport-script.txt
@@ -44,6 +44,9 @@ OPTIONS
 	to avoid noisy changesets. Highly recommended, but off by default
 	to preserve compatibility with early imported trees. 
 
+-u::
+	Convert underscores in tag and branch names to dots.
+
 -o <branch-for-HEAD>::
 	The 'HEAD' branch from CVS is imported to the 'origin' branch within
 	the git repository, as 'HEAD' already has a special meaning for git.
diff --git a/git-cvsimport-script b/git-cvsimport-script
--- a/git-cvsimport-script
+++ b/git-cvsimport-script
@@ -24,23 +24,24 @@ use Time::Local;
 use IO::Socket;
 use IO::Pipe;
 use POSIX qw(strftime dup2);
+use IPC::Open2;
 
 $SIG{'PIPE'}="IGNORE";
 $ENV{'TZ'}="UTC";
 
-our($opt_h,$opt_o,$opt_v,$opt_k,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M);
+our($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_s,$opt_m,$opt_M);
 
 sub usage() {
 	print STDERR <<END;
 Usage: ${\basename $0}     # fetch/update GIT from CVS
-       [ -o branch-for-HEAD ] [ -h ] [ -v ] [ -d CVSROOT ]
-       [ -p opts-for-cvsps ] [ -C GIT_repository ] [ -z fuzz ]
-       [ -i ] [ -k ] [-s subst] [ -m ] [ -M regex] [ CVS_module ]
+       [-o branch-for-HEAD] [-h] [-v] [-d CVSROOT]
+       [-p opts-for-cvsps] [-C GIT_repository] [-z fuzz]
+       [-i] [-k] [-u] [-s subst] [-m] [-M regex] [CVS_module]
 END
 	exit(1);
 }
 
-getopts("hivmko:d:p:C:z:s:M:") or usage();
+getopts("hivmkuo:d:p:C:z:s:M:") or usage();
 usage if $opt_h;
 
 @ARGV <= 1 or usage();
@@ -628,13 +629,37 @@ my $commit = sub {
 		or die "Cannot write branch $branch for update: $!\n";
 
 	if($tag) {
-		open(C,">$git_dir/refs/tags/$tag")
-			or die "Cannot create tag $tag: $!\n";
-		print C "$cid\n"
-			or die "Cannot write tag $branch: $!\n";
+		my($in, $out) = ('','');
+	        my($xtag) = $tag;
+		$xtag =~ s/\s+\*\*.*$//; # Remove stuff like ** INVALID ** and ** FUNKY **
+		$xtag =~ tr/_/\./ if ( $opt_u );
+		
+		my $pid = open2($in, $out, 'git-mktag');
+		print $out "object $cid\n".
+		    "type commit\n".
+		    "tag $xtag\n".
+		    "tagger $author <$author>\n"
+		    or die "Cannot create tag object $xtag: $!\n";
+		close($out)
+		    or die "Cannot create tag object $xtag: $!\n";
+
+		my $tagobj = <$in>;
+		chomp $tagobj;
+
+		if ( !close($in) or waitpid($pid, 0) != $pid or
+		     $? != 0 or $tagobj !~ /^[0123456789abcdef]{40}$/ ) {
+		    die "Cannot create tag object $xtag: $!\n";
+	        }
+		
+
+		open(C,">$git_dir/refs/tags/$xtag")
+			or die "Cannot create tag $xtag: $!\n";
+		print C "$tagobj\n"
+			or die "Cannot write tag $xtag: $!\n";
 		close(C)
-			or die "Cannot write tag $branch: $!\n";
-		print "Created tag '$tag' on '$branch'\n" if $opt_v;
+			or die "Cannot write tag $xtag: $!\n";
+
+		print "Created tag '$xtag' on '$branch'\n" if $opt_v;
 	}
 };
 
H. Peter Anvin· Sep 6, 2005, 18:56 UTC · re: H. Peter Anvin · lore

Re: [PATCH] git-cvsimport-script: handling of tags

H. Peter Anvin wrote:
Show 6 quoted lines
> This patch changes git-cvsimport-script so that it creates tag objects 
> instead of refs to commits, and adds an option, -u, to convert 
> underscores in branch and tag names to dots (since CVS doesn't allow 
> dots in branches and tags.)
> 
> Pullable tree at master.kernel.org:/home/hpa/git/cvsimport.git/

I should probably point out that there are still bugs in git-cvsimport-script; for one thing, it seems to fail to register a tag associated with the head, and I have yet to get the "recognize merge" feature to actually work. It's also possible -- but I haven't verified it -- that two tags which are aliases may not be properly registered.

	-hpa
H. Peter Anvin· Sep 6, 2005, 20:24 UTC · re: H. Peter Anvin · lore

Re: [PATCH] git-cvsimport-script: handling of tags

H. Peter Anvin wrote:
Show 16 quoted lines
> H. Peter Anvin wrote:
> 
>> This patch changes git-cvsimport-script so that it creates tag objects 
>> instead of refs to commits, and adds an option, -u, to convert 
>> underscores in branch and tag names to dots (since CVS doesn't allow 
>> dots in branches and tags.)
>>
>> Pullable tree at master.kernel.org:/home/hpa/git/cvsimport.git/
> 
> 
> I should probably point out that there are still bugs in 
> git-cvsimport-script; for one thing, it seems to fail to register a tag 
> associated with the head, and I have yet to get the "recognize merge" 
> feature to actually work.  It's also possible -- but I haven't verified 
> it -- that two tags which are aliases may not be properly registered.
> 

I just verified this; git-cvsimport-script will not handle more than one tag per commit.

	-hpa
Martin Langhoff· Sep 6, 2005, 21:21 UTC · re: H. Peter Anvin · lore

Re: [PATCH] git-cvsimport-script: handling of tags

On 9/7/05, H. Peter Anvin <hpa@zytor.com> wrote:
Show 7 quoted lines
> > I should probably point out that there are still bugs in
> > git-cvsimport-script; for one thing, it seems to fail to register a tag
> > associated with the head, and I have yet to get the "recognize merge"
> > feature to actually work.  It's also possible -- but I haven't verified
> > it -- that two tags which are aliases may not be properly registered.
> I just verified this; git-cvsimport-script will not handle more than one
> tag per commit.

Tell me more about how you are trying the 'recognize merge'. It is a pretty unsophisticated thing, as it trusts the commit message in the first place. But when it works, it works.

I have a more refined merge detection already working in the Arch imports -- patch coming soon -- but with cvs it is pretty hard to do.

cheers,
martin
H. Peter Anvin· Sep 6, 2005, 21:33 UTC · re: Martin Langhoff · lore

Re: [PATCH] git-cvsimport-script: handling of tags

Martin Langhoff wrote:
Show 5 quoted lines
> 
> Tell me more about how you are trying the 'recognize merge'. It is a
> pretty unsophisticated thing, as it trusts the commit message in the
> first place. But when it works, it works.
> 
Perhaps it would be good to know what it expects in the commit message?

My style has always be to use tags for merges; tag the origin branch as well as before and after on the receiving branch.

	-hpa
Martin Langhoff· Sep 6, 2005, 22:59 UTC · re: H. Peter Anvin · lore

Re: [PATCH] git-cvsimport-script: handling of tags

On 9/7/05, H. Peter Anvin <hpa@zytor.com> wrote:
Show 8 quoted lines
> Martin Langhoff wrote:
> >
> > Tell me more about how you are trying the 'recognize merge'. It is a
> > pretty unsophisticated thing, as it trusts the commit message in the
> > first place. But when it works, it works.
> >
> 
> Perhaps it would be good to know what it expects in the commit message?
>From the source, with line numbers:

80 our @mergerx = (); 81 if ($opt_m) { 82 @mergerx = ( qr/\W(?:from|of|merge|merging|merged) (\w+)/i ); 83 } 84 if ($opt_M) { 85 push (@mergerx, qr/$opt_M/); 86 }

If your commit messages have a particular format, feed -M a regex that captures the branchname/tagname in $1.

> My style has always be to use tags for merges; tag the origin branch as
> well as before and after on the receiving branch.

Do you move the tags with cvs tag -F? If that's the case, the data you need to merge is lost... otherwise, you could hack an alternative merge detection based on your tagnames.

cheers,
martin
H. Peter Anvin· Sep 6, 2005, 23:19 UTC · re: Martin Langhoff · lore

Re: [PATCH] git-cvsimport-script: handling of tags

Martin Langhoff wrote:
Show 8 quoted lines
> 
>>My style has always be to use tags for merges; tag the origin branch as
>>well as before and after on the receiving branch.
> 
> Do you move the tags with cvs tag -F? If that's the case, the data you
> need to merge is lost... otherwise, you could hack an alternative
> merge detection based on your tagnames.
> 
No, there are three tags:
             before-merge-foo
             |  after-merge-foo
             |  |
branch 1 ---*--*----
               /
              /
branch 2 ---*-------
             |
             merge-point-foo

That's why I was a bit confused. I thought most people did something similar.

	-hpa
Junio C Hamano· Sep 6, 2005, 19:01 UTC · re: H. Peter Anvin · lore

Re: [PATCH] git-cvsimport-script: handling of tags

"H. Peter Anvin" <hpa@zytor.com> writes:
> This patch changes git-cvsimport-script so that it creates tag objects 
> instead of refs to commits, and adds an option, -u, to convert 
> underscores in branch and tag names to dots (since CVS doesn't allow 
> dots in branches and tags.)
Looks good.  Thanks.
Martin Langhoff· Sep 7, 2005, 02:44 UTC · re: H. Peter Anvin · lore

Re: [PATCH] git-cvsimport-script: handling of tags

On 9/7/05, H. Peter Anvin <hpa@zytor.com> wrote:
> This patch changes git-cvsimport-script so that it creates tag objects
> instead of refs to commits, and adds an option, -u, to convert
> underscores in branch and tag names to dots (since CVS doesn't allow
> dots in branches and tags.)

looks good. Will it add proper tag objects for tags already imported and for tags added to the project post-initial-git-import?

cheers,
martin
H. Peter Anvin· Sep 7, 2005, 02:48 UTC · re: Martin Langhoff · lore

Re: [PATCH] git-cvsimport-script: handling of tags

Martin Langhoff wrote:
Show 11 quoted lines
> On 9/7/05, H. Peter Anvin <hpa@zytor.com> wrote:
> 
>>This patch changes git-cvsimport-script so that it creates tag objects
>>instead of refs to commits, and adds an option, -u, to convert
>>underscores in branch and tag names to dots (since CVS doesn't allow
>>dots in branches and tags.)
> 
> 
> looks good. Will it add proper tag objects for tags already imported
> and for tags added to the project post-initial-git-import?
> 
No and yes, respectively.

I incorrectly stated it renamed both branches and tags. It currently only renames tags. I'm trying to get branch renaming to work, but it seems to be a lot more work to get right.

	-hpa

← back to recent threads