merging upstream changes
This commit is contained in:
commit
35d0de8f36
49 changed files with 512 additions and 169 deletions
|
@ -7,6 +7,7 @@ class Event < ActiveRecord::Base
|
|||
Reopened = 4
|
||||
Pushed = 5
|
||||
Commented = 6
|
||||
Merged = 7
|
||||
|
||||
belongs_to :project
|
||||
belongs_to :target, :polymorphic => true
|
||||
|
|
|
@ -1,9 +1,14 @@
|
|||
require File.join(Rails.root, "app/models/commit")
|
||||
|
||||
class MergeRequest < ActiveRecord::Base
|
||||
belongs_to :project
|
||||
belongs_to :author, :class_name => "User"
|
||||
belongs_to :assignee, :class_name => "User"
|
||||
has_many :notes, :as => :noteable, :dependent => :destroy
|
||||
|
||||
serialize :st_commits
|
||||
serialize :st_diffs
|
||||
|
||||
attr_protected :author, :author_id, :project, :project_id
|
||||
attr_accessor :author_id_of_changes
|
||||
|
||||
|
@ -32,6 +37,13 @@ class MergeRequest < ActiveRecord::Base
|
|||
scope :closed, where(:closed => true)
|
||||
scope :assigned, lambda { |u| where(:assignee_id => u.id)}
|
||||
|
||||
def self.search query
|
||||
where("title like :query", :query => "%#{query}%")
|
||||
end
|
||||
|
||||
def self.find_all_by_branch(branch_name)
|
||||
where("source_branch like :branch or target_branch like :branch", :branch => branch_name)
|
||||
end
|
||||
|
||||
def validate_branches
|
||||
if target_branch == source_branch
|
||||
|
@ -39,23 +51,99 @@ class MergeRequest < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
def reload_code
|
||||
self.reloaded_commits
|
||||
self.reloaded_diffs
|
||||
end
|
||||
|
||||
def new?
|
||||
today? && created_at == updated_at
|
||||
end
|
||||
|
||||
def diffs
|
||||
st_diffs || []
|
||||
end
|
||||
|
||||
def reloaded_diffs
|
||||
if open? && unmerged_diffs.any?
|
||||
self.st_diffs = unmerged_diffs
|
||||
save
|
||||
end
|
||||
diffs
|
||||
end
|
||||
|
||||
def unmerged_diffs
|
||||
commits = project.repo.commits_between(target_branch, source_branch).map {|c| Commit.new(c)}
|
||||
diffs = project.repo.diff(commits.first.prev_commit.id, commits.last.id) rescue []
|
||||
end
|
||||
|
||||
def last_commit
|
||||
project.commit(source_branch)
|
||||
commits.first
|
||||
end
|
||||
|
||||
def merged?
|
||||
merged && merge_event
|
||||
end
|
||||
|
||||
def merge_event
|
||||
self.project.events.where(:target_id => self.id, :target_type => "MergeRequest", :action => Event::Merged).last
|
||||
end
|
||||
|
||||
def closed_event
|
||||
self.project.events.where(:target_id => self.id, :target_type => "MergeRequest", :action => Event::Closed).last
|
||||
end
|
||||
|
||||
|
||||
# Return the number of +1 comments (upvotes)
|
||||
def upvotes
|
||||
notes.select(&:upvote?).size
|
||||
end
|
||||
|
||||
def commits
|
||||
st_commits || []
|
||||
end
|
||||
|
||||
def probably_merged?
|
||||
unmerged_commits.empty? &&
|
||||
commits.any? && open?
|
||||
end
|
||||
|
||||
def open?
|
||||
!closed
|
||||
end
|
||||
|
||||
def mark_as_merged!
|
||||
self.merged = true
|
||||
self.closed = true
|
||||
save
|
||||
end
|
||||
|
||||
def reloaded_commits
|
||||
if open? && unmerged_commits.any?
|
||||
self.st_commits = unmerged_commits
|
||||
save
|
||||
end
|
||||
commits
|
||||
end
|
||||
|
||||
def unmerged_commits
|
||||
self.project.repo.
|
||||
commits_between(self.target_branch, self.source_branch).
|
||||
map {|c| Commit.new(c)}.
|
||||
sort_by(&:created_at).
|
||||
reverse
|
||||
end
|
||||
|
||||
def merge!(user_id)
|
||||
self.mark_as_merged!
|
||||
Event.create(
|
||||
:project => self.project,
|
||||
:action => Event::Merged,
|
||||
:target_id => self.id,
|
||||
:target_type => "MergeRequest",
|
||||
:author_id => user_id
|
||||
)
|
||||
end
|
||||
end
|
||||
# == Schema Information
|
||||
#
|
||||
|
|
|
@ -54,6 +54,10 @@ class Project < ActiveRecord::Base
|
|||
UsersProject.access_roles
|
||||
end
|
||||
|
||||
def self.search query
|
||||
where("name like :query or code like :query or path like :query", :query => "%#{query}%")
|
||||
end
|
||||
|
||||
def to_param
|
||||
code
|
||||
end
|
||||
|
@ -73,6 +77,24 @@ class Project < ActiveRecord::Base
|
|||
)
|
||||
end
|
||||
|
||||
def update_merge_requests(oldrev, newrev, ref, author_key_id)
|
||||
return true unless ref =~ /heads/
|
||||
branch_name = ref.gsub("refs/heads/", "")
|
||||
user = Key.find_by_identifier(author_key_id).user
|
||||
c_ids = self.commits_between(oldrev, newrev).map(&:id)
|
||||
|
||||
# Update code for merge requests
|
||||
mrs = self.merge_requests.opened.find_all_by_branch(branch_name).all
|
||||
mrs.each { |merge_request| merge_request.reload_code }
|
||||
|
||||
# Close merge requests
|
||||
mrs = self.merge_requests.opened.where(:target_branch => branch_name).all
|
||||
mrs = mrs.select(&:last_commit).select { |mr| c_ids.include?(mr.last_commit.id) }
|
||||
mrs.each { |merge_request| merge_request.merge!(user.id) }
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def execute_web_hooks(oldrev, newrev, ref, author_key_id)
|
||||
ref_parts = ref.split('/')
|
||||
|
||||
|
|
|
@ -86,6 +86,10 @@ class User < ActiveRecord::Base
|
|||
)
|
||||
end
|
||||
end
|
||||
|
||||
def cared_merge_requests
|
||||
MergeRequest.where("author_id = :id or assignee_id = :id", :id => self.id).opened
|
||||
end
|
||||
end
|
||||
# == Schema Information
|
||||
#
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue