+sub no_such_bug {
+ my ($q,$ref) = @_;
+ print $q->header(-status => 404,
+ -content_type => "text/html",
+ -charset => 'utf-8',
+ -cache_control => 'public, max-age=600',
+ );
+ print fill_in_template(template=>'cgi/no_such_bug',
+ variables => {modify_time => strftime('%a, %e %b %Y %T UTC', gmtime),
+ bug_num => $ref,
+ },
+ );
+ exit 0;
+}
+
+## calculate etag for this bugreport.cgi call
+my $etag;
+## identify the files that we need to look at; if someone just wants the mbox,
+## they don't need to see anything but the buglog; otherwise, track what is
+## necessary for the usertags and things to calculate status.
+
+my @dependent_files = ($buglog);
+my $need_status = 0;
+if (not (($mbox and not $mbox_status_message) or
+ (defined $att and defined $msg))) {
+ $need_status = 1;
+ push @dependent_files,
+ $bug_status,
+ defined $config{version_index} ? $config{version_index}:(),
+ defined $config{binary_source_map} ? $config{binary_source_map}:();
+}
+
+## Identify the users required
+for my $user (map {split /[\s*,\s*]+/} make_list($param{users}||[])) {
+ next unless length($user);
+ push @dependent_files,Debbugs::User::usertag_file_from_email($user);
+}
+if (defined $param{usertag}) {
+ for my $usertag (make_list($param{usertag})) {
+ my ($user, $tag) = split /:/, $usertag, 2;
+ push @dependent_files,Debbugs::User::usertag_file_from_email($user);
+ }
+}
+$etag =
+ etag_does_not_match(cgi => $q,
+ additional_data => [grep {defined $_ ? $_ :()}
+ values %param
+ ],
+ files => [@dependent_files,
+ ],
+ );
+if (not $etag) {
+ print $q->header(-status => 304,
+ -cache_control => 'public, max-age=600',
+ -etag => $etag,
+ -charset => 'utf-8',
+ -content_type => 'text/html',
+ );
+ print "304: Not modified\n";
+ exit 0;