]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/Status.pm
* Fix lintian issues: libdebbugs-perl: spelling-error-in-manpage for:
[debbugs.git] / Debbugs / Status.pm
index 5b23bcc7a1ffc4bdf3e2248612eaf8486f5510be..6fad22e5f2d6a04359546f41041a44161fd4378c 100644 (file)
@@ -38,6 +38,7 @@ use base qw(Exporter);
 
 use Params::Validate qw(validate_with :types);
 use Debbugs::Common qw(:util :lock :quit :misc);
+use Debbugs::UTF8;
 use Debbugs::Config qw(:config);
 use Debbugs::MIME qw(decode_rfc1522 encode_rfc1522);
 use Debbugs::Packages qw(makesourceversions make_source_versions getversions get_versions binary_to_source);
@@ -45,7 +46,7 @@ use Debbugs::Versions;
 use Debbugs::Versions::Dpkg;
 use POSIX qw(ceil);
 use File::Copy qw(copy);
-use Encode qw(decode encode);
+use Encode qw(decode encode is_utf8);
 
 use Storable qw(dclone);
 use List::Util qw(min max);
@@ -108,6 +109,7 @@ our %fields = (originator     => 'submitter',
               blockedby      => 'blocked-by',
              unarchived     => 'unarchived',
              summary        => 'summary',
+             outlook        => 'outlook',
              affects        => 'affects',
              );
 
@@ -217,6 +219,7 @@ sub read_bug{
        }
        return undef;
     }
+    binmode($status_fh,':encoding(UTF-8)');
 
     my %data;
     my @lines;
@@ -240,20 +243,6 @@ sub read_bug{
 
     my %namemap = reverse %fields;
     for my $line (@lines) {
-       my @encodings_to_try = qw(utf8 iso8859-1);
-       if ($version >= 3) {
-           @encodings_to_try = qw(utf8);
-       }
-       for (@encodings_to_try) {
-           my $temp;
-           eval {
-               $temp = decode("$_",$line,Encode::FB_CROAK);
-           };
-           if (not $@) { # only update the line if there are no errors.
-               $line = $temp;
-               last;
-           }
-       }
         if ($line =~ /(\S+?): (.*)/) {
             my ($name, $value) = (lc $1, $2);
            # this is a bit of a hack; we should never, ever have \r
@@ -264,7 +253,7 @@ sub read_bug{
         }
     }
     for my $field (keys %fields) {
-        $data{$field} = '' unless exists $data{$field};
+       $data{$field} = '' unless exists $data{$field};
     }
     if ($version < 3) {
        for my $field (@rfc1522_fields) {
@@ -619,6 +608,8 @@ sub makestatus {
     }
     %newdata = %{join_status_fields(\%newdata)};
 
+    %newdata = encode_utf8_structure(%newdata);
+
     if ($version < 3) {
         for my $field (@rfc1522_fields) {
             $newdata{$field} = encode_rfc1522($newdata{$field});
@@ -655,11 +646,6 @@ sub makestatus {
             }
         }
     }
-    if ($version >= 3) {
-       eval {
-           $contents = encode_utf8($contents,Encode::FB_CROAK);
-       };
-    }
     return $contents;
 }
 
@@ -669,7 +655,7 @@ sub makestatus {
 
 Writes the bug status and summary files out.
 
-Skips writting out a status file if minversion is 2
+Skips writing out a status file if minversion is 2
 
 Does not call bughook if disablebughook is true.
 
@@ -686,7 +672,7 @@ sub writebug {
         die "can't find location for $ref" unless defined $status;
        my $sfh;
        if ($version >= 3) {
-           open $sfh,">:utf8","$status.new"  or
+           open $sfh,">","$status.new"  or
                die "opening $status.new: $!";
        }
        else {
@@ -787,7 +773,7 @@ exactly are removed. Otherwise, all versions matching the version
 number are removed.
 
 Currently $package and $isbinary are entirely ignored, but accepted
-for backwards compatibilty.
+for backwards compatibility.
 
 =cut
 
@@ -1123,6 +1109,63 @@ a source package). Defaults to true.
 Note: Currently the version information is cached; this needs to be
 changed before using this function in long lived programs.
 
+=head3 Returns
+
+Currently returns a hashref of status with the following keys.
+
+=over
+
+=item id -- bug number
+
+=item bug_num -- duplicate of id
+
+=item keywords -- tags set on the bug, including usertags if bugusertags passed.
+
+=item tags -- duplicate of keywords
+
+=item package -- name of package that the bug is assigned to
+
+=item severity -- severity of the bug
+
+=item pending -- pending state of the bug; one of following possible
+values; values listed later have precedence if multiple conditions are
+satisifed:
+
+=over
+
+=item pending -- default state
+
+=item forwarded -- bug has been forwarded
+
+=item pending-fixed -- bug is tagged pending
+
+=item fixed -- bug is tagged fixed
+
+=item absent -- bug does not apply to this distribution/architecture
+
+=item done -- bug is resolved in this distribution/architecture
+
+=back
+
+=item location -- db-h or archive; the location in the filesystem
+
+=item subject -- title of the bug
+
+=item last_modified -- epoch that the bug was last modified
+
+=item date -- epoch that the bug was filed
+
+=item originator -- bug reporter
+
+=item log_modified -- epoch that the log file was last modified
+
+=item msgid -- Message id of the original bug report
+
+=back
+
+
+Other key/value pairs are returned but are not currently documented here.
+
 =cut
 
 sub get_bug_status {
@@ -1572,6 +1615,8 @@ sub update_realtime {
        my $idx_new = IO::File->new($file.'.new','w')
             or die "Couldn't open ${file}.new: $!";
 
+        binmode($idx_old,':raw:utf8');
+        binmode($idx_new,':raw:encoding(UTF-8)');
        my $min_bug = min(keys %bugs);
        my $line;
        my @line;