edab46e9fa
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.
141 lines
2.6 KiB
Ruby
141 lines
2.6 KiB
Ruby
require File.join(Rails.root, "lib", "gitlabhq", "git_host")
|
|
|
|
class Repository
|
|
REPO_N = 0
|
|
REPO_R = 1
|
|
REPO_RW = 2
|
|
|
|
attr_accessor :project
|
|
|
|
def self.default_ref
|
|
"master"
|
|
end
|
|
|
|
def self.access_options
|
|
{
|
|
"Denied" => REPO_N,
|
|
"Pull" => REPO_R,
|
|
"Pull & Push" => REPO_RW
|
|
}
|
|
end
|
|
|
|
def initialize(project)
|
|
@project = project
|
|
end
|
|
|
|
def path
|
|
@path ||= project.path
|
|
end
|
|
|
|
def project_id
|
|
project.id
|
|
end
|
|
|
|
def write_hooks
|
|
%w(post-receive).each do |hook|
|
|
write_hook(hook, File.read(File.join(Rails.root, 'lib', "#{hook}-hook")))
|
|
end
|
|
end
|
|
|
|
def write_hook(name, content)
|
|
hook_file = File.join(project.path_to_repo, 'hooks', name)
|
|
|
|
File.open(hook_file, 'w') do |f|
|
|
f.write(content)
|
|
end
|
|
|
|
File.chmod(0775, hook_file)
|
|
end
|
|
|
|
def repo
|
|
@repo ||= Grit::Repo.new(project.path_to_repo)
|
|
end
|
|
|
|
def url_to_repo
|
|
Gitlabhq::GitHost.url_to_repo(path)
|
|
end
|
|
|
|
def path_to_repo
|
|
GIT_HOST["base_path"] + path + ".git"
|
|
end
|
|
|
|
def update_repository
|
|
Gitlabhq::GitHost.system.new.configure do |c|
|
|
c.update_project(path, project)
|
|
end
|
|
|
|
write_hooks
|
|
end
|
|
|
|
def destroy_repository
|
|
Gitlabhq::GitHost.system.new.configure do |c|
|
|
c.destroy_project(@project)
|
|
end
|
|
end
|
|
|
|
def repo_exists?
|
|
repo rescue false
|
|
end
|
|
|
|
def tags
|
|
repo.tags.map(&:name).sort.reverse
|
|
end
|
|
|
|
def heads
|
|
@heads ||= repo.heads
|
|
end
|
|
|
|
def tree(fcommit, path = nil)
|
|
fcommit = commit if fcommit == :head
|
|
tree = fcommit.tree
|
|
path ? (tree / path) : tree
|
|
end
|
|
|
|
def commit(commit_id = nil)
|
|
commit = if commit_id
|
|
repo.commits(commit_id).first
|
|
else
|
|
repo.commits.first
|
|
end
|
|
Commit.new(commit) if commit
|
|
end
|
|
|
|
def fresh_commits(n = 10)
|
|
commits = heads.map do |h|
|
|
repo.commits(h.name, n).map { |c| Commit.new(c, h) }
|
|
end.flatten.uniq { |c| c.id }
|
|
|
|
commits.sort! do |x, y|
|
|
y.committed_date <=> x.committed_date
|
|
end
|
|
|
|
commits[0...n]
|
|
end
|
|
|
|
def commits_since(date)
|
|
commits = heads.map do |h|
|
|
repo.log(h.name, nil, :since => date).each { |c| Commit.new(c, h) }
|
|
end.flatten.uniq { |c| c.id }
|
|
|
|
commits.sort! do |x, y|
|
|
y.committed_date <=> x.committed_date
|
|
end
|
|
|
|
commits
|
|
end
|
|
|
|
def commits(ref, path = nil, limit = nil, offset = nil)
|
|
if path
|
|
repo.log(ref, path, :max_count => limit, :skip => offset)
|
|
elsif limit && offset
|
|
repo.commits(ref, limit, offset)
|
|
else
|
|
repo.commits(ref)
|
|
end.map{ |c| Commit.new(c) }
|
|
end
|
|
|
|
def commits_between(from, to)
|
|
repo.commits_between(from, to).map { |c| Commit.new(c) }
|
|
end
|
|
end
|