summaryrefslogtreecommitdiff
path: root/app/models/project.rb
diff options
context:
space:
mode:
authorAriejan de Vroom <ariejan@ariejan.net>2011-12-14 17:38:52 +0100
committerAriejan de Vroom <ariejan@ariejan.net>2011-12-14 17:38:52 +0100
commitedab46e9fa5f568b1423c0021e81d30453d7dc1e (patch)
tree8efba8b082a534e1a069f4566d55d6117951e6ba /app/models/project.rb
parent56fc53e8d870b70ca66332daeb6da39ab0eb5ce7 (diff)
downloadgitlab-ce-edab46e9fa5f568b1423c0021e81d30453d7dc1e.tar.gz
Added web hooks functionality
This commit includes: * Projects can have zero or more WebHooks. * The PostReceive job will ask a project to execute any web hooks defined for that project. * WebHook has a URL, we post Github-compatible JSON to that URL. * Failure to execute a WebHook will be silently ignored.
Diffstat (limited to 'app/models/project.rb')
-rw-r--r--app/models/project.rb44
1 files changed, 43 insertions, 1 deletions
diff --git a/app/models/project.rb b/app/models/project.rb
index a5361313911..e14c1ebf86b 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -14,6 +14,7 @@ class Project < ActiveRecord::Base
has_many :users, :through => :users_projects
has_many :notes, :dependent => :destroy
has_many :snippets, :dependent => :destroy
+ has_many :web_hooks, :dependent => :destroy
acts_as_taggable
@@ -79,12 +80,53 @@ class Project < ActiveRecord::Base
:heads,
:commits_since,
:fresh_commits,
+ :commits_between,
:to => :repository, :prefix => nil
def to_param
code
end
+ def web_url
+ [GIT_HOST['host'], code].join("/")
+ end
+
+ def execute_web_hooks(oldrev, newrev, ref)
+ data = web_hook_data(oldrev, newrev, ref)
+ web_hooks.each { |web_hook| web_hook.execute(data) }
+ end
+
+ def web_hook_data(oldrev, newrev, ref)
+ data = {
+ before: oldrev,
+ after: newrev,
+ ref: ref,
+ repository: {
+ name: name,
+ url: web_url,
+ description: description,
+ homepage: web_url,
+ private: private?
+ },
+ commits: []
+ }
+
+ commits_between(oldrev, newrev).each do |commit|
+ data[:commits] << {
+ id: commit.id,
+ message: commit.safe_message,
+ timestamp: commit.date.xmlschema,
+ url: "http://#{GIT_HOST['host']}/#{code}/commits/#{commit.id}",
+ author: {
+ name: commit.author_name,
+ email: commit.author_email
+ }
+ }
+ end
+
+ data
+ end
+
def team_member_by_name_or_email(email = nil, name = nil)
user = users.where("email like ? or name like ?", email, name).first
users_projects.find_by_user_id(user.id) if user
@@ -157,7 +199,7 @@ class Project < ActiveRecord::Base
@admins ||= users_projects.includes(:user).where(:project_access => PROJECT_RWA).map(&:user)
end
- def root_ref
+ def root_ref
default_branch || "master"
end