X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Ferrorlib.in;h=a93c79bf3542e376203c79f1664de98dbe839130;hb=58e4bee353b3570f306e84567f1e38efa00f80f8;hp=338b7c170491eecfbb3784dc97806e9a97b3aead;hpb=b04b187283a1444886e6e48e7e1351b9a2b90f75;p=debbugs.git diff --git a/scripts/errorlib.in b/scripts/errorlib.in index 338b7c1..a93c79b 100755 --- a/scripts/errorlib.in +++ b/scripts/errorlib.in @@ -1,8 +1,11 @@ # -*- perl -*- -# $Id: errorlib.in,v 1.4 2001/07/15 09:46:16 doogie Exp $ -sub F_SETLK { 6; } sub F_WRLCK{ 1; } -$flockstruct= 'sslll'; # And there ought to be something for this too. +use Mail::Address; +use Debbugs::MIME qw(decode_rfc1522 encode_rfc1522); +use Debbugs::Packages qw(:all); +use Debbugs::Common qw(:all); +use Debbugs::Status qw(:all); +use Carp; sub unlockreadbugmerge { local ($rv) = @_; @@ -11,115 +14,68 @@ sub unlockreadbugmerge { } sub lockreadbugmerge { - local ($lref) = @_; - if (!&lockreadbug($lref)) { return 0; } - if (!length($s_mergedwith)) { return 1; } + local ($lref, $location) = @_; + local $data; + if (!($data = &lockreadbug($lref, $location))) { return ( 0, undef ); } + if (!length($data->{mergedwith})) { return ( 1, $data ); } &unfilelock; &filelock('lock/merge'); - if (!&lockreadbug($lref)) { &unfilelock; return 0; } - return 2; -} - -sub lockreadbug { - local ($lref) = @_; - &filelock("lock/$lref"); - if (!open(S,"db/$lref.status")) { &unfilelock; return 0; } - chop($s_originator= ); - chop($s_date= ); - chop($s_subject= ); - chop($s_msgid= ); - chop($s_package= ); - chop($s_keywords= ); - chop($s_done= ); - chop($s_forwarded= ); - chop($s_mergedwith= ); - chop($s_severity= ); - close(S); - $s_severity = 'normal' if $s_severity eq ''; - return 1; -} - -sub filelock { - # NB - NOT COMPATIBLE WITH `with-lock' - local ($lockfile,$flockpushno,$evalstring,$count,$errors,@s1,@s2) = @_; - $flockpushno= $#filelocks+1; - $count= 10; $errors= ''; - for (;;) { - $evalstring= " - open(FLOCK${flockpushno},\"> \$lockfile\") || die \"open: \$!\"; - \$flockwant= pack(\$flockstruct,&F_WRLCK,0,0,1,0);". - ($] >= 5.000 ? " - fcntl(FLOCK$flockpushno,&F_SETLK,\$flockwant) || die \"setlk: \$!\";" : " - \$z= syscall(&SYS_fcntl,fileno(FLOCK$flockpushno),&F_SETLK,\$flockwant) < 0 - && die \"syscall fcntl setlk: \$!\";") ." - (\@s1= lstat(\$lockfile)) || die \"lstat: \$!\"; - (\@s2= stat(FLOCK$flockpushno)) || die \"fstat: \$!\"; - join(',',\@s1) eq join(',',\@s2) || die \"file switched\"; - 1; - "; - last if eval $evalstring; - $errors .= $@; - eval "close(FLOCK$flockpushno);"; - if (--$count <=0) { - $errors =~ s/\n+$//; - &quit("failed to get lock on file $lockfile: $errors // $evalstring"); - } - sleep 10; - } - push(@cleanups,'unfilelock'); - push(@filelocks,$lockfile); -} - -sub unfilelock { - local ($lockfile) = pop(@filelocks); - pop(@cleanups); - eval 'close(FLOCK'.($#filelocks+1).');' || warn "failed to close lock file: $!"; - unlink($lockfile) || warn "failed to remove lock file: $!"; -} - -sub quit { - print DEBUG "quitting >$_[0]<\n"; - local ($u); - while ($u= $cleanups[$#cleanups]) { &$u; } - die "*** $_[0]\n"; + if (!&lockreadbug($lref, $location)) { &unfilelock; return ( 0, undef ); } + return ( 2, $data ); } %saniarray= ('<','lt', '>','gt', '&','amp', '"','quot'); sub sani { - local ($in) = @_; - local ($out); - while ($in =~ m/[<>&"]/) { - $out.= $`. '&'. $saniarray{$&}. ';'; - $in=$'; - } - $out.= $in; - $out; + my ($in) = @_; + carp "You should be using HTML::Entities instead."; + $in =~ s/([<>&"])/$saniarray{$1}/g; + return $in; } -sub bughook { - my ( $type, $ref ) = ( shift, shift ); - &filelock("debbugs.trace.lock"); - &appendfile("debbugs.trace","$type $ref\n",@_); - &unfilelock; +sub getmailbody { + my $entity = shift; + my $type = $entity->effective_type; + if ($type =~ m#text/(?!html|enriched)# or + $type eq 'application/pgp') { + return $entity->bodyhandle; + } elsif ($type eq 'multipart/alternative') { + # RFC 2046 says we should use the last part we recognize. + for my $part (reverse $entity->parts) { + my $ret = getmailbody($part); + return $ret if $ret; + } + } else { + # For other multipart types, we just pretend they're + # multipart/mixed and run through in order. + for my $part ($entity->parts) { + my $ret = getmailbody($part); + return $ret if $ret; + } + } + return undef; } -sub appendfile { - my $file = shift; - if (!open(AP,">>$file")) { - print DEBUG "failed open log<\n"; - print DEBUG "failed open log err $!<\n"; - &quit("opening db/$ref.log (li): $!"); - } - print(AP @_) || &quit("writing $file (appendfile): $!"); - close(AP) || &quit("closing $file (appendfile): $!"); +sub get_addresses { + return + map { $_->address() } + map { Mail::Address->parse($_) } @_; } +sub escapelog { + my @log = @_; + map { s/^([\01-\07\030])/\030$1/gm } @log; + return \@log; +} -@severities= @gSeverityList; +@severities= grep { not exists $gObsoleteSeverities{$_} } @gSeverityList; @showseverities= @severities; grep ($_= $_ eq '' ? $gDefaultSeverity : $_, @showseverities); -@strongseverities= @gStrongSeverities; %displayshowseverities= %gSeverityDisplay; +# compatibility +if (defined $gFowardList and not defined $gForwardList) { + $gForwardList = $gFowardList; +} + 1;