diff options
author | Joey Hess <joey@kodama.kitenet.net> | 2008-07-17 16:03:16 -0400 |
---|---|---|
committer | Joey Hess <joey@kodama.kitenet.net> | 2008-07-17 16:17:15 -0400 |
commit | ac62a47ea431271447909b17e883eeaefa87aaea (patch) | |
tree | e867e6a454b0ce85ed10edffe06d19023535e896 /IkiWiki | |
parent | 584f3e3061e8983e4caa328d7bc16fdeba849654 (diff) | |
download | ikiwiki-ac62a47ea431271447909b17e883eeaefa87aaea.tar ikiwiki-ac62a47ea431271447909b17e883eeaefa87aaea.tar.gz |
git: Put web committer name/openid/address in the git author field
The committer's email address is not used (because leaking email addresses
is not liked by many users). Closes: #451023
A "Web-commit" trailer is added, to allow telling the difference between
web commits and direct commits.
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Rcs/git.pm | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/IkiWiki/Rcs/git.pm b/IkiWiki/Rcs/git.pm index 425536f62..f71b57774 100644 --- a/IkiWiki/Rcs/git.pm +++ b/IkiWiki/Rcs/git.pm @@ -180,14 +180,14 @@ sub _parse_diff_tree ($@) { #{{{ $ci{ "${who}_epoch" } = $epoch; $ci{ "${who}_tz" } = $tz; - if ($name =~ m/^([^<]+) <([^@>]+)/) { - my ($fullname, $username) = ($1, $2); - $ci{"${who}_fullname"} = $fullname; - $ci{"${who}_username"} = $username; + if ($name =~ m/^[^<]+\s+<([^@>]+)/) { + $ci{"${who}_username"} = $1; + } + elsif ($name =~ m/^([^<]+)\s+<>$/) { + $ci{"${who}_username"} = $1; } else { - $ci{"${who}_fullname"} = - $ci{"${who}_username"} = $name; + $ci{"${who}_username"} = $name; } } elsif ($line =~ m/^$/) { @@ -311,15 +311,6 @@ sub rcs_commit ($$$;$$) { #{{{ my ($file, $message, $rcstoken, $user, $ipaddr) = @_; - if (defined $user) { - $message = "web commit by $user" . - (length $message ? ": $message" : ""); - } - elsif (defined $ipaddr) { - $message = "web commit from $ipaddr" . - (length $message ? ": $message" : ""); - } - # Check to see if the page has been changed by someone else since # rcs_prepedit was called. my $cur = git_sha1($file); @@ -329,6 +320,14 @@ sub rcs_commit ($$$;$$) { #{{{ my $conflict = _merge_past($prev, $file, $dummy_commit_msg); return $conflict if defined $conflict; } + + # Set the commit author to the web committer. + my %env=%ENV; + if (defined $user || defined $ipaddr) { + $ENV{GIT_AUTHOR_NAME}=defined $user ? $user : $ipaddr; + $ENV{GIT_AUTHOR_EMAIL}=""; + $message.="\n\nWeb-commit: true\n"; + } # git commit returns non-zero if file has not been really changed. # so we should ignore its exit status (hence run_or_non). @@ -338,7 +337,8 @@ sub rcs_commit ($$$;$$) { #{{{ run_or_cry('git', 'push', $config{gitorigin_branch}); } } - + + %ENV=%env; return undef; # success } #}}} @@ -368,7 +368,7 @@ sub rcs_recentchanges ($) { #{{{ $ci->{'author_epoch'} ); - my (@pages, @messages); + my @pages; foreach my $detail (@{ $ci->{'details'} }) { my $file = $detail->{'file'}; @@ -384,26 +384,34 @@ sub rcs_recentchanges ($) { #{{{ }; } - push @messages, { line => $_ } foreach grep { - ! m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i - } @{$ci->{'comment'}}; - - my ($user, $type) = (q{}, "web"); + my $web_commit=0; + my @messages; + my $pastblank=0; + foreach my $line (@{$ci->{'comment'}}) { + $pastblank=1 if $line eq ''; + next if $pastblank && $line=~m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i; + if ($pastblank && $line=~m/^ *web-commit: true$/i) { + $web_commit=1; + next; + } + push @messages, { line => $line }; + } - if (defined $messages[0] && + my $user; + # compatability code for old web commit messages + if (! $web_commit && defined $messages[0] && $messages[0]->{line} =~ m/$config{web_commit_regexp}/) { $user = defined $2 ? "$2" : "$3"; $messages[0]->{line} = $4; } else { - $type ="git"; $user = $ci->{'author_username'}; } push @rets, { rev => $sha1, user => $user, - committype => $type, + committype => $web_commit ? "web" : "git", when => $when, message => [@messages], pages => [@pages], |