Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
gitlab-ce
Commits
77d2aeab
Commit
77d2aeab
authored
Feb 11, 2016
by
James Lopez
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
attempt to reduce code complexity on GitPushService#execute
parent
9bcc9ec1
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
123 additions
and
80 deletions
+123
-80
app/services/git_push_service.rb
app/services/git_push_service.rb
+66
-53
app/workers/post_receive.rb
app/workers/post_receive.rb
+1
-1
spec/services/git_push_service_spec.rb
spec/services/git_push_service_spec.rb
+56
-26
No files found.
app/services/git_push_service.rb
View file @
77d2aeab
...
@@ -3,6 +3,15 @@ class GitPushService
...
@@ -3,6 +3,15 @@ class GitPushService
include
Gitlab
::
CurrentSettings
include
Gitlab
::
CurrentSettings
include
Gitlab
::
Access
include
Gitlab
::
Access
def
initialize
(
project
,
user
,
oldrev
,
newrev
,
ref
)
# TODO: Consider passing an options hash instead https://github.com/bbatsov/ruby-style-guide#too-many-params
@project
=
project
@user
=
user
@oldrev
=
oldrev
@newrev
=
newrev
@ref
=
ref
end
# This method will be called after each git update
# This method will be called after each git update
# and only if the provided user and project is present in GitLab.
# and only if the provided user and project is present in GitLab.
#
#
...
@@ -15,67 +24,67 @@ class GitPushService
...
@@ -15,67 +24,67 @@ class GitPushService
# 4. Executes the project's web hooks
# 4. Executes the project's web hooks
# 5. Executes the project's services
# 5. Executes the project's services
#
#
def
execute
(
project
,
user
,
oldrev
,
newrev
,
ref
)
def
execute
@project
,
@user
=
project
,
user
@project
.
repository
.
expire_cache
(
branch_name
)
branch_name
=
Gitlab
::
Git
.
ref_name
(
ref
)
project
.
repository
.
expire_cache
(
branch_name
)
if
push_remove_branch?
(
ref
,
newrev
)
project
.
repository
.
expire_has_visible_content_cache
if
push_remove_branch?
@project
.
repository
.
expire_has_visible_content_cache
@push_commits
=
[]
@push_commits
=
[]
elsif
push_to_new_branch?
(
ref
,
oldrev
)
elsif
push_to_new_branch?
project
.
repository
.
expire_has_visible_content_cache
@
project
.
repository
.
expire_has_visible_content_cache
# Re-find the pushed commits.
# Re-find the pushed commits.
if
is_default_branch?
(
ref
)
if
is_default_branch?
# Initial push to the default branch. Take the full history of that branch as "newly pushed".
# Initial push to the default branch. Take the full history of that branch as "newly pushed".
@push_commits
=
project
.
repository
.
commits
(
newrev
)
process_default_branch
# Ensure HEAD points to the default branch in case it is not master
project
.
change_head
(
branch_name
)
# Set protection on the default branch if configured
if
(
current_application_settings
.
default_branch_protection
!=
PROTECTION_NONE
)
developers_can_push
=
current_application_settings
.
default_branch_protection
==
PROTECTION_DEV_CAN_PUSH
?
true
:
false
project
.
protected_branches
.
create
({
name:
project
.
default_branch
,
developers_can_push:
developers_can_push
})
end
else
else
# Use the pushed commits that aren't reachable by the default branch
# Use the pushed commits that aren't reachable by the default branch
# as a heuristic. This may include more commits than are actually pushed, but
# as a heuristic. This may include more commits than are actually pushed, but
# that shouldn't matter because we check for existing cross-references later.
# that shouldn't matter because we check for existing cross-
@
references later.
@push_commits
=
project
.
repository
.
commits_between
(
project
.
default_branch
,
newrev
)
@push_commits
=
@project
.
repository
.
commits_between
(
@project
.
default_branch
,
@
newrev
)
# don't process commits for the initial push to the default branch
# don't process commits for the initial push to the default branch
process_commit_messages
(
ref
)
process_commit_messages
end
end
elsif
push_to_existing_branch?
(
ref
,
oldrev
)
elsif
push_to_existing_branch?
# Collect data for this git push
# Collect data for this git push
@push_commits
=
project
.
repository
.
commits_between
(
oldrev
,
newrev
)
@push_commits
=
@project
.
repository
.
commits_between
(
@oldrev
,
@
newrev
)
process_commit_messages
(
ref
)
process_commit_messages
end
end
# Update merge requests that may be affected by this push. A new branch
# Update merge requests that may be affected by this push. A new branch
# could cause the last commit of a merge request to change.
# could cause the last commit of a merge request to change.
project
.
update_merge_requests
(
oldrev
,
newrev
,
ref
,
@user
)
update_merge_requests
end
@push_data
=
build_push_data
(
oldrev
,
newrev
,
ref
)
protected
def
update_merge_requests
@project
.
update_merge_requests
(
@oldrev
,
@newrev
,
@ref
,
@user
)
EventCreateService
.
new
.
push
(
project
,
user
,
@
push_data
)
EventCreateService
.
new
.
push
(
@project
,
@user
,
build_
push_data
)
project
.
execute_hooks
(
@
push_data
.
dup
,
:push_hooks
)
@project
.
execute_hooks
(
build_
push_data
.
dup
,
:push_hooks
)
project
.
execute_services
(
@
push_data
.
dup
,
:push_hooks
)
@project
.
execute_services
(
build_
push_data
.
dup
,
:push_hooks
)
CreateCommitBuildsService
.
new
.
execute
(
project
,
@user
,
@
push_data
)
CreateCommitBuildsService
.
new
.
execute
(
@project
,
@user
,
build_
push_data
)
ProjectCacheWorker
.
perform_async
(
project
.
id
)
ProjectCacheWorker
.
perform_async
(
@
project
.
id
)
end
end
protected
def
process_default_branch
@push_commits
=
project
.
repository
.
commits
(
@newrev
)
# Ensure HEAD points to the default branch in case it is not master
project
.
change_head
(
branch_name
)
# Set protection on the default branch if configured
if
(
current_application_settings
.
default_branch_protection
!=
PROTECTION_NONE
)
developers_can_push
=
current_application_settings
.
default_branch_protection
==
PROTECTION_DEV_CAN_PUSH
?
true
:
false
@project
.
protected_branches
.
create
({
name:
@project
.
default_branch
,
developers_can_push:
developers_can_push
})
end
end
# Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched,
# Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched,
# close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables.
# close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables.
def
process_commit_messages
(
ref
)
def
process_commit_messages
is_default_branch
=
is_default_branch?
(
ref
)
is_default_branch
=
is_default_branch?
authors
=
Hash
.
new
do
|
hash
,
commit
|
authors
=
Hash
.
new
do
|
hash
,
commit
|
email
=
commit
.
author_email
email
=
commit
.
author_email
...
@@ -104,34 +113,38 @@ class GitPushService
...
@@ -104,34 +113,38 @@ class GitPushService
end
end
end
end
def
build_push_data
(
oldrev
,
newrev
,
ref
)
def
build_push_data
Gitlab
::
PushDataBuilder
.
@push_data
||=
Gitlab
::
PushDataBuilder
.
build
(
project
,
user
,
oldrev
,
newrev
,
ref
,
push_commits
)
build
(
@project
,
@user
,
@oldrev
,
@newrev
,
@
ref
,
push_commits
)
end
end
def
push_to_existing_branch?
(
ref
,
oldrev
)
def
push_to_existing_branch?
# Return if this is not a push to a branch (e.g. new commits)
# Return if this is not a push to a branch (e.g. new commits)
Gitlab
::
Git
.
branch_ref?
(
ref
)
&&
!
Gitlab
::
Git
.
blank_ref?
(
oldrev
)
Gitlab
::
Git
.
branch_ref?
(
@ref
)
&&
!
Gitlab
::
Git
.
blank_ref?
(
@
oldrev
)
end
end
def
push_to_new_branch?
(
ref
,
oldrev
)
def
push_to_new_branch?
Gitlab
::
Git
.
branch_ref?
(
ref
)
&&
Gitlab
::
Git
.
blank_ref?
(
oldrev
)
Gitlab
::
Git
.
branch_ref?
(
@ref
)
&&
Gitlab
::
Git
.
blank_ref?
(
@
oldrev
)
end
end
def
push_remove_branch?
(
ref
,
newrev
)
def
push_remove_branch?
Gitlab
::
Git
.
branch_ref?
(
ref
)
&&
Gitlab
::
Git
.
blank_ref?
(
newrev
)
Gitlab
::
Git
.
branch_ref?
(
@ref
)
&&
Gitlab
::
Git
.
blank_ref?
(
@
newrev
)
end
end
def
push_to_branch?
(
ref
)
def
push_to_branch?
Gitlab
::
Git
.
branch_ref?
(
ref
)
Gitlab
::
Git
.
branch_ref?
(
@
ref
)
end
end
def
is_default_branch?
(
ref
)
def
is_default_branch?
Gitlab
::
Git
.
branch_ref?
(
ref
)
&&
Gitlab
::
Git
.
branch_ref?
(
@
ref
)
&&
(
Gitlab
::
Git
.
ref_name
(
ref
)
==
project
.
default_branch
||
project
.
default_branch
.
nil?
)
(
Gitlab
::
Git
.
ref_name
(
@
ref
)
==
project
.
default_branch
||
project
.
default_branch
.
nil?
)
end
end
def
commit_user
(
commit
)
def
commit_user
(
commit
)
commit
.
author
||
user
commit
.
author
||
user
end
end
def
branch_name
@_branch_name
||=
Gitlab
::
Git
.
ref_name
(
@ref
)
end
end
end
app/workers/post_receive.rb
View file @
77d2aeab
...
@@ -38,7 +38,7 @@ class PostReceive
...
@@ -38,7 +38,7 @@ class PostReceive
if
Gitlab
::
Git
.
tag_ref?
(
ref
)
if
Gitlab
::
Git
.
tag_ref?
(
ref
)
GitTagPushService
.
new
.
execute
(
project
,
@user
,
oldrev
,
newrev
,
ref
)
GitTagPushService
.
new
.
execute
(
project
,
@user
,
oldrev
,
newrev
,
ref
)
else
else
GitPushService
.
new
.
execute
(
project
,
@user
,
oldrev
,
newrev
,
ref
)
GitPushService
.
new
(
project
,
@user
,
oldrev
,
newrev
,
ref
).
execute
end
end
end
end
end
end
...
...
spec/services/git_push_service_spec.rb
View file @
77d2aeab
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment