X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FStatus.pm;h=6fad22e5f2d6a04359546f41041a44161fd4378c;hb=ede5f340a093569596670be592d4aace355df05a;hp=e70643fbe6244f86c799b9149e4fc44e51a653bf;hpb=cb2d3bceada187525f182c9ea7c7d4f5e93fefce;p=debbugs.git diff --git a/Debbugs/Status.pm b/Debbugs/Status.pm index e70643f..6fad22e 100644 --- a/Debbugs/Status.pm +++ b/Debbugs/Status.pm @@ -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,6 +46,7 @@ use Debbugs::Versions; use Debbugs::Versions::Dpkg; use POSIX qw(ceil); use File::Copy qw(copy); +use Encode qw(decode encode is_utf8); use Storable qw(dclone); use List::Util qw(min max); @@ -107,6 +109,7 @@ our %fields = (originator => 'submitter', blockedby => 'blocked-by', unarchived => 'unarchived', summary => 'summary', + outlook => 'outlook', affects => 'affects', ); @@ -216,6 +219,7 @@ sub read_bug{ } return undef; } + binmode($status_fh,':encoding(UTF-8)'); my %data; my @lines; @@ -249,9 +253,13 @@ 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) { + $data{$field} = decode_rfc1522($data{$field}); + } } - $data{severity} = $config{default_severity} if $data{severity} eq ''; for my $field (qw(found_versions fixed_versions found_date fixed_date)) { $data{$field} = [split ' ', $data{$field}]; @@ -264,11 +272,6 @@ sub read_bug{ @{$data{"${field}_date"}}); } - if ($version < 3) { - for my $field (@rfc1522_fields) { - $data{$field} = decode_rfc1522($data{$field}); - } - } my $status_modified = (stat($status))[9]; # Add log last modified time $data{log_modified} = (stat($log))[9]; @@ -547,12 +550,8 @@ sub new_bug { close $nn_fh; overwritefile("nextnumber", ($nn+1)."\n"); + unfilelock(); my $nn_hash = get_hashname($nn); - use IO::File; - my $t_fh = IO::File->new("/home/don/temp.txt",'a') or die "Unable to open ~don/temp.txt for writing: $!"; - use Data::Dumper; - print {$t_fh} Dumper({%param,nn => $nn, nn_hash => $nn_hash, nextnumber => qx(cat nextnumber)}); - close $t_fh; if ($param{copy}) { my $c_hash = get_hashname($param{copy}); for my $file (qw(log status summary report)) { @@ -596,7 +595,7 @@ version. sub makestatus { my ($data,$version) = @_; - $version = 2 unless defined $version; + $version = 3 unless defined $version; my $contents = ''; @@ -609,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}); @@ -640,11 +641,11 @@ sub makestatus { # Output field names in proper case, e.g. 'Merged-With'. my $properfield = $fields{$field}; $properfield =~ s/(?:^|(?<=-))([a-z])/\u$1/g; - $contents .= "$properfield: $newdata{$field}\n"; + my $data = $newdata{$field}; + $contents .= "$properfield: $data\n"; } } } - return $contents; } @@ -654,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. @@ -664,15 +665,23 @@ sub writebug { my ($ref, $data, $location, $minversion, $disablebughook) = @_; my $change; - my %outputs = (1 => 'status', 2 => 'summary'); + my %outputs = (1 => 'status', 3 => 'summary'); for my $version (keys %outputs) { next if defined $minversion and $version < $minversion; my $status = getbugcomponent($ref, $outputs{$version}, $location); die "can't find location for $ref" unless defined $status; - open(S,"> $status.new") || die "opening $status.new: $!"; - print(S makestatus($data, $version)) || + my $sfh; + if ($version >= 3) { + open $sfh,">","$status.new" or + die "opening $status.new: $!"; + } + else { + open $sfh,">","$status.new" or + die "opening $status.new: $!"; + } + print {$sfh} makestatus($data, $version) or die "writing $status.new: $!"; - close(S) || die "closing $status.new: $!"; + close($sfh) or die "closing $status.new: $!"; if (-e $status) { $change = 'change'; } else { @@ -764,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 @@ -1100,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 { @@ -1549,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;