]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/Log.pm
Merge branch 'don/processencoding' of git+ssh://git.donarmstrong.com/srv/git/debbugs...
[debbugs.git] / Debbugs / Log.pm
index e64d2369a371b131466dd7f8d7fdf3e4aae4e73b..96748b7ee401813e6a096bf825a33122caca9daf 100644 (file)
@@ -39,6 +39,7 @@ use Carp;
 
 use Debbugs::Common qw(getbuglocation getbugcomponent make_list);
 use Params::Validate qw(:types validate_with);
+use Encode qw(encode is_utf8);
 
 =head1 NAME
 
@@ -200,6 +201,7 @@ sub new
              die "Unable to open bug log $bug_log for reading: $!";
     }
 
+    binmode($self->{logfh},':utf8');
     $self->{state} = 'kill-init';
     $self->{linenum} = 0;
     return $self;
@@ -368,7 +370,7 @@ sub write_log_records
         $logfh = $param{logfh}
     }
     elsif (exists $param{log_name}) {
-        $logfh = IO::File->new($param{log_name},'w') or
+        $logfh = IO::File->new(">>$param{log_name}") or
              die "Unable to open bug log $param{log_name} for writing: $!";
     }
     elsif (exists $param{bug_num}) {
@@ -381,8 +383,8 @@ sub write_log_records
 
     for my $record (@records) {
        my $type = $record->{type};
+       croak "record type '$type' with no text field" unless defined $record->{text};
        my ($text) = escape_log($record->{text});
-       croak "record type '$type' with no text field" unless defined $text;
        if ($type eq 'autocheck') {
            print {$logfh} "\01\n$text\03\n" or
                die "Unable to write to logfile: $!";
@@ -426,7 +428,7 @@ Applies the log escape regex to the passed logfile.
 
 sub escape_log {
        my @log = @_;
-       return map { s/^([\01-\07\030])/\030$1/gm; $_ } @log;
+       return map { eval {$_ = is_utf8($_)?encode("utf8",$_,Encode::FB_CROAK):$_;}; s/^([\01-\07\030])/\030$1/gm; $_ } @log;
 }