From: Don Armstrong Date: Fri, 16 Mar 2018 00:14:56 +0000 (-0700) Subject: Merge branch 'database' X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=53c435119200ab9b1c2538a96b8374c51a078855;hp=3d939e2663317081551c707b05f69db870a79a2d;p=debbugs.git Merge branch 'database' --- diff --git a/.bzrignore b/.bzrignore deleted file mode 100644 index 0b9634c..0000000 --- a/.bzrignore +++ /dev/null @@ -1,4 +0,0 @@ -Makefile.perl -Makefile.perl.old -build-stamp -install-stamp diff --git a/.travis.yml b/.travis.yml index b6f1be8..418ae83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,11 @@ dist: trusty +services: + - docker sudo: required before_install: - - sudo apt-get -qq update - - sudo apt-get install -y devscripts equivs - - dch -r -m '' - - mk-build-deps -s sudo -i debian/control + - docker build -t debbugs/travis -f .travis/Dockerfile . script: - - make; make test + - docker run debbugs/travis sh -c 'cd /debbugs/; make; make test' notifications: irc: channels: diff --git a/.travis/Dockerfile b/.travis/Dockerfile new file mode 100644 index 0000000..e4bfa95 --- /dev/null +++ b/.travis/Dockerfile @@ -0,0 +1,15 @@ +FROM debian:stable-slim +RUN apt-get -qq update; \ + apt-get install --no-install-recommends -y devscripts equivs; \ + rm -rf /var/lib/apt/lists/*; \ + apt-get clean; +COPY debian/control debian/control +COPY debian/changelog debian/changelog +RUN dch -r -m ''; +RUN apt-get -qq update; \ + mk-build-deps --install \ + --tool 'apt-get -y -o Debug:pkgProblemResolver=yes --no-install-recommends' \ + debian/control; \ + rm -rf /var/lib/apt/lists/*; \ + apt-get clean; +COPY . debbugs \ No newline at end of file diff --git a/Debbugs/CGI.pm b/Debbugs/CGI.pm index 0f44943..a80397f 100644 --- a/Debbugs/CGI.pm +++ b/Debbugs/CGI.pm @@ -34,29 +34,10 @@ use strict; use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT); use Exporter qw(import); -use Debbugs::URI; -use HTML::Entities; -use Debbugs::Common qw(getparsedaddrs make_list); -use Params::Validate qw(validate_with :types); - -use Debbugs::Config qw(:config); -use Debbugs::Status qw(splitpackages isstrongseverity); -use Debbugs::User qw(); - -use Mail::Address; -use POSIX qw(ceil); -use Storable qw(dclone); - -use List::AllUtils qw(max); -use File::stat; -use Digest::MD5 qw(md5_hex); -use Carp; - -use Debbugs::Text qw(fill_in_template); +use feature qw(state); our %URL_PARAMS = (); - BEGIN{ ($VERSION) = q$Revision: 1.3 $ =~ /^Revision:\s+([^\s+])/; $DEBUG = 0 unless defined $DEBUG; @@ -84,6 +65,27 @@ BEGIN{ $EXPORT_TAGS{all} = [@EXPORT_OK]; } +use Debbugs::URI; +use URI::Escape; +use HTML::Entities; +use Debbugs::Common qw(getparsedaddrs make_list); +use Params::Validate qw(validate_with :types); + +use Debbugs::Config qw(:config); +use Debbugs::Status qw(splitpackages isstrongseverity); +use Debbugs::User qw(); + +use Mail::Address; +use POSIX qw(ceil); +use Storable qw(dclone); + +use List::AllUtils qw(max); +use File::stat; +use Digest::MD5 qw(md5_hex); +use Carp; + +use Debbugs::Text qw(fill_in_template); + =head2 set_url_params @@ -327,65 +329,101 @@ our @package_search_key_order = (package => 'in package', bugs => 'in bug', ); our %package_search_keys = @package_search_key_order; - +our %package_links_invalid_options = + map {($_,1)} (keys %package_search_keys, + qw(msg att)); sub package_links { + state $spec = + {(map { ($_,{type => SCALAR|ARRAYREF, + optional => 1, + }); + } keys %package_search_keys, + ## these are aliases for package + ## search keys + source => {type => SCALAR|ARRAYREF, + optional => 1, + }, + maintainer => {type => SCALAR|ARRAYREF, + optional => 1, + }, + ), + links_only => {type => BOOLEAN, + default => 0, + }, + class => {type => SCALAR, + default => '', + }, + separator => {type => SCALAR, + default => ', ', + }, + options => {type => HASHREF, + default => {}, + }, + }; my %param = validate_with(params => \@_, - spec => {(map { ($_,{type => SCALAR|ARRAYREF, - optional => 1, - }); - } keys %package_search_keys, - ), - links_only => {type => BOOLEAN, - default => 0, - }, - class => {type => SCALAR, - default => '', - }, - separator => {type => SCALAR, - default => ', ', - }, - options => {type => HASHREF, - default => {}, - }, - }, - normalize_keys => - sub { - my ($key) = @_; - my %map = (source => 'src', - maintainer => 'maint', - pkg => 'package', - ); - return $map{$key} if exists $map{$key}; - return $key; - } + spec => $spec, ); my %options = %{$param{options}}; - for ((keys %package_search_keys,qw(msg att))) { - delete $options{$_} if exists $options{$_}; + for (grep {$package_links_invalid_options{$_}} keys %options) { + delete $options{$_}; } + ## remove aliases for source and maintainer + if (exists $param{source}) { + $param{src} = [exists $param{src}?make_list($param{src}):(), + make_list($param{source}), + ]; + delete $param{source}; + } + if (exists $param{maintainer}) { + $param{maint} = [exists $param{maint}?make_list($param{maint}):(), + make_list($param{maintainer}), + ]; + delete $param{maintainer}; + } + my $has_options = keys %options; my @links = (); for my $type (qw(src package)) { - push @links, map {my $t_type = $type; - if ($_ =~ s/^src://) { - $t_type = 'src'; - } - (munge_url('pkgreport.cgi?', - %options, - $t_type => $_, - ), - ($t_type eq 'src'?'src:':'').$_); - } make_list($param{$type}) if exists $param{$type}; + next unless exists $param{$type}; + for my $target (make_list($param{$type})) { + my $t_type = $type; + if ($target =~ s/^src://) { + $t_type = 'source'; + } elsif ($t_type eq 'source') { + $target = 'src:'.$target; + } + if ($has_options) { + push @links, + (munge_url('pkgreport.cgi?', + %options, + $t_type => $target, + ), + $target); + } else { + push @links, + ('pkgreport.cgi?'.$t_type.'='.uri_escape_utf8($target), + $target); + } + } } for my $type (qw(maint owner submitter correspondent)) { - push @links, map {my $addr = getparsedaddrs($_); - $addr = defined $addr?$addr->address:''; - (munge_url('pkgreport.cgi?', - %options, - $type => $addr, - ), - $_); - } make_list($param{$type}) if exists $param{$type}; + next unless exists $param{$type}; + for my $target (make_list($param{$type})) { + my $addr = getparsedaddrs($target); + $addr = defined $addr?$addr->address:''; + if ($has_options) { + push @links, + (munge_url('pkgreport.cgi?', + %options, + $type => $target), + $target); + } else { + push @links, + ('pkgreport.cgi?'. + $type.'='.uri_escape_utf8($target), + $target); + } + } } my @return = (); my ($link,$link_name); @@ -455,13 +493,20 @@ sub bug_links { for (qw(bug)) { delete $options{$_} if exists $options{$_}; } + my $has_options = keys %options; my @links; - push @links, map {(munge_url('bugreport.cgi?', - %options, - bug => $_, - ), - $_); - } make_list($param{bug}) if exists $param{bug}; + if ($has_options) { + push @links, map {(munge_url('bugreport.cgi?', + %options, + bug => $_, + ), + $_); + } make_list($param{bug}) if exists $param{bug}; + } else { + push @links, map {('bugreport.cgi?bug='.uri_escape_utf8($_), + $_)} + make_list($param{bug}) if exists $param{bug}; + } my @return; my ($link,$link_name); my $class = ''; @@ -576,7 +621,7 @@ sub emailfromrfc822{ return $addr; } -sub mainturl { package_links(maint => $_[0], links_only => 1); } +sub mainturl { package_links(maintainer => $_[0], links_only => 1); } sub submitterurl { package_links(submitter => $_[0], links_only => 1); } sub htmlize_maintlinks { my ($prefixfunc, $maints) = @_; @@ -821,23 +866,6 @@ sub option_form{ # we'll add extra comands here once I figure out what they # should be } - # add in a few utility routines - $variables->{output_select_options} = sub { - my ($options,$value) = @_; - my @options = @{$options}; - my $output = ''; - while (my ($o_value,$name) = splice @options,0,2) { - my $selected = ''; - if (defined $value and $o_value eq $value) { - $selected = ' selected'; - } - $output .= q(\n); - } - return $output; - }; - $variables->{make_list} = sub { make_list(@_); - }; # now at this point, we're ready to create the template return Debbugs::Text::fill_in_template(template=>$param{template}, (exists $param{language}?(language=>$param{language}):()), diff --git a/Debbugs/CGI/Pkgreport.pm b/Debbugs/CGI/Pkgreport.pm index 078feca..060e980 100644 --- a/Debbugs/CGI/Pkgreport.pm +++ b/Debbugs/CGI/Pkgreport.pm @@ -103,7 +103,7 @@ sub generate_package_info{ print {$output} '

'; print {$output} (($maint =~ /,/)? "Maintainer for $showpkg is " : "Maintainers for $showpkg are ") . - package_links(maint => $maint); + package_links(maintainer => $maint); print {$output} ".

\n"; } else { @@ -353,12 +353,14 @@ sub pkg_htmlizebugs { push @{$exclude{$key}}, split /\s*,\s*/, $value; } + my $binary_to_source_cache = {}; foreach my $bug (@bugs) { my %status = %{get_bug_status(bug=>$bug, (map {exists $param{$_}?($_,$param{$_}):()} qw(dist version schema bugusertags) ), (exists $param{arch}?(arch => $param{arch}):(arch => $config{default_architectures})), + binary_to_source_cache => $binary_to_source_cache, )}; next unless %status; next if bug_filter(bug => $bug, diff --git a/Debbugs/Command.pm b/Debbugs/Command.pm new file mode 100644 index 0000000..c68dd70 --- /dev/null +++ b/Debbugs/Command.pm @@ -0,0 +1,101 @@ +# This module is part of debbugs, and is released under the terms of +# the GPL version 3, or any later version (at your option). See the +# file README and COPYING for more information. +# Copyright 2017 by Don Armstrong . + +package Debbugs::Command; + +=head1 NAME + +Debbugs::Command -- Handle multiple subcommand-style commands + +=head1 SYNOPSIS + + use Debbugs::Command; + +=head1 DESCRIPTION + + +=head1 BUGS + +None known. + +=cut + +use warnings; +use strict; +use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT); +use base qw(Exporter); + +BEGIN{ + $VERSION = '0.1'; + $DEBUG = 0 unless defined $DEBUG; + + @EXPORT = (); + %EXPORT_TAGS = (commands => [qw(handle_main_arguments), + qw(handle_subcommand_arguments) + ], + ); + @EXPORT_OK = (); + Exporter::export_ok_tags(keys %EXPORT_TAGS); + $EXPORT_TAGS{all} = [@EXPORT_OK]; + +} + +use Getopt::Long qw(:config no_ignore_case); +use Pod::Usage qw(pod2usage); + +=head1 Command processing (:commands) + +Functions which parse arguments for commands (exportable with +C<:commands>) + +=over + +=item handle_main_arguments( + +=cut + +sub handle_main_arguments { + my ($options,@args) = @_; + Getopt::Long::Configure('pass_through'); + GetOptions($options,@args); + Getopt::Long::Configure('default'); + return $options; +} + + + +sub handle_subcommand_arguments { + my ($argv,$args,$subopt) = @_; + $subopt //= {}; + Getopt::Long::GetOptionsFromArray($argv, + $subopt, + keys %{$args}, + ); + my @usage_errors; + for my $arg (keys %{$args}) { + next unless $args->{$arg}; + my $r_arg = $arg; # real argument name + $r_arg =~ s/[=\|].+//g; + if (not defined $subopt->{$r_arg}) { + push @usage_errors, "You must give a $r_arg option"; + } + } + pod2usage(join("\n",@usage_errors)) if @usage_errors; + return $subopt; +} + +=back + +=cut + + +1; + + +__END__ +# Local Variables: +# indent-tabs-mode: nil +# cperl-indent-level: 4 +# End: diff --git a/Debbugs/Control.pm b/Debbugs/Control.pm index ab60384..1f8b3aa 100644 --- a/Debbugs/Control.pm +++ b/Debbugs/Control.pm @@ -364,7 +364,7 @@ sub set_blocks { next if $ok_blockers{$blocker} or $bad_blockers{$blocker}; my $data = read_bug(bug=>$blocker, ); - if (defined $data and not $data->{archive}) { + if (defined $data and not $data->{archived}) { $data = split_status_fields($data); $ok_blockers{$blocker} = 1; my @merged_bugs; @@ -379,15 +379,17 @@ sub set_blocks { # throw an error if we are setting the blockers and there is a bad # blocker if (keys %bad_blockers and $mode eq 'set') { - croak "Unknown blocking bug(s):".join(', ',keys %bad_blockers). - keys %ok_blockers?'':" and no known blocking bug(s)"; + __end_control(%info); + croak "Unknown/archived blocking bug(s):".join(', ',keys %bad_blockers). + keys %ok_blockers?'':" and no good blocking bug(s)"; } # if there are no ok blockers and we are not setting the blockers, # there's an error. if (not keys %ok_blockers and $mode ne 'set') { print {$transcript} "No valid blocking bug(s) given; not doing anything\n"; if (keys %bad_blockers) { - croak "Unknown blocking bug(s):".join(', ',keys %bad_blockers); + __end_control(%info); + croak "Unknown/archived blocking bug(s):".join(', ',keys %bad_blockers); } __end_control(%info); return; @@ -410,6 +412,7 @@ sub set_blocks { @bugs{@bugs} = (1) x @bugs; for my $blocker (@change_blockers) { if ($bugs{$blocker}) { + __end_control(%info); croak "It is nonsensical for a bug to block itself (or a merged partner): $blocker"; } } @@ -2070,9 +2073,11 @@ sub set_merged { print {$transcript} "$change->{field} of #$change->{bug} is '$change->{text_orig_value}' not '$change->{text_value}'\n"; } if ($attempts > 0) { + __end_control(%info); croak "Some bugs were altered while attempting to merge"; } else { + __end_control(%info); croak "Did not alter merged bugs"; } } @@ -2084,6 +2089,7 @@ sub set_merged { $param{show_bug_info} and not __internal_request(1); $bug_info_shown{$change_bug} = 1; __allow_relocking($param{locks},[keys %data]); + eval { for my $change (@{$changes->{$change_bug}}) { if ($change->{field} eq 'blockedby' or $change->{field} eq 'blocks') { my %target_blockedby; @@ -2120,6 +2126,12 @@ sub set_merged { ); } } + }; + if ($@) { + __disallow_relocking($param{locks}); + __end_control(%info); + croak "Failure while trying to adjust bugs, please report this as a bug: $@"; + } __disallow_relocking($param{locks}); my ($data,$n_locks) = __lock_and_load_merged_bugs(bugs_to_load => [keys %merging], @@ -2286,13 +2298,22 @@ sub __calculate_merge_status{ $merged_bugs{$data->{bug_num}} = 1; $bugs_to_merge = 1; } + } + for my $data (@{$data_a}) { # the master_bug is the bug that every other bug is made to # look like. However, if merge is set, tags, fixed and found # are merged. if ($data->{bug_num} == $master_bug) { - for (qw(package forwarded severity blocks blockedby done owner summary outlook affects)) { + for (qw(package forwarded severity done owner summary outlook affects)) { $merge_status{$_} = $data->{$_} } + # bugs which are in the newly merged set and are also + # blocks/blockedby must be removed before merging + for (qw(blocks blockedby)) { + $merge_status{$_} = + join(' ',grep {not exists $merged_bugs{$_}} + split / /,$data->{$_}); + } } if (defined $merge_status) { next unless $data->{bug_num} == $master_bug; @@ -2770,7 +2791,8 @@ sub _summary { \#|reopen|close|(?:not|)(?:fixed|found)|clone| debug|(?:not|)forwarded|priority| (?:un|)block|limit|(?:un|)archive| - reassign|retitle|affects|wrongpackage + reassign|retitle|affects|package| + outlook| (?:un|force|)merge|user(?:category|tags?|) )\s+\S}xis) { if (not length $paragraph) { @@ -3224,6 +3246,15 @@ sub bug_unarchive { my @bugs = @{$info{bugs}}; my $action = "$config{bug} unarchived."; my @files_to_remove; + ## error out if we're unarchiving unarchived bugs + for my $data (@{$info{data}}) { + if (not defined $data->{archived} or + not $data->{archived} + ) { + __end_control(%info); + croak("Bug $data->{bug_num} was not archived; not unarchiving it."); + } + } for my $bug (@bugs) { print {$debug} "$param{bug} removing $bug\n"; my $dir = get_hashname($bug); diff --git a/Debbugs/Log/Spam.pm b/Debbugs/Log/Spam.pm index a2fe44c..e5ed18f 100644 --- a/Debbugs/Log/Spam.pm +++ b/Debbugs/Log/Spam.pm @@ -122,7 +122,11 @@ sub _init { binmode($fh,':encoding(UTF-8)'); while (<$fh>) { chomp; - $self->{spam}{$_} = 1; + if (s/\sham$//) { + $self->{spam}{$_} = '0'; + } else { + $self->{spam}{$_} = '1'; + } } close ($fh) or croak "Unable to close bug log filehandle: $!"; @@ -132,7 +136,10 @@ sub _init { croak "Unable to open bug log spamdir '$self->{name}.d' for reading: $!"; for my $dir (readdir($d)) { next unless $dir =~ m/([^\.].*)_(\w+)$/; - $self->{spam}{$1} = 1; + # .spam overrides .spam.d + next if exists $self->{spam}{$1}; + # set the spam HASH to $dir so we know where this value was set from + $self->{spam}{$1} = $dir; } closedir($d) or croak "Unable to close bug log spamdir: $!"; @@ -142,7 +149,7 @@ sub _init { =item save -$self->save(); +C<$spam_log->save();> Saves changes to the bug log spam file. @@ -156,7 +163,16 @@ sub save { croak "Unable to open bug log spam '$self->{name}.tmp' for writing: $!"; binmode($fh,':encoding(UTF-8)'); for my $msgid (keys %{$self->{spam}}) { - print {$fh} $msgid."\n"; + # was this message set to spam/ham by .d? If so, don't save it + if ($self->{spam}{$msgid} ne '0' and + $self->{spam}{$msgid} ne '1') { + next; + } + print {$fh} $msgid; + if ($self->{spam}{$msgid} eq '0') { + print {$fh} ' ham'; + } + print {$fh} "\n"; } close($fh) or croak "Unable to write to '$self->{name}.tmp': $!"; rename($self->{name}.'.tmp',$self->{name}); @@ -165,11 +181,11 @@ sub save { =item is_spam - next if ($spam_log->is_spam('12456@exmaple.com')); +Cis_spam('12456@exmaple.com'));> Returns 1 if this message id confirms that the message is spam -Returns 0 if this message is not spam +Returns 0 if this message is not known to be spam =cut sub is_spam { @@ -177,29 +193,78 @@ sub is_spam { return 0 if not defined $msgid or not length $msgid; $msgid =~ s/^<|>$//; if (exists $self->{spam}{$msgid} and - $self->{spam}{$msgid} + $self->{spam}{$msgid} ne '0' + ) { + return 1; + } + return 0; +} + +=item is_ham + + next if ($spam_log->is_ham('12456@exmaple.com')); + +Returns 1 if this message id confirms that the message is ham + +Returns 0 if this message is not known to be ham + +=cut +sub is_ham { + my ($self,$msgid) = @_; + return 0 if not defined $msgid or not length $msgid; + $msgid =~ s/^<|>$//; + if (exists $self->{spam}{$msgid} and + $self->{spam}{$msgid} eq '0' ) { return 1; } return 0; } + =item add_spam $spam_log->add_spam('123456@example.com'); Add a message id to the spam listing. -You must call C<$self->save()> if you wish the changes to be written out to disk. +You must call C<$spam_log->save()> if you wish the changes to be written out to disk. =cut sub add_spam { my ($self,$msgid) = @_; $msgid =~ s/^<|>$//; - $self->{spam}{$msgid} = 1; + $self->{spam}{$msgid} = '1'; } +=item add_ham + + $spam_log->add_ham('123456@example.com'); + +Add a message id to the ham listing. + +You must call C<$spam_log->save()> if you wish the changes to be written out to disk. + +=cut + +sub add_ham { + my ($self,$msgid) = @_; + $msgid =~ s/^<|>$//; + $self->{spam}{$msgid} = '0'; +} + +=item remove_message + + $spam_log->remove_message('123456@example.com'); + +Remove a message from the spam/ham listing. + +You must call C<$spam_log->save()> if you wish the changes to be written out to disk. + +=cut + + 1; =back diff --git a/Debbugs/SOAP.pm b/Debbugs/SOAP.pm index 9ed0249..a0c3cbf 100644 --- a/Debbugs/SOAP.pm +++ b/Debbugs/SOAP.pm @@ -127,6 +127,7 @@ sub get_status { @bugs = @{$bugs[0]}; } my %status; + my %binary_to_source_cache; for my $bug (@bugs) { my $bug_status; if (ref($bug)) { @@ -134,11 +135,14 @@ sub get_status { next unless defined $param{bug}; $bug = $param{bug}; $bug_status = get_bug_status(map {(exists $param{$_})?($_,$param{$_}):()} - qw(bug dist arch bugusertags sourceversions version indicatesource) + qw(bug dist arch bugusertags sourceversions version indicatesource), + binary_to_source_cache => \%binary_to_source_cache, ); } else { - $bug_status = get_bug_status(bug => $bug); + $bug_status = get_bug_status(bug => $bug, + binary_to_source_cache => \%binary_to_source_cache, + ); } if (defined $bug_status and keys %{$bug_status} > 0) { $status{$bug} = $bug_status; diff --git a/Debbugs/Status.pm b/Debbugs/Status.pm index 7af7fcf..9d047a4 100644 --- a/Debbugs/Status.pm +++ b/Debbugs/Status.pm @@ -33,6 +33,8 @@ status of a particular bug use warnings; use strict; +use feature 'state'; + use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT); use Exporter qw(import); @@ -165,27 +167,27 @@ sub read_bug{ if (@_ == 1) { unshift @_, 'bug'; } + state $spec = + {bug => {type => SCALAR, + optional => 1, + # something really stupid passes negative bugnumbers + regex => qr/^-?\d+/, + }, + location => {type => SCALAR|UNDEF, + optional => 1, + }, + summary => {type => SCALAR, + optional => 1, + }, + lock => {type => BOOLEAN, + optional => 1, + }, + locks => {type => HASHREF, + optional => 1, + }, + }; my %param = validate_with(params => \@_, - spec => {bug => {type => SCALAR, - optional => 1, - # something really - # stupid passes - # negative bugnumbers - regex => qr/^-?\d+/, - }, - location => {type => SCALAR|UNDEF, - optional => 1, - }, - summary => {type => SCALAR, - optional => 1, - }, - lock => {type => BOOLEAN, - optional => 1, - }, - locks => {type => HASHREF, - optional => 1, - }, - }, + spec => $spec, ); die "One of bug or summary must be passed to read_bug" if not exists $param{bug} and not exists $param{summary}; @@ -230,15 +232,19 @@ sub read_bug{ my %data; my @lines; - my $version = 2; + my $version; local $_; while (<$status_fh>) { chomp; push @lines, $_; - $version = $1 if /^Format-Version: ([0-9]+)/i; + if (not defined $version and + /^Format-Version: ([0-9]+)/i + ) { + $version = $1; + } } - + $version = 2 if not defined $version; # Version 3 is the latest format version currently supported. if ($version > 3) { warn "Unsupported status version '$version'"; @@ -248,7 +254,7 @@ sub read_bug{ return undef; } - my %namemap = reverse %fields; + state $namemap = {reverse %fields}; for my $line (@lines) { if ($line =~ /(\S+?): (.*)/) { my ($name, $value) = (lc $1, $2); @@ -256,7 +262,7 @@ sub read_bug{ # or \n in the fields of status. Kill them off here. # [Eventually, this should be superfluous.] $value =~ s/[\r\n]//g; - $data{$namemap{$name}} = $value if exists $namemap{$name}; + $data{$namemap->{$name}} = $value if exists $namemap->{$name}; } } for my $field (keys %fields) { @@ -1221,38 +1227,43 @@ sub get_bug_status { if (@_ == 1) { unshift @_, 'bug'; } + state $spec = + {bug => {type => SCALAR, + regex => qr/^\d+$/, + }, + status => {type => HASHREF, + optional => 1, + }, + bug_index => {type => OBJECT, + optional => 1, + }, + version => {type => SCALAR|ARRAYREF, + optional => 1, + }, + dist => {type => SCALAR|ARRAYREF, + optional => 1, + }, + arch => {type => SCALAR|ARRAYREF, + optional => 1, + }, + bugusertags => {type => HASHREF, + optional => 1, + }, + sourceversions => {type => ARRAYREF, + optional => 1, + }, + indicatesource => {type => BOOLEAN, + default => 1, + }, + binary_to_source_cache => {type => HASHREF, + optional => 1, + }, + schema => {type => OBJECT, + optional => 1, + }, + }; my %param = validate_with(params => \@_, - spec => {bug => {type => SCALAR, - regex => qr/^\d+$/, - }, - status => {type => HASHREF, - optional => 1, - }, - bug_index => {type => OBJECT, - optional => 1, - }, - version => {type => SCALAR|ARRAYREF, - optional => 1, - }, - dist => {type => SCALAR|ARRAYREF, - optional => 1, - }, - arch => {type => SCALAR|ARRAYREF, - optional => 1, - }, - bugusertags => {type => HASHREF, - optional => 1, - }, - sourceversions => {type => ARRAYREF, - optional => 1, - }, - indicatesource => {type => BOOLEAN, - default => 1, - }, - schema => {type => OBJECT, - optional => 1, - }, - }, + spec => $spec, ); my %status; @@ -1343,6 +1354,8 @@ sub get_bug_status { $status{source} = binary_to_source(binary=>[split /\s*,\s*/, $status{package}], source_only => 1, + exists $param{binary_to_source_cache}? + (cache =>$param{binary_to_source_cache}):(), ); $status{"package"} = 'unknown' if ($status{"package"} eq ''); diff --git a/Debbugs/Text.pm b/Debbugs/Text.pm index 1edb174..53ecf04 100644 --- a/Debbugs/Text.pm +++ b/Debbugs/Text.pm @@ -47,7 +47,7 @@ BEGIN { $EXPORT_TAGS{all} = [@EXPORT_OK]; } -use Text::Template; +use Text::Xslate qw(html_builder); use Storable qw(dclone); @@ -58,34 +58,84 @@ use Carp; use IO::File; use Data::Dumper; +### for %text_xslate_functions +use POSIX; +use Debbugs::CGI qw(html_escape); +use Scalar::Util; +use Debbugs::Common qw(make_list); +use Debbugs::Status; + our %tt_templates; our %filled_templates; our $language; -# This function is what is called when someone does include('foo/bar') -# {include('foo/bar')} - -sub include { - my $template = shift; - $filled_templates{$template}++; - print STDERR "include template $template language $language\n" if $DEBUG; - # Die if we're in a template loop - die "Template loop with $template" if $filled_templates{$template} > 10; - my $filled_tmpl = ''; - eval { - $filled_tmpl = fill_in_template(template => $template, - variables => {}, - language => $language, - ); - }; - if ($@) { - print STDERR "failed to fill template $template: $@"; - } - print STDERR "failed to fill template $template\n" if $filled_tmpl eq '' and $DEBUG; - print STDERR "template $template '$filled_tmpl'\n" if $DEBUG; - $filled_templates{$template}--; - return $filled_tmpl; -}; + +sub __output_select_options { + my ($options,$value) = @_; + my @options = @{$options}; + my $output = ''; + while (@options) { + my ($o_value) = shift @options; + if (ref($o_value)) { + for (@{$o_value}) { + unshift @options, + ($_,$_); + } + next; + } + my $name = shift @options; + my $selected = ''; + if (defined $value and $o_value eq $value) { + $selected = ' selected'; + } + $output .= q(\n); + } + return $output; +} + +sub __text_xslate_functions { + return + {gm_strftime => sub {POSIX::strftime($_[0],gmtime)}, + package_links => html_builder(\&Debbugs::CGI::package_links), + bug_links => html_builder(\&Debbugs::CGI::bug_links), + looks_like_number => \&Scalar::Util::looks_like_number, + isstrongseverity => \&Debbugs::Status::isstrongseverity, + secs_to_english => \&Debbugs::Common::secs_to_english, + maybelink => \&Debbugs::CGI::maybelink, + # add in a few utility routines + duplicate_array => sub { + my @r = map {($_,$_)} make_list(@{$_[0]}); + return @r; + }, + output_select_options => html_builder(\&__output_select_options), + make_list => \&make_list, + }; +} +sub __text_xslate_functions_text { + return + {bugurl => + sub{ + return "$_[0]: ". + $config{cgi_domain}.'/'. + Debbugs::CGI::bug_links(bug=>$_[0], + links_only => 1, + ); + }, + }; +} + + + +### this function removes leading spaces from line-start code strings and spaces +### before <:- and spaces after -:> +sub __html_template_prefilter { + my $text = shift; + $text =~ s/^\s+:/:/mg; + $text =~ s/((?:^:[^\n]*\n)?)\s*(<:-)/$1$2/mg; + $text =~ s/(-:>)\s+(^:|)/$1.(length($2)?"\n$2":'')/emg; + return $text; +} =head2 fill_in_template @@ -95,15 +145,14 @@ sub include { language => '..' ); -Reads a template from disk (if it hasn't already been read in) and -fills the template in. +Reads a template from disk (if it hasn't already been read in) andf +ills the template in. =cut - sub fill_in_template{ my %param = validate_with(params => \@_, - spec => {template => SCALAR|HANDLE|SCALARREF, + spec => {template => SCALAR, variables => {type => HASHREF, default => {}, }, @@ -113,106 +162,59 @@ sub fill_in_template{ output => {type => HANDLE, optional => 1, }, - safe => {type => OBJECT|UNDEF, - optional => 1, - }, hole_var => {type => HASHREF, optional => 1, }, + output_type => {type => SCALAR, + default => 'html', + }, }, ); - if ($DEBUG) { - print STDERR "fill_in_template "; - print STDERR join(" ",map {exists $param{$_}?"$_:$param{$_}":()} keys %param); - print STDERR "\n"; - } - # Get the text - my $tt_type = ''; - my $tt_source; - if (ref($param{template}) eq 'GLOB' or - ref(\$param{template}) eq 'GLOB') { - $tt_type = 'FILE_HANDLE'; - $tt_source = $param{template}; - binmode($tt_source,":encoding(UTF-8)"); - } - elsif (ref($param{template}) eq 'SCALAR') { - $tt_type = 'STRING'; - $tt_source = ${$param{template}}; - } - else { - $tt_type = 'FILE'; - $tt_source = _locate_text($param{template},$param{language}); - } - if (not defined $tt_source) { - die "Unable to find template $param{template} with language $param{language}"; - } - - $language = $param{language}; + my $output_type = $param{output_type}; + my $language = $param{language}; + my $template = $param{template}; + $template .= '.tx' unless $template =~ /\.tx$/; my $tt; - if ($tt_type eq 'FILE' and - defined $tt_templates{$tt_source} and - ($tt_templates{$tt_source}{mtime} + 60) < time and - (stat $tt_source)[9] <= $tt_templates{$tt_source}{mtime} + if (not exists $tt_templates{$output_type}{$language} or + not defined $tt_templates{$output_type}{$language} ) { - $tt = $tt_templates{$tt_source}{template}; - } - else { - my $passed_source = $tt_source; - my $passed_type = $tt_type; - if ($tt_type eq 'FILE') { - $tt_templates{$tt_source}{mtime} = - (stat $tt_source)[9]; - $passed_source = IO::File->new($tt_source,'r'); - binmode($passed_source,":encoding(UTF-8)"); - $passed_type = 'FILEHANDLE'; - } - $tt = Text::Template->new(TYPE => $passed_type, - SOURCE => $passed_source, - UNTAINT => 1, - ); - if ($tt_type eq 'FILE') { - $tt_templates{$tt_source}{template} = $tt; - } + $tt_templates{$output_type}{$language} = + Text::Xslate->new(# cache in template_cache or temp directory + cache_dir => $config{template_cache} // + File::Temp::tempdir(CLEANUP => 1), + # default to the language, but fallback to en_US + path => [$config{template_dir}.'/'.$language.'/', + $config{template_dir}.'/en_US/', + ], + suffix => '.tx', + ## use html or text specific functions + function => + ($output_type eq 'html' ? __text_xslate_functions() : + __text_xslate_functions_text()), + syntax => 'Kolon', + module => ['Text::Xslate::Bridge::Star', + 'Debbugs::Text::XslateBridge', + ], + type => $output_type, + ## use the html-specific pre_process_handler + $output_type eq 'html'? + (pre_process_handler => \&__html_template_prefilter):(), + ) + or die "Unable to create Text::Xslate"; } - if (not defined $tt) { - die "Unable to create Text::Template for $tt_type:$tt_source"; + $tt = $tt_templates{$output_type}{$language}; + my $ret = + $tt->render($template, + {time => time, + %{$param{variables}//{}}, + config => \%config, + }); + if (exists $param{output}) { + print {$param{output}} $ret; + return ''; } - my $ret = $tt->fill_in(PACKAGE => 'DTT', - HASH => {%{$param{variables}//{}}, - (map {my $t = $_; $t =~ s/^\&//; ($t => $param{hole_var}{$_})} - keys %{$param{hole_var}//{}}), - include => \&Debbugs::Text::include, - config => \%config, - }, - defined $param{output}?(OUTPUT=>$param{output}):(), - ); - if (not defined $ret) { - print STDERR $Text::Template::ERROR; - return ''; - } - if ($DEBUG) { - no strict 'refs'; - no warnings 'uninitialized'; - print STDERR "Variables for $param{template}\n"; - } - return $ret; } -sub _locate_text{ - my ($template,$language) = @_; - $template =~ s/\.tmpl$//g; - # if a language doesn't exist, use the en_US template - if (not -e $config{template_dir}.'/'.$language.'/'.$template.'.tmpl') { - $language = 'en_US'; - } - my $loc = $config{template_dir}.'/'.$language.'/'.$template.'.tmpl'; - if (not -e $loc) { - print STDERR "Unable to locate template $loc\n"; - return undef; - } - return $loc; -} - 1; diff --git a/Debbugs/Text/XslateBridge.pm b/Debbugs/Text/XslateBridge.pm new file mode 100644 index 0000000..14652c2 --- /dev/null +++ b/Debbugs/Text/XslateBridge.pm @@ -0,0 +1,51 @@ +# This module is part of debbugs, and is released +# under the terms of the GPL version 2, or any later +# version at your option. +# See the file README and COPYING for more information. +# +# Copyright 2018 by Don Armstrong . + +package Debbugs::Text::XslateBridge; + +use warnings; +use strict; + +use base qw(Text::Xslate::Bridge); + +=head1 NAME + +Debbugs::Text::XslateBridge -- bridge for Xslate to add in useful functions + +=head1 DESCRIPTION + +This module provides bridge functionality to load functions into +Text::Xslate. It's loosely modeled after +Text::Xslate::Bridge::TT2Like, but with fewer functions. + +=head1 BUGS + +None known. + +=cut + + +use vars qw($VERSION); + +BEGIN { + $VERSION = 1.00; +} + +use Text::Xslate; + +__PACKAGE__-> + bridge(scalar => {length => \&__length, + }, + function => {length => \&__length,} + ); + +sub __length { + length $_[0]; +} + + +1; diff --git a/Debbugs/UTF8.pm b/Debbugs/UTF8.pm index 230ab79..01351f3 100644 --- a/Debbugs/UTF8.pm +++ b/Debbugs/UTF8.pm @@ -154,6 +154,10 @@ sub convert_to_utf8 { if ($charset eq 'RAW') { croak("Charset must not be raw when calling convert_to_utf8"); } + ## if the charset is unknown or unknown 8 bit, assume that it's UTF-8. + if ($charset =~ /unknown/i) { + $charset = 'UTF-8' + } my $iconv_converter; eval { $iconv_converter = Text::Iconv->new($charset,"UTF-8") or @@ -200,6 +204,10 @@ sub __fallback_convert_to_utf8 { } # lets assume everything that doesn't have a charset is utf8 $charset //= 'utf8'; + ## if the charset is unknown, assume it's UTF-8 + if ($charset =~ /unknown/i) { + $charset = 'utf8'; + } my $result; eval { $result = decode($charset,$data,0); diff --git a/Makefile b/Makefile index 8114d0b..a279aeb 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,6 @@ sbin_dir := $(DESTDIR)/usr/sbin etc_dir := $(DESTDIR)/etc/debbugs var_dir := $(DESTDIR)/var/lib/debbugs scripts_dir := $(DESTDIR)/usr/lib/debbugs -perl_dir := $(DESTDIR)/usr/share/perl5/Debbugs doc_dir := $(DESTDIR)/usr/share/doc/debbugs templates_dir := $(DESTDIR)/usr/share/debbugs/templates man_dir := $(DESTDIR)/usr/share/man @@ -14,11 +13,7 @@ examples_dir := $(doc_dir)/examples scripts_in = $(foreach script, $(filter-out scripts/config% scripts/errorlib scripts/text, $(wildcard scripts/*)),$(patsubst scripts/%,%,$(script))) htmls_in := $(wildcard html/*.html.in) -cgis := $(wildcard cgi/*.cgi cgi/*.pl) - -# We use the Makefile.PL to install these; not totally decided if we -# should switch entirely to this model. -#perls := $(shell find Debbugs -type f -iname '*.pm') +cgis := $(wildcard cgi/*.cgi) install_exec := install -m755 -p install_data := install -m644 -p @@ -32,6 +27,7 @@ all: build build: $(PERL) Makefile.PL $(MAKE) -f Makefile.perl + $(MAKE) -C html/logo test: LC_ALL=$(UTF8_LOCALE) $(PERL) -MTest::Harness -I. -e 'runtests(glob(q(t/*.t)))' @@ -49,7 +45,7 @@ clean: install: install_mostfiles # install basic debbugs documentation - $(install_data) COPYING UPGRADE README.md debian/README.mail $(doc_dir) + $(install_data) COPYING UPGRADE.md README.md debian/README.mail $(doc_dir) $(MAKE) -f Makefile.perl install DESTDIR=$(DESTDIR) install_mostfiles: @@ -60,12 +56,6 @@ $(var_dir)/www/css \ $(var_dir)/spool/lock $(var_dir)/spool/archive $(var_dir)/spool/incoming \ $(var_dir)/spool/db-h $(scripts_dir) $(examples_dir) $(man8_dir); \ do test -d $$dir || $(install_exec) -d $$dir; done -# we shouldn't ship db-h spool directories - # make db-h spool dirs if they don't exist -# cd $(var_dir)/spool/db-h; \ -# for dir in $(shell seq -w 00 99); \ -# do test -d $$dir || $(install_exec) -d $$dir; done - # install the scripts $(foreach script,$(scripts_in), $(install_exec) scripts/$(script) $(scripts_dir);) @@ -84,15 +74,10 @@ $(var_dir)/spool/db-h $(scripts_dir) $(examples_dir) $(man8_dir); \ $(foreach html, $(htmls_in), $(install_data) $(html) $(etc_dir)/html;) $(install_data) html/htaccess $(var_dir)/www/db/.htaccess $(install_data) html/bugs.css $(var_dir)/www/css/bugs.css + $(install_data) html/logo/debbugs_logo_icon.png $(var_dir)/www/favicon.png # install the CGIs for cgi in $(cgis); do $(install_exec) $$cgi $(var_dir)/www/cgi; done - $(install_exec) cgi/bugs-fetch2.pl $(var_dir)/www/cgi/bugs-fetch2.pl - -# # install Perl modules -# for perl in $(perls); do $(install_data) $$perl $(perl_dir); done - # Make documentation for the perl modules - # install debbugsconfig $(install_exec) debian/debbugsconfig $(sbin_dir) diff --git a/UPGRADE b/UPGRADE deleted file mode 100644 index b4ab626..0000000 --- a/UPGRADE +++ /dev/null @@ -1,170 +0,0 @@ - - Debbugs upgrade notes - +=====================+ - -From 2.4.1 to 2.4.2 -------------------- - -The file format used to store the status of a bug (package, severity, etc.) -has changed; it is now in an RFC822-like format in order to be more -extensible, and is written to .summary files rather than the old .status -files. Before accepting any mail with the new version of debbugs, you must -run the 'debbugs-upgradestatus' program over your bug spool. The old .status -files will be left intact, and will continue to be written in sync with the -.summary files for compatibility with external tools. - -There is a new standalone spam-scanning script called spamscan, which uses -the SpamAssassin modules. To use it, set the $gSpamScan variable in -/etc/debbugs/config to a true value and $gSpamMailbox to an mbox file to -which detected spam should be appended, add /usr/lib/debbugs/spamscan to -your crontab as per the example, and optionally set $gSpamRulesDir and -$gSpamLocalTestsOnly as desired. - -From 2.4 to 2.4.1 ------------------ - -Add the following variables to the /etc/debbugs/config file: - -$gHTMLSuffix = ".html"; - -The use of $gCGIDomain has been cleaned up; formerly, it needed to begin -with "http://", which was confusingly inconsistent with all the other domain -variables. If you worked around this in your configuration, you will need to -recheck it. - -From 2.3 to 2.4 ---------------- - -Add the following variables to the /etc/debbugs/config file: - -$gWebHost = "localhost"; # e.g. www.debian.org -$gWebHostBugDir = "Bugs"; # e.g. Bugs -# For now, don't change this one manually! -$gWebDomain = "$gWebHost/$gWebHostBugDir"; -$gCGIDomain = "$gWebDomain/Bugs/cgi"; # e.g. cgi.debian.org -$gPackagePages = "packages.debian.org"; # e.g. packages.debian.org -$gSubscriptionDomain = "packages.something"; # e.g. packages.qa.debian.org -$gMaintainerFileOverride = "$gConfigDir/Maintainers.override"; -$gUnknownMaintainerEmail = "$gMaintainerEmail"; -$gPackageSource = "$gConfigDir/indices/sources"; - -$gWebDomain will probably exist already; change it as shown above. - -$gSubscriptionDomain is optional. - -$gMaintainerFileOverride is the name of a file used to manually override the -Maintainers file (which is often automatically generated). - -$gUnknownMaintainerEmail is the address to mail when a bug report arrives -for a package with no maintainer in $gMaintainerFile or -$gMaintainerFileOverride. - -$gPackageSource is a file containing three tab-separated columns: package -name, component (e.g. main, contrib, non-free), and the corresponding source -package name. - -Add the following variable to the /etc/debbugs/text file: - -############################################################################ -# Description of the tags -############################################################################ -$gHTMLTagDesc = " -
patch -
A patch or some other easy procedure for fixing the $gBug is included in - the $gBug logs. If there\'s a patch, but it doesn\'t resolve the $gBug - adequately or causes some other problems, this tag should not be used. - -
wontfix -
This $gBug won\'t be fixed. Possibly because this is a choice between two - arbitrary ways of doing things and the maintainer and submitter prefer - different ways of doing things, possibly because changing the behaviour - will cause other, worse, problems for others, or possibly for other - reasons. - -
moreinfo -
This $gBug can\'t be addressed until more information is provided by the - submitter. The $gBug will be closed if the submitter doesn\'t provide ore - information in a reasonable (few months) timeframe. This is for $gBugs like - \"It doesn\'t work\". What doesn\'t work? - -
unreproducible -
This $gBug can\'t be reproduced on the maintainer\'s system. Assistance - from third parties is needed in diagnosing the cause of the problem. - -
fixed -
This $gBug is fixed or worked around, but there\'s still an issue that - needs to be resolved. (This will eventually replace the \"fixed\" severity) - -
stable -
This $gBug affects the stable distribution in particular. This is only - intended to be used for ease in identifying release critical $gBugs that - affect the stable distribution. It\'ll be replaced eventually with - something a little more flexible, probably. -"; - -The bug database is now stored in a hashed directory format (db-h). You -will need to migrate your database to this new format. The -/usr/sbin/debbugs-dbhash program is provided to help you perform this -migration. - -From 2.2 to 2.3 ---------------- - -There are three new scripts that have to be installed in CGI and the front -page (or any other search you have set up) needs to be changed to use these -scripts. They are: - * bugreport.cgi - * common.pl - * pkgreport.cgi - -Add the following variables to the /etc/debbugs/config file: -(the /usr/share/doc/debbugs/examples/config file can be used as a -reference) - -$gSummaryList = "summary.list"; #debian-bugs-report@lists -$gSaveOldBugs = 1; - -Make sure you do not have a double ,, as shown here if you're using the -default severities. Also, 'fixed' was added to the default severities: -- 'normal',"Normal $gBugs",, -+ 'normal',"Normal $gBugs", -+ 'fixed',"NMU Fixed $gBugs", - -These have been added to the /etc/debbugs/text file: -+############################################################################ -+# Here is a blurb to point people to ftp archive of directions. It is -+# used by the receive script when bouncing a badly formatted email -+# -+# $gTextInstructions = "$gBadEmailPrefix -+# $gBadEmailPrefix Instructions are available from ftp.debian.org in /debian -+# $gBadEmailPrefix and at all Debian mirror sites, in the files: -+# $gBadEmailPrefix doc/bug-reporting.txt -+# $gBadEmailPrefix doc/bug-log-access.txt -+# $gBadEmailPrefix doc/bug-maint-info.txt -+# $gBadEmailPrefix"; -+############################################################################ -+$gTextInstructions = "$gBadEmailPrefix"; -+ -+ - -$gHTMLStart = ""; #this is used by HTML generation to create the "uniform look" - -The following code was added to /etc/debbugs/text if you use the new fixed -severity - -
wishlist --
for any feature request, and also for any $gBugs that are very difficult -- to fix due to major design considerations."; -+
for any feature request, and also for any $gBugs that are very -+ difficult to fix due to major design considerations."; -+ -+
fixed -+
fixed in the current version in the unstable archive but the fix has -+ not been fixed by the person responsible. - - In All such entries in /etc/debbugs/text, if you replace with - $gHTMLStart, all html pages will have the same look (as specified in - $gHTMLStart): - - $gSummaryIndex = "$gProject $gBug report logs - summary index - $gPackageLog = "$gProject $gBug report logs - index by package diff --git a/UPGRADE.md b/UPGRADE.md new file mode 100644 index 0000000..62a7bd4 --- /dev/null +++ b/UPGRADE.md @@ -0,0 +1,184 @@ +# Debbugs upgrade notes # + +## From 2.4.2 to 2.6 ## + +Debbugs configuration file now sets default values for all configuration file +options, so if you're upgrading from earlier versions, you do not need to +specify values for the new configuration files. + +### Templates ### + +Debbugs now uses Text::Template for templates, and any of the existing templates +can be overridden by creating a new directory and setting `$gTemplateDir` to the +new directory. + +## From 2.4.1 to 2.4.2 ## + +The file format used to store the status of a bug (package, severity, etc.) +has changed; it is now in an RFC822-like format in order to be more +extensible, and is written to .summary files rather than the old .status +files. Before accepting any mail with the new version of debbugs, you must +run the 'debbugs-upgradestatus' program over your bug spool. The old .status +files will be left intact, and will continue to be written in sync with the +.summary files for compatibility with external tools. + +There is a new standalone spam-scanning script called spamscan, which uses +the SpamAssassin modules. To use it, set the `$gSpamScan` variable in +`/etc/debbugs/config` to a true value and `$gSpamMailbox` to an mbox file to +which detected spam should be appended, add /usr/lib/debbugs/spamscan to +your crontab as per the example, and optionally set `$gSpamRulesDir` and +`$gSpamLocalTestsOnly` as desired. + +## From 2.4 to 2.4.1 ## + +Add the following variables to the /etc/debbugs/config file: + +`$gHTMLSuffix = ".html";` + +The use of `$gCGIDomain` has been cleaned up; formerly, it needed to begin +with "http://", which was confusingly inconsistent with all the other domain +variables. If you worked around this in your configuration, you will need to +recheck it. + +## From 2.3 to 2.4 ## + +Add the following variables to the /etc/debbugs/config file: + +```perl +$gWebHost = "localhost"; # e.g. www.debian.org +$gWebHostBugDir = "Bugs"; # e.g. Bugs +# For now, don't change this one manually! +$gWebDomain = "$gWebHost/$gWebHostBugDir"; +$gCGIDomain = "$gWebDomain/Bugs/cgi"; # e.g. cgi.debian.org +$gPackagePages = "packages.debian.org"; # e.g. packages.debian.org +$gSubscriptionDomain = "packages.something"; # e.g. packages.qa.debian.org +$gMaintainerFileOverride = "$gConfigDir/Maintainers.override"; +$gUnknownMaintainerEmail = "$gMaintainerEmail"; +$gPackageSource = "$gConfigDir/indices/sources"; +``` + +`$gWebDomain` will probably exist already; change it as shown above. + +`$gSubscriptionDomain` is optional. + +`$gMaintainerFileOverride is the name of a file used to manually override the +Maintainers file (which is often automatically generated). + +`$gUnknownMaintainerEmail` is the address to mail when a bug report arrives +for a package with no maintainer in `$gMaintainerFile` or +`$gMaintainerFileOverride`. + +`$gPackageSource` is a file containing three tab-separated columns: package +name, component (e.g. main, contrib, non-free), and the corresponding source +package name. + +Add the following variable to the `/etc/debbugs/text` file: + +``` +############################################################################ +# Description of the tags +############################################################################ +`$gHTMLTagDesc = " +
patch +
A patch or some other easy procedure for fixing the `$gBug is included in + the `$gBug logs. If there\'s a patch, but it doesn\'t resolve the `$gBug + adequately or causes some other problems, this tag should not be used. + +
wontfix +
This `$gBug won\'t be fixed. Possibly because this is a choice between two + arbitrary ways of doing things and the maintainer and submitter prefer + different ways of doing things, possibly because changing the behaviour + will cause other, worse, problems for others, or possibly for other + reasons. + +
moreinfo +
This `$gBug can\'t be addressed until more information is provided by the + submitter. The `$gBug will be closed if the submitter doesn\'t provide ore + information in a reasonable (few months) timeframe. This is for `$gBugs like + \"It doesn\'t work\". What doesn\'t work? + +
unreproducible +
This `$gBug can\'t be reproduced on the maintainer\'s system. Assistance + from third parties is needed in diagnosing the cause of the problem. + +
fixed +
This `$gBug is fixed or worked around, but there\'s still an issue that + needs to be resolved. (This will eventually replace the \"fixed\" severity) + +
stable +
This `$gBug affects the stable distribution in particular. This is only + intended to be used for ease in identifying release critical `$gBugs that + affect the stable distribution. It\'ll be replaced eventually with + something a little more flexible, probably. +"; +``` + +The bug database is now stored in a hashed directory format (db-h). You +will need to migrate your database to this new format. The +`/usr/sbin/debbugs-dbhash` program is provided to help you perform this +migration. + +## From 2.2 to 2.3 ## + +There are three new scripts that have to be installed in CGI and the front +page (or any other search you have set up) needs to be changed to use these +scripts. They are: + * bugreport.cgi + * common.pl + * pkgreport.cgi + +Add the following variables to the /etc/debbugs/config file: +(the /usr/share/doc/debbugs/examples/config file can be used as a +reference) + +```perl +`$gSummaryList = "summary.list"; #debian-bugs-report@lists +`$gSaveOldBugs = 1; +``` + +Make sure you do not have a double ,, as shown here if you're using the +default severities. Also, 'fixed' was added to the default severities: +- 'normal',"Normal `$gBugs",, ++ 'normal',"Normal `$gBugs", ++ 'fixed',"NMU Fixed $gBugs", + +These have been added to the /etc/debbugs/text file: +``` ++############################################################################ ++# Here is a blurb to point people to ftp archive of directions. It is ++# used by the receive script when bouncing a badly formatted email ++# ++# $gTextInstructions = "$gBadEmailPrefix ++# $gBadEmailPrefix Instructions are available from ftp.debian.org in /debian ++# $gBadEmailPrefix and at all Debian mirror sites, in the files: ++# $gBadEmailPrefix doc/bug-reporting.txt ++# $gBadEmailPrefix doc/bug-log-access.txt ++# $gBadEmailPrefix doc/bug-maint-info.txt ++# $gBadEmailPrefix"; ++############################################################################ ++$gTextInstructions = "$gBadEmailPrefix"; ++ ++ +``` + +`$gHTMLStart = ""; #this is used by HTML generation to create the "uniform look"` + +The following code was added to /etc/debbugs/text if you use the new fixed +severity +``` +
wishlist +-
for any feature request, and also for any $gBugs that are very difficult +- to fix due to major design considerations."; ++
for any feature request, and also for any $gBugs that are very ++ difficult to fix due to major design considerations."; ++ ++
fixed ++
fixed in the current version in the unstable archive but the fix has ++ not been fixed by the person responsible. +``` + In All such entries in /etc/debbugs/text, if you replace with + `$gHTMLStart`, all html pages will have the same look (as specified in + `$gHTMLStart`): + + `$gSummaryIndex = "$gProject $gBug report logs - summary index` + `$gPackageLog = "$gProject $gBug report logs - index by package` diff --git a/bin/debbugs-spam b/bin/debbugs-spam new file mode 100755 index 0000000..09077e0 --- /dev/null +++ b/bin/debbugs-spam @@ -0,0 +1,430 @@ +#! /usr/bin/perl +# debbugs-spam is part of debbugs, and is released +# under the terms of the GPL version 2, or any later version, at your +# option. See the file README and COPYING for more information. +# Copyright 2012 by Don Armstrong . + + +use warnings; +use strict; + +use Getopt::Long qw(:config no_ignore_case); +use Pod::Usage; + +=head1 NAME + +debbugs-spam -- Scan log files for spam and populate nnn.log.spam + +=head1 SYNOPSIS + +debbugs-spam [options] bugnumber [[bugnumber2]..] + + Options: + --spool-dir debbugs spool directory + --debug, -d debugging level (Default 0) + --help, -h display this help + --man, -m display manual + +=head1 OPTIONS + +=over + +=item B<--spool-dir> + +Debbugs spool directory; defaults to the value configured in the +debbugs configuration file. + +=item B<--debug, -d> + +Debug verbosity. + +=item B<--help, -h> + +Display brief useage information. + +=item B<--man, -m> + +Display this manual. + +=back + +=head1 SUBCOMMANDS + +=over + +=item B + +Automatically scan messages using spamassassin and mark messages as +spam which hit the threshold, and those that are highly negative as +ham. + +=item B + +Output the score of all of the messages in a bug + +=over + +=item B<--skip-seen> Skip messages which have previously been classified + +=back + +=item B + +Mark messages as spam if there is a regex match to subject or message +id + +=item B + +Mark messages as ham if there is a regex match to subject or message +id + +=item B + +Learn from messages which are ham/spam + +=back + + +=head1 EXAMPLES + +Start spamd: + + /usr/sbin/spamd --socketpath=/home/debbugs/spamd_socket \ + --nouser-config --cf='include /home/debbugs/.spamassassin/user_prefs' \ + --cf='allow_user_rules 1' --allow-tell; + +Then score bugs: + + debbugs-spam --spamc-opts '-U' --spamc-opts '/home/debbugs/spamd_socket' \ + score 859123; + +=cut + + +use vars qw($DEBUG); + +use Debbugs::Log qw(record_regex); +use Debbugs::Log::Spam; +use Debbugs::Config qw(:config); +use Debbugs::Command qw(:all); +use IPC::Open3 qw(open3); +use Carp; + +my %options = + (debug => 0, + help => 0, + man => 0, + verbose => 0, + quiet => 0, + quick => 0, + spamc => 'spamc', + spamc_opts => [], + ); + +handle_main_arguments(\%options, + 'quick|q', + 'service|s', + 'sysconfdir|c', + 'spamc=s' => 0, + 'spamc_opts|spamc-opts=s@' => 0, + 'spool_dir|spool-dir=s', + 'debug|d+','help|h|?','man|m'); + +my %subcommands = + ('auto-scan' => {function => \&auto_spamscan, + arguments => {'ham_threshold|ham-threshold=s' => 0, + }, + defaults => {ham_threshold => -5}, + }, + 'score' => {function => \&score_bug, + arguments => {'skip_seen|skip-seen!' => 0 + }, + }, + 'mark-spam' => {function => \&mark_spam, + }, + 'mark-ham' => {function => \&mark_ham, + }, + 'learn' => {function => \&learn, + }, + 'help' => {function => sub {pod2usage({verbose => 2});}} + ); + +pod2usage() if $options{help}; +pod2usage({verbose=>2}) if $options{man}; + +$DEBUG = $options{debug}; + +my @USAGE_ERRORS; +$options{verbose} = $options{verbose} - $options{quiet}; + +pod2usage(join("\n",@USAGE_ERRORS)) if @USAGE_ERRORS; + +my ($subcommand) = shift @ARGV; +if (not defined $subcommand) { + $subcommand = 'help'; + print STDERR "You must provide a subcommand; displaying usage.\n"; + pod2usage(); +} elsif (not exists $subcommands{$subcommand}) { + print STDERR "$subcommand is not a valid subcommand; displaying usage.\n"; + pod2usage(); +} + +if (exists $options{spool_dir} and defined $options{spool_dir}) { + $config{spool_dir} = $options{spool_dir}; +} +if ($subcommand ne 'help') { + chdir($config{spool_dir}) or die "chdir $config{spool_dir} failed: $!"; +} +my $opts = + handle_subcommand_arguments(\@ARGV, + $subcommands{$subcommand}{arguments}, + $subcommands{$subcommand}{defaults}, + ); +$subcommands{$subcommand}{function}->(\%options,$opts,\%config,\@ARGV); + + +sub mark_ham { + mark_it('ham',@_); +} + +sub mark_spam { + mark_it('spam',@_); +} + +sub mark_it { + my ($spam_ham,$options,$opts,$config,$argv) = @_; + my $regex = shift @{$argv}; + for my $bug_num (@{$argv}) { + my $spam = Debbugs::Log::Spam->new(bug_num => $bug_num) or + die "Unable to open bug log spam for $bug_num"; + foreachmsg(sub { + my ($bn,$rec,$mid) = @_; + my $body = $rec->{text}; + my ($subject) = $body =~ /^Subject: *(.+)$/mi; + my $is_match = 0; + if ($subject =~ /$regex/) { + $is_match = 1; + } + if ($mid =~ /$regex/) { + $is_match = 1; + } + if ($is_match) { + print STDERR "it's a match" if $DEBUG; + if ($spam_ham eq 'spam') { + $spam->add_spam($mid); + } else { + $spam->add_ham($mid); + } + } + }, + $bug_num + ); + $spam->save(); + } +} + +sub learn { + my ($options,$opts,$config,$argv) = @_; + for my $bug_num (@{$argv}) { + my $spam = Debbugs::Log::Spam->new(bug_num => $bug_num) or + die "Unable to open bug log spam for $bug_num"; + foreachmsg(sub { + my ($bn,$rec,$mid) = @_; + my $score; + if ($spam->is_spam($mid)) { + $score //= + spam_score($rec,$options->{spamc}, + [@{$options->{spamc_opts}}, + '-L','spam' + ] + ); + print STDERR "learning spam" if $DEBUG; + } elsif ($spam->is_ham($mid)) { + $score //= + spam_score($rec,$options->{spamc}, + [@{$options->{spamc_opts}}, + '-L','ham' + ] + ); + print STDERR "learning ham" if $DEBUG; + } else { + print STDERR "not learning" if $DEBUG; + } + print STDERR " from $mid" if $DEBUG; + }, + $bug_num + ); + } +} + + +sub score_bug { + my ($options,$opts,$config,$argv) = @_; + for my $bug_num (@{$argv}) { + my @bug_score = + spam_score_bug($bug_num, + $options->{spamc}, + $options->{spamc_opts}, + $opts->{skip_seen}, + ); + print "$_->{score} $_->{message_id} $_->{subject}\n" + foreach @bug_score; + } +} + +sub auto_spamscan { + my ($options,$opts,$config,$argv) = @_; + + for my $bug_num (@{$argv}) { + my $spam = Debbugs::Log::Spam->new(bug_num => $bug_num) or + die "Unable to open bug log spam for $bug_num"; + foreachmsg(sub { + my ($bn,$rec,$mid) = @_; + if ($spam->is_spam($mid)) { + print STDERR "already spam\n" if $DEBUG; + return; + } + if ($spam->is_ham($mid)) { + print STDERR "already ham\n" if $DEBUG; + return; + } + my ($score,$is_spam,$report,$threshold) = + spam_score($rec, + $options->{spamc}, + $options->{spamc_opts}, + ); + if ($is_spam) { + print STDERR "it's spam ($score)\n" if $DEBUG; + $spam->add_spam($mid); + } elsif ($score < $opts->{ham_threshold}) { + print STDERR "it's really ham ($score)\n" if $DEBUG; + $spam->add_ham($mid); + } + else { + print STDERR "it's ham ($score)\n" if $DEBUG; + } + }, + $bug_num, + ); + $spam->save(); + } +} + +sub spam_score_bug { + my ($bug,$spamc,$spamc_opts,$skip_seen) = @_; + + my $spam; + if ($skip_seen) { + $spam = Debbugs::Log::Spam->new(bug_num => $bug) or + die "Unable to open bug log spam for $bug"; + } + my @records; + foreachmsg(sub { + my ($bn,$rec,$mid) = @_; + my $score; + if ($skip_seen) { + if ($spam->is_spam($mid)) { + $score = 999; + } elsif ($spam->is_ham($mid)) { + $score = -999; + } + } + $score //= + spam_score($rec,$spamc,$spamc_opts); + my ($subject) = $rec->{text} =~ /^Subject: *(.+)$/mi; + push @records, + {message_id => $mid, + score => $score, + subject => $subject, + }; + }, + $bug + ); + return @records; +} + +sub spam_score { + my ($record,$spamc,$spamc_opts) = @_; + my ($score,$threshold,$report); + my $is_spam = 0; + eval { + $report = ''; + $score = 0; + $threshold = 5; + my ($spamc_in,$spamc_out); + my $old_sig = $SIG{"PIPE"}; + $SIG{"PIPE"} = sub { + die "SIGPIPE in child for some reason"; + }; + my $childpid = + open3($spamc_in,$spamc_out,0, + $spamc,'-E','--headers',@{$spamc_opts}) or + die "Unable to fork spamc: $!"; + if (not $childpid) { + die "Unable to fork spamc"; + } + print {$spamc_in} $record->{text}; + close($spamc_in) or die "Unable to close spamc_in: $!"; + waitpid($childpid,0); + my $exit_code = $? >> 8; + if ($exit_code) { + $is_spam = 1; + } + while (<$spamc_out>) { + if (/^X-Spam/) { + $report .= $_; + if (/^X-Spam-Status: (Yes|No), score=(-?[\d\.]+) required=(-?[\d\.]+)/) { + $threshold = $3; + $score = $2; + } + } + if (/^\s*$/) { + last; + } + } + if ($DEBUG) { + print STDERR "[$exit_code] [$score/$threshold]\n$report\n"; + } + close($spamc_out); + $SIG{"PIPE"} = $old_sig; + }; + if ($@) { + carp "processing of message failed [$@]\n"; + return undef; + } + return wantarray?($score,$is_spam,$report):$score; +} + +sub foreachmsg { + my ($sub,$bug_num) = @_; + my $log = Debbugs::Log->new(bug_num => $bug_num) or + die "Unable to open bug log for $bug_num"; + my %seen_msgids; + while (my $record = $log->read_record()) { + next if $record->{type} eq 'html'; + next if $record->{type} eq 'autocheck'; + my ($msg_id) = record_regex($record, + qr/^Message-Id:\s+<(.+)>/mi); + next unless defined $msg_id; + print STDERR "examining $msg_id: " if $DEBUG; + if ($msg_id =~ /$config{email_domain}$/) { + print STDERR "skipping\n" if $DEBUG; + next; + } + if ($seen_msgids{$msg_id}) { + print STDERR "already seen\n" if $DEBUG; + next; + } + $seen_msgids{$msg_id}=1; + $sub->($bug_num,$record,$msg_id); + print STDERR "\n" if $DEBUG; + } +} + + +__END__ + +# Local Variables: +# cperl-indent-level: 4 +# indent-tabs-mode: nil +# End: diff --git a/bin/debbugs-spamscan-log b/bin/debbugs-spamscan-log deleted file mode 100755 index 08e7526..0000000 --- a/bin/debbugs-spamscan-log +++ /dev/null @@ -1,189 +0,0 @@ -#! /usr/bin/perl -# debbugs-spamscan-log is part of debbugs, and is released -# under the terms of the GPL version 2, or any later version, at your -# option. See the file README and COPYING for more information. -# Copyright 2012 by Don Armstrong . - - -use warnings; -use strict; - -use Getopt::Long qw(:config no_ignore_case); -use Pod::Usage; - -=head1 NAME - -debbugs-spamscan-log -- Scan log files for spam and populate nnn.log.spam - -=head1 SYNOPSIS - -debbugs-spamscan-log [options] bugnumber [[bugnumber2]..] - - Options: - --spool-dir debbugs spool directory - --debug, -d debugging level (Default 0) - --help, -h display this help - --man, -m display manual - -=head1 OPTIONS - -=over - -=item B<--spool-dir> - -Debbugs spool directory; defaults to the value configured in the -debbugs configuration file. - -=item B<--debug, -d> - -Debug verbosity. - -=item B<--help, -h> - -Display brief useage information. - -=item B<--man, -m> - -Display this manual. - -=back - -=head1 EXAMPLES - -Rebuild the index.db for db-h. - - debbugs-spamscan-log; - -Rebuild the index.db for archive - - debbugs-spamscan-log archive; - - -=cut - - -use vars qw($DEBUG); - -use Debbugs::Log qw(record_regex); -use Debbugs::Log::Spam; -use Debbugs::Config qw(:config); -use IPC::Open3 qw(open3); - -my %options = - (debug => 0, - help => 0, - man => 0, - verbose => 0, - quiet => 0, - quick => 0, - spamc => 'spamc', - spamc_opts => [], - ); - - -GetOptions(\%options, - 'quick|q', - 'service|s', - 'sysconfdir|c', - 'spool_dir|spool-dir=s', - 'spamc=s', - 'spamc_opts|spamc-opts=s@', - 'debug|d+','help|h|?','man|m'); - -pod2usage() if $options{help}; -pod2usage({verbose=>2}) if $options{man}; - -$DEBUG = $options{debug}; - -my @USAGE_ERRORS; -$options{verbose} = $options{verbose} - $options{quiet}; - -if (not @ARGV) { - push @USAGE_ERRORS, - "You must provide a bug number to examine\n"; -} - -pod2usage(join("\n",@USAGE_ERRORS)) if @USAGE_ERRORS; - -if (exists $options{spool_dir} and defined $options{spool_dir}) { - $config{spool_dir} = $options{spool_dir}; -} -chdir($config{spool_dir}) or die "chdir $config{spool_dir} failed: $!"; - -for my $bug_num (@ARGV) { - my $log = Debbugs::Log->new(bug_num => $bug_num) or - die "Unable to open bug log for $bug_num"; - my $spam = Debbugs::Log::Spam->new(bug_num => $bug_num) or - die "Unable to open bug log spam for $bug_num"; - - my %seen_msgids; - while (my $record = $log->read_record()) { - next if $record->{type} eq 'html'; - next if $record->{type} eq 'autocheck'; - my ($msg_id) = record_regex($record, - qr/^Message-Id:\s+<(.+)>/mi); - next unless defined $msg_id; - if ($msg_id =~ /$config{email_domain}$/) { - print STDERR "skipping $msg_id\n" if $DEBUG; - next; - } - print STDERR "examining $msg_id: " if $DEBUG; - if ($seen_msgids{$msg_id}) { - print STDERR "already seen\n" if $DEBUG; - next; - } - $seen_msgids{$msg_id}=1; - if ($spam->is_spam($msg_id)) { - print STDERR "already spam\n" if $DEBUG; - next; - } - my $is_spam; - eval { - my ($spamc,$child_out); - my $old_sig = $SIG{"PIPE"}; - $SIG{"PIPE"} = sub { - die "SIGPIPE in child for some reason"; - }; - my $childpid = - open3($spamc,$child_out,0, - $options{spamc},'-E',@{$options{spamc_opts}}) or - die "Unable to fork spamc: $!"; - if (not $childpid) { - die "Unable to fork spamc"; - } - print {$spamc} $record->{text}; - close($spamc) or die "Unable to close spamc: $!"; - waitpid($childpid,0); - if ($DEBUG) { - print STDERR "[$?;".($? >> 8)."] "; - print STDERR map {s/\n//; $_ } <$child_out>; - print STDERR " "; - } - close($child_out); - $SIG{"PIPE"} = $old_sig; - if ($? >> 8) { - $is_spam = 1; - } - }; - if ($@) { - print STDERR "processing of $msg_id failed [$@]\n"; - } else { - if ($is_spam) { - print STDERR "it's spam\n" if $DEBUG; - $spam->add_spam($msg_id); - } - else { - print STDERR "it's ham\n" if $DEBUG; - } - } - } - $spam->save(); -} - - -__END__ - -# Local Variables: -# cperl-indent-level: 4 -# indent-tabs-mode: nil -# End: diff --git a/bin/local-debbugs b/bin/local-debbugs index 4825923..3e397f3 100755 --- a/bin/local-debbugs +++ b/bin/local-debbugs @@ -204,12 +204,12 @@ if ($options{daemon}) { \$gSpoolDir = "$options{mirror_location}"; \$gTemplateDir = "$options{template_dir}"; \$gWebHost = 'localhost:$options{port}'; -\$gPackageSource = ''; +\$gPackageSource = '$options{mirror_location}/sources'; \$gPseudoDescFile = ''; \$gPseudoMaintFile = ''; -\$gMaintainerFile = ''; +\$gMaintainerFile = '$options{mirror_location}/Maintainers'; \$gMaintainerFileOverride = ''; -\$config{source_maintainer_file} = ''; +\$config{source_maintainer_file} = '$options{mirror_location}/Source_maintainers'; \$config{source_maintainer_file_override} = ''; \$gProject = 'Local Debbugs'; 1; diff --git a/debian/changelog b/debian/changelog index ab0d792..4fcec4d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,11 @@ -debbugs (2.6.0~exp1) UNRELEASED; urgency=low +debbugs (3.0.0~alpha.1) unstable; urgency=medium + + * Use Text::Xslate instead of Text::Template; Text::Xslate is significantly + faster. + + -- Don Armstrong Fri, 09 Mar 2018 11:17:10 -0800 + +debbugs (2.6.0) unstable; urgency=medium [ Don Armstrong ] * Hack around elinks css bug (closes: #593804) @@ -61,6 +68,15 @@ debbugs (2.6.0~exp1) UNRELEASED; urgency=low Thanks to Julien Cristau * Use pass-through for rewrites of URLs to hide implementation (Closes: #871784) Thanks to Ridier 'OdyX' Raboud + * Use foo instead of bar@baz.com (foo) for From: (Closes: + #881903). Thanks to Michael Stapelberg. + * Add rel="canonical" links to bug pages (Closes: #890338). Thanks to Chris + Lamb. + * Fix blocks/blockedby of archived bugs (Closes: #892060). Thanks to Laurent Bigonville. + * Provide informative error message when unarchive fails because the bug is + not archived. (Closes: #892135). Thanks to Dan Jacobson. + * Update standards version to 4.1.3; add Testsuite, fix Homepage and git repos + links, update priority. [ Niels Thykier ] * quitcgi() now returns 400/500 status codes instead of 200 (Closes: #584922) diff --git a/debian/control b/debian/control index 7729153..0226f70 100644 --- a/debian/control +++ b/debian/control @@ -1,24 +1,26 @@ Source: debbugs Section: misc -Priority: extra +Priority: optional Maintainer: Debbugs developers Uploaders: Colin Watson , Don Armstrong -Standards-Version: 3.9.4 -Vcs-Browser: http://bugs.debian.org/debbugs-source/mainline -Vcs-Git: http://bugs.debian.org/debbugs-source/debbugs.git +Standards-Version: 4.1.3 +Vcs-Browser: https://salsa.debian.org/debbugs-team/debbugs +Vcs-Git: https://salsa.debian.org/debbugs-team/debbugs.git Build-Depends: debhelper (>= 9) Build-Depends-Indep: libparams-validate-perl, libmailtools-perl, libmime-tools-perl, libio-stringy-perl, libmldbm-perl, liburi-perl, libsoap-lite-perl, libcgi-simple-perl, libhttp-server-simple-perl, libtest-www-mechanize-perl, - libmail-rfc822-address-perl, libsafe-hole-perl, libuser-perl, + libmail-rfc822-address-perl, libuser-perl, libconfig-simple-perl, libtest-pod-perl, liblist-allutils-perl, libfile-libmagic-perl, libgravatar-url-perl, libwww-perl, imagemagick, - libdbix-class-perl, libdatetime-format-pg-perl, + libdbix-class-perl, libdatetime-format-pg-perl, libtest-postgresql-perl, libdatetime-format-mail-perl, - libtext-template-perl, graphviz, libtext-iconv-perl, libnet-server-perl, - libtest-postgresql-perl -Homepage: http://wiki.debian.org/Teams/Debbugs + libtext-xslate-perl, graphviz, libtext-iconv-perl, libnet-server-perl, +# used to make the logo + inkscape +Homepage: https://salsa.debian.org/debbugs-team +Testsuite: autopkgtest-pkg-perl Package: debbugs Architecture: all @@ -45,12 +47,11 @@ Architecture: all Depends: ${misc:Depends}, ${perl:Depends}, libmailtools-perl, ed, libmime-tools-perl, libio-stringy-perl, libmldbm-perl, liburi-perl, libsoap-lite-perl, - libcgi-simple-perl, libparams-validate-perl, libtext-template-perl, - libsafe-hole-perl, libmail-rfc822-address-perl, liblist-moreutils-perl, - libtext-template-perl, - # used by Debbugs::Libravatar and libravatar.cgi - libfile-libmagic-perl, - libgravatar-url-perl, libwww-perl, imagemagick, + libcgi-simple-perl, libparams-validate-perl, libtext-xslate-perl, + libmail-rfc822-address-perl, liblist-allutils-perl, + graphviz, libtext-iconv-perl, libuser-perl, +# used by Debbugs::Libravatar and libravatar.cgi + libfile-libmagic-perl, libgravatar-url-perl, libwww-perl, imagemagick # used by the database libdatetime-format-mail-perl, libdbix-class-perl, libdatetime-format-pg-perl Section: perl diff --git a/debian/copyright b/debian/copyright index 7ba7507..56f304b 100644 --- a/debian/copyright +++ b/debian/copyright @@ -14,7 +14,7 @@ Former developers have been: Darren Benham The sources can be obtained by: - bzr get http://bugs.debian.org/debbugs-source/mainline + git clone https://salsa.debian.org/debbugs-team/debbugs.git Copyright 1994-1997 Ian Jackson Copyright 1997,2003 nCipher Corporation Limited diff --git a/examples/debian/versions/build-versions-db b/examples/debian/versions/build-versions-db index 3098587..6d22696 100755 --- a/examples/debian/versions/build-versions-db +++ b/examples/debian/versions/build-versions-db @@ -187,26 +187,37 @@ for my $suite (@{$suites}) { my $suitedir = "$toplevel/$suite"; for my $component ('main', 'main/debian-installer', - 'contrib', 'non-free') { + 'contrib', 'contrib/debian-installer', + 'non-free', 'non-free/debian-installer', + ) { my $componentdir = "$suitedir/$component"; - next unless -d $componentdir; + if (not -d $componentdir) { + print STDERR "No directory $suitedir/$component\n" if $DEBUG; + next; + } my $COMPONENT; opendir $COMPONENT, $componentdir or die "opendir $componentdir: $!"; # debian-installer is really a section rather than a component # (ugh). - (my $viscomponent = $component) =~ s[/.*][]; - - my $sources = (grep { -f $_ } glob "$suitedir/$component/source/Sources.*")[0]; - next unless defined $sources; - read_packages($db,$db2,$sources, $viscomponent,'source',$suite); - + my $viscomponent = $component; + $viscomponent =~ s[/.*][]; + + my $sources = (grep { -f $_ } glob "$componentdir/source/Sources.*")[0]; + if (not defined $sources) { + print STDERR "No sources matching $componentdir/source/Sources.*\n" if $DEBUG; + } else { + read_packages($db,$db2,$sources, $viscomponent,'source',$suite); + } for my $arch (readdir $COMPONENT) { next unless $arch =~ s/^binary-//; my $archdir = "$componentdir/binary-$arch"; my $packages = (grep { -f $_ } glob("$archdir/Packages.*"))[0]; - next unless defined $packages; + if (not defined $packages) { + print STDERR "No binary packages matching $archdir/Packages.*\n" if $DEBUG; + next; + } read_packages($db,$db2,$packages, $viscomponent,$arch,$suite); } diff --git a/examples/debian/versions/merge-one-version b/examples/debian/versions/merge-one-version index 7be6f38..ac4a54a 100755 --- a/examples/debian/versions/merge-one-version +++ b/examples/debian/versions/merge-one-version @@ -1,12 +1,14 @@ #! /usr/bin/perl -w -use vars qw($gVersionPackagesDir); -require '/etc/debbugs/config'; -my $root = $gVersionPackagesDir; +use warnings; use strict; + +use Debbugs::Config qw(:config); use Debbugs::Versions; use Debbugs::Versions::Dpkg; +my $root = $config{version_packages_dir}; + unless (-d $root) { mkdir $root or die "can't mkdir $root: $!\n"; diff --git a/future_directions b/future_directions deleted file mode 100644 index 2aad806..0000000 --- a/future_directions +++ /dev/null @@ -1,49 +0,0 @@ -Here are outlined some of the future directions for the debbugs -codebase and things that should be done. - -PACKAGE CLEANUP - -* Stop doing the .in -> foo translation - - We no longer do this -* Use ExtUtils::Makemaker instead of a custom makefile - - We use Makemaker for the easy perl bits -* More testing of modules so it's not so easy to break things - - -GENERAL ORGANIZATIONAL CLEANUP - -* Modularization - * use of strict and warnings everywhere - * Split out errorlib and common.pl; stop requiring stuff - * Use CGI::Simple, URI, and Params::Validate instead of our own - versions - -* Configuration Module - * Allow for multiple debbugs configurations; easy overriding of values - * Possibly implemented using Config::General (maybe Config::Simple?) - with hack to allow for backwards compatibility - - The backwards compatibility hack is now fully implemented, a - decision on a configuration system just needs to be made. - -* Separation of Output forms from the code - * Use Text::Template to do this; it's simple, we don't lose - flexibility if we need it - -* Bring back all of the helper scripts into the bzr repository and - document the setup of Debian's bts - -FEATURES - -* Full text searching -- using Hyper Estraier (in progress on merkel) - * See Debbugs::Estraier - -* CGI Options enable/disable forms - -* Better display of bugs in bug lists - - Display subsidiary bugs: merged bugs, block bugs, etc. - -* Archiving [display of applicable bugs even if they are archived] - -BUG FIXING - -* ... \ No newline at end of file diff --git a/html/bugs.css b/html/bugs.css index 1fb0198..7bddb10 100644 --- a/html/bugs.css +++ b/html/bugs.css @@ -53,25 +53,12 @@ a:link:hover, a:visited:hover { color: #d81e1e; } -.link { +.link, .link abbr, .link abbr:hover { color: #1b56ce; font-weight: bold; text-decoration: underline; } -.link abbr { - color: #1b56ce; - font-weight: bold; - text-decoration: underline; -} - -.link abbr:hover { - color: #1b56ce; - font-weight: bold; - text-decoration: underline; -} - - .link span:hover { color: #d81e1e; } @@ -138,16 +125,7 @@ div.headers { overflow: auto; } -div.header { - font-family: sans-serif; - font-size: 95%; - color: #3c3c3c; - padding: 0px; - line-height: 120%; - margin: 0px; -} - -div.headers p { +div.header, div.headers p { font-family: sans-serif; font-size: 95%; color: #3c3c3c; @@ -186,17 +164,12 @@ pre.mime { color: #686868; } -.msgreceived p { +.msgreceived p, p.msgreceived { width: 120ch; margin-top: 0px; margin-bottom: 0px; } -p.msgreceived { - width: 120ch; - margin-top: 0px; - margin-bottom: 0px; -} .buginfo p { diff --git a/html/logo/.gitignore b/html/logo/.gitignore new file mode 100644 index 0000000..5cde14c --- /dev/null +++ b/html/logo/.gitignore @@ -0,0 +1 @@ +debbugs_logo_icon.png diff --git a/html/logo/Makefile b/html/logo/Makefile new file mode 100644 index 0000000..82ceaab --- /dev/null +++ b/html/logo/Makefile @@ -0,0 +1,16 @@ +#!/usr/bin/make -f + +all: debbugs_logo.svg debbugs_logo_icon.png + +## if you want to modify debbugs_logo.svg do the modifications to +## debbugs_logo_orig.svg, and then run make update_debbugs_logo and check the +## changes in. +update_debbugs_logo: debbugs_logo_orig.svg + inkscape --without-gui \ + --export-text-to-path --export-plain-svg debbugs_logo.svg $<; + +debbugs_logo_icon.png: debbugs_logo.svg + inkscape --without-gui \ + --export-width 32 --export-height 32 \ + --export-background=white \ + --export-png $@ $< diff --git a/html/logo/debbugs_logo.svg b/html/logo/debbugs_logo.svg new file mode 100644 index 0000000..022165a --- /dev/null +++ b/html/logo/debbugs_logo.svg @@ -0,0 +1,161 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/logo/debbugs_logo_orig.svg b/html/logo/debbugs_logo_orig.svg new file mode 100644 index 0000000..4b34e9e --- /dev/null +++ b/html/logo/debbugs_logo_orig.svg @@ -0,0 +1,175 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + Debbugs + 🐜🐛🐞 + + + diff --git a/scripts/process b/scripts/process index 3eba1fc..3da8f98 100755 --- a/scripts/process +++ b/scripts/process @@ -34,6 +34,7 @@ use Debbugs::Control qw(append_action_to_log); use Debbugs::Control::Service qw(valid_control control_line); use Debbugs::Recipients qw(determine_recipients); use Encode qw(encode_utf8 decode); +use List::AllUtils qw(first uniqnum); =head1 NAME @@ -312,7 +313,7 @@ if (defined $tryref) { $ref= $tryref; } else { &sendmessage(create_mime_message( - [From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + [From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, Subject => "Unknown problem report $gBug#$tryref ($subject)", 'Message-ID' => "", @@ -403,7 +404,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') } if ($ref<0) { &sendmessage(create_mime_message( - [From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + [From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, Subject => "Message with no $gBug number ignored by $receivedat ($subject)", 'Message-ID' => "", @@ -495,7 +496,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') &htmllog("Reply","sent",$replyto,"You have marked $gBug as forwarded."); &sendmessage(create_mime_message( [@common_headers, - From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => "$replyto", Subject => "$gBug#$ref: marked as forwarded ($data->{subject})", "Message-ID" => "", @@ -520,7 +521,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') &htmllog("Reply","sent",$replyto,"You have taken responsibility."); &sendmessage(create_mime_message( [@common_headers, - From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, Subject => "$gBug#$ref: marked as done ($data->{subject})", "Message-ID" => "", @@ -546,7 +547,7 @@ if ($codeletter eq 'D' || $codeletter eq 'F') "$gBug acknowledged by developer."); &sendmessage(create_mime_message( [@common_headers, - From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => "$data->{originator}", Subject => "$gBug#$ref closed by $markedby ($header{'subject'})", "Message-ID" => "", @@ -577,7 +578,7 @@ if ($ref<0) { # new bug report if ($codeletter eq 'U') { # -submitter &sendmessage(create_mime_message( [@common_headers, - From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, Subject => "Message with no $gBug number cannot be sent to submitter! ($subject)", 'Message-ID' => "", @@ -617,7 +618,7 @@ if ($ref<0) { # new bug report ); &sendmessage(create_mime_message( [@common_headers, - From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, Subject => "Message with no Package: tag cannot be processed! ($subject)", "Message-ID" => "", @@ -989,7 +990,7 @@ if (not exists $header{'x-debbugs-no-ack'} and ); &sendmessage(create_mime_message( [@common_headers, - From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, Subject => $t_h{subject}, "Message-ID" => $t_h{messageid}, @@ -1090,7 +1091,7 @@ if (@control_bits) { my $error_text = $errors > 0 ? " (with $errors error" . ($errors > 1 ? "s" : "") . ")" : ""; my $reply = create_mime_message(['X-Loop' => $gMaintainerEmail, - From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, @maintccs ? (Cc => join(', ',@maintccs)):(), Subject => "Processed${error_text}: $header{subject}", @@ -1273,20 +1274,15 @@ sub fill_template{ my $variables = {config => \%config, defined($ref)?(ref => $ref):(), defined($data)?(data => $data):(), - refs => [map {exists $clonebugs{$_}?$clonebugs{$_}:$_} keys %bug_affected], + refs => [sort + uniqnum(defined($ref)?($ref):(), + map {exists $clonebugs{$_}?$clonebugs{$_}:$_} + keys %bug_affected)], %{$extra_var}, }; - my $hole_var = {'&bugurl' => - sub{"$_[0]: ". - $config{cgi_domain}.'/'. - Debbugs::CGI::bug_links(bug=>$_[0], - links_only => 1, - ); - } - }; return fill_in_template(template => $template, variables => $variables, - hole_var => $hole_var, + output_type => 'text', ); } diff --git a/scripts/service b/scripts/service index c62e3d5..7e4c205 100755 --- a/scripts/service +++ b/scripts/service @@ -39,7 +39,7 @@ use Debbugs::Text qw(:templates); use Scalar::Util qw(looks_like_number); -use List::AllUtils qw(first); +use List::AllUtils qw(first uniqnum); use Mail::RFC822::Address; use Encode qw(decode encode); @@ -518,7 +518,7 @@ eval{ $temp_transcript = decode("utf8",$temp_transcript,Encode::FB_CROAK); }; my $reply = - create_mime_message([From => "$gMaintainerEmail ($gProject $gBug Tracking System)", + create_mime_message([From => qq("$gProject $gBug Tracking System" <$gMaintainerEmail>), To => $replyto, @maintccs ? (Cc => join(', ',@maintccs)):(), Subject => "Processed${error_text}: $header{subject}", @@ -573,20 +573,15 @@ sub fill_template{ my $variables = {config => \%config, defined($ref)?(ref => $ref):(), defined($data)?(data => $data):(), - refs => [map {exists $clonebugs{$_}?$clonebugs{$_}:$_} keys %bug_affected], + refs => [sort + uniqnum(defined($ref)?($ref):(), + map {exists $clonebugs{$_}?$clonebugs{$_}:$_} + keys %bug_affected)], %{$extra_var}, }; - my $hole_var = {'&bugurl' => - sub{"$_[0]: ". - $config{cgi_domain}.'/'. - Debbugs::CGI::bug_links(bug=>$_[0], - links_only => 1, - ); - } - }; return fill_in_template(template => $template, variables => $variables, - hole_var => $hole_var, + output_type => 'text', ); } @@ -884,7 +879,7 @@ sub sendtxthelpraw { close(D); print {$transcript} "Sending $description in separate message.\n"; &sendmailmessage(< To: $replyto Subject: $gProject $gBug help: $description References: $header{'message-id'} @@ -912,7 +907,7 @@ sub sendlynxdocraw { } else { print {$transcript} "Sending $description.\n"; &sendmailmessage(< To: $replyto Subject: $gProject $gBugs information: $description References: $header{'message-id'} @@ -949,7 +944,7 @@ sub sendinfo { } print {$transcript} "Sending $description.\n"; &sendmailmessage(< To: $replyto Subject: $gProject $gBugs information: $description References: $header{'message-id'} diff --git a/t/12_merge.t b/t/12_merge.t index c654359..a20b397 100644 --- a/t/12_merge.t +++ b/t/12_merge.t @@ -1,6 +1,6 @@ # -*- mode: cperl;-*- -use Test::More tests => 35; +use Test::More; use warnings; use strict; @@ -132,7 +132,8 @@ my @control_commands = }, ); -test_control_commands(@control_commands); +test_control_commands(\%config, + @control_commands); send_message(to => 'control@bugs.something', headers => [To => 'control@bugs.something', @@ -160,22 +161,19 @@ found -5 1.2-5 fixed -5 1.2-6 thanks EOF - ; - $SD_SIZE = - num_messages_sent($SD_SIZE,1, - $sendmail_dir, - 'control@bugs.something messages appear to have been sent out properly'); - -test_control_commands(forcemerge => {command => 'forcemerge', - value => '1 2', +test_control_commands(\%config, + forcemerge => {command => 'forcemerge', + value => "2 3\nseverity 2 minor", status_key => 'mergedwith', - status_value => '2', + status_value => '3', + bug => 2, }, unmerge => {command => 'unmerge', - value => '1', + value => '2', status_key => 'mergedwith', status_value => '', + bug => 2, }, forcemerge => {command => 'forcemerge', value => '1 2 5', @@ -195,43 +193,4 @@ test_control_commands(forcemerge => {command => 'forcemerge', }, ); - -sub test_control_commands{ - my @commands = @_; - - while (my ($command,$control_command) = splice(@commands,0,2)) { - # just check to see that control doesn't explode - $control_command->{value} = " $control_command->{value}" if length $control_command->{value} - and $control_command->{value} !~ /^\s/; - send_message(to => 'control@bugs.something', - headers => [To => 'control@bugs.something', - From => 'foo@bugs.something', - Subject => "Munging a bug with $command", - ], - body => <{command} $control_command->{value} -thanks -EOF - ; - $SD_SIZE = - num_messages_sent($SD_SIZE,1, - $sendmail_dir, - 'control@bugs.something messages appear to have been sent out properly'); - # now we need to check to make sure the control message was processed without errors - ok(system('sh','-c','find '.$sendmail_dir.q( -type f | xargs grep -q "Subject: Processed: Munging a bug with $command")) == 0, - 'control@bugs.something'. "$command message was parsed without errors"); - # now we need to check to make sure that the control message actually did anything - my $status; - $status = read_bug(exists $control_command->{bug}?(bug => $control_command->{bug}):(bug=>1), - exists $control_command->{location}?(location => $control_command->{location}):(), - ); - is_deeply($status->{$control_command->{status_key}}, - $control_command->{status_value}, - "bug " . - (exists $control_command->{bug}?$control_command->{bug}:1). - " $command" - ) - or fail(Dumper($status)); - } -} +done_testing(); diff --git a/t/lib/DebbugsTest.pm b/t/lib/DebbugsTest.pm index fcc0dc0..a23fdd4 100644 --- a/t/lib/DebbugsTest.pm +++ b/t/lib/DebbugsTest.pm @@ -43,6 +43,7 @@ BEGIN{ @EXPORT = (); %EXPORT_TAGS = (configuration => [qw(dirsize create_debbugs_configuration send_message)], mail => [qw(num_messages_sent)], + control => [qw(test_control_commands)], database => [qw(create_postgresql_database update_postgresql_database)] ); @EXPORT_OK = (); @@ -207,6 +208,80 @@ sub send_message{ } } +=item test_control_commands + + test_control_commands(\%config, + forcemerge => {command => 'forcemerge', + value => '1 2', + status_key => 'mergedwith', + status_value => '2', + expect_error => 0, + }); + +Test a set of control commands to see if they will fail or not. Takes +SCALAR/HASHREF pairs, where the scalar should be unique, and the HASHREF +contains the following keys: + +=over + +=item command -- control command to issue + +=item value -- value to pass to control command + +=item status_key -- bug status key to check + +=item status_value -- value of status key + +=item expect_error -- whether to expect the control command to error or not + +=back + +=cut + +sub test_control_commands { + my ($config,@commands) = @_; + + # now we need to check to make sure that the control message actually did anything + # This is an eval because $ENV{DEBBUGS_CONFIG_FILE} isn't set at BEGIN{} time + eval "use Debbugs::Status qw(read_bug writebug);"; + while (my ($command,$control_command) = splice(@commands,0,2)) { + # just check to see that control doesn't explode + $control_command->{value} = " $control_command->{value}" if length $control_command->{value} + and $control_command->{value} !~ /^\s/; + send_message(to => 'control@bugs.something', + headers => [To => 'control@bugs.something', + From => 'foo@bugs.something', + Subject => "Munging a bug with $command", + ], + body => <{command} $control_command->{value} +thanks +EOF + ; + # now we need to check to make sure the control message was processed without errors + if (not ($control_command->{expect_error} // 0)) { + ok(system('sh','-c','find '.$config->{sendmail_dir}. + q( -type f | xargs grep -q "Subject: Processed: Munging a bug with $command") + ) == 0, + 'control@bugs.something'. "$command message was parsed without errors"); + } + # now we need to check to make sure that the control message actually did anything + my $status; + $status = read_bug(exists $control_command->{bug}?(bug => $control_command->{bug}):(bug=>1), + exists $control_command->{location}?(location => $control_command->{location}):(), + ); + is_deeply($status->{$control_command->{status_key}}, + $control_command->{status_value}, + "bug " . + (exists $control_command->{bug}?$control_command->{bug}:1). + " $command" + ) + or fail(Data::Dumper->Dump([$status],[qw(status)])); + } +} + + { package DebbugsTest::HTTPServer; use base qw(HTTP::Server::Simple::CGI HTTP::Server::Simple::CGI::Environment); diff --git a/templates/en_US/cgi/bugreport.tmpl b/templates/en_US/cgi/bugreport.tmpl deleted file mode 100644 index 2f0ec04..0000000 --- a/templates/en_US/cgi/bugreport.tmpl +++ /dev/null @@ -1,50 +0,0 @@ -{include(q(html/pre_title))}#{$bug_num} - {html_escape($status{subject})} - {html_escape($config{project})} {html_escape($config{bug})} report logs{include(q(html/post_title.tmpl))} - - - -

{html_escape($config{project})} {html_escape($config{bug})} report logs - -#{$bug_num}
-{html_escape($status{subject})}

-
{$version_graph}
-{include(q(cgi/bugreport_pkginfo))} -{include(q(cgi/bugreport_buginfo))} -{ my $output = ''; - if (looks_like_number($msg)) { - $output .= sprintf qq(

Full log

),html_escape(bug_links(bug=>$bug_num,links_only=>1)); - } - else { - if (not $status{archived}) { - $output .= qq(

Reply ). - qq(or subscribe ). - qq(to this bug.

\n); - } - $output .= qq(

Toggle useless messages

); - $output .= sprintf qq(

View this report as an mbox folder, ). - qq(status mbox, maintainer mbox

\n), - html_escape(bug_links(bug=>$bug_num, links_only=>1,options=>{mbox=>'yes'})), - html_escape(bug_links(bug=>$bug_num, links_only=>1,options=>{mbox=>'yes',mboxstatus=>'yes'})), - html_escape(bug_links(bug=>$bug_num, links_only=>1,options=>{mbox=>'yes',mboxmaint=>'yes'})); - } - $output; -} -{$log} -
-

Send a report that this bug log contains spam.

-
-{include(q(html/html_tail))} - - diff --git a/templates/en_US/cgi/bugreport.tx b/templates/en_US/cgi/bugreport.tx new file mode 100644 index 0000000..ce72b32 --- /dev/null +++ b/templates/en_US/cgi/bugreport.tx @@ -0,0 +1,52 @@ +<: include "html/pre_title.tx" :>#<: $bug_num :> - <: $status.subject :> - <: $config.project :> <: $config.bug :> report logs<: include "html/post_title.tx" :> + + + + +
<: $config.project :> <: $config.bug :> report logs
+

#<: $bug_num :> + <: $status.subject :> +

+
<: raw($version_graph) :>
+<: include "cgi/bugreport_pkginfo.tx" :> +<: include "cgi/bugreport_buginfo.tx" :> +
+: if looks_like_number($msg) { + Full log +: } else { +: if ! $status.archived { +Reply +or subscribe +to this <: $config.bug :>. +: } +View this <: $config.bug :> as an +1,options=>{mbox=>"yes"}) :>">mbox, +1,options=>{mbox=>"yes",mboxstatus => "yes"}) :>">status mbox, or +1,options=>{mbox=>"yes",mboxmaint => "yes"}) :>">maintainer mbox + +
+: } +<: raw($log) :> + +
+

