summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xBugzilla/Bug.pm113
-rw-r--r--CGI.pl109
-rwxr-xr-xprocess_bug.cgi4
-rwxr-xr-xshow_activity.cgi5
4 files changed, 119 insertions, 112 deletions
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm
index fae0decc0..32030a7c2 100755
--- a/Bugzilla/Bug.pm
+++ b/Bugzilla/Bug.pm
@@ -805,6 +805,119 @@ sub GetComments {
return \@comments;
}
+# Get the activity of a bug, starting from $starttime (if given).
+# This routine assumes ValidateBugID has been previously called.
+sub GetBugActivity {
+ my ($id, $starttime) = @_;
+ my $dbh = Bugzilla->dbh;
+
+ # Arguments passed to the SQL query.
+ my @args = ($id);
+
+ # Only consider changes since $starttime, if given.
+ my $datepart = "";
+ if (defined $starttime) {
+ trick_taint($starttime);
+ push (@args, $starttime);
+ $datepart = "AND bugs_activity.bug_when > ?";
+ }
+
+ # Only includes attachments the user is allowed to see.
+ my $suppjoins = "";
+ my $suppwhere = "";
+ if (Param("insidergroup") && !UserInGroup(Param('insidergroup'))) {
+ $suppjoins = "LEFT JOIN attachments
+ ON attachments.attach_id = bugs_activity.attach_id";
+ $suppwhere = "AND COALESCE(attachments.isprivate, 0) = 0";
+ }
+
+ my $query = "
+ SELECT COALESCE(fielddefs.description, "
+ # This is a hack - PostgreSQL requires both COALESCE
+ # arguments to be of the same type, and this is the only
+ # way supported by both MySQL 3 and PostgreSQL to convert
+ # an integer to a string. MySQL 4 supports CAST.
+ . $dbh->sql_string_concat('bugs_activity.fieldid', q{''}) .
+ "), fielddefs.name, bugs_activity.attach_id, " .
+ $dbh->sql_date_format('bugs_activity.bug_when', '%Y.%m.%d %H:%i:%s') .
+ ", bugs_activity.removed, bugs_activity.added, profiles.login_name
+ FROM bugs_activity
+ $suppjoins
+ LEFT JOIN fielddefs
+ ON bugs_activity.fieldid = fielddefs.fieldid
+ INNER JOIN profiles
+ ON profiles.userid = bugs_activity.who
+ WHERE bugs_activity.bug_id = ?
+ $datepart
+ $suppwhere
+ ORDER BY bugs_activity.bug_when";
+
+ my $list = $dbh->selectall_arrayref($query, undef, @args);
+
+ my @operations;
+ my $operation = {};
+ my $changes = [];
+ my $incomplete_data = 0;
+
+ foreach my $entry (@$list) {
+ my ($field, $fieldname, $attachid, $when, $removed, $added, $who) = @$entry;
+ my %change;
+ my $activity_visible = 1;
+
+ # check if the user should see this field's activity
+ if ($fieldname eq 'remaining_time'
+ || $fieldname eq 'estimated_time'
+ || $fieldname eq 'work_time'
+ || $fieldname eq 'deadline')
+ {
+ $activity_visible = UserInGroup(Param('timetrackinggroup')) ? 1 : 0;
+ } else {
+ $activity_visible = 1;
+ }
+
+ if ($activity_visible) {
+ # This gets replaced with a hyperlink in the template.
+ $field =~ s/^Attachment// if $attachid;
+
+ # Check for the results of an old Bugzilla data corruption bug
+ $incomplete_data = 1 if ($added =~ /^\?/ || $removed =~ /^\?/);
+
+ # An operation, done by 'who' at time 'when', has a number of
+ # 'changes' associated with it.
+ # If this is the start of a new operation, store the data from the
+ # previous one, and set up the new one.
+ if ($operation->{'who'}
+ && ($who ne $operation->{'who'}
+ || $when ne $operation->{'when'}))
+ {
+ $operation->{'changes'} = $changes;
+ push (@operations, $operation);
+
+ # Create new empty anonymous data structures.
+ $operation = {};
+ $changes = [];
+ }
+
+ $operation->{'who'} = $who;
+ $operation->{'when'} = $when;
+
+ $change{'field'} = $field;
+ $change{'fieldname'} = $fieldname;
+ $change{'attachid'} = $attachid;
+ $change{'removed'} = $removed;
+ $change{'added'} = $added;
+ push (@$changes, \%change);
+ }
+ }
+
+ if ($operation->{'who'}) {
+ $operation->{'changes'} = $changes;
+ push (@operations, $operation);
+ }
+
+ return(\@operations, $incomplete_data);
+}
+
# CountOpenDependencies counts the number of open dependent bugs for a
# list of bugs and returns a list of bug_id's and their dependency count
# It takes one parameter:
diff --git a/CGI.pl b/CGI.pl
index 27e9fab26..73df77695 100644
--- a/CGI.pl
+++ b/CGI.pl
@@ -232,115 +232,6 @@ sub LogActivityEntry {
}
}
-sub GetBugActivity {
- my ($id, $starttime) = (@_);
- my $datepart = "";
- my $dbh = Bugzilla->dbh;
-
- die "Invalid id: $id" unless $id=~/^\s*\d+\s*$/;
-
- if (defined $starttime) {
- $datepart = "AND bugs_activity.bug_when > " . SqlQuote($starttime);
- }
- my $suppjoins = "";
- my $suppwhere = "";
- if (Param("insidergroup") && !UserInGroup(Param('insidergroup'))) {
- $suppjoins = "LEFT JOIN attachments
- ON attachments.attach_id = bugs_activity.attach_id";
- $suppwhere = "AND COALESCE(attachments.isprivate, 0) = 0";
- }
- my $query = "
- SELECT COALESCE(fielddefs.description, "
- # This is a hack - PostgreSQL requires both COALESCE
- # arguments to be of the same type, and this is the only
- # way supported by both MySQL 3 and PostgreSQL to convert
- # an integer to a string. MySQL 4 supports CAST.
- . $dbh->sql_string_concat('bugs_activity.fieldid', q{''}) .
- "), fielddefs.name, bugs_activity.attach_id, " .
- $dbh->sql_date_format('bugs_activity.bug_when', '%Y.%m.%d %H:%i:%s') .
- ", bugs_activity.removed, bugs_activity.added, profiles.login_name
- FROM bugs_activity
- $suppjoins
- LEFT JOIN fielddefs
- ON bugs_activity.fieldid = fielddefs.fieldid
- INNER JOIN profiles
- ON profiles.userid = bugs_activity.who
- WHERE bugs_activity.bug_id = $id
- $datepart
- $suppwhere
- ORDER BY bugs_activity.bug_when";
-
- SendSQL($query);
-
- my @operations;
- my $operation = {};
- my $changes = [];
- my $incomplete_data = 0;
-
- while (my ($field, $fieldname, $attachid, $when, $removed, $added, $who)
- = FetchSQLData())
- {
- my %change;
- my $activity_visible = 1;
-
- # check if the user should see this field's activity
- if ($fieldname eq 'remaining_time' ||
- $fieldname eq 'estimated_time' ||
- $fieldname eq 'work_time' ||
- $fieldname eq 'deadline') {
-
- if (!UserInGroup(Param('timetrackinggroup'))) {
- $activity_visible = 0;
- } else {
- $activity_visible = 1;
- }
- } else {
- $activity_visible = 1;
- }
-
- if ($activity_visible) {
- # This gets replaced with a hyperlink in the template.
- $field =~ s/^Attachment// if $attachid;
-
- # Check for the results of an old Bugzilla data corruption bug
- $incomplete_data = 1 if ($added =~ /^\?/ || $removed =~ /^\?/);
-
- # An operation, done by 'who' at time 'when', has a number of
- # 'changes' associated with it.
- # If this is the start of a new operation, store the data from the
- # previous one, and set up the new one.
- if ($operation->{'who'}
- && ($who ne $operation->{'who'}
- || $when ne $operation->{'when'}))
- {
- $operation->{'changes'} = $changes;
- push (@operations, $operation);
-
- # Create new empty anonymous data structures.
- $operation = {};
- $changes = [];
- }
-
- $operation->{'who'} = $who;
- $operation->{'when'} = $when;
-
- $change{'field'} = $field;
- $change{'fieldname'} = $fieldname;
- $change{'attachid'} = $attachid;
- $change{'removed'} = $removed;
- $change{'added'} = $added;
- push (@$changes, \%change);
- }
- }
-
- if ($operation->{'who'}) {
- $operation->{'changes'} = $changes;
- push (@operations, $operation);
- }
-
- return(\@operations, $incomplete_data);
-}
-
############# Live code below here (that is, not subroutine defs) #############
use Bugzilla;
diff --git a/process_bug.cgi b/process_bug.cgi
index 58e52f83c..10dc47d62 100755
--- a/process_bug.cgi
+++ b/process_bug.cgi
@@ -1288,8 +1288,8 @@ foreach my $id (@idlist) {
}
if (defined $cgi->param('delta_ts') && $cgi->param('delta_ts') ne $delta_ts)
{
- ($vars->{'operations'}) = GetBugActivity($cgi->param('id'),
- $cgi->param('delta_ts'));
+ ($vars->{'operations'}) = Bugzilla::Bug::GetBugActivity($cgi->param('id'),
+ $cgi->param('delta_ts'));
$vars->{'start_at'} = $cgi->param('longdesclength');
diff --git a/show_activity.cgi b/show_activity.cgi
index 5ab4e366e..eacaeba37 100755
--- a/show_activity.cgi
+++ b/show_activity.cgi
@@ -28,6 +28,9 @@ use lib qw(.);
use vars qw ($template $vars);
require "CGI.pl";
+
+use Bugzilla::Bug;
+
my $cgi = Bugzilla->cgi;
###############################################################################
@@ -47,7 +50,7 @@ ValidateBugID($bug_id);
###############################################################################
($vars->{'operations'}, $vars->{'incomplete_data'}) =
- GetBugActivity($bug_id);
+ Bugzilla::Bug::GetBugActivity($bug_id);
$vars->{'bug_id'} = $bug_id;