2012-11-19 13:24:05 -05:00
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: events
|
|
|
|
#
|
|
|
|
# id :integer not null, primary key
|
|
|
|
# target_type :string(255)
|
|
|
|
# target_id :integer
|
|
|
|
# title :string(255)
|
|
|
|
# data :text
|
|
|
|
# project_id :integer
|
2014-04-09 08:05:03 -04:00
|
|
|
# created_at :datetime
|
|
|
|
# updated_at :datetime
|
2012-11-19 13:24:05 -05:00
|
|
|
# action :integer
|
|
|
|
# author_id :integer
|
|
|
|
#
|
|
|
|
|
2012-02-28 08:09:23 -05:00
|
|
|
class Event < ActiveRecord::Base
|
2013-12-09 12:40:55 -05:00
|
|
|
default_scope { where.not(author_id: nil) }
|
2012-03-07 03:13:43 -05:00
|
|
|
|
2013-02-13 06:48:16 -05:00
|
|
|
CREATED = 1
|
|
|
|
UPDATED = 2
|
|
|
|
CLOSED = 3
|
|
|
|
REOPENED = 4
|
|
|
|
PUSHED = 5
|
|
|
|
COMMENTED = 6
|
|
|
|
MERGED = 7
|
|
|
|
JOINED = 8 # User joined project
|
|
|
|
LEFT = 9 # User left project
|
2012-02-28 09:01:14 -05:00
|
|
|
|
2012-09-27 02:20:36 -04:00
|
|
|
delegate :name, :email, to: :author, prefix: true, allow_nil: true
|
|
|
|
delegate :title, to: :issue, prefix: true, allow_nil: true
|
|
|
|
delegate :title, to: :merge_request, prefix: true, allow_nil: true
|
2014-05-29 10:55:55 -04:00
|
|
|
delegate :title, to: :note, prefix: true, allow_nil: true
|
2012-09-27 02:20:36 -04:00
|
|
|
|
2012-09-27 16:23:11 -04:00
|
|
|
belongs_to :author, class_name: "User"
|
2012-02-28 08:09:23 -05:00
|
|
|
belongs_to :project
|
2012-08-10 18:07:50 -04:00
|
|
|
belongs_to :target, polymorphic: true
|
2012-02-28 09:01:14 -05:00
|
|
|
|
2012-04-03 19:49:58 -04:00
|
|
|
# For Hash only
|
|
|
|
serialize :data
|
2012-02-28 09:01:14 -05:00
|
|
|
|
2014-06-17 14:23:43 -04:00
|
|
|
# Callbacks
|
|
|
|
after_create :reset_project_activity
|
|
|
|
|
2012-10-08 20:10:04 -04:00
|
|
|
# Scopes
|
2013-02-12 02:16:45 -05:00
|
|
|
scope :recent, -> { order("created_at DESC") }
|
2013-02-13 06:48:16 -05:00
|
|
|
scope :code_push, -> { where(action: PUSHED) }
|
2012-10-09 15:09:46 -04:00
|
|
|
scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
|
2012-02-29 15:38:24 -05:00
|
|
|
|
2012-10-08 20:10:04 -04:00
|
|
|
class << self
|
2013-07-17 08:11:03 -04:00
|
|
|
def create_ref_event(project, user, ref, action = 'add', prefix = 'refs/heads')
|
2014-02-24 07:55:27 -05:00
|
|
|
commit = project.repository.commit(ref.target)
|
|
|
|
|
2013-07-17 08:11:03 -04:00
|
|
|
if action.to_s == 'add'
|
|
|
|
before = '00000000'
|
2014-02-24 07:55:27 -05:00
|
|
|
after = commit.id
|
2013-07-17 08:11:03 -04:00
|
|
|
else
|
2014-02-24 07:55:27 -05:00
|
|
|
before = commit.id
|
2013-07-17 08:11:03 -04:00
|
|
|
after = '00000000'
|
|
|
|
end
|
|
|
|
|
2013-07-16 15:43:14 -04:00
|
|
|
Event.create(
|
|
|
|
project: project,
|
|
|
|
action: Event::PUSHED,
|
|
|
|
data: {
|
2013-07-16 16:12:52 -04:00
|
|
|
ref: "#{prefix}/#{ref.name}",
|
2013-07-17 08:11:03 -04:00
|
|
|
before: before,
|
|
|
|
after: after
|
2013-07-16 15:43:14 -04:00
|
|
|
},
|
|
|
|
author_id: user.id
|
|
|
|
)
|
|
|
|
end
|
2014-07-16 14:44:24 -04:00
|
|
|
|
|
|
|
def reset_event_cache_for(target)
|
|
|
|
Event.where(target_id: target.id, target_type: target.class.to_s).
|
|
|
|
order('id DESC').limit(100).
|
|
|
|
update_all(updated_at: Time.now)
|
|
|
|
end
|
2012-07-20 01:39:34 -04:00
|
|
|
end
|
|
|
|
|
2012-12-14 14:39:55 -05:00
|
|
|
def proper?
|
|
|
|
if push?
|
|
|
|
true
|
|
|
|
elsif membership_changed?
|
|
|
|
true
|
|
|
|
else
|
|
|
|
(issue? || merge_request? || note? || milestone?) && target
|
|
|
|
end
|
2012-03-01 13:47:57 -05:00
|
|
|
end
|
|
|
|
|
2012-09-14 11:46:40 -04:00
|
|
|
def project_name
|
|
|
|
if project
|
2013-06-22 09:00:39 -04:00
|
|
|
project.name_with_namespace
|
2012-09-14 11:46:40 -04:00
|
|
|
else
|
2012-09-30 09:04:43 -04:00
|
|
|
"(deleted project)"
|
2012-09-14 11:46:40 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-10-01 09:39:19 -04:00
|
|
|
def target_title
|
2013-06-06 12:19:17 -04:00
|
|
|
if target && target.respond_to?(:title)
|
|
|
|
target.title
|
|
|
|
end
|
2012-10-01 09:39:19 -04:00
|
|
|
end
|
|
|
|
|
2012-02-29 15:38:24 -05:00
|
|
|
def push?
|
2013-02-13 06:48:16 -05:00
|
|
|
action == self.class::PUSHED && valid_push?
|
2012-02-29 15:38:24 -05:00
|
|
|
end
|
|
|
|
|
2012-04-01 17:24:45 -04:00
|
|
|
def merged?
|
2013-02-13 06:48:16 -05:00
|
|
|
action == self.class::MERGED
|
2012-04-01 17:24:45 -04:00
|
|
|
end
|
|
|
|
|
2012-03-07 03:13:43 -05:00
|
|
|
def closed?
|
2013-02-13 06:48:16 -05:00
|
|
|
action == self.class::CLOSED
|
2012-03-07 03:13:43 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def reopened?
|
2013-02-13 06:48:16 -05:00
|
|
|
action == self.class::REOPENED
|
2012-03-07 03:13:43 -05:00
|
|
|
end
|
|
|
|
|
2012-12-14 12:33:33 -05:00
|
|
|
def milestone?
|
|
|
|
target_type == "Milestone"
|
|
|
|
end
|
|
|
|
|
|
|
|
def note?
|
|
|
|
target_type == "Note"
|
|
|
|
end
|
|
|
|
|
2012-09-14 11:46:40 -04:00
|
|
|
def issue?
|
2012-04-01 17:24:45 -04:00
|
|
|
target_type == "Issue"
|
2012-02-29 15:38:24 -05:00
|
|
|
end
|
|
|
|
|
2012-09-14 11:46:40 -04:00
|
|
|
def merge_request?
|
2012-04-01 17:24:45 -04:00
|
|
|
target_type == "MergeRequest"
|
2012-03-05 17:29:40 -05:00
|
|
|
end
|
|
|
|
|
2012-09-09 16:18:28 -04:00
|
|
|
def joined?
|
2013-02-13 06:48:16 -05:00
|
|
|
action == JOINED
|
2012-09-09 17:27:47 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def left?
|
2013-02-13 06:48:16 -05:00
|
|
|
action == LEFT
|
2012-09-09 17:27:47 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def membership_changed?
|
|
|
|
joined? || left?
|
2012-09-09 16:18:28 -04:00
|
|
|
end
|
|
|
|
|
2012-09-14 11:46:40 -04:00
|
|
|
def issue
|
2012-03-01 15:43:04 -05:00
|
|
|
target if target_type == "Issue"
|
|
|
|
end
|
|
|
|
|
|
|
|
def merge_request
|
|
|
|
target if target_type == "MergeRequest"
|
|
|
|
end
|
|
|
|
|
2014-05-29 10:55:55 -04:00
|
|
|
def note
|
|
|
|
target if target_type == "Note"
|
|
|
|
end
|
|
|
|
|
2012-04-01 17:24:45 -04:00
|
|
|
def action_name
|
|
|
|
if closed?
|
|
|
|
"closed"
|
|
|
|
elsif merged?
|
2013-04-06 08:53:35 -04:00
|
|
|
"accepted"
|
2012-09-09 16:18:28 -04:00
|
|
|
elsif joined?
|
|
|
|
'joined'
|
2012-09-09 17:27:47 -04:00
|
|
|
elsif left?
|
|
|
|
'left'
|
2012-09-14 11:46:40 -04:00
|
|
|
else
|
2012-04-01 17:24:45 -04:00
|
|
|
"opened"
|
2012-02-29 15:38:24 -05:00
|
|
|
end
|
|
|
|
end
|
2013-01-02 16:35:11 -05:00
|
|
|
|
|
|
|
def valid_push?
|
2013-11-13 07:21:03 -05:00
|
|
|
data[:ref] && ref_name.present?
|
2014-12-29 04:36:57 -05:00
|
|
|
rescue
|
2013-01-02 16:35:11 -05:00
|
|
|
false
|
|
|
|
end
|
|
|
|
|
|
|
|
def tag?
|
|
|
|
data[:ref]["refs/tags"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def branch?
|
|
|
|
data[:ref]["refs/heads"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def new_ref?
|
|
|
|
commit_from =~ /^00000/
|
|
|
|
end
|
|
|
|
|
|
|
|
def rm_ref?
|
|
|
|
commit_to =~ /^00000/
|
|
|
|
end
|
|
|
|
|
|
|
|
def md_ref?
|
|
|
|
!(rm_ref? || new_ref?)
|
|
|
|
end
|
|
|
|
|
|
|
|
def commit_from
|
|
|
|
data[:before]
|
|
|
|
end
|
|
|
|
|
|
|
|
def commit_to
|
|
|
|
data[:after]
|
|
|
|
end
|
|
|
|
|
|
|
|
def ref_name
|
|
|
|
if tag?
|
|
|
|
tag_name
|
|
|
|
else
|
|
|
|
branch_name
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def branch_name
|
|
|
|
@branch_name ||= data[:ref].gsub("refs/heads/", "")
|
|
|
|
end
|
|
|
|
|
|
|
|
def tag_name
|
|
|
|
@tag_name ||= data[:ref].gsub("refs/tags/", "")
|
|
|
|
end
|
|
|
|
|
|
|
|
# Max 20 commits from push DESC
|
|
|
|
def commits
|
2013-11-25 10:59:12 -05:00
|
|
|
@commits ||= (data[:commits] || []).reverse
|
2013-01-02 16:35:11 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def commits_count
|
|
|
|
data[:total_commits_count] || commits.count || 0
|
|
|
|
end
|
|
|
|
|
|
|
|
def ref_type
|
|
|
|
tag? ? "tag" : "branch"
|
|
|
|
end
|
|
|
|
|
|
|
|
def push_action_name
|
|
|
|
if new_ref?
|
|
|
|
"pushed new"
|
|
|
|
elsif rm_ref?
|
|
|
|
"deleted"
|
|
|
|
else
|
|
|
|
"pushed to"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def push_with_commits?
|
2013-04-05 12:47:45 -04:00
|
|
|
md_ref? && commits.any? && commit_from && commit_to
|
2013-01-02 16:35:11 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def last_push_to_non_root?
|
|
|
|
branch? && project.default_branch != branch_name
|
|
|
|
end
|
|
|
|
|
|
|
|
def note_commit_id
|
|
|
|
target.commit_id
|
|
|
|
end
|
|
|
|
|
2013-08-19 15:12:59 -04:00
|
|
|
def target_iid
|
|
|
|
target.respond_to?(:iid) ? target.iid : target_id
|
|
|
|
end
|
|
|
|
|
2013-01-02 16:35:11 -05:00
|
|
|
def note_short_commit_id
|
2014-10-10 08:39:48 -04:00
|
|
|
Commit.truncate_sha(note_commit_id)
|
2013-01-02 16:35:11 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def note_commit?
|
|
|
|
target.noteable_type == "Commit"
|
|
|
|
end
|
|
|
|
|
2013-03-25 07:58:09 -04:00
|
|
|
def note_project_snippet?
|
|
|
|
target.noteable_type == "Snippet"
|
|
|
|
end
|
|
|
|
|
2013-01-02 16:35:11 -05:00
|
|
|
def note_target
|
|
|
|
target.noteable
|
|
|
|
end
|
|
|
|
|
|
|
|
def note_target_id
|
|
|
|
if note_commit?
|
|
|
|
target.commit_id
|
|
|
|
else
|
|
|
|
target.noteable_id.to_s
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-08-19 15:53:11 -04:00
|
|
|
def note_target_iid
|
|
|
|
if note_target.respond_to?(:iid)
|
|
|
|
note_target.iid
|
|
|
|
else
|
|
|
|
note_target_id
|
|
|
|
end.to_s
|
|
|
|
end
|
|
|
|
|
2013-01-02 16:35:11 -05:00
|
|
|
def note_target_type
|
|
|
|
if target.noteable_type.present?
|
|
|
|
target.noteable_type.titleize
|
|
|
|
else
|
|
|
|
"Wall"
|
|
|
|
end.downcase
|
|
|
|
end
|
2013-08-20 14:31:37 -04:00
|
|
|
|
|
|
|
def body?
|
|
|
|
if push?
|
|
|
|
push_with_commits?
|
|
|
|
elsif note?
|
|
|
|
true
|
|
|
|
else
|
|
|
|
target.respond_to? :title
|
|
|
|
end
|
|
|
|
end
|
2014-06-17 14:23:43 -04:00
|
|
|
|
|
|
|
def reset_project_activity
|
|
|
|
if project
|
2014-06-17 14:45:03 -04:00
|
|
|
project.update_column(:last_activity_at, self.created_at)
|
2014-06-17 14:23:43 -04:00
|
|
|
end
|
|
|
|
end
|
2012-02-28 08:09:23 -05:00
|
|
|
end
|