Send a report that this bug log contains spam.

+
+<: include "html/html_tail.tx" :> + + diff --git a/templates/en_US/cgi/bugreport_buginfo.tmpl b/templates/en_US/cgi/bugreport_buginfo.tmpl deleted file mode 100644 index 9b6c4fd..0000000 --- a/templates/en_US/cgi/bugreport_buginfo.tmpl +++ /dev/null @@ -1,79 +0,0 @@ -
-

Reported by: {package_links(submitter=>$status{originator})}

-

Date: {$status{date_text}}

-{ my $output = ''; - if (defined $status{owner} and length $status{owner}) { - $output = q(

Owned by: ).package_links(owner=>$status{owner}).q(

); - } - $output; -} -

Severity: {my $output = $status{severity}; - if (isstrongseverity($status{severity})) { - $output = q().$status{severity}.q(); - } - $output; - }

-

{@{$status{tags_array}}?q(Tags: ).html_escape(join(q(, ),@{$status{tags_array}})):''}

-{my $output = ''; - if (@{$status{mergedwith_array}}) { - $output .= q(

Merged with ).join(qq(,\n),bug_links(bug=>$status{mergedwith_array})).qq(

\n); - } - $output; -} -{my $output = ''; - if (@{$status{found_versions}}) { - $output .= q(

Found in ); - $output .= (@{$status{found_versions}} == 1) ? 'version ' : 'versions '; - $output .= join(qq(, ),map {html_escape($_);} @{$status{found_versions}}).qq(

\n); - } - if (@{$status{fixed_versions}}) { - $output .= q(

Fixed in ); - $output .= (@{$status{fixed_versions}} == 1) ? 'version ' : 'versions '; - $output .= join(qq(, ),map {html_escape($_);} @{$status{fixed_versions}}).qq(

\n); - } - $output; -} -{ my $output = ''; - if (length($status{done})) { - $output .= q(

Done: ).html_escape($status{done}).q(

) - } - $output; -} -{ my $output = ''; - if (@{$status{blockedby_array}}) { - $output .= q(

Fix blocked by ). - join(q(, ), - map {bug_links(bug=>$_->{bug_num}).q(: ).html_escape($_->{subject})} - @{$status{blockedby_array}}).q(

) - } - if (@{$status{blocks_array}}) { - $output .= q(

Blocking fix for ). - join(q(, ), - map {bug_links(bug=>$_->{bug_num}).q(: ).html_escape($_->{subject})} - @{$status{blocks_array}}).q(

) - } - $output; -} -{ my $output = ''; - if (exists $status{archived} and $status{archived}) { - $output .= q(

Bug is archived. No further changes may be made.

) - } - $output -}{ my $output = ''; - if (length($status{forwarded})) { - $output = "

Forwarded to " . - join(', ', - map {maybelink($_)} - split /\,\s+/,$status{forwarded} - )."

\n"; - } - $output; -}{ my $output = ''; - if (exists $status{summary} and defined $status{summary} and length $status{summary}) { - $output .= q(

Summary: ).html_escape($status{summary}).q(

); - } - if (exists $status{outlook} and defined $status{outlook} and length $status{outlook}) { - $output .= q(

Outlook: ).html_escape($status{outlook}).q(

); - } - $output; -}
diff --git a/templates/en_US/cgi/bugreport_buginfo.tx b/templates/en_US/cgi/bugreport_buginfo.tx new file mode 100644 index 0000000..9067959 --- /dev/null +++ b/templates/en_US/cgi/bugreport_buginfo.tx @@ -0,0 +1,89 @@ +
+
    +
  • Reported by + <: package_links(submitter=>$status.originator) :> +
  • +
  • Date + <: $status.date_text :> +
  • + : if defined($status.owner) && $status.owner.length() { +
  • Owned by + <: package_links("owner",$status.owner) :> +
  • + : } +
  • Severity + + <:- if $status.severity { :><: } -:> + <:- $status.severity -:> + <:- if $status.severity { :><: } -:> + +
  • + : if $status.tags_array { +
  • Tags + <: $status.tags_array.join(' ') :> +
  • + : } + : if $status.mergedwith_array.count > 0 { +
  • Merged with + <: bug_links(bug=>$status.mergedwith_array).join(",\n") :> +
  • + : } + : if $status.found_versions.count { +
  • Found in + version<:- if $status.found_versions.count > 1 { -:>s<: } -:> + <: $status.found_versions.join(', ') :> +
  • + : } + : if $status.fixed_versions.count { +
  • Fixed in + version<: if $status.fixed_versions.count > 1 { :>s<: } :> + <: $status.fixed_versions.join(', ') :> +
  • + : } + <: if $status.done.length() { :> +
  • Done + <: $status.done :> +
  • + : } + : if $status.blockedby_array.count { +
  • Fix blocked by + + : for $status.blockedby_array -> $bug { + <: bug_links("bug",$bug.bug_num) :>: <: $bug.subject -:> + <:- if !$~bug.is_last { :>, <: } else { :>.<: } :> + : } + +
  • + : } + : if $status.blocks_array.count { +
  • Blocking fix for + $bug { + <: bug_links("bug",$bug.bug_num) :>: <: $bug.subject -:> + <:- if ! $~bug.is_last { :>, <: } else { :>.<: } :> + : } + +
  • + : } + : if $status.archived { +
  • Bug is + Archived +
  • + : } + : if defined $status.forwarded and $status.forwarded.length() { +
  • Forwarded to + <: split($status.forwarded,',\s+').map(maybelink).join(', ') :> +
  • + : } + : if defined $status.summary and $status.summary.length() { +
  • Summary + <: $status.summary :> +
  • + : } + : if defined $status.outlook and $status.outlook.length() { +
  • Outlook + <: $status.outlook :> +
  • + : } +
