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.
master
Joey Hess 2008-07-17 16:03:16 -04:00
parent 584f3e3061
commit ac62a47ea4
3 changed files with 38 additions and 25 deletions

View File

@ -180,14 +180,14 @@ sub _parse_diff_tree ($@) { #{{{
$ci{ "${who}_epoch" } = $epoch; $ci{ "${who}_epoch" } = $epoch;
$ci{ "${who}_tz" } = $tz; $ci{ "${who}_tz" } = $tz;
if ($name =~ m/^([^<]+) <([^@>]+)/) { if ($name =~ m/^[^<]+\s+<([^@>]+)/) {
my ($fullname, $username) = ($1, $2); $ci{"${who}_username"} = $1;
$ci{"${who}_fullname"} = $fullname; }
$ci{"${who}_username"} = $username; elsif ($name =~ m/^([^<]+)\s+<>$/) {
$ci{"${who}_username"} = $1;
} }
else { else {
$ci{"${who}_fullname"} = $ci{"${who}_username"} = $name;
$ci{"${who}_username"} = $name;
} }
} }
elsif ($line =~ m/^$/) { elsif ($line =~ m/^$/) {
@ -311,15 +311,6 @@ sub rcs_commit ($$$;$$) { #{{{
my ($file, $message, $rcstoken, $user, $ipaddr) = @_; 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 # Check to see if the page has been changed by someone else since
# rcs_prepedit was called. # rcs_prepedit was called.
my $cur = git_sha1($file); my $cur = git_sha1($file);
@ -329,6 +320,14 @@ sub rcs_commit ($$$;$$) { #{{{
my $conflict = _merge_past($prev, $file, $dummy_commit_msg); my $conflict = _merge_past($prev, $file, $dummy_commit_msg);
return $conflict if defined $conflict; 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. # git commit returns non-zero if file has not been really changed.
# so we should ignore its exit status (hence run_or_non). # 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}); run_or_cry('git', 'push', $config{gitorigin_branch});
} }
} }
%ENV=%env;
return undef; # success return undef; # success
} #}}} } #}}}
@ -368,7 +368,7 @@ sub rcs_recentchanges ($) { #{{{
$ci->{'author_epoch'} $ci->{'author_epoch'}
); );
my (@pages, @messages); my @pages;
foreach my $detail (@{ $ci->{'details'} }) { foreach my $detail (@{ $ci->{'details'} }) {
my $file = $detail->{'file'}; my $file = $detail->{'file'};
@ -384,26 +384,34 @@ sub rcs_recentchanges ($) { #{{{
}; };
} }
push @messages, { line => $_ } foreach grep { my $web_commit=0;
! m/^ *(signed[ \-]off[ \-]by[ :]|acked[ \-]by[ :]|cc[ :])/i my @messages;
} @{$ci->{'comment'}}; 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 };
}
my ($user, $type) = (q{}, "web"); my $user;
# compatability code for old web commit messages
if (defined $messages[0] && if (! $web_commit && defined $messages[0] &&
$messages[0]->{line} =~ m/$config{web_commit_regexp}/) { $messages[0]->{line} =~ m/$config{web_commit_regexp}/) {
$user = defined $2 ? "$2" : "$3"; $user = defined $2 ? "$2" : "$3";
$messages[0]->{line} = $4; $messages[0]->{line} = $4;
} }
else { else {
$type ="git";
$user = $ci->{'author_username'}; $user = $ci->{'author_username'};
} }
push @rets, { push @rets, {
rev => $sha1, rev => $sha1,
user => $user, user => $user,
committype => $type, committype => $web_commit ? "web" : "git",
when => $when, when => $when,
message => [@messages], message => [@messages],
pages => [@pages], pages => [@pages],

3
debian/changelog vendored
View File

@ -28,6 +28,9 @@ ikiwiki (2.54) UNRELEASED; urgency=low
work. Markdown removes one level of escaping. work. Markdown removes one level of escaping.
* Add a postscan hook. * Add a postscan hook.
* search: Use postscan hook, avoid updating index when previewing. * search: Use postscan hook, avoid updating index when previewing.
* 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
[ Simon McVittie ] [ Simon McVittie ]
* meta, inline: Support guid options, to allow forcing a particular url or * meta, inline: Support guid options, to allow forcing a particular url or

View File

@ -5,3 +5,5 @@ the user or by the script?), it could also set `GIT_COMMITTER_NAME` and
`GIT_COMMITTER_EMAIL` to the same values. --[[JoshTriplett]] `GIT_COMMITTER_EMAIL` to the same values. --[[JoshTriplett]]
> See [[debbug 451023]] for a [[patch]] --[[Joey]] > See [[debbug 451023]] for a [[patch]] --[[Joey]]
[[done]]