about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorAndreas Heiduk <asheiduk@gmail.com>2018-03-24 11:20:46 +0100
committerEric Wong <e@80x24.org>2018-04-05 19:22:06 +0000
commitcb427e9eb0243fe7a1a22ea3bd0a46b7410c0bf3 (patch)
tree018a79db4d49c4c477109839a3e6272fdcbe60c5
parent9c18398f8b75f34c2251224c9443b4e1271ff9ff (diff)
downloadgit-svn-svn/authors-prog-2.tar.gz
The email address in --authors-file and --authors-prog can be empty but
git-svn translated it into a fictional email address in the form

	jondoe <jondoe@6aafaa21e0fb4338a68ab372a049893d>

containing the SVN repository UUID. Now git-svn behaves like git-commit:
If the email is *explicitly* set to the empty string using '<>', the
commit does not contain an email address, only the name:

	jondoe <>

Allowing to remove the email address *intentionally* prevents automatic
systems from sending emails to those fictional addresses and avoids
cluttering the log output with unnecessary stuff.

Signed-off-by: Andreas Heiduk <asheiduk@gmail.com>
Signed-off-by: Eric Wong <e@80x24.org>
-rw-r--r--Documentation/git-svn.txt8
-rw-r--r--perl/Git/SVN.pm13
-rwxr-xr-xt/t9130-git-svn-authors-file.sh14
-rwxr-xr-xt/t9138-git-svn-authors-prog.sh26
4 files changed, 50 insertions, 11 deletions
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index b858374649..d59379ee23 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -635,7 +635,8 @@ config key: svn.findcopiesharder
 
 -A<filename>::
 --authors-file=<filename>::
-        Syntax is compatible with the file used by 'git cvsimport':
+        Syntax is compatible with the file used by 'git cvsimport' but
+        an empty email address can be supplied with '<>':
 +
 ------------------------------------------------------------------------
         loginname = Joe User <user@example.com>
@@ -654,8 +655,9 @@ config key: svn.authorsfile
         If this option is specified, for each SVN committer name that
         does not exist in the authors file, the given file is executed
         with the committer name as the first argument.  The program is
-        expected to return a single line of the form "Name <email>",
-        which will be treated as if included in the authors file.
+        expected to return a single line of the form "Name <email>" or
+        "Name <>", which will be treated as if included in the authors
+        file.
 +
 Due to historical reasons a relative 'filename' is first searched
 relative to the current directory for 'init' and 'clone' and relative
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index 991a5885e9..76b2965905 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -1482,7 +1482,6 @@ sub call_authors_prog {
         }
         if ($author =~ /^\s*(.+?)\s*<(.*)>\s*$/) {
                 my ($name, $email) = ($1, $2);
-                $email = undef if length $2 == 0;
                 return [$name, $email];
         } else {
                 die "Author: $orig_author: $::_authors_prog returned "
@@ -2020,8 +2019,8 @@ sub make_log_entry {
                 remove_username($full_url);
                 $log_entry{metadata} = "$full_url\@$r $uuid";
                 $log_entry{svm_revision} = $r;
-                $email ||= "$author\@$uuid";
-                $commit_email ||= "$author\@$uuid";
+                $email = "$author\@$uuid" unless defined $email;
+                $commit_email = "$author\@$uuid" unless defined $commit_email;
         } elsif ($self->use_svnsync_props) {
                 my $full_url = canonicalize_url(
                         add_path_to_url( $self->svnsync->{url}, $self->path )
@@ -2029,15 +2028,15 @@ sub make_log_entry {
                 remove_username($full_url);
                 my $uuid = $self->svnsync->{uuid};
                 $log_entry{metadata} = "$full_url\@$rev $uuid";
-                $email ||= "$author\@$uuid";
-                $commit_email ||= "$author\@$uuid";
+                $email = "$author\@$uuid" unless defined $email;
+                $commit_email = "$author\@$uuid" unless defined $commit_email;
         } else {
                 my $url = $self->metadata_url;
                 remove_username($url);
                 my $uuid = $self->rewrite_uuid || $self->ra->get_uuid;
                 $log_entry{metadata} = "$url\@$rev " . $uuid;
-                $email ||= "$author\@" . $uuid;
-                $commit_email ||= "$author\@" . $uuid;
+                $email = "$author\@$uuid" unless defined $email;
+                $commit_email = "$author\@$uuid" unless defined $commit_email;
         }
         $log_entry{name} = $name;
         $log_entry{email} = $email;
diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
index 41264818cc..6af6daf461 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/t/t9130-git-svn-authors-file.sh
@@ -108,6 +108,20 @@ test_expect_success !MINGW 'fresh clone with svn.authors-file in config' '
         )
 '
 
+cat >> svn-authors <<EOF
+ff = FFFFFFF FFFFFFF <>
+EOF
+
+test_expect_success 'authors-file imported user without email' '
+        svn_cmd mkdir -m aa/branches/ff --username ff "$svnrepo/aa/branches/ff" &&
+        (
+                cd aa-work &&
+                git svn fetch --authors-file=../svn-authors &&
+                git rev-list -1 --pretty=raw refs/remotes/origin/ff | \
+                  grep "^author FFFFFFF FFFFFFF <> "
+        )
+        '
+
 test_debug 'GIT_DIR=gitconfig.clone/.git git log'
 
 test_done
diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh
index 7d7e9d46bc..e94d2a684a 100755
--- a/t/t9138-git-svn-authors-prog.sh
+++ b/t/t9138-git-svn-authors-prog.sh
@@ -9,7 +9,9 @@ test_description='git svn authors prog tests'
 
 write_script svn-authors-prog "$PERL_PATH" <<-\EOF
         $_ = shift;
-        if (s/-sub$//)  {
+        if (s/-hermit//) {
+                print "$_ <>\n";
+        } elsif (s/-sub$//)  {
                 print "$_ <$_\@sub.example.com>\n";
         } else {
                 print "$_ <$_\@example.com>\n";
@@ -68,6 +70,28 @@ test_expect_success 'authors-file overrode authors-prog' '
 git --git-dir=x/.git config --unset svn.authorsfile
 git --git-dir=x/.git config --unset svn.authorsprog
 
+test_expect_success 'authors-prog imported user without email' '
+        svn mkdir -m gg --username gg-hermit "$svnrepo"/gg &&
+        (
+                cd x &&
+                git svn fetch --authors-prog=../svn-authors-prog &&
+                git rev-list -1 --pretty=raw refs/remotes/git-svn | \
+                  grep "^author gg <> "
+        )
+'
+
+test_expect_success 'imported without authors-prog and authors-file' '
+        svn mkdir -m hh --username hh "$svnrepo"/hh &&
+        (
+                uuid=$(svn info "$svnrepo" |
+                        sed -n "s/^Repository UUID: //p") &&
+                cd x &&
+                git svn fetch &&
+                git rev-list -1 --pretty=raw refs/remotes/git-svn | \
+                  grep "^author hh <hh@$uuid> "
+        )
+'
+
 test_expect_success 'authors-prog handled special characters in username' '
         svn mkdir -m bad --username "xyz; touch evil" "$svnrepo"/bad &&
         (