+
diff --git a/templates/en_US/cgi/bugreport_pkginfo.tmpl b/templates/en_US/cgi/bugreport_pkginfo.tmpl deleted file mode 100644 index 777928e..0000000 --- a/templates/en_US/cgi/bugreport_pkginfo.tmpl +++ /dev/null @@ -1,31 +0,0 @@ -
-

{if (keys %package > 1) { q(Packages)} else {q(Package)}}: - {join(q(, ),package_links(package => [map {$_->{package}} grep {!$_->{is_source}} values %package], - source => [map {$_->{source} } grep { $_->{is_source}} values %package], - class => q(submitter), - ) - )}; -{my $output =''; - for my $package (values %package) { - $output .= q(Maintainer for ).package_links($package->{is_source}?(source=>$package->{source}):(package=>$package->{package})).qq( is ). - package_links(maintainer => $package->{maintainer}).qq(; ); - if (exists $package->{source} and not $package->{is_source}) { - $output .= q(Source for ).package_links(package=>$package->{package}).qq( is ). - package_links(source => $package->{source}).qq(. ); - } - } - $output; -}

-{ my $output = ''; - if (keys %affects) { - $output .= q(

Affects: ). - join(q(, ), - package_links(package => [map {$_->{package}} grep {!$_->{is_source}} values %affects], - source => [map {$_->{source} } grep { $_->{is_source}} values %affects], - class => q(submitter), - ) - ).q(

); - } - $output; -} -
diff --git a/templates/en_US/cgi/bugreport_pkginfo.tx b/templates/en_US/cgi/bugreport_pkginfo.tx new file mode 100644 index 0000000..18d259a --- /dev/null +++ b/templates/en_US/cgi/bugreport_pkginfo.tx @@ -0,0 +1,27 @@ +: macro link_to_package -> ($packages) { +: for $packages.values() -> $pkg { +: if $pkg.is_source { +<:- package_links(source => $pkg.source,class=>"submitter"); -:> +: } else { +<:- package_links(package => $pkg.package,class=>"submitter"); -:> +: } +: if $~pkg.is_last { +; +: } else { +, +: } } } +
+

