Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
85007434
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
85007434
编写于
11月 19, 2012
作者:
D
Dmitriy Zaporozhets
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Post Receive Refactored. Service hooks also triggered now
上级
95c23b2f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
86 addition
and
57 deletion
+86
-57
app/roles/push_observer.rb
app/roles/push_observer.rb
+73
-42
spec/models/project_hooks_spec.rb
spec/models/project_hooks_spec.rb
+8
-6
spec/workers/post_receive_spec.rb
spec/workers/post_receive_spec.rb
+5
-9
未找到文件。
app/roles/push_observer.rb
浏览文件 @
85007434
...
...
@@ -2,45 +2,83 @@
#
# Triggered by PostReceive job
module
PushObserver
def
observe_push
(
oldrev
,
newrev
,
ref
,
user
)
# This method will be called after each post receive and only if the provided
# user is present in GitLab.
#
# All callbacks for post receive should be placed here.
def
trigger_post_receive
(
oldrev
,
newrev
,
ref
,
user
)
data
=
post_receive_data
(
oldrev
,
newrev
,
ref
,
user
)
Event
.
create
(
project:
self
,
action:
Event
::
Pushed
,
data:
data
,
author_id:
data
[
:user_id
]
)
end
# Create push event
self
.
observe_push
(
data
)
def
update_merge_requests
(
oldrev
,
newrev
,
ref
,
user
)
return
true
unless
ref
=~
/heads/
branch_name
=
ref
.
gsub
(
"refs/heads/"
,
""
)
c_ids
=
self
.
commits_between
(
oldrev
,
newrev
).
map
(
&
:id
)
if
push_to_branch?
ref
,
oldrev
# Close merged MR
self
.
update_merge_requests
(
oldrev
,
newrev
,
ref
,
user
)
# 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
;
merge_request
.
mark_as_unchecked
}
# Execute web hooks
self
.
execute_hooks
(
data
.
dup
)
# 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
)
}
# Execute project services
self
.
execute_services
(
data
.
dup
)
end
true
# Create satellite
self
.
satellite
.
create
unless
self
.
satellite
.
exists?
# Discover the default branch, but only if it hasn't already been set to
# something else
if
default_branch
.
nil?
update_attributes
(
default_branch:
discover_default_branch
)
end
end
def
execute_hooks
(
oldrev
,
newrev
,
ref
,
user
)
def
push_to_branch?
ref
,
oldrev
ref_parts
=
ref
.
split
(
'/'
)
# Return if this is not a push to a branch (e.g. new commits)
return
if
ref_parts
[
1
]
!~
/heads/
||
oldrev
==
"00000000000000000000000000000000"
!
(
ref_parts
[
1
]
!~
/heads/
||
oldrev
==
"00000000000000000000000000000000"
)
end
data
=
post_receive_data
(
oldrev
,
newrev
,
ref
,
user
)
def
observe_push
(
data
)
Event
.
create
(
project:
self
,
action:
Event
::
Pushed
,
data:
data
,
author_id:
data
[
:user_id
]
)
end
def
execute_hooks
(
data
)
hooks
.
each
{
|
hook
|
hook
.
execute
(
data
)
}
end
def
execute_services
(
data
)
services
.
each
do
|
service
|
# Call service hook for service if it has one
service
.
service_hook
.
execute
if
service
.
service_hook
end
end
# Produce a hash of post-receive data
#
# data = {
# before: String,
# after: String,
# ref: String,
# user_id: String,
# user_name: String,
# repository: {
# name: String,
# url: String,
# description: String,
# homepage: String,
# },
# commits: Array,
# total_commits_count: Fixnum
# }
#
def
post_receive_data
(
oldrev
,
newrev
,
ref
,
user
)
push_commits
=
commits_between
(
oldrev
,
newrev
)
...
...
@@ -87,27 +125,20 @@ module PushObserver
data
end
# This method will be called after each post receive and only if the provided
# user is present in GitLab.
#
# All callbacks for post receive should be placed here.
def
trigger_post_receive
(
oldrev
,
newrev
,
ref
,
user
)
# Create push event
self
.
observe_push
(
oldrev
,
newrev
,
ref
,
user
)
# Close merged MR
self
.
update_merge_requests
(
oldrev
,
newrev
,
ref
,
user
)
def
update_merge_requests
(
oldrev
,
newrev
,
ref
,
user
)
return
true
unless
ref
=~
/heads/
branch_name
=
ref
.
gsub
(
"refs/heads/"
,
""
)
c_ids
=
self
.
commits_between
(
oldrev
,
newrev
).
map
(
&
:id
)
# Execute web hooks
self
.
execute_hooks
(
oldrev
,
newrev
,
ref
,
user
)
# 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
;
merge_request
.
mark_as_unchecked
}
# Create satellite
self
.
satellite
.
create
unless
self
.
satellite
.
exists?
# 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
)
}
# Discover the default branch, but only if it hasn't already been set to
# something else
if
default_branch
.
nil?
update_attributes
(
default_branch:
discover_default_branch
)
end
true
end
end
spec/models/project_hooks_spec.rb
浏览文件 @
85007434
...
...
@@ -11,13 +11,15 @@ describe Project, "Hooks" do
describe
"Post Receive Event"
do
it
"should create push event"
do
oldrev
,
newrev
,
ref
=
'00000000000000000000000000000000'
,
'newrev'
,
'refs/heads/master'
project
.
observe_push
(
oldrev
,
newrev
,
ref
,
@user
)
data
=
project
.
post_receive_data
(
oldrev
,
newrev
,
ref
,
@user
)
project
.
observe_push
(
data
)
event
=
Event
.
last
event
.
should_not
be_nil
event
.
project
.
should
==
project
event
.
action
.
should
==
Event
::
Pushed
event
.
data
==
project
.
post_receive_data
(
oldrev
,
newrev
,
ref
,
@user
)
event
.
data
.
should
==
data
end
end
...
...
@@ -25,7 +27,7 @@ describe Project, "Hooks" do
context
"with no web hooks"
do
it
"raises no errors"
do
lambda
{
project
.
execute_hooks
(
'oldrev'
,
'newrev'
,
'ref'
,
@user
)
project
.
execute_hooks
(
{}
)
}.
should_not
raise_error
end
end
...
...
@@ -41,7 +43,7 @@ describe Project, "Hooks" do
@project_hook
.
should_receive
(
:execute
).
once
@project_hook_2
.
should_receive
(
:execute
).
once
project
.
execute_hooks
(
'oldrev'
,
'newrev'
,
'refs/heads/master'
,
@user
)
project
.
trigger_post_receive
(
'oldrev'
,
'newrev'
,
'refs/heads/master'
,
@user
)
end
end
...
...
@@ -53,12 +55,12 @@ describe Project, "Hooks" do
it
"when pushing a branch for the first time"
do
@project_hook
.
should_not_receive
(
:execute
)
project
.
execute_hooks
(
'00000000000000000000000000000000'
,
'newrev'
,
'refs/heads/master'
,
@user
)
project
.
trigger_post_receive
(
'00000000000000000000000000000000'
,
'newrev'
,
'refs/heads/master'
,
@user
)
end
it
"when pushing tags"
do
@project_hook
.
should_not_receive
(
:execute
)
project
.
execute_hooks
(
'oldrev'
,
'newrev'
,
'refs/tags/v1.0.0'
,
@user
)
project
.
trigger_post_receive
(
'oldrev'
,
'newrev'
,
'refs/tags/v1.0.0'
,
@user
)
end
end
...
...
spec/workers/post_receive_spec.rb
浏览文件 @
85007434
...
...
@@ -27,16 +27,12 @@ describe PostReceive do
PostReceive
.
perform
(
project
.
path
,
'sha-old'
,
'sha-new'
,
'refs/heads/master'
,
key_id
).
should
be_false
end
it
"asks the project to
execute web
hooks"
do
it
"asks the project to
trigger all
hooks"
do
Project
.
stub
(
find_by_path:
project
)
project
.
should_receive
(
:execute_hooks
).
with
(
'sha-old'
,
'sha-new'
,
'refs/heads/master'
,
project
.
owner
)
PostReceive
.
perform
(
project
.
path
,
'sha-old'
,
'sha-new'
,
'refs/heads/master'
,
key_id
)
end
it
"asks the project to observe push/create event data"
do
Project
.
stub
(
find_by_path:
project
)
project
.
should_receive
(
:observe_push
).
with
(
'sha-old'
,
'sha-new'
,
'refs/heads/master'
,
project
.
owner
)
project
.
should_receive
(
:execute_hooks
)
project
.
should_receive
(
:execute_services
)
project
.
should_receive
(
:update_merge_requests
)
project
.
should_receive
(
:observe_push
)
PostReceive
.
perform
(
project
.
path
,
'sha-old'
,
'sha-new'
,
'refs/heads/master'
,
key_id
)
end
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录