Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > But: > >> sub parse_tag { >> my $tag_id = shift; >> my %tag; >> @@ -3471,6 +3493,10 @@ sub parse_tag { >> if ($tag{'author'} =~ m/^([^<]+) <([^>]*)>/) { >> $tag{'author_name'} = $1; >> $tag{'author_email'} = $2; >> + if (gitweb_check_feature('email_privacy')) { >> + $tag{'author_email'} = "private"; >> + $tag{'author'} = hide_mailaddr($tag{'author'}); >> + } > > This code seems quite awkward, we've already done the regex match, but > this code: > >> [snip] >> +sub hide_mailaddr_if_private { >> + my $line = shift; >> + return $line unless (gitweb_check_feature('email_privacy') && >> + $line =~ m/^([^<]+) <([^>]*)>/); >> + return hide_mailaddr($line) >> +} >> + >> +sub hide_mailaddr { >> + my $mailaddr = shift; >> + $mailaddr =~ s/<([^>]*)>/<private>/; >> + return $mailaddr; >> +} > > Is going to do it again incrementally, and then just act on a > search-replacement if we've got the feature enabled. I think you misread the patch the same way as I did initially. What is called in parse_tag is not the "if-private" version---the caller knows that $tag{'author'} MUST BE an address so unconditionally redact when the feature is set by bypassing the _if_private variant. Having said that, I do think > sub maybe_hide_email { > my ($email, $ref) = shift; > return $email unless gitweb_check_feature('email_privacy'); > $$ref = "private" if $ref; > return hide_email($email); > } this helper is how you would simplify these numerous callers. >> } elsif ($format eq 'patch') { >> - local $/ = undef; >> - print <$fd>; >> + while (my $line = <$fd>) { >> + print hide_mailaddr_if_private($line); >> + } > > Urm, have you tested this? How does a while loop over a <$fd> make sense > when $/ is undef, the readline() operator will always return just one > record, so having a while loop doesn't make sense. > > I'm not sure of the input here, but given that if you're expecting to > replace all e-mail addresses on all lines with this function that's not > how it'll work, the s/// doesn't have a /g, so it'll stop at the first > replacement. > >> close $fd >> or print "Reading git-format-patch failed\n"; >> } All true. This one is reading from "format-patch --stdout" output, but for the reasons I mentioned in my review, I do not think it should touch the 'patch' output at all.