Package<: if ($package.keys.count > 1) {:>s<: } :> + <: link_to_package($package) :> +: for $package.values() -> $pkg { +

Maintainer for <: package_links($pkg.is_source ? "source": "package",$pkg.is_source ? $pkg.source : $pkg.package ) :> is <: package_links(maintainer => $pkg.maintainer) :>; +<: if defined($pkg.source) && not $pkg.is_source { :> +Source for <: package_links(package => $pkg.package) :> is +<: package_links(source => $pkg.source) :>. +<: } :>

+: } +: if $affects.keys.size > 0 { +

Affects: <: link_to_package($affects) :> +

+: } +
diff --git a/templates/en_US/cgi/no_such_bug.tmpl b/templates/en_US/cgi/no_such_bug.tmpl deleted file mode 100644 index bdbd67d..0000000 --- a/templates/en_US/cgi/no_such_bug.tmpl +++ /dev/null @@ -1,9 +0,0 @@ - - -#{$bug_num} - {$config{project}} {$config{bug}} report logs - -

{$config{project}} {$config{bug}} report logs - #{$bug_num}

-

There is no record of {$config{bug}} #{$bug_num}. -Try the search page instead.

-{#include('html/html_tail')} - diff --git a/templates/en_US/cgi/no_such_bug.tx b/templates/en_US/cgi/no_such_bug.tx new file mode 100644 index 0000000..b929f85 --- /dev/null +++ b/templates/en_US/cgi/no_such_bug.tx @@ -0,0 +1,9 @@ + + +#<: $bug_num :> - <: $config.project :> <: $config.bug :> report logs + +

<: $config.project :> <: $config.bug :> report logs - #<: $bug_num :>

+

There is no record of <: $config.bug :> #<: $bug_num:>. +Try the search page instead.

+<: include 'html/html_tail.tx' :> + diff --git a/templates/en_US/cgi/pkgindex.tmpl b/templates/en_US/cgi/pkgindex.tmpl deleted file mode 100644 index c645a60..0000000 --- a/templates/en_US/cgi/pkgindex.tmpl +++ /dev/null @@ -1,32 +0,0 @@ -{include(q(html/pre_title))}{html_escape($config{project})} {html_escape($config{bug})} report logs by {html_escape($tag)}{include(q(html/post_title.tmpl))} - - -

{html_escape($config{project})} {html_escape($config{bug})} report logs by {html_escape($tag)}

-{$note} -
- - - - - - -{ my $output = ''; -if (defined $param{first}) { - $output .= qq(\n); -} else { - $output .= q(

); - if ($param{skip}> 0) { - $output .= q(); - } - if (keys %count > ($param{skip} + $param{max_results})) { - $output .= q(); - } - $output .= qq(

\n); -} -$output; -} -{ $result } -
-{include(q(html/html_tail))} - - diff --git a/templates/en_US/cgi/pkgindex.tx b/templates/en_US/cgi/pkgindex.tx new file mode 100644 index 0000000..875d7bc --- /dev/null +++ b/templates/en_US/cgi/pkgindex.tx @@ -0,0 +1,29 @@ +<: include "html/pre_title.tx":>.$config.project) .$config.bug report logs by <: $tag :><:include "html/post_title.tx":> + + +

