Merge part of kh/svnimport branch into master

This commit is contained in:
Junio C Hamano 2006-02-27 15:46:39 -08:00
commit f3a4ec48e4
2 changed files with 32 additions and 4 deletions

View File

@ -13,7 +13,8 @@ SYNOPSIS
[ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev] [ -C <GIT_repository> ] [ -i ] [ -u ] [-l limit_rev]
[ -b branch_subdir ] [ -T trunk_subdir ] [ -t tag_subdir ] [ -b branch_subdir ] [ -T trunk_subdir ] [ -t tag_subdir ]
[ -s start_chg ] [ -m ] [ -r ] [ -M regex ] [ -s start_chg ] [ -m ] [ -r ] [ -M regex ]
[ -I <ignorefile_name> ] <SVN_repository_URL> [ <path> ] [ -I <ignorefile_name> ] [ -A <author_file> ]
<SVN_repository_URL> [ <path> ]
DESCRIPTION DESCRIPTION
@ -71,6 +72,16 @@ When importing incrementally, you might need to edit the .git/svn2git file.
syntaxes are similar enough that using the Subversion patterns syntaxes are similar enough that using the Subversion patterns
directly with "-I .gitignore" will almost always just work.) directly with "-I .gitignore" will almost always just work.)
-A <author_file>::
Read a file with lines on the form
username = User's Full Name <email@addr.es>
and use "User's Full Name <email@addr.es>" as the GIT
author and committer for Subversion commits made by
"username". If encountering a commit made by a user not in the
list, abort.
-m:: -m::
Attempt to detect merges based on the commit message. This option Attempt to detect merges based on the commit message. This option
will enable default regexes that try to capture the name source will enable default regexes that try to capture the name source

View File

@ -30,7 +30,7 @@ $SIG{'PIPE'}="IGNORE";
$ENV{'TZ'}="UTC"; $ENV{'TZ'}="UTC";
our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T, our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T,
$opt_b,$opt_r,$opt_I,$opt_s,$opt_l,$opt_d,$opt_D); $opt_b,$opt_r,$opt_I,$opt_A,$opt_s,$opt_l,$opt_d,$opt_D);
sub usage() { sub usage() {
print STDERR <<END; print STDERR <<END;
@ -38,12 +38,12 @@ Usage: ${\basename $0} # fetch/update GIT from SVN
[-o branch-for-HEAD] [-h] [-v] [-l max_rev] [-o branch-for-HEAD] [-h] [-v] [-l max_rev]
[-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname] [-C GIT_repository] [-t tagname] [-T trunkname] [-b branchname]
[-d|-D] [-i] [-u] [-r] [-I ignorefilename] [-s start_chg] [-d|-D] [-i] [-u] [-r] [-I ignorefilename] [-s start_chg]
[-m] [-M regex] [SVN_URL] [-m] [-M regex] [-A author_file] [SVN_URL]
END END
exit(1); exit(1);
} }
getopts("b:C:dDhiI:l:mM:o:rs:t:T:uv") or usage(); getopts("A:b:C:dDhiI:l:mM:o:rs:t:T:uv") or usage();
usage if $opt_h; usage if $opt_h;
my $tag_name = $opt_t || "tags"; my $tag_name = $opt_t || "tags";
@ -68,6 +68,19 @@ if ($opt_M) {
push (@mergerx, qr/$opt_M/); push (@mergerx, qr/$opt_M/);
} }
our %users = ();
if ($opt_A) {
die "Cannot open $opt_A\n" unless -f $opt_A;
open(my $authors,$opt_A);
while(<$authors>) {
chomp;
next unless /^(\S+?)\s*=\s*(.+?)\s*<(.+)>\s*$/;
(my $user,my $name,my $email) = ($1,$2,$3);
$users{$user} = [$name,$email];
}
close($authors);
}
select(STDERR); $|=1; select(STDOUT); select(STDERR); $|=1; select(STDOUT);
@ -485,6 +498,10 @@ sub commit {
if (not defined $author) { if (not defined $author) {
$author_name = $author_email = "unknown"; $author_name = $author_email = "unknown";
} elsif ($opt_A) {
die "User $author is not listed in $opt_A\n"
unless exists $users{$author};
($author_name,$author_email) = @{$users{$author}};
} elsif ($author =~ /^(.*?)\s+<(.*)>$/) { } elsif ($author =~ /^(.*?)\s+<(.*)>$/) {
($author_name, $author_email) = ($1, $2); ($author_name, $author_email) = ($1, $2);
} else { } else {