git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] git-cvsimport: Add -A <author-conv-file> option
@ 2006-01-12 23:38 Andreas Ericsson
  2006-01-13  1:55 ` Junio C Hamano
  0 siblings, 1 reply; 6+ messages in thread
From: Andreas Ericsson @ 2006-01-12 23:38 UTC (permalink / raw)
  To: git

This patch adds the option to specify an author name/email conversion
file in the format

	exon=Andreas Ericsson <ae@op5.se>
	spawn=Simon Pawn <spawn@frog-pond.org>

which will translate the ugly cvs authornames to the more informative
git style.

The info is saved in $GIT_DIR/cvs-authors, so that subsequent
incremental imports will use the same author-info even if no -A
option is specified. If an -A option *is* specified, the info in
$GIT_DIR/cvs-authors is appended/updated appropriately.

Docs updated accordingly.

Signed-off-by: Andreas Ericsson <ae@op5.se>

---

 Documentation/git-cvsimport.txt |   20 ++++++++++++++
 git-cvsimport.perl              |   56 +++++++++++++++++++++++++++++++++++----
 2 files changed, 70 insertions(+), 6 deletions(-)

a1883e11a55c4684c0c5123c75425623a54f44cf
diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt
index 01ca7ef..dfe86ce 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.txt
@@ -89,6 +89,26 @@ If you need to pass multiple options, se
 -s <subst>::
 	Substitute the character "/" in branch names with <subst>
 
+-A <author-conv-file>::
+	CVS by default uses the unix username when writing its
+	commit logs. Using this option and an author-conv-file
+	in this format
+
+	exon=Andreas Ericsson <ae@op5.se>
+	spawn=Simon Pawn <spawn@frog-pond.org>
+
+	git-cvsimport will make it appear as those authors had
+	their GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL set properly
+	all along.
+
+	For convenience, this data is saved to $GIT_DIR/cvs-authors
+	each time the -A option is provided and read from that same
+	file each time git-cvsimport is run.
+
+	It is not recommended to use this feature if you intend to
+	export changes back to CVS again later with
+	git-link[1]::git-cvsexportcommit.
+
 OUTPUT
 ------
 If '-v' is specified, the script reports what it is doing.
diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index 8619e7d..8d493c2 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -29,19 +29,52 @@ use IPC::Open2;
 $SIG{'PIPE'}="IGNORE";
 $ENV{'TZ'}="UTC";
 
-our($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $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_P, $opt_s,$opt_m,$opt_M,$opt_A);
+my (%conv_author_name, %conv_author_email);
 
 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] [-u] [-s subst] [-m] [-M regex] [CVS_module]
+       [-o branch-for-HEAD] [-h] [-v] [-d CVSROOT] [-A author-conv-file]
+       [-p opts-for-cvsps] [-C GIT_repository] [-z fuzz] [-i] [-k] [-u]
+       [-s subst] [-m] [-M regex] [CVS_module]
 END
 	exit(1);
 }
 
-getopts("hivmkuo:d:p:C:z:s:M:P:") or usage();
+sub read_author_info($) {
+	my ($file) = @_;
+	my $user;
+	open my $f, '<', "$file" or die("Failed to open $file: $!\n");
+
+	while (<$f>) {
+		chomp;
+		# Expected format is this;
+		#   exon=Andreas Ericsson <ae@op5.se>
+		if (m/^([^ \t=]*)[ \t=]*([^<]*)(<.*$)\s*/) {
+			$user = $1;
+			$conv_author_name{$1} = $2;
+			$conv_author_email{$1} = $3;
+			# strip trailing whitespace from author name
+			$conv_author_name{$1} =~ s/\s*$//;
+		}
+	}
+	close ($f);
+}
+
+sub write_author_info($) {
+	my ($file) = @_;
+	open my $f, '>', $file or
+	  die("Failed to open $file for writing: $!");
+
+	foreach (keys %conv_author_name) {
+		print $f "$_=" . $conv_author_name{$_} .
+		  " " . $conv_author_email{$_} . "\n";
+	}
+	close ($f);
+}
+
+getopts("hivmkuo:d:p:C:z:s:M:P:A:") or usage();
 usage if $opt_h;
 
 @ARGV <= 1 or usage();
@@ -453,7 +486,7 @@ 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
+    git read-tree -m -u CVS2GIT_HEAD HEAD
 EOM
 	}
 	system('cp', "$git_dir/HEAD", "$git_dir/CVS2GIT_HEAD");
@@ -489,6 +522,14 @@ EOM
 -d $git_dir
 	or die "Could not create git subdir ($git_dir).\n";
 
+# now we read (and possibly save) author-info as well
+-f "$git_dir/cvs-authors" and
+  read_author_info("$git_dir/cvs-authors");
+if ($opt_A) {
+	read_author_info($opt_A);
+	write_author_info("$git_dir/cvs-authors");
+}
+
 my $pid = open(CVS,"-|");
 die "Cannot fork: $!\n" unless defined $pid;
 unless($pid) {
@@ -702,6 +743,9 @@ while(<CVS>) {
 		s/\s+$//;
 		if (/^(.*?)\s+<(.*)>/) {
 		    ($author_name, $author_email) = ($1, $2);
+		} elsif ($conv_author_name{$_}) {
+			$author_name = $conv_author_name{$_};
+			$author_email = $conv_author_email{$_};
 		} else {
 		    $author_name = $author_email = $_;
 		}
-- 
1.1.1-g4c34-dirty

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] git-cvsimport: Add -A <author-conv-file> option
  2006-01-12 23:38 [PATCH] git-cvsimport: Add -A <author-conv-file> option Andreas Ericsson
@ 2006-01-13  1:55 ` Junio C Hamano
  2006-01-13  2:14   ` Andreas Ericsson
  2006-01-13  3:19   ` Alexander Litvinov
  0 siblings, 2 replies; 6+ messages in thread
