]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 813628 - New extension hook for Bugzilla::Bug::update called bug_start_of_update
authorDave Lawrence <dlawrence@mozilla.com>
Tue, 18 Dec 2012 20:17:52 +0000 (15:17 -0500)
committerDave Lawrence <dlawrence@mozilla.com>
Tue, 18 Dec 2012 20:17:52 +0000 (15:17 -0500)
r/a=LpSolit

Bugzilla/Bug.pm
Bugzilla/Hook.pm
extensions/Example/Extension.pm

index efad66f622865395f824fea2d4e3416a73369b8a..1f2b3cfeab79fce65bdd05f2372f06d49389db8c 100644 (file)
@@ -791,6 +791,10 @@ sub update {
 
     my ($changes, $old_bug) = $self->SUPER::update(@_);
 
+    Bugzilla::Hook::process('bug_start_of_update',
+        { timestamp => $delta_ts, bug => $self,
+           old_bug => $old_bug, changes => $changes });
+
     # Certain items in $changes have to be fixed so that they hold
     # a name instead of an ID.
     foreach my $field (qw(product_id component_id)) {
index 5ac07046e801e0ed57cca066192d0bca0d58dabf..4c8933b168ce43830f18a0cafe3fe65565e8e82e 100644 (file)
@@ -421,6 +421,39 @@ to the user.
 
 =back
 
+=head2 bug_start_of_update
+
+This happens near the beginning of L<Bugzilla::Bug/update>, after L<Bugzilla::Object/update>
+is called, but before all other special changes are made to the database. Once use case is
+this allows for adding your own entries to the C<changes> hash which gets added to the
+bugs_activity table later keeping you from having to do it yourself. Also this is also helpful
+if your extension needs to add CC members, flags, keywords, groups, etc. This generally
+occurs inside a database transaction.
+
+Params:
+
+=over
+
+=item C<bug> 
+
+The changed bug object, with all fields set to their updated values.
+
+=item C<old_bug>
+
+A bug object pulled from the database before the fields were set to
+their updated values (so it has the old values available for each field).
+
+=item C<timestamp> 
+
+The timestamp used for all updates in this transaction, as a SQL date
+string.
+
+=item C<changes> 
+
+The hash of changed fields. C<< $changes->{field} = [old, new] >>
+
+=back
+
 =head2 bug_url_sub_classes
 
 Allows you to add more L<Bugzilla::BugUrl> sub-classes.
index 6b85ace42c1f46e071e7d39a089c3231a8773d61..76e866b3c060d87a4752020220962142bbfdd38b 100644 (file)
@@ -153,6 +153,42 @@ sub bug_end_of_create_validators {
     # $bug_params->{cc} = [];
 }
 
+sub bug_start_of_update {
+    my ($self, $args) = @_;
+
+    # This code doesn't actually *do* anything, it's just here to show you
+    # how to use this hook.
+    my ($bug, $old_bug, $timestamp, $changes) = 
+        @$args{qw(bug old_bug timestamp changes)};
+
+    foreach my $field (keys %$changes) {
+        my $used_to_be = $changes->{$field}->[0];
+        my $now_it_is  = $changes->{$field}->[1];
+    }
+
+    my $old_summary = $old_bug->short_desc;
+
+    my $status_message;
+    if (my $status_change = $changes->{'bug_status'}) {
+        my $old_status = new Bugzilla::Status({ name => $status_change->[0] });
+        my $new_status = new Bugzilla::Status({ name => $status_change->[1] });
+        if ($new_status->is_open && !$old_status->is_open) {
+            $status_message = "Bug re-opened!";
+        }
+        if (!$new_status->is_open && $old_status->is_open) {
+            $status_message = "Bug closed!";
+        }
+    }
+
+    my $bug_id = $bug->id;
+    my $num_changes = scalar keys %$changes;
+    my $result = "There were $num_changes changes to fields on bug $bug_id"
+                 . " at $timestamp.";
+    # Uncomment this line to see $result in your webserver's error log whenever
+    # you update a bug.
+    # warn $result;
+}
+
 sub bug_end_of_update {
     my ($self, $args) = @_;