Ævar Arnfjörð Bjarmason <[email protected]> wrote:
> On Fri, Apr 06 2018, Eric Wong wrote:
> > Ævar Arnfjörð Bjarmason <[email protected]> wrote:
> >
> >> --- a/perl/Git.pm
> >> +++ b/perl/Git.pm
> >> @@ -554,7 +554,7 @@ sub get_record {
> >> my ($fh, $rs) = @_;
> >> local $/ = $rs;
> >> my $rec = <$fh>;
> >> - chomp $rec if defined $rs;
> >> + chomp $rec if defined $rs and defined $rec;
> >
> > I'm struggling to understand the reason for the "defined $rs"
> > check. I think it was a braino on my part and meant to use:
> >
> > chomp $rec if defined $rec;
>
> Whether this makes any sense is another question, but you seem to have
> explicitly meant this at the time. The full function definition with
> documentation:
>
> =item get_record ( FILEHANDLE, INPUT_RECORD_SEPARATOR )
>
> Read one record from FILEHANDLE delimited by INPUT_RECORD_SEPARATOR,
> removing any trailing INPUT_RECORD_SEPARATOR.
I've always known chomp to respect the value of $/; so chomp($rec)
whould only cut out whatever $rs is, and be a no-op if $rs is undef.
> It doesn't make to remove the trailing record separator if it's not
> defined, otherwise we'd be coercing undef to "\n" while at the same time
> returning multiple records. But then of course the only user of this
> with an "undef" argument just does:
>
> chomp($log_entry{log} = get_record($log_fh, undef));
Subtle difference, that chomp() still sees $/ as "\n".
$/ is only undef inside get_record.
> So we could also remove that chomp(), adn not check defined $rs, but IMO
> it's cleaner & more consistent this way.
I think the chomp is necessary. In git-svn.perl /^sub get_commit_entry {:
# <snip>
open my $log_fh, '>', $commit_editmsg or croak $!;
# <snip>
$msgbuf =~ s/\s+$//s;
# <snip>
print $log_fh $msgbuf or croak $!;
# <snip>
close $log_fh or croak $!;
# Above, we ensured the contents of $commit_editmsg has no trailing newline
if ($_edit || ($type eq 'tree')) {
chomp(my $editor = command_oneline(qw(var GIT_EDITOR)));
system('sh', '-c', $editor.' "$@"', $editor, $commit_editmsg);
}
# However, $editor is likely to introduce a trailing newline
rename $commit_editmsg, $commit_msg or croak $!;
{
require Encode;
# SVN requires messages to be UTF-8 when entering the repo
open $log_fh, '<', $commit_msg or croak $!;
binmode $log_fh;
# chomp trailing newline introduced by $editor:
chomp($log_entry{log} = get_record($log_fh, undef));