From: Junio C Hamano @ 2006-01-13  1:55 UTC (permalink / raw)
  To: Andreas Ericsson; +Cc: git

ISTR there was a thread that suggested using CVSROOT/users file
for this purpose.

	http://thread.gmane.org/gmane.comp.version-control.git/8167

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] git-cvsimport: Add -A <author-conv-file> option
  2006-01-13  1:55 ` Junio C Hamano
@ 2006-01-13  2:14   ` Andreas Ericsson
  2006-01-13  4:09     ` Junio C Hamano
  2006-01-13  3:19   ` Alexander Litvinov
  1 sibling, 1 reply; 6+ messages in thread
From: Andreas Ericsson @ 2006-01-13  2:14 UTC (permalink / raw)
  To: git

Junio C Hamano wrote:
> ISTR there was a thread that suggested using CVSROOT/users file
> for this purpose.
> 
> 	http://thread.gmane.org/gmane.comp.version-control.git/8167
> 

ISTR?

That patch doesn't work when importing from sourceforge (among others), 
because no-one uses their devname@users.sourceforge.net address (and 
often just filter them out because they attract so much spam). It also 
does nothing for when the username isn't the leading part of the 
email-addres, or for GIT_AUTHOR_NAME, which is the most disturbing since 
it ruffles the shortlog output. We use that shortlog to get a gisted 
changelog for the sales and marketing people. I can recommend this. 
They're absolutely thrilled to see things like "Only use vararg macros 
#ifdef __GNUC__" and "declare **envp const throughout mplex api". ;)

Anyways, I can keep this separate if you don't want to accept it. I'll 
most likely implement some config-reading to it too though so I don't 
have to type the repository name and such each time I run it.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] git-cvsimport: Add -A <author-conv-file> option
  2006-01-13  1:55 ` Junio C Hamano
  2006-01-13  2:14   ` Andreas Ericsson
@ 2006-01-13  3:19   ` Alexander Litvinov
  1 sibling, 0 replies; 6+ messages in thread
From: Alexander Litvinov @ 2006-01-13  3:19 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Andreas Ericsson, git

On Friday 13 January 2006 07:55, Junio C Hamano wrote:
> ISTR there was a thread that suggested using CVSROOT/users file
> for this purpose.
>
> 	http://thread.gmane.org/gmane.comp.version-control.git/8167

This should went into docs for cvsimport. Before now I knew there is a way to 
import authors but I did not find anything in cvsimport script. This patch 
shows not only me lost this feature.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] git-cvsimport: Add -A <author-conv-file> option
  2006-01-13  2:14   ` Andreas Ericsson
@ 2006-01-13  4:09     ` Junio C Hamano
  2006-01-13  8:45       ` Junio C Hamano
  0 siblings, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2006-01-13  4:09 UTC (permalink / raw)
  To: Andreas Ericsson; +Cc: git

Andreas Ericsson <ae@op5.se> writes:

> Junio C Hamano wrote:
>> ISTR there was a thread that suggested using CVSROOT/users file
>> for this purpose.
>> 	http://thread.gmane.org/gmane.comp.version-control.git/8167
>
> ISTR?

I seem to recall...

> That patch doesn't work when importing from sourceforge...
>
> Anyways, I can keep this separate if you don't want to accept it.

Oh, I haven't formed an opinion on accept/reject yet.  I was
just trying to see if you are aware of that (especially Pasky's
message in that thread) and thought about issues like "if in
some repositories CVSROOT/users is in usable form then perhaps
making sure -A file has the same format and suggest its use in
the documentation would be nicer".

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] git-cvsimport: Add -A <author-conv-file> option
  2006-01-13  4:09     ` Junio C Hamano
@ 2006-01-13  8:45       ` Junio C Hamano
  0 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2006-01-13  8:45 UTC (permalink / raw)
  To: Andreas Ericsson; +Cc: git

Junio C Hamano <junkio@cox.net> writes:

> Andreas Ericsson <ae@op5.se> writes:
>
>> Anyways, I can keep this separate if you don't want to accept it.
>
> Oh, I haven't formed an opinion on accept/reject yet.  I was
> just trying to see if you are aware of that (especially Pasky's
> message in that thread) and thought about issues like "if in
> some repositories CVSROOT/users is in usable form then perhaps
> making sure -A file has the same format and suggest its use in
> the documentation would be nicer".

OK, after a little googling around, I have formed an opinion.  I
agree to the patch in principle, but at least it would be nicer
to use "CVSROOT/users" compatible format before giving it to the
general public.

	http://computing.ee.ethz.ch/sepp/cvs-1.10-to/cvsbook/main_70.html

seems to indicate that:

 - colon ':' is used instead of your '='.

 - RHS, if it contains a whitespace, is quoted either with
   single or double quote.

It was a bit unclear to me how quote characters are to be
quoted, so the patch needs a bit of research, quoting (when
writing out new records) and unquoting (when reading) in the
script, but otherwise I think it is a welcome change.

Opinions from other heavy CVS users?

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2006-01-13  8:45 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-12 23:38 [PATCH] git-cvsimport: Add -A <author-conv-file> option Andreas Ericsson
2006-01-13  1:55 ` Junio C Hamano
2006-01-13  2:14   ` Andreas Ericsson
2006-01-13  4:09     ` Junio C Hamano
2006-01-13  8:45       ` Junio C Hamano
2006-01-13  3:19   ` Alexander Litvinov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).