summaryrefslogtreecommitdiff
path: root/app/observers
diff options
context:
space:
mode:
authorash wilson <smashwilson@gmail.com>2013-05-30 23:16:49 +0000
committerAsh Wilson <smashwilson@gmail.com>2013-08-25 18:58:41 -0400
commitc8a115c0e3a9c8242c2a422572d47a49e0cb2874 (patch)
tree5a36c3e0f364fdfb710e01090fc81b9676ea53c4 /app/observers
parent2b36dee64485062c69779217d4a202e5ca1b67bd (diff)
downloadgitlab-ce-c8a115c0e3a9c8242c2a422572d47a49e0cb2874.tar.gz
Link issues from comments and automatically close them
Any mention of Issues, MergeRequests, or Commits via GitLab-flavored markdown references in descriptions, titles, or attached Notes creates a back-reference Note that links to the original referencer. Furthermore, pushing commits with commit messages that match a (configurable) regexp to a project's default branch will close any issues mentioned by GFM in the matched closing phrase. If accepting a merge request would close any Issues in this way, a banner is appended to the merge request's main panel to indicate this.
Diffstat (limited to 'app/observers')
-rw-r--r--app/observers/activity_observer.rb4
-rw-r--r--app/observers/base_observer.rb4
-rw-r--r--app/observers/issue_observer.rb6
-rw-r--r--app/observers/merge_request_observer.rb8
-rw-r--r--app/observers/note_observer.rb12
5 files changed, 29 insertions, 5 deletions
diff --git a/app/observers/activity_observer.rb b/app/observers/activity_observer.rb
index 477ebd78aeb..d754ac8185a 100644
--- a/app/observers/activity_observer.rb
+++ b/app/observers/activity_observer.rb
@@ -5,8 +5,8 @@ class ActivityObserver < BaseObserver
event_author_id = record.author_id
if record.kind_of?(Note)
- # Skip system status notes like 'status changed to close'
- return true if record.note.include?("_Status changed to ")
+ # Skip system notes, like status changes and cross-references.
+ return true if record.system?
# Skip wall notes to prevent spamming of dashboard
return true if record.noteable_type.blank?
diff --git a/app/observers/base_observer.rb b/app/observers/base_observer.rb
index 92b73981d27..f9a0242ce77 100644
--- a/app/observers/base_observer.rb
+++ b/app/observers/base_observer.rb
@@ -10,4 +10,8 @@ class BaseObserver < ActiveRecord::Observer
def current_user
Thread.current[:current_user]
end
+
+ def current_commit
+ Thread.current[:current_commit]
+ end
end
diff --git a/app/observers/issue_observer.rb b/app/observers/issue_observer.rb
index 50538419776..886d8b776fb 100644
--- a/app/observers/issue_observer.rb
+++ b/app/observers/issue_observer.rb
@@ -1,6 +1,8 @@
class IssueObserver < BaseObserver
def after_create(issue)
notification.new_issue(issue, current_user)
+
+ issue.create_cross_references!(issue.project, current_user)
end
def after_close(issue, transition)
@@ -17,12 +19,14 @@ class IssueObserver < BaseObserver
if issue.is_being_reassigned?
notification.reassigned_issue(issue, current_user)
end
+
+ issue.notice_added_references(issue.project, current_user)
end
protected
# Create issue note with service comment like 'Status changed to closed'
def create_note(issue)
- Note.create_status_change_note(issue, issue.project, current_user, issue.state)
+ Note.create_status_change_note(issue, issue.project, current_user, issue.state, current_commit)
end
end
diff --git a/app/observers/merge_request_observer.rb b/app/observers/merge_request_observer.rb
index 689a25ff4b7..d70da514cd2 100644
--- a/app/observers/merge_request_observer.rb
+++ b/app/observers/merge_request_observer.rb
@@ -7,11 +7,13 @@ class MergeRequestObserver < ActivityObserver
end
notification.new_merge_request(merge_request, current_user)
+
+ merge_request.create_cross_references!(merge_request.project, current_user)
end
def after_close(merge_request, transition)
create_event(merge_request, Event::CLOSED)
- Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state)
+ Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)
notification.close_mr(merge_request, current_user)
end
@@ -33,11 +35,13 @@ class MergeRequestObserver < ActivityObserver
def after_reopen(merge_request, transition)
create_event(merge_request, Event::REOPENED)
- Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state)
+ Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)
end
def after_update(merge_request)
notification.reassigned_merge_request(merge_request, current_user) if merge_request.is_being_reassigned?
+
+ merge_request.notice_added_references(merge_request.project, current_user)
end
def create_event(record, status)
diff --git a/app/observers/note_observer.rb b/app/observers/note_observer.rb
index 7b79161cce4..d31b6e8d7ce 100644
--- a/app/observers/note_observer.rb
+++ b/app/observers/note_observer.rb
@@ -1,5 +1,17 @@
class NoteObserver < BaseObserver
def after_create(note)
notification.new_note(note)
+
+ unless note.system?
+ # Create a cross-reference note if this Note contains GFM that names an
+ # issue, merge request, or commit.
+ note.references.each do |mentioned|
+ Note.create_cross_reference_note(mentioned, note.noteable, note.author, note.project)
+ end
+ end
+ end
+
+ def after_update(note)
+ note.notice_added_references(note.project, current_user)
end
end