diff options
author | Ariejan de Vroom <ariejan@ariejan.net> | 2011-12-14 17:38:52 +0100 |
---|---|---|
committer | Ariejan de Vroom <ariejan@ariejan.net> | 2011-12-14 17:38:52 +0100 |
commit | edab46e9fa5f568b1423c0021e81d30453d7dc1e (patch) | |
tree | 8efba8b082a534e1a069f4566d55d6117951e6ba /app/models/project.rb | |
parent | 56fc53e8d870b70ca66332daeb6da39ab0eb5ce7 (diff) | |
download | gitlab-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.rb | 44 |
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 |