.$config.project .$config.bug report logs by .$tag

+ .$note + + + + + + + + : if (defined $param.first) { + + : } else { +

+ : if ($param.skip> 0) { + + : } + : if (keys %count > ($param.skip + $param.max_results)) { + + : } +

+ : } + <: $result :> +
+ <: include "html/html_tail.tx" :> + + diff --git a/templates/en_US/cgi/pkgreport_javascript.tmpl b/templates/en_US/cgi/pkgreport_javascript.tmpl deleted file mode 100644 index a786cbf..0000000 --- a/templates/en_US/cgi/pkgreport_javascript.tmpl +++ /dev/null @@ -1,136 +0,0 @@ - diff --git a/templates/en_US/cgi/pkgreport_javascript.tx b/templates/en_US/cgi/pkgreport_javascript.tx new file mode 100644 index 0000000..644feb4 --- /dev/null +++ b/templates/en_US/cgi/pkgreport_javascript.tx @@ -0,0 +1,136 @@ + diff --git a/templates/en_US/cgi/pkgreport_options.tmpl b/templates/en_US/cgi/pkgreport_options.tmpl deleted file mode 100644 index da362dd..0000000 --- a/templates/en_US/cgi/pkgreport_options.tmpl +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -

Select bugs

-
-{ my $output = ''; -our $value_index = 0; -our $search = ''; -our $search_value = ''; -for my $key (@search_key_order){ - if (exists $param{$key}){ - for my $value (make_list($param{$key})){ - $search = $key; - $search_value = $value; - $output .= include('cgi/pkgreport_options_search_key'); - $output .= '
'; - $value_index++; - } - } - } - $search = ''; - $search_value = ''; - $output; -} -{include('cgi/pkgreport_options_search_key')} -
-

The same search fields are ORed, different fields are ANDed.

-

Valid severities are {$config{show_severities}}

-

Valid tags are {join(', ',@{$config{tags}})}

-

Include Bugs

{our $incexc = 'include'; -include('cgi/pkgreport_options_include_exclude'); -}

Exclude Bugs

-{our $incexc = 'exclude'; -include('cgi/pkgreport_options_include_exclude'); -} -

Categorize/Order using

Misc options

- Repeat Merged
- Reverse Bugs
- Reverse Pending
- Reverse Severity
- No Bugs which affect packages
-
-
-Toggle all extra information -

Submit

- -
- - diff --git a/templates/en_US/cgi/pkgreport_options.tx b/templates/en_US/cgi/pkgreport_options.tx new file mode 100644 index 0000000..15497a5 --- /dev/null +++ b/templates/en_US/cgi/pkgreport_options.tx @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + +

Select bugs

+
+ : for $search_key_order -> $key { + : if defined $param[$key] { + : for $param[$key] -> $value { + : include "cgi/pkgreport_options_search_key.tx" { search => $key, search_value => $value }; + : } + : } + : } + : include "cgi/pkgreport_options_search_key.tx"; + +

The same search fields are ORed, different fields are ANDed.

+

Valid severities are <: $config.show_severities :>

+

Valid tags are <: $config.tags.join(', ') :>

+

Include Bugs

+ : include "cgi/pkgreport_options_include_exclude.tx" { incexc => "include" }; +

Exclude Bugs

+ : include "cgi/pkgreport_options_include_exclude.tx" { incexc => "exclude" }; +

Categorize/Order using

+

Misc options

+ : macro input_checkbox ->($what,$text) { + <:- $text -:>
+ : } + <:- input_checkbox("repeatmerged","Repeat Merged") :> + <:- input_checkbox("bug-rev","Reverse Bugs") :> + <:- input_checkbox("pend-rev","Reverse Pending") :> + <:- input_checkbox("sev-rev","Reverse Severity") :> + <:- input_checkbox("noaffects","No Bugs which affect packages") :> +
+
+ + Toggle all extra information +

Submit

+ +
+
diff --git a/templates/en_US/cgi/pkgreport_options_include_exclude.tmpl b/templates/en_US/cgi/pkgreport_options_include_exclude.tmpl deleted file mode 100644 index c0f8acd..0000000 --- a/templates/en_US/cgi/pkgreport_options_include_exclude.tmpl +++ /dev/null @@ -1,16 +0,0 @@ - -{ my $output = ''; - our $value_index = 0; - our $key1 = ''; - our $key2 = ''; - for my $field (make_list($param{$incexc})) { - ($key1,$key2) = $field =~ m/^([^:]+)\:(.+)/; - next unless defined $key2; - $output .= include('cgi/pkgreport_options_include_exclude_key'); - } - $key1 = ''; - $key2 = ''; - $output .= include('cgi/pkgreport_options_include_exclude_key'); - $output; -} - diff --git a/templates/en_US/cgi/pkgreport_options_include_exclude.tx b/templates/en_US/cgi/pkgreport_options_include_exclude.tx new file mode 100644 index 0000000..a4a6f94 --- /dev/null +++ b/templates/en_US/cgi/pkgreport_options_include_exclude.tx @@ -0,0 +1,5 @@ + +: for $param[$incexc] -> $field { + : include "cgi/pkgreport_options_include_exclude_key.tx" {key1 => split($field,':',2).0, key2 => split($field,':',2).1 }; +: } +: include "cgi/pkgreport_options_include_exclude_key.tx"; diff --git a/templates/en_US/cgi/pkgreport_options_include_exclude_key.tmpl b/templates/en_US/cgi/pkgreport_options_include_exclude_key.tmpl deleted file mode 100644 index ab0a246..0000000 --- a/templates/en_US/cgi/pkgreport_options_include_exclude_key.tmpl +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/templates/en_US/cgi/pkgreport_options_include_exclude_key.tx b/templates/en_US/cgi/pkgreport_options_include_exclude_key.tx new file mode 100644 index 0000000..5beb8b9 --- /dev/null +++ b/templates/en_US/cgi/pkgreport_options_include_exclude_key.tx @@ -0,0 +1,13 @@ + + + diff --git a/templates/en_US/cgi/pkgreport_options_search_key.tmpl b/templates/en_US/cgi/pkgreport_options_search_key.tmpl deleted file mode 100644 index e09fdff..0000000 --- a/templates/en_US/cgi/pkgreport_options_search_key.tmpl +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/templates/en_US/cgi/pkgreport_options_search_key.tx b/templates/en_US/cgi/pkgreport_options_search_key.tx new file mode 100644 index 0000000..4d92782 --- /dev/null +++ b/templates/en_US/cgi/pkgreport_options_search_key.tx @@ -0,0 +1,5 @@ + + + diff --git a/templates/en_US/cgi/quit.tmpl b/templates/en_US/cgi/quit.tmpl deleted file mode 100644 index 2a89d8e..0000000 --- a/templates/en_US/cgi/quit.tmpl +++ /dev/null @@ -1,6 +0,0 @@ - -Error - -An error occurred. -Error was: {$msg} - diff --git a/templates/en_US/cgi/quit.tx b/templates/en_US/cgi/quit.tx new file mode 100644 index 0000000..d889679 --- /dev/null +++ b/templates/en_US/cgi/quit.tx @@ -0,0 +1,6 @@ + +Error + +An error occurred. +Error was: <: $msg :> + diff --git a/templates/en_US/cgi/short_bug_status.tmpl b/templates/en_US/cgi/short_bug_status.tmpl deleted file mode 100644 index 821a459..0000000 --- a/templates/en_US/cgi/short_bug_status.tmpl +++ /dev/null @@ -1,157 +0,0 @@ -
- #{html_escape($status{bug_num})} - [{ - my $output = qq(); - my $temp = $status{severity}; - $temp = substr $temp,0,1; - if (isstrongseverity($status{severity})){ - $temp = q().uc($temp).q(); - } - $output .= $temp.qq(); - length($output)?$output:'  '; - }|{ - my $output = ''; - for my $tag (@{$status{tags_array}}) { - next unless exists $config{tags_single_letter}{$tag}; - $output .= q().$config{tags_single_letter}{$tag}.q(); - } - length($output)?$output:'  '; - }|{ - my $output = ''; - if (@{$status{mergedwith_array}}) { - $output .= qq(=); - } - if (@{$status{fixed_versions}}) { - $output .= qq(☺); - } - if (@{$status{blockedby_array}}) { - $output .= qq(♙); - } - if (@{$status{blocks_array}}) { - $output .= qq(♔); - } - if (length($status{forwarded})) { - $output .= qq(↝); - } - if ($status{archived}) { - $output .= qq(♲); - } - if (length $status{affects}){ - $output .= qq(☣); - } - length($output)?$output:'  '; - }] - [{package_links(package=>[split /,/,$status{package}],options=>\%options,class=>"submitter")}] - {html_escape($status{subject})} -
- Reported by: {package_links(submitter=>$status{originator})}; - Date: {$status{date_text}}; -{ my $output = ''; - if (defined $status{owner} and length $status{owner}) { - $output = q(Owned by: ).package_links(owner=>$status{owner}).qq(;\n); - } - $output; -}Severity: {my $output = $status{severity}; - if (isstrongseverity($status{severity})) { - $output = q().$status{severity}.q(); - } - $output; - }; -{@{$status{tags_array}}?q(Tags: ).html_escape(join(q(, ),@{$status{tags_array}})).';':''} -{my $output = ''; - if (@{$status{mergedwith_array}}) { - $output .= q(Merged with ).join(qq(,\n),bug_links(bug=>$status{mergedwith_array})).qq(;\n); - } - $output; -}{my $output = ''; - if (@{$status{found_versions}} or @{$status{fixed_versions}}) { - $output .= ' '; - } - if (@{$status{found_versions}}) { - $output .= q(Found in ); - $output .= (@{$status{found_versions}} == 1) ? 'version ' : 'versions '; - $output .= join(qq(, ),map {html_escape($_);} @{$status{found_versions}}).qq(;\n); - } - if (@{$status{fixed_versions}}) { - $output .= q(Fixed in ); - $output .= (@{$status{fixed_versions}} == 1) ? 'version ' : 'versions '; - $output .= join(qq(, ),map {html_escape($_);} @{$status{fixed_versions}}).qq(;\n); - } - if (@{$status{found_versions}} or @{$status{fixed_versions}}) { - $output .= qq(); - } - $output; -}{ my $output = ''; - if (length($status{forwarded})) { - $output = "Forwarded to " . - join(', ', - map {maybelink($_)} - split /\,\s+/,$status{forwarded} - ).";\n"; - } - $output; -}{ my $output = ''; - if (length($status{done})) { - $output .= q(Done: ).html_escape($status{done}).q(; ) - } - $output; -}{ my $output = ''; - my $days = $status{archive_days}; - if ($days >= 0 and defined $status{location} and $status{location} ne 'archive') { - $output .= "Can be archived" . - ( $days == 0 ? " today" : $days == 1 ? " in $days day" : " in $days days" ) . - ";\n"; - } - elsif (defined $status{location} and $status{location} eq 'archived') { - $output .= "Archived;\n"; - } - $output; -}{ my $output = ''; - if (@{$status{blockedby_array}}) { - $output .= q(Fix blocked by ). - join(q(, ), - map {bug_links(bug=>$_->{bug_num}).q(: ).html_escape($_->{subject})} - @{$status{blockedby_array}}).q(; ) - } - if (@{$status{blocks_array}}) { - $output .= q(Blocking fix for ). - join(q(, ), - map {bug_links(bug=>$_->{bug_num}).q(: ).html_escape($_->{subject})} - @{$status{blocks_array}}).q(; ) - } - $output; -}{ my $output = ''; - my ($days_last,$eng_last) = secs_to_english(time - $status{log_modified}); - my ($days,$eng) = secs_to_english(time - $status{date}); - - if ($days >= 7) { - my $font = ""; - my $efont = ""; - $font = "em" if ($days > 30); - $font = "strong" if ($days > 60); - $efont = "" if ($font); - $font = "<$font>" if ($font); - - $output .= "${font}Filed $eng ago$efont;\n"; - } - if ($days_last > 7) { - my $font = ""; - my $efont = ""; - $font = "em" if ($days_last > 30); - $font = "strong" if ($days_last > 60); - $efont = "" if ($font); - $font = "<$font>" if ($font); - - $output .= "${font}Modified $eng_last ago$efont;\n"; - } - $output; - }{ my $output = ''; - if (exists $status{archived} and $status{archived}) { - $output .= q(Bug is archived. No further changes may be made. ) - } - $output}
-
diff --git a/templates/en_US/cgi/short_bug_status.tx b/templates/en_US/cgi/short_bug_status.tx new file mode 100644 index 0000000..1952173 --- /dev/null +++ b/templates/en_US/cgi/short_bug_status.tx @@ -0,0 +1,135 @@ +
+ >#<: $status.bug_num :> + [ + <:- my $short_sev = substr($status.severity,0,1) -:> + <:- if isstrongseverity($status.severity) { -:><: uc($short_sev) :> + <:- } else { -:> + <:- $short_sev } -:>| + <:- for $status.tags_array -> $tag { -:> + <:- if defined($config.tags_single_letter[$tag]) { -:> + <: $config.tags_single_letter[$tag] :><:- } -:> + : } + <:- if $status.tags_array.size() == 0 { -:>  <: } :>| + <:- if $status.mergedwith_array.count > 0 { -:> + = + <:- } -:> + <:- if $status.fixed_versions.count > 0 { -:> + ☺ + <:- } -:> + <:- if $status.fixed_versions.count > 0 { -:> + ☺ + <:- } -:> + <:- if $status.blockedby_array.count > 0 { -:> + ♙ + <:- } -:> + <:- if $status.blocks_array.count > 0 { -:> + ♔ + <:- } -:> + <:- if length($status.forwarded) { -:> + ↝ + <:- } -:> + <:- if $status.archived { -:> + ♲ + <:- } -:> + <:- if length($status.affects) { -:> + ☣ + <:- } -:>] + [<: raw(package_links(package=>$status.package.split(','),class=>"submitter")) :>] + <: $status.subject :> +
+ Reported by: <: raw(package_links(submitter=>$status.originator)) :>; + Date: <: $status.date_text :>; + <:- if (defined $status.owner and length($status.owner)) { -:> + Owned by: <: raw(package_links(owner=>$status.owner)) :>; + <:- } :> + Severity: + <:- if (isstrongseverity($status.severity)) { -:> + )<: $status.severity :> + <:- } else { -:> + <: $status.severity :> + <:- } -:> + + <:- if $status.tags_array.size > 0 { -:> + Tags: <: $status.tags_array.join(', ') :>; + <:- } -:> + + : if $status.mergedwith_array.size > 0 { + Merged with <: bug_links(bug=>$status.mergedwith_array).join(",\n") :>; + : } + : if $status.found_versions.size > 0 or $status.fixed_versions.size > 0 { + + <:- } -:> + <:- if $status.found_versions.size > 0 { -:> + Found in version<: if $status.found_versions.size > 1 { :>s<: } :> + <:- $status.found_versions.join(', ') -:>; + + <:- } -:> + <:- if $status.fixed_versions.size > 0 { :> + Fixed in version<: if $status.fixed_versions.size > 1 { :>s<: } :> + <:- $status.fixed_versions.join(', ') -:>; + + <:- } -:> + <:- if $status.found_versions.size > 0 or $status.fixed_versions.size > 0 { -:> + + <:- } -:> + <:- if (length($status.forwarded)) { :> + Forwarded to + <: $status.forwarded.split('\,\s+').map(maybelink).join(', ') :> + + <:- } -:> + <:- if (length($status.done)) { -:> + Done: + <: $status.done :> + + <:- } -:> + <:- if $status.archive_days >= 0 and + defined($status.location) && $status.location != "archive" { -:> + Can be archived + <: if $status.archive_days == 0 { :> + today + <: } else if $status.archive_days == 1 { :> + in 1 day + <: } else { :> + in <: $status.archive_days :> days + <:- } :>; + <:- } else if defined($status.location) && $status.location == "archived" { -:> + Archived + <:- } -:> + <:- if $status.blockedby_array.count > 0 { :> + Fix blocked by + <: for $status.blockedby_array -> $bug { :> + <: bug_links("bug",bug.bug_num) :>: + <: $bug.subject -:> + <:- if ! $~bug.is_last { -:>, <: } else { -:>.<:- } -:> + <:- } -:> + + <:- } -:> + <:- if $status.blocks_array.count > 0 { :> + Blocking fix for + <: for $status.blocks_array -> $bug { :> + <: bug_links("bug",bug.bug_num) :>: + <: $bug.subject -:> + <:- if ! $~bug.is_last {-:>, <: } else { -:>.<:- } -:> + <:- } -:> + + <:- } -:> + <:- macro days_ago->($what,$ago) {-:> + + <:- if ($time - $ago) / 86400 > 60 { -:> + <: $what :> <: secs_to_english($time-$ago) :> ago. + <:- } else if ($time - $ago) / 86400 > 30 { :> + <: $what :> <: secs_to_english($time-$ago) :> ago. + <:- } -:>; + + <:- } -:> + <: days_ago("Filed",$status.date) :> + <: days_ago("Modified",$status.log_modified) :> + <:- if defined $status.archived and $status.archived {:> + Bug is archived. No further changes may be made. + <:- } -:> +
+
diff --git a/templates/en_US/html/html_tail.tmpl b/templates/en_US/html/html_tail.tmpl deleted file mode 100644 index 0bbfc43..0000000 --- a/templates/en_US/html/html_tail.tmpl +++ /dev/null @@ -1,20 +0,0 @@ -
{$config{maintainer}} <{$config{maintainer_email}}>. -Last modified: -{$last_modified||strftime('%c',gmtime)}; -Machine Name: -{$config{machine_name}||'Unknown'} -

-{$config{project}} {$config{bug}} tracking system -

-

- Debbugs is free software and licensed under the terms of the GNU - Public License version 2. The current version can be obtained - from https://bugs.debian.org/debbugs-source/. -

-

-Copyright © 1999 Darren O. Benham, -1997,2003 nCipher Corporation Ltd, -1994-97 Ian Jackson, -2005-2017 Don Armstrong, and many other contributors. -

-
diff --git a/templates/en_US/html/html_tail.tx b/templates/en_US/html/html_tail.tx new file mode 100644 index 0000000..cca1fe7 --- /dev/null +++ b/templates/en_US/html/html_tail.tx @@ -0,0 +1,21 @@ +
<: $config.maintainer :> + <<: $config.maintainer_email :>>. + Last modified: + <: defined $last_modified ? $last_modified : gm_strftime('%c') :>; + Machine Name: + <: $config.machine_name ||'Unknown' :> +

+ <: $config.project :> <: $config.bug :> tracking system +

+

+ Debbugs is free software and licensed under the terms of the + GNU Public License version 2. The current version can be + obtained from https://bugs.debian.org/debbugs-source/. +

+

+ Copyright © 1999 Darren O. Benham, + 1997,2003 nCipher Corporation Ltd, + 1994-97 Ian Jackson, + 2005-2017 Don Armstrong, and many other contributors. +

+
diff --git a/templates/en_US/html/post_title.tmpl b/templates/en_US/html/post_title.tmpl deleted file mode 100644 index 5ec109a..0000000 --- a/templates/en_US/html/post_title.tmpl +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/templates/en_US/html/post_title.tx b/templates/en_US/html/post_title.tx new file mode 100644 index 0000000..0061ca2 --- /dev/null +++ b/templates/en_US/html/post_title.tx @@ -0,0 +1,4 @@ + + + + diff --git a/templates/en_US/html/pre_title.tmpl b/templates/en_US/html/pre_title.tmpl deleted file mode 100644 index 2f7ab77..0000000 --- a/templates/en_US/html/pre_title.tmpl +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/templates/en_US/html/pre_title.tx b/templates/en_US/html/pre_title.tx new file mode 100644 index 0000000..22cdfda --- /dev/null +++ b/templates/en_US/html/pre_title.tx @@ -0,0 +1,4 @@ +<!DOCTYPE html> +<html><head> +<link rel="icon" href="//favicon.png"> +<title> \ No newline at end of file diff --git a/templates/en_US/mail/excluded_from_control.tmpl b/templates/en_US/mail/excluded_from_control.tmpl deleted file mode 100644 index adf10e4..0000000 --- a/templates/en_US/mail/excluded_from_control.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -You have been specifically excluded from using the control interface. - -Have a nice day diff --git a/templates/en_US/mail/excluded_from_control.tx b/templates/en_US/mail/excluded_from_control.tx new file mode 100644 index 0000000..adf10e4 --- /dev/null +++ b/templates/en_US/mail/excluded_from_control.tx @@ -0,0 +1,3 @@ +You have been specifically excluded from using the control interface. + +Have a nice day diff --git a/templates/en_US/mail/fake_control_message.tmpl b/templates/en_US/mail/fake_control_message.tmpl deleted file mode 100644 index 2af273d..0000000 --- a/templates/en_US/mail/fake_control_message.tmpl +++ /dev/null @@ -1,21 +0,0 @@ -Received: (at fakecontrol) by fakecontrolmessage; -To: {$request_addr} -From: {$requester} -Subject: Internal Control -Message-Id: {$action} -Date: {$date} -User-Agent: Fakemail v42.6.9 - -# A New Hope -# A long time ago, in a galaxy far, far away -# something happened. -# -# Magically this resulted in the following -# action being taken, but this fake control -# message doesn't tell you why it happened -# -# The action: -# {$action} -thanks -# This fakemail brought to you by your local debbugs -# administrator diff --git a/templates/en_US/mail/fake_control_message.tx b/templates/en_US/mail/fake_control_message.tx new file mode 100644 index 0000000..9df6c9b --- /dev/null +++ b/templates/en_US/mail/fake_control_message.tx @@ -0,0 +1,21 @@ +Received: (at fakecontrol) by fakecontrolmessage; +To: <: $request_addr :> +From: <: $requester :> +Subject: Internal Control +Message-Id: <: $action :> +Date: <: $date :> +User-Agent: Fakemail v42.6.9 + +# A New Hope +# A long time ago, in a galaxy far, far away +# something happened. +# +# Magically this resulted in the following +# action being taken, but this fake control +# message doesn't tell you why it happened +# +# The action: +# <: $action :> +thanks +# This fakemail brought to you by your local debbugs +# administrator diff --git a/templates/en_US/mail/footer.tmpl b/templates/en_US/mail/footer.tmpl deleted file mode 100644 index 132201f..0000000 --- a/templates/en_US/mail/footer.tmpl +++ /dev/null @@ -1,11 +0,0 @@ --- -{ -my %ref_handled; -for my $bug (sort ($ref,@refs)) { - next unless defined $bug; - next if exists $ref_handled{$bug}; - $ref_handled{$bug} = 1; - $OUT .= bugurl($bug).qq(\n); -} -}{$config{project}} {ucfirst($config{bug})} Tracking System -Contact {$config{maintainer_email}} with problems diff --git a/templates/en_US/mail/footer.tx b/templates/en_US/mail/footer.tx new file mode 100644 index 0000000..921606e --- /dev/null +++ b/templates/en_US/mail/footer.tx @@ -0,0 +1,6 @@ +-- +: for $refs -> $bug { +<: bugurl($bug) :> +: } +<:$config.project:> <: $config.ubug :> Tracking System +Contact <: $config.maintainer_email :> with problems diff --git a/templates/en_US/mail/forward_maintonly.tmpl b/templates/en_US/mail/forward_maintonly.tmpl deleted file mode 100644 index ec6606e..0000000 --- a/templates/en_US/mail/forward_maintonly.tmpl +++ /dev/null @@ -1,4 +0,0 @@ - -Your message has been forwarded to the package maintainers (but not -other interested parties, as you requested) for their attention; they -will reply in due course. diff --git a/templates/en_US/mail/forward_maintonly.tx b/templates/en_US/mail/forward_maintonly.tx new file mode 100644 index 0000000..ec6606e --- /dev/null +++ b/templates/en_US/mail/forward_maintonly.tx @@ -0,0 +1,4 @@ + +Your message has been forwarded to the package maintainers (but not +other interested parties, as you requested) for their attention; they +will reply in due course. diff --git a/templates/en_US/mail/forward_normal.tmpl b/templates/en_US/mail/forward_normal.tmpl deleted file mode 100644 index c345364..0000000 --- a/templates/en_US/mail/forward_normal.tmpl +++ /dev/null @@ -1,3 +0,0 @@ - -Your message is being forwarded to the package maintainers and other -interested parties for their attention; they will reply in due course. diff --git a/templates/en_US/mail/forward_normal.tx b/templates/en_US/mail/forward_normal.tx new file mode 100644 index 0000000..c345364 --- /dev/null +++ b/templates/en_US/mail/forward_normal.tx @@ -0,0 +1,3 @@ + +Your message is being forwarded to the package maintainers and other +interested parties for their attention; they will reply in due course. diff --git a/templates/en_US/mail/forward_veryquiet.tmpl b/templates/en_US/mail/forward_veryquiet.tmpl deleted file mode 100644 index 623eded..0000000 --- a/templates/en_US/mail/forward_veryquiet.tmpl +++ /dev/null @@ -1,5 +0,0 @@ - -Your message has not been forwarded to the package maintainers or -other interested parties; you should ensure that the developers are -aware of the problem you have entered into the system - preferably -quoting the { $config{bug} } reference number, #{ $ref }. diff --git a/templates/en_US/mail/forward_veryquiet.tx b/templates/en_US/mail/forward_veryquiet.tx new file mode 100644 index 0000000..b98e82f --- /dev/null +++ b/templates/en_US/mail/forward_veryquiet.tx @@ -0,0 +1,5 @@ + +Your message has not been forwarded to the package maintainers or +other interested parties; you should ensure that the developers are +aware of the problem you have entered into the system - preferably +quoting the <: $config.bug :> reference number, #<: $ref :>. diff --git a/templates/en_US/mail/header.tmpl b/templates/en_US/mail/header.tmpl deleted file mode 100644 index e69de29..0000000 diff --git a/templates/en_US/mail/header.tx b/templates/en_US/mail/header.tx new file mode 100644 index 0000000..e69de29 diff --git a/templates/en_US/mail/invalid_maintainer.tmpl b/templates/en_US/mail/invalid_maintainer.tmpl deleted file mode 100644 index 9a244ff..0000000 --- a/templates/en_US/mail/invalid_maintainer.tmpl +++ /dev/null @@ -1,9 +0,0 @@ - -You requested that the message be sent to the package maintainer(s) -but either the { $config{bug} } report is not associated with any package (probably -because of a missing Package pseudo-header field in the original { $config{bug} } -report), or the package(s) specified do not have any maintainer(s). - -Your message has *not* been sent to any package maintainers; it has -merely been filed in the { $config{bug} } tracking system. If you require assistance -please contact { $config{maintainer_email} } quoting the { $config{bug} } number { $ref }. diff --git a/templates/en_US/mail/invalid_maintainer.tx b/templates/en_US/mail/invalid_maintainer.tx new file mode 100644 index 0000000..cff38b4 --- /dev/null +++ b/templates/en_US/mail/invalid_maintainer.tx @@ -0,0 +1,9 @@ + +You requested that the message be sent to the package maintainer(s) +but either the <: $config.bug :> report is not associated with any package (probably +because of a missing Package pseudo-header field in the original <: $config.bug :> +report), or the package(s) specified do not have any maintainer(s). + +Your message has *not* been sent to any package maintainers; it has +merely been filed in the <: $config.bug :> tracking system. If you require assistance +please contact <: $config.maintainer_email :> quoting the <: $config.bug :> number <: $ref :>. diff --git a/templates/en_US/mail/invalid_severity.tmpl b/templates/en_US/mail/invalid_severity.tmpl deleted file mode 100644 index dad928f..0000000 --- a/templates/en_US/mail/invalid_severity.tmpl +++ /dev/null @@ -1,5 +0,0 @@ - -Your message specified a Severity: in the pseudo-header, but -the severity value {$severity} was not recognised. -The default severity {$config{default_severity}} is being used instead. -The recognised values are: {$config{show_severities}}. diff --git a/templates/en_US/mail/invalid_severity.tx b/templates/en_US/mail/invalid_severity.tx new file mode 100644 index 0000000..826f6c8 --- /dev/null +++ b/templates/en_US/mail/invalid_severity.tx @@ -0,0 +1,5 @@ + +Your message specified a Severity: in the pseudo-header, but +the severity value <: $severity :> was not recognised. +The default severity <: $config.default_severity :> is being used instead. +The recognised values are: <: $config.show_severities :>. diff --git a/templates/en_US/mail/invalid_user.tmpl b/templates/en_US/mail/invalid_user.tmpl deleted file mode 100644 index d7f3891..0000000 --- a/templates/en_US/mail/invalid_user.tmpl +++ /dev/null @@ -1,3 +0,0 @@ - -Your message tried to set a usertag, but didn't have a valid -user set ('{$user}' isn't valid) diff --git a/templates/en_US/mail/invalid_user.tx b/templates/en_US/mail/invalid_user.tx new file mode 100644 index 0000000..2df06f2 --- /dev/null +++ b/templates/en_US/mail/invalid_user.tx @@ -0,0 +1,3 @@ + +Your message tried to set a usertag, but didn't have a valid +user set ('<: $user :>' isn't valid) diff --git a/templates/en_US/mail/invalid_version.tmpl b/templates/en_US/mail/invalid_version.tmpl deleted file mode 100644 index 1bddeab..0000000 --- a/templates/en_US/mail/invalid_version.tmpl +++ /dev/null @@ -1,9 +0,0 @@ - -Your message had a Version: pseudo-header with an invalid package -version: - -{$version} - -please either use found or fixed to the control server with a correct -version, or reply to this report indicating the correct version so the -maintainer (or someone else) can correct it for you. diff --git a/templates/en_US/mail/invalid_version.tx b/templates/en_US/mail/invalid_version.tx new file mode 100644 index 0000000..a1bbcaf --- /dev/null +++ b/templates/en_US/mail/invalid_version.tx @@ -0,0 +1,9 @@ + +Your message had a Version: pseudo-header with an invalid package +version: + +<: $version :> + +please either use found or fixed to the control server with a correct +version, or reply to this report indicating the correct version so the +maintainer (or someone else) can correct it for you. diff --git a/templates/en_US/mail/maintainercc.tmpl b/templates/en_US/mail/maintainercc.tmpl deleted file mode 100644 index 5a6cb41..0000000 --- a/templates/en_US/mail/maintainercc.tmpl +++ /dev/null @@ -1,3 +0,0 @@ - -Your message has been sent to the package maintainer(s): -{join('',map {" $_\n"} @maintaddrs)} \ No newline at end of file diff --git a/templates/en_US/mail/maintainercc.tx b/templates/en_US/mail/maintainercc.tx new file mode 100644 index 0000000..e168771 --- /dev/null +++ b/templates/en_US/mail/maintainercc.tx @@ -0,0 +1,3 @@ + +Your message has been sent to the package maintainer(s): +<: $maintaddrs.join("\n") :> diff --git a/templates/en_US/mail/message_body.tmpl b/templates/en_US/mail/message_body.tmpl deleted file mode 100644 index b2f7c4d..0000000 --- a/templates/en_US/mail/message_body.tmpl +++ /dev/null @@ -1,2 +0,0 @@ -{include('mail/header')}{$body} -{include('mail/footer')} \ No newline at end of file diff --git a/templates/en_US/mail/message_body.tx b/templates/en_US/mail/message_body.tx new file mode 100644 index 0000000..a7a4863 --- /dev/null +++ b/templates/en_US/mail/message_body.tx @@ -0,0 +1,3 @@ +: include "mail/header.tx" +<: $body :> +: include "mail/footer.tx" \ No newline at end of file diff --git a/templates/en_US/mail/process_ack.tmpl b/templates/en_US/mail/process_ack.tmpl deleted file mode 100644 index e15ea5a..0000000 --- a/templates/en_US/mail/process_ack.tmpl +++ /dev/null @@ -1,10 +0,0 @@ -{$thanks} -This is an automatically generated reply to let you know your message -has been received. -{ $forwardexplain }{ $resentccexplain } -If you wish to submit further information on this problem, please -send it to { $refreplyto }. - -Please do not send mail to {$config{maintainer_email}} unless you wish -to report a problem with the {ucfirst($config{bug})}-tracking system. -{$brokenness} \ No newline at end of file diff --git a/templates/en_US/mail/process_ack.tx b/templates/en_US/mail/process_ack.tx new file mode 100644 index 0000000..e3ca006 --- /dev/null +++ b/templates/en_US/mail/process_ack.tx @@ -0,0 +1,10 @@ +<: $thanks :> +This is an automatically generated reply to let you know your message +has been received. +<: $forwardexplain :><: $resentccexplain :> +If you wish to submit further information on this problem, please +send it to <: $refreplyto :>. + +Please do not send mail to <:$config.maintainer_email:> unless you wish +to report a problem with the <: $config.bug :>-tracking system. +<: $brokenness :> \ No newline at end of file diff --git a/templates/en_US/mail/process_ack_thanks_additional.tmpl b/templates/en_US/mail/process_ack_thanks_additional.tmpl deleted file mode 100644 index 47e7675..0000000 --- a/templates/en_US/mail/process_ack_thanks_additional.tmpl +++ /dev/null @@ -1,2 +0,0 @@ -Thank you for the additional information you have supplied regarding -this {$config{bug}} report. diff --git a/templates/en_US/mail/process_ack_thanks_additional.tx b/templates/en_US/mail/process_ack_thanks_additional.tx new file mode 100644 index 0000000..f431380 --- /dev/null +++ b/templates/en_US/mail/process_ack_thanks_additional.tx @@ -0,0 +1,2 @@ +Thank you for the additional information you have supplied regarding +this <: $config.bug :> report. diff --git a/templates/en_US/mail/process_ack_thanks_new.tmpl b/templates/en_US/mail/process_ack_thanks_new.tmpl deleted file mode 100644 index adcb5c0..0000000 --- a/templates/en_US/mail/process_ack_thanks_new.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -Thank you for filing a new {$config{bug}} report with {$config{project}}. - -You can follow progress on this {$config{bug}} here: {bugurl($ref)}. diff --git a/templates/en_US/mail/process_ack_thanks_new.tx b/templates/en_US/mail/process_ack_thanks_new.tx new file mode 100644 index 0000000..538eb50 --- /dev/null +++ b/templates/en_US/mail/process_ack_thanks_new.tx @@ -0,0 +1,3 @@ +Thank you for filing a new <: $config.bug :> report with <:$config.project:>. + +You can follow progress on this <: $config.bug :> here: <: bugurl($ref) :> diff --git a/templates/en_US/mail/process_broken_subject.tmpl b/templates/en_US/mail/process_broken_subject.tmpl deleted file mode 100644 index b14668d..0000000 --- a/templates/en_US/mail/process_broken_subject.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -Your message did not contain a Subject field. They are recommended and -useful because the title of a {$config{bug}} is determined using this field. -Please remember to include a Subject field in your messages in future. diff --git a/templates/en_US/mail/process_broken_subject.tx b/templates/en_US/mail/process_broken_subject.tx new file mode 100644 index 0000000..38275bd --- /dev/null +++ b/templates/en_US/mail/process_broken_subject.tx @@ -0,0 +1,3 @@ +Your message did not contain a Subject field. They are recommended and +useful because the title of a <: $config.bug :> is determined using this field. +Please remember to include a Subject field in your messages in future. diff --git a/templates/en_US/mail/process_default_package_selected.tmpl b/templates/en_US/mail/process_default_package_selected.tmpl deleted file mode 100644 index 46cbe54..0000000 --- a/templates/en_US/mail/process_default_package_selected.tmpl +++ /dev/null @@ -1,6 +0,0 @@ -The ${gBug} you submitted against package '{$old_package}' has no -known maintainer. This usually means that you either did not include a -Package: pseudoheader, or you filed a bug against a non-existant -package. Your bug report has been reassigned to package -'{$new_package}' which is the default package for this bug reporting -system. diff --git a/templates/en_US/mail/process_default_package_selected.tx b/templates/en_US/mail/process_default_package_selected.tx new file mode 100644 index 0000000..c5d941e --- /dev/null +++ b/templates/en_US/mail/process_default_package_selected.tx @@ -0,0 +1,6 @@ +The <: $config.bug :> you submitted against package '<: $old_package :>' has no +known maintainer. This usually means that you either did not include a +Package: pseudoheader, or you filed a bug against a non-existant +package. Your bug report has been reassigned to package +'<: $new_package :>' which is the default package for this bug reporting +system. diff --git a/templates/en_US/mail/process_mark_as_done.tmpl b/templates/en_US/mail/process_mark_as_done.tmpl deleted file mode 100644 index f764c43..0000000 --- a/templates/en_US/mail/process_mark_as_done.tmpl +++ /dev/null @@ -1,13 +0,0 @@ -Your message dated {$date} -with message-id {$messageid} -and subject line {$subject} -has caused the {$config{project}} {$config{bug}} report #{$ref}, -regarding {$data{subject}} -to be marked as done. - -This means that you claim that the problem has been dealt with. -If this is not the case it is now your responsibility to reopen the -{$config{bug}} report if necessary, and/or fix the problem forthwith. - -{include('mail/serious_mail_misconfiguration')} - diff --git a/templates/en_US/mail/process_mark_as_done.tx b/templates/en_US/mail/process_mark_as_done.tx new file mode 100644 index 0000000..3c8a4e0 --- /dev/null +++ b/templates/en_US/mail/process_mark_as_done.tx @@ -0,0 +1,13 @@ +Your message dated <: $date :> +with message-id <: $messageid :> +and subject line <: $subject :> +has caused the <: $config.project :> <: $config.bug :> report #<: $ref:> +regarding <:$data.subject:> +to be marked as done. + +This means that you claim that the problem has been dealt with. +If this is not the case it is now your responsibility to reopen the +<: $config.bug :> report if necessary, and/or fix the problem forthwith. + +: include "mail/serious_mail_misconfiguration.tx" + diff --git a/templates/en_US/mail/process_mark_as_forwarded.tmpl b/templates/en_US/mail/process_mark_as_forwarded.tmpl deleted file mode 100644 index c099230..0000000 --- a/templates/en_US/mail/process_mark_as_forwarded.tmpl +++ /dev/null @@ -1,9 +0,0 @@ -Your message dated {$date} -with message-id {$messageid} -has caused the {$gProject} {$gBug} report #{$ref}, -regarding {$data{subject}} -to be marked as having been forwarded to the upstream software -author(s) {$data{forwarded}} - -{include('mail/serious_mail_misconfiguration')} - diff --git a/templates/en_US/mail/process_mark_as_forwarded.tx b/templates/en_US/mail/process_mark_as_forwarded.tx new file mode 100644 index 0000000..e8d9341 --- /dev/null +++ b/templates/en_US/mail/process_mark_as_forwarded.tx @@ -0,0 +1,8 @@ +Your message dated <: $date :> +with message-id <: $messageid :> +has caused the <: $config.project :> <: $config.bug :> report #<: $ref :> +regarding <: $data.subject :> +to be marked as having been forwarded to the upstream software +author(s) <: $data.forwarded :> + +: include "mail/serious_mail_misconfiguration.tx" diff --git a/templates/en_US/mail/process_no_bug_number.tmpl b/templates/en_US/mail/process_no_bug_number.tmpl deleted file mode 100644 index 033d180..0000000 --- a/templates/en_US/mail/process_no_bug_number.tmpl +++ /dev/null @@ -1,22 +0,0 @@ -You sent a message to the {$config{project}} {$config{bug}} tracking system old-style -{$markaswhat} address ({$receivedat}), -without a recognisable $gBug number in the Subject. -Your message has been filed under junk but otherwise ignored. - -If you don't know what I'm talking about then probably either: - -You unwittingly sent a message to {$receivedat} -because you replied to all recipients of the message a developer used -to mark a {$config{bug}} as {$markaswhat} and you modified the Subject. In this case, -please do not be alarmed. To avoid confusion do not do it again, but -there is no need to apologise or mail anyone asking for an explanation. - --or- - -{include('mail/serious_mail_misconfiguration')} - -Your message was dated {$date} and had -message-id {$messageid} -and subject {$subject}. - -If you need any assistance or explanation please contact {$config{maintainer_email}}. diff --git a/templates/en_US/mail/process_no_bug_number.tx b/templates/en_US/mail/process_no_bug_number.tx new file mode 100644 index 0000000..b420deb --- /dev/null +++ b/templates/en_US/mail/process_no_bug_number.tx @@ -0,0 +1,22 @@ +You sent a message to the <:$config.project:> <: $config.bug :> tracking system old-style +<: $markaswhat :> address (<: $receivedat :>), +without a recognisable <: $config.bug :> number in the Subject. +Your message has been filed under junk but otherwise ignored. + +If you don't know what I'm talking about then probably either: + +You unwittingly sent a message to <: $receivedat :> +because you replied to all recipients of the message a developer used +to mark a <: $config.bug :> as <: $markaswhat :> and you modified the Subject. In this case, +please do not be alarmed. To avoid confusion do not do it again, but +there is no need to apologise or mail anyone asking for an explanation. + +-or- + +: include('mail/serious_mail_misconfiguration.tx') + +Your message was dated <: $date :> and had +message-id <: $messageid :> +and subject <: $subject :>. + +If you need any assistance or explanation please contact <:$config.maintainer_email:>. diff --git a/templates/en_US/mail/process_no_package.tmpl b/templates/en_US/mail/process_no_package.tmpl deleted file mode 100644 index ccfc486..0000000 --- a/templates/en_US/mail/process_no_package.tmpl +++ /dev/null @@ -1,22 +0,0 @@ -Your message didn't have a Package: line at the very first line of the -mail body (part of the pseudo-header), or didn't have a Package: line -at all. Unfortunatly, this means that your message has been ignored -completely. - -Without this information we are unable to categorise or otherwise deal -with your problem report. Please _resubmit_ your report to -{$baddress}@{$config{email_domain}} and tell us which package the -report is for. For help, check out -{$config{web_domain}}/Reporting{$config{html_suffix}}. - -Your message was dated {$date} and had -message-id {$messageid} -and subject {$subject}. -The complete text of it is attached to this message. - -If you need any assistance or explanation please contact -{$config{maintainer_email}} and include the the attached -message. - -If you didn't send the attached message (spam was sent forging your -from address), we apologize; please disregard this message. diff --git a/templates/en_US/mail/process_no_package.tx b/templates/en_US/mail/process_no_package.tx new file mode 100644 index 0000000..d6391eb --- /dev/null +++ b/templates/en_US/mail/process_no_package.tx @@ -0,0 +1,22 @@ +Your message didn't have a Package: line at the very first line of the +mail body (part of the pseudo-header), or didn't have a Package: line +at all. Unfortunatly, this means that your message has been ignored +completely. + +Without this information we are unable to categorise or otherwise deal +with your problem report. Please _resubmit_ your report to +<: $baddress :>@<: $config.email_domain:> and tell us which package the +report is for. For help, check out: +<: $config.web_domain :>/Reporting<: $config.html_suffix :> + +Your message was dated <: $date :> and had +message-id <: $messageid :> +and subject <: $subject :>. +The complete text of it is attached to this message. + +If you need any assistance or explanation please contact +<: $config.maintainer_email :> and include the the attached +message. + +If you didn't send the attached message (spam was sent forging your +from address), we apologize; please disregard this message. diff --git a/templates/en_US/mail/process_unknown_bug_number.tmpl b/templates/en_US/mail/process_unknown_bug_number.tmpl deleted file mode 100644 index b3391a1..0000000 --- a/templates/en_US/mail/process_unknown_bug_number.tmpl +++ /dev/null @@ -1,21 +0,0 @@ -You sent a message to the {$config{bug}} tracking system which gave (in the -Subject line or encoded into the recipient at {$config{email_domain}), -the number of a nonexistent {$config{bug}} report (#{$tryref}). -{if ($config{remove_age}){ - $OUT .= "\n". -"This may be because that $config{bug} report has been resolved for more than $config{remove_age}\n". -"days, and the record of it has been archived and made read-only, or\n". -"because you mistyped the $config{bug} report number.\n" - } -} -Your message was dated {$date} and was sent to -{$baddress}@{$config{email_domain}}. It had -Message-ID {$messageid} -and Subject {$subject} - -It has been filed (under junk) but otherwise ignored. - -Please consult your records to find the correct {$config{bug}} report -number, or contact {$config{maintainer_email}} for assistance. - -{include('mail/serious_mail_misconfiguration')} \ No newline at end of file diff --git a/templates/en_US/mail/process_unknown_bug_number.tx b/templates/en_US/mail/process_unknown_bug_number.tx new file mode 100644 index 0000000..76b72df --- /dev/null +++ b/templates/en_US/mail/process_unknown_bug_number.tx @@ -0,0 +1,20 @@ +You sent a message to the <: $config.bug :> tracking system which gave (in the +Subject line or encoded into the recipient at <: $config.email_domain :>), +the number of a nonexistent <: $config.bug :> report (#<: $tryref :>). +:if ($config.remove_age) { +This may be because that <: $config.bug :> report has been resolved for more than <: $config.remove_age :> +days, and the record of it has been archived and made read-only, or +because you mistyped the <: $config.bug :> report number. +: } + +Your message was dated <: $date :> and was sent to +< :$baddress :>@<:$config.email_domain:>. It had +Message-ID <: $messageid :> +and Subject <: $subject :> + +It has been filed (under junk) but otherwise ignored. + +Please consult your records to find the correct <: $config.bug :> report +number, or contact <: $config.maintainer_email :> for assistance. + +: include('mail/serious_mail_misconfiguration.tx') \ No newline at end of file diff --git a/templates/en_US/mail/process_your_bug_done.tmpl b/templates/en_US/mail/process_your_bug_done.tmpl deleted file mode 100644 index f01e5b0..0000000 --- a/templates/en_US/mail/process_your_bug_done.tmpl +++ /dev/null @@ -1,12 +0,0 @@ -This is an automatic notification regarding your {$config{bug}} report -which was filed against the {$data{package}} package: - -#{$data{bug_num}}: {$data{subject}} - -It has been closed by {$markedby}. - -Their explanation is attached below along with your original report. -If this explanation is unsatisfactory and you have not received a -better one in a separate message then please contact {$markedby} by -replying to this email. - diff --git a/templates/en_US/mail/process_your_bug_done.tx b/templates/en_US/mail/process_your_bug_done.tx new file mode 100644 index 0000000..faac745 --- /dev/null +++ b/templates/en_US/mail/process_your_bug_done.tx @@ -0,0 +1,12 @@ +This is an automatic notification regarding your <: $config.bug :> report +which was filed against the <: $data.package :> package: + +#<: $data.bug_num :>: <: $data.subject :> + +It has been closed by <: $markedby :> + +Their explanation is attached below along with your original report. +If this explanation is unsatisfactory and you have not received a +better one in a separate message then please contact <: $markedby :> by +replying to this email. + diff --git a/templates/en_US/mail/serious_mail_misconfiguration.tmpl b/templates/en_US/mail/serious_mail_misconfiguration.tmpl deleted file mode 100644 index 1a9539f..0000000 --- a/templates/en_US/mail/serious_mail_misconfiguration.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -(NB: If you are a system administrator and have no idea what this -message is talking about, this may indicate a serious mail system -misconfiguration somewhere. Please contact {$config{maintainer_email}} -immediately.) \ No newline at end of file diff --git a/templates/en_US/mail/serious_mail_misconfiguration.tx b/templates/en_US/mail/serious_mail_misconfiguration.tx new file mode 100644 index 0000000..4f7477c --- /dev/null +++ b/templates/en_US/mail/serious_mail_misconfiguration.tx @@ -0,0 +1,4 @@ +(NB: If you are a system administrator and have no idea what this +message is talking about, this may indicate a serious mail system +misconfiguration somewhere. Please contact <: $config.maintainer_email :> +immediately.) \ No newline at end of file diff --git a/templates/en_US/mail/submitter_changed.tmpl b/templates/en_US/mail/submitter_changed.tmpl deleted file mode 100644 index c7032f1..0000000 --- a/templates/en_US/mail/submitter_changed.tmpl +++ /dev/null @@ -1,13 +0,0 @@ -The submitter address recorded for your {$config{bug}} report -#{$data{bug_num}}: {$data{subject}} -has been changed. - -The old submitter address for this report was -{$old_data{originator}}. - -The new submitter address is -{$data{originator}}. - -This change was made by -{$replyto}. -If it was incorrect, please contact them directly. diff --git a/templates/en_US/mail/submitter_changed.tx b/templates/en_US/mail/submitter_changed.tx new file mode 100644 index 0000000..5920c0e --- /dev/null +++ b/templates/en_US/mail/submitter_changed.tx @@ -0,0 +1,13 @@ +The submitter address recorded for your <: $config.bug :> report +#<: $data.bug_num :>: <:$data.subject:> +has been changed. + +The old submitter address for this report was +<: $old_data.originator :>. + +The new submitter address is +<: $data.originator :>. + +This change was made by +<: $replyto :> +If it was incorrect, please contact them directly. diff --git a/templates/en_US/mail/xdebbugscc.tmpl b/templates/en_US/mail/xdebbugscc.tmpl deleted file mode 100644 index cc6e4d3..0000000 --- a/templates/en_US/mail/xdebbugscc.tmpl +++ /dev/null @@ -1,4 +0,0 @@ - -As you requested using X-Debbugs-CC, your message was also forwarded to - { $xcchdr } -(after having been given a { $config{bug} } report number, if it did not have one). diff --git a/templates/en_US/mail/xdebbugscc.tx b/templates/en_US/mail/xdebbugscc.tx new file mode 100644 index 0000000..3641584 --- /dev/null +++ b/templates/en_US/mail/xdebbugscc.tx @@ -0,0 +1,4 @@ + +As you requested using X-Debbugs-CC, your message was also forwarded to + <: $xcchdr :> +(after having been given a <: $config.bug :> report number, if it did not have one).