Merge branch 'master' into check-out-branch-button
This commit is contained in:
commit
4a2b7cef57
43 changed files with 320 additions and 115 deletions
|
@ -38,12 +38,15 @@ v 7.14.0 (unreleased)
|
||||||
- Tweak project page buttons.
|
- Tweak project page buttons.
|
||||||
- Disabled autocapitalize and autocorrect on login field (Daryl Chan)
|
- Disabled autocapitalize and autocorrect on login field (Daryl Chan)
|
||||||
- Mention group and project name in creation, update and deletion notices (Achilleas Pipinellis)
|
- Mention group and project name in creation, update and deletion notices (Achilleas Pipinellis)
|
||||||
|
- Update gravatar link on profile page to link to configured gravatar host (Ben Bodenmiller)
|
||||||
- Remove redis-store TTL monkey patch
|
- Remove redis-store TTL monkey patch
|
||||||
- Add support for CI skipped status
|
- Add support for CI skipped status
|
||||||
- Fetch code from forks to refs/merge-requests/:id/head when merge request created
|
- Fetch code from forks to refs/merge-requests/:id/head when merge request created
|
||||||
- Remove satellites
|
- Remove satellites
|
||||||
- Remove comments and email addresses when publicly exposing ssh keys (Zeger-Jan van de Weg)
|
- Remove comments and email addresses when publicly exposing ssh keys (Zeger-Jan van de Weg)
|
||||||
- Add "Check out branch" button to the MR page.
|
- Add "Check out branch" button to the MR page.
|
||||||
|
- Improve MR merge widget text and UI consistency.
|
||||||
|
- Improve text in MR "How To Merge" modal.
|
||||||
- Cache all events
|
- Cache all events
|
||||||
|
|
||||||
v 7.13.3
|
v 7.13.3
|
||||||
|
|
|
@ -154,7 +154,7 @@ GEM
|
||||||
doorkeeper (2.1.3)
|
doorkeeper (2.1.3)
|
||||||
railties (>= 3.2)
|
railties (>= 3.2)
|
||||||
dotenv (0.9.0)
|
dotenv (0.9.0)
|
||||||
dropzonejs-rails (0.4.14)
|
dropzonejs-rails (0.7.1)
|
||||||
rails (> 3.1)
|
rails (> 3.1)
|
||||||
email_spec (1.6.0)
|
email_spec (1.6.0)
|
||||||
launchy (~> 2.1)
|
launchy (~> 2.1)
|
||||||
|
@ -373,7 +373,7 @@ GEM
|
||||||
mini_portile (0.6.2)
|
mini_portile (0.6.2)
|
||||||
minitest (5.3.5)
|
minitest (5.3.5)
|
||||||
mousetrap-rails (1.4.6)
|
mousetrap-rails (1.4.6)
|
||||||
multi_json (1.11.1)
|
multi_json (1.11.2)
|
||||||
multi_xml (0.5.5)
|
multi_xml (0.5.5)
|
||||||
multipart-post (1.2.0)
|
multipart-post (1.2.0)
|
||||||
mysql2 (0.3.16)
|
mysql2 (0.3.16)
|
||||||
|
|
|
@ -8,6 +8,7 @@ class @DropzoneInput
|
||||||
divAlert = "<div class=\"" + alertClass + "\"></div>"
|
divAlert = "<div class=\"" + alertClass + "\"></div>"
|
||||||
iconPaperclip = "<i class=\"fa fa-paperclip div-dropzone-icon\"></i>"
|
iconPaperclip = "<i class=\"fa fa-paperclip div-dropzone-icon\"></i>"
|
||||||
iconSpinner = "<i class=\"fa fa-spinner fa-spin div-dropzone-icon\"></i>"
|
iconSpinner = "<i class=\"fa fa-spinner fa-spin div-dropzone-icon\"></i>"
|
||||||
|
uploadProgress = $("<div class=\"div-dropzone-progress\"></div>")
|
||||||
btnAlert = "<button type=\"button\"" + alertAttr + ">×</button>"
|
btnAlert = "<button type=\"button\"" + alertAttr + ">×</button>"
|
||||||
project_uploads_path = window.project_uploads_path or null
|
project_uploads_path = window.project_uploads_path or null
|
||||||
markdown_preview_path = window.markdown_preview_path or null
|
markdown_preview_path = window.markdown_preview_path or null
|
||||||
|
@ -28,6 +29,7 @@ class @DropzoneInput
|
||||||
form_dropzone.find(".div-dropzone-hover").append iconPaperclip
|
form_dropzone.find(".div-dropzone-hover").append iconPaperclip
|
||||||
form_dropzone.append divSpinner
|
form_dropzone.append divSpinner
|
||||||
form_dropzone.find(".div-dropzone-spinner").append iconSpinner
|
form_dropzone.find(".div-dropzone-spinner").append iconSpinner
|
||||||
|
form_dropzone.find(".div-dropzone-spinner").append uploadProgress
|
||||||
form_dropzone.find(".div-dropzone-spinner").css
|
form_dropzone.find(".div-dropzone-spinner").css
|
||||||
"opacity": 0
|
"opacity": 0
|
||||||
"display": "none"
|
"display": "none"
|
||||||
|
@ -112,13 +114,18 @@ class @DropzoneInput
|
||||||
$(".div-dropzone-alert").append btnAlert + errorMessage
|
$(".div-dropzone-alert").append btnAlert + errorMessage
|
||||||
return
|
return
|
||||||
|
|
||||||
|
totaluploadprogress: (totalUploadProgress) ->
|
||||||
|
uploadProgress.text Math.round(totalUploadProgress) + "%"
|
||||||
|
return
|
||||||
|
|
||||||
sending: ->
|
sending: ->
|
||||||
form_dropzone.find(".div-dropzone-spinner").css
|
form_dropzone.find(".div-dropzone-spinner").css
|
||||||
"opacity": 0.7
|
"opacity": 0.7
|
||||||
"display": "inherit"
|
"display": "inherit"
|
||||||
return
|
return
|
||||||
|
|
||||||
complete: ->
|
queuecomplete: ->
|
||||||
|
uploadProgress.text ""
|
||||||
$(".dz-preview").remove()
|
$(".dz-preview").remove()
|
||||||
$(".markdown-area").trigger "input"
|
$(".markdown-area").trigger "input"
|
||||||
$(".div-dropzone-spinner").css
|
$(".div-dropzone-spinner").css
|
||||||
|
|
|
@ -40,6 +40,15 @@
|
||||||
font-size: inherit;
|
font-size: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.div-dropzone-progress {
|
||||||
|
position: absolute;
|
||||||
|
top: 7px;
|
||||||
|
left: -40px;
|
||||||
|
width: 35px;
|
||||||
|
font-size: 13px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
.dz-preview {
|
.dz-preview {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -183,6 +183,10 @@
|
||||||
width: 250px !important;
|
width: 250px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#modal_merge_info .modal-dialog {
|
||||||
|
width: 600px;
|
||||||
|
}
|
||||||
|
|
||||||
.mr-source-target {
|
.mr-source-target {
|
||||||
line-height: 31px;
|
line-height: 31px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,71 @@
|
||||||
class PostCommitService < BaseService
|
class PostCommitService < BaseService
|
||||||
|
include Gitlab::Popen
|
||||||
|
|
||||||
|
attr_reader :changes, :repo_path
|
||||||
|
|
||||||
def execute(sha, branch)
|
def execute(sha, branch)
|
||||||
commit = repository.commit(sha)
|
commit = repository.commit(sha)
|
||||||
full_ref = 'refs/heads/' + branch
|
full_ref = Gitlab::Git::BRANCH_REF_PREFIX + branch
|
||||||
old_sha = commit.parent_id || Gitlab::Git::BLANK_SHA
|
old_sha = commit.parent_id || Gitlab::Git::BLANK_SHA
|
||||||
GitPushService.new.execute(project, current_user, old_sha, sha, full_ref)
|
@changes = "#{old_sha} #{sha} #{full_ref}"
|
||||||
|
@repo_path = repository.path_to_repo
|
||||||
|
|
||||||
|
post_receive
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def post_receive
|
||||||
|
hook = hook_file('post-receive', repo_path)
|
||||||
|
return true if hook.nil?
|
||||||
|
call_receive_hook(hook)
|
||||||
|
end
|
||||||
|
|
||||||
|
def call_receive_hook(hook)
|
||||||
|
# function will return true if succesful
|
||||||
|
exit_status = false
|
||||||
|
|
||||||
|
vars = {
|
||||||
|
'GL_ID' => Gitlab::ShellEnv.gl_id(current_user),
|
||||||
|
'PWD' => repo_path
|
||||||
|
}
|
||||||
|
|
||||||
|
options = {
|
||||||
|
chdir: repo_path
|
||||||
|
}
|
||||||
|
|
||||||
|
# we combine both stdout and stderr as we don't know what stream
|
||||||
|
# will be used by the custom hook
|
||||||
|
Open3.popen2e(vars, hook, options) do |stdin, stdout_stderr, wait_thr|
|
||||||
|
exit_status = true
|
||||||
|
stdin.sync = true
|
||||||
|
|
||||||
|
# in git, pre- and post- receive hooks may just exit without
|
||||||
|
# reading stdin. We catch the exception to avoid a broken pipe
|
||||||
|
# warning
|
||||||
|
begin
|
||||||
|
# inject all the changes as stdin to the hook
|
||||||
|
changes.lines do |line|
|
||||||
|
stdin.puts line
|
||||||
|
end
|
||||||
|
rescue Errno::EPIPE
|
||||||
|
end
|
||||||
|
|
||||||
|
# need to close stdin before reading stdout
|
||||||
|
stdin.close
|
||||||
|
|
||||||
|
# only output stdut_stderr if scripts doesn't return 0
|
||||||
|
unless wait_thr.value == 0
|
||||||
|
exit_status = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
exit_status
|
||||||
|
end
|
||||||
|
|
||||||
|
def hook_file(hook_type, repo_path)
|
||||||
|
hook_path = File.join(repo_path.strip, 'hooks')
|
||||||
|
hook_file = "#{hook_path}/#{hook_type}"
|
||||||
|
hook_file if File.exist?(hook_file)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
.event-item-timestamp
|
.event-item-timestamp
|
||||||
#{time_ago_with_tooltip(event.created_at)}
|
#{time_ago_with_tooltip(event.created_at)}
|
||||||
|
|
||||||
= cache event, "v1" do
|
= cache [event, "v1"] do
|
||||||
= image_tag avatar_icon(event.author_email, 24), class: "avatar s24", alt:''
|
= image_tag avatar_icon(event.author_email, 24), class: "avatar s24", alt:''
|
||||||
- if event.created_project?
|
- if event.created_project?
|
||||||
= render "events/event/created_project", event: event
|
= render "events/event/created_project", event: event
|
||||||
|
|
|
@ -82,12 +82,12 @@
|
||||||
You can change your avatar here
|
You can change your avatar here
|
||||||
- if Gitlab.config.gravatar.enabled
|
- if Gitlab.config.gravatar.enabled
|
||||||
%br
|
%br
|
||||||
or remove the current avatar to revert to #{link_to "gravatar.com", "http://gravatar.com"}
|
or remove the current avatar to revert to #{link_to Gitlab.config.gravatar.host, "http://" + Gitlab.config.gravatar.host}
|
||||||
- else
|
- else
|
||||||
You can upload an avatar here
|
You can upload an avatar here
|
||||||
- if Gitlab.config.gravatar.enabled
|
- if Gitlab.config.gravatar.enabled
|
||||||
%br
|
%br
|
||||||
or change it at #{link_to "gravatar.com", "http://gravatar.com"}
|
or change it at #{link_to Gitlab.config.gravatar.host, "http://" + Gitlab.config.gravatar.host}
|
||||||
%hr
|
%hr
|
||||||
%a.choose-btn.btn.btn-sm.js-choose-user-avatar-button
|
%a.choose-btn.btn.btn-sm.js-choose-user-avatar-button
|
||||||
%i.fa.fa-paperclip
|
%i.fa.fa-paperclip
|
||||||
|
|
|
@ -3,42 +3,45 @@
|
||||||
.modal-content
|
.modal-content
|
||||||
.modal-header
|
.modal-header
|
||||||
%a.close{href: "#", "data-dismiss" => "modal"} ×
|
%a.close{href: "#", "data-dismiss" => "modal"} ×
|
||||||
%h3 How to merge
|
%h3 Check out, review and merge locally
|
||||||
.modal-body
|
.modal-body
|
||||||
- if @merge_request.for_fork?
|
%p
|
||||||
- source_remote = @merge_request.source_project.namespace.nil? ? "source" :@merge_request.source_project.namespace.path
|
%strong Step 1.
|
||||||
- target_remote = @merge_request.target_project.namespace.nil? ? "target" :@merge_request.target_project.namespace.path
|
Fetch and check out the branch for this merge request
|
||||||
%p
|
%pre.dark
|
||||||
%strong Step 1.
|
- if @merge_request.for_fork?
|
||||||
Fetch the code and create a new branch pointing to it
|
|
||||||
%pre.dark
|
|
||||||
:preserve
|
:preserve
|
||||||
git fetch #{@merge_request.source_project.http_url_to_repo} #{@merge_request.source_branch}
|
git fetch #{@merge_request.source_project.http_url_to_repo} #{@merge_request.source_branch}
|
||||||
git checkout -b #{@merge_request.source_project_path}-#{@merge_request.source_branch} FETCH_HEAD
|
git checkout -b #{@merge_request.source_project_path}-#{@merge_request.source_branch} FETCH_HEAD
|
||||||
%p
|
- else
|
||||||
%strong Step 2.
|
|
||||||
Merge the branch and push the changes to GitLab
|
|
||||||
%pre.dark
|
|
||||||
:preserve
|
|
||||||
git checkout #{@merge_request.target_branch}
|
|
||||||
git merge --no-ff #{@merge_request.source_project_path}-#{@merge_request.source_branch}
|
|
||||||
git push origin #{@merge_request.target_branch}
|
|
||||||
- else
|
|
||||||
%p
|
|
||||||
%strong Step 1.
|
|
||||||
Update the repo and checkout the branch we are going to merge
|
|
||||||
%pre.dark
|
|
||||||
:preserve
|
:preserve
|
||||||
git fetch origin
|
git fetch origin
|
||||||
git checkout -b #{@merge_request.source_branch} origin/#{@merge_request.source_branch}
|
git checkout -b #{@merge_request.source_branch} origin/#{@merge_request.source_branch}
|
||||||
%p
|
%p
|
||||||
%strong Step 2.
|
%strong Step 2.
|
||||||
Merge the branch and push the changes to GitLab
|
Review the changes locally
|
||||||
%pre.dark
|
|
||||||
|
%p
|
||||||
|
%strong Step 3.
|
||||||
|
Merge the branch and fix any conflicts that come up
|
||||||
|
%pre.dark
|
||||||
|
- if @merge_request.for_fork?
|
||||||
|
:preserve
|
||||||
|
git checkout #{@merge_request.target_branch}
|
||||||
|
git merge --no-ff #{@merge_request.source_project_path}-#{@merge_request.source_branch}
|
||||||
|
- else
|
||||||
:preserve
|
:preserve
|
||||||
git checkout #{@merge_request.target_branch}
|
git checkout #{@merge_request.target_branch}
|
||||||
git merge --no-ff #{@merge_request.source_branch}
|
git merge --no-ff #{@merge_request.source_branch}
|
||||||
git push origin #{@merge_request.target_branch}
|
%p
|
||||||
|
%strong Step 4.
|
||||||
|
Push the result of the merge to GitLab
|
||||||
|
%pre.dark
|
||||||
|
:preserve
|
||||||
|
git push origin #{@merge_request.target_branch}
|
||||||
|
- unless @merge_request.can_be_merged_by?(current_user)
|
||||||
|
%p
|
||||||
|
Note that pushing to GitLab requires write access to this repository.
|
||||||
|
|
||||||
:javascript
|
:javascript
|
||||||
$(function(){
|
$(function(){
|
||||||
|
|
|
@ -6,4 +6,7 @@
|
||||||
- if @merge_request.closed_event
|
- if @merge_request.closed_event
|
||||||
by #{link_to_member(@project, @merge_request.closed_event.author, avatar: true)}
|
by #{link_to_member(@project, @merge_request.closed_event.author, avatar: true)}
|
||||||
#{time_ago_with_tooltip(@merge_request.closed_event.created_at)}
|
#{time_ago_with_tooltip(@merge_request.closed_event.created_at)}
|
||||||
%p Changes were not merged into target branch
|
%p
|
||||||
|
= succeed '.' do
|
||||||
|
The changes were not merged into
|
||||||
|
%span.label-branch= @merge_request.target_branch
|
||||||
|
|
|
@ -3,26 +3,26 @@
|
||||||
- [:success, :skipped, :canceled, :failed, :running, :pending].each do |status|
|
- [:success, :skipped, :canceled, :failed, :running, :pending].each do |status|
|
||||||
.ci_widget{class: "ci-#{status}", style: "display:none"}
|
.ci_widget{class: "ci-#{status}", style: "display:none"}
|
||||||
- if status == :success
|
- if status == :success
|
||||||
|
- status = "passed"
|
||||||
= icon("check-circle")
|
= icon("check-circle")
|
||||||
- else
|
- else
|
||||||
= icon("circle")
|
= icon("circle")
|
||||||
%span CI build #{status}
|
%span CI build #{status}
|
||||||
for #{@merge_request.last_commit_short_sha}.
|
for #{@merge_request.last_commit_short_sha}.
|
||||||
%span.ci-coverage
|
%span.ci-coverage
|
||||||
= link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink"
|
= link_to "View build details", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink"
|
||||||
|
|
||||||
.ci_widget
|
.ci_widget
|
||||||
= icon("spinner spin")
|
= icon("spinner spin")
|
||||||
Checking for CI status for #{@merge_request.last_commit_short_sha}
|
Checking CI status for #{@merge_request.last_commit_short_sha}…
|
||||||
|
|
||||||
.ci_widget.ci-not_found{style: "display:none"}
|
.ci_widget.ci-not_found{style: "display:none"}
|
||||||
= icon("times-circle")
|
= icon("times-circle")
|
||||||
%span Can not find commit in the CI server
|
Could not find CI status for #{@merge_request.last_commit_short_sha}.
|
||||||
for #{@merge_request.last_commit_short_sha}.
|
|
||||||
|
|
||||||
.ci_widget.ci-error{style: "display:none"}
|
.ci_widget.ci-error{style: "display:none"}
|
||||||
= icon("times-circle")
|
= icon("times-circle")
|
||||||
%span Cannot connect to the CI server. Please check your settings and try again.
|
Could not connect to the CI server. Please check your settings and try again.
|
||||||
|
|
||||||
:coffeescript
|
:coffeescript
|
||||||
$ ->
|
$ ->
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
= render 'projects/merge_requests/widget/heading'
|
= render 'projects/merge_requests/widget/heading'
|
||||||
.mr-widget-body
|
.mr-widget-body
|
||||||
%h4
|
%h4
|
||||||
Merge in progress...
|
= icon("spinner spin")
|
||||||
|
Merge in progress…
|
||||||
%p
|
%p
|
||||||
Merging is in progress. While merging this request is locked and cannot be closed.
|
This merge request is in the process of being merged, during which time it is locked and cannot be closed.
|
||||||
|
|
||||||
|
|
|
@ -7,23 +7,31 @@
|
||||||
by #{link_to_member(@project, @merge_request.merge_event.author, avatar: true)}
|
by #{link_to_member(@project, @merge_request.merge_event.author, avatar: true)}
|
||||||
#{time_ago_with_tooltip(@merge_request.merge_event.created_at)}
|
#{time_ago_with_tooltip(@merge_request.merge_event.created_at)}
|
||||||
%div
|
%div
|
||||||
- if @source_branch.blank?
|
- if !@merge_request.source_branch_exists?
|
||||||
Source branch has been removed
|
= succeed '.' do
|
||||||
|
The changes were merged into
|
||||||
|
%span.label-branch= @merge_request.target_branch
|
||||||
|
The source branch has been removed.
|
||||||
|
|
||||||
- elsif can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && @merge_request.merged?
|
- elsif can_remove_branch?(@merge_request.source_project, @merge_request.source_branch)
|
||||||
.remove_source_branch_widget
|
.remove_source_branch_widget
|
||||||
%p Changes merged into #{@merge_request.target_branch}. You can remove source branch now
|
%p
|
||||||
|
= succeed '.' do
|
||||||
|
The changes were merged into
|
||||||
|
%span.label-branch= @merge_request.target_branch
|
||||||
|
You can remove the source branch now.
|
||||||
= link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @source_branch), remote: true, method: :delete, class: "btn btn-primary btn-sm remove_source_branch" do
|
= link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @source_branch), remote: true, method: :delete, class: "btn btn-primary btn-sm remove_source_branch" do
|
||||||
%i.fa.fa-times
|
%i.fa.fa-times
|
||||||
Remove Source Branch
|
Remove Source Branch
|
||||||
|
|
||||||
.remove_source_branch_widget.failed.hide
|
.remove_source_branch_widget.failed.hide
|
||||||
Failed to remove source branch '#{@merge_request.source_branch}'
|
%p
|
||||||
|
Failed to remove source branch '#{@merge_request.source_branch}'.
|
||||||
|
|
||||||
.remove_source_branch_in_progress.hide
|
.remove_source_branch_in_progress.hide
|
||||||
%i.fa.fa-spinner.fa-spin
|
%p
|
||||||
|
= icon('spinner spin')
|
||||||
Removing source branch '#{@merge_request.source_branch}'. Please wait. Page will be automatically reloaded.
|
Removing source branch '#{@merge_request.source_branch}'. Please wait. This page will be automatically reload.
|
||||||
|
|
||||||
:coffeescript
|
:coffeescript
|
||||||
$('.remove_source_branch').on 'click', ->
|
$('.remove_source_branch').on 'click', ->
|
||||||
|
|
|
@ -22,6 +22,6 @@
|
||||||
.mr-widget-footer
|
.mr-widget-footer
|
||||||
%span
|
%span
|
||||||
%i.fa.fa-check
|
%i.fa.fa-check
|
||||||
Accepting this merge request will close #{@closes_issues.size == 1 ? 'issue' : 'issues'}
|
Accepting this merge request will close #{"issue".pluralize(@closes_issues.size)}
|
||||||
= succeed '.' do
|
= succeed '.' do
|
||||||
!= gfm(issues_sentence(@closes_issues))
|
!= gfm(issues_sentence(@closes_issues))
|
||||||
|
|
|
@ -8,10 +8,10 @@
|
||||||
.accept-control.checkbox
|
.accept-control.checkbox
|
||||||
= label_tag :should_remove_source_branch, class: "remove_source_checkbox" do
|
= label_tag :should_remove_source_branch, class: "remove_source_checkbox" do
|
||||||
= check_box_tag :should_remove_source_branch
|
= check_box_tag :should_remove_source_branch
|
||||||
Remove source-branch
|
Remove source branch
|
||||||
.accept-control
|
.accept-control
|
||||||
= link_to "#", class: "modify-merge-commit-link js-toggle-button", title: "Modify merge commit message" do
|
= link_to "#", class: "modify-merge-commit-link js-toggle-button" do
|
||||||
%i.fa.fa-edit
|
= icon('edit')
|
||||||
Modify commit message
|
Modify commit message
|
||||||
.js-toggle-content.hide.prepend-top-20
|
.js-toggle-content.hide.prepend-top-20
|
||||||
= render 'shared/commit_message_container', params: params,
|
= render 'shared/commit_message_container', params: params,
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
|
%h4
|
||||||
|
Project is archived
|
||||||
%p
|
%p
|
||||||
%strong Archived projects do not provide commit access.
|
This merge request cannot be merged because archived projects cannot be written to.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
%strong
|
%strong
|
||||||
%i.fa.fa-spinner.fa-spin
|
= icon("spinner spin")
|
||||||
Checking automatic merge…
|
Checking ability to merge automatically…
|
||||||
|
|
||||||
:coffeescript
|
:coffeescript
|
||||||
$ ->
|
$ ->
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
%h4
|
%h4
|
||||||
This merge request contains merge conflicts that must be resolved.
|
= icon("exclamation-triangle")
|
||||||
|
This merge request contains merge conflicts
|
||||||
|
|
||||||
- if @merge_request.can_be_merged_by?(current_user)
|
%p
|
||||||
%p
|
Please resolve these conflicts or
|
||||||
You can merge it manually using the
|
- if @merge_request.can_be_merged_by?(current_user)
|
||||||
%strong
|
#{link_to "merge this request manually", "#modal_merge_info", class: "how_to_merge_link vlink", "data-toggle" => "modal"}.
|
||||||
= link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal"
|
- else
|
||||||
- else
|
ask someone with write access to this repository to merge this request manually.
|
||||||
%p
|
|
||||||
Only those with write access to this repository can merge merge requests.
|
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
%h4
|
- unless @merge_request.source_branch_exists?
|
||||||
Can't be merged
|
%h4
|
||||||
%p
|
= icon("exclamation-triangle")
|
||||||
This merge request can not be accepted because branch
|
Source branch
|
||||||
- unless @merge_request.source_branch_exists?
|
%span.label-branch= source_branch_with_namespace(@merge_request)
|
||||||
%span.label.label-inverse= @merge_request.source_branch
|
does not exist
|
||||||
does not exist in
|
%p
|
||||||
%span.label.label-info= @merge_request.source_project_path
|
Please restore the source branch or close this merge request and open a new merge request with a different source branch.
|
||||||
%br
|
- else
|
||||||
%strong Please close this merge request and open a new merge request to change source branches.
|
%h4
|
||||||
- else
|
= icon("exclamation-triangle")
|
||||||
%span.label.label-inverse= @merge_request.target_branch
|
Target branch
|
||||||
does not exist in
|
%span.label-branch= @merge_request.target_branch
|
||||||
%span.label.label-info= @merge_request.target_project_path
|
does not exist
|
||||||
%br
|
%p
|
||||||
%strong Please close this merge request or change to another target branch.
|
Please restore the target branch or use a different target branch.
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
%strong This request can be merged automatically.
|
%h4
|
||||||
Only those with write access to this repository can merge merge requests.
|
Ready to be merged automatically
|
||||||
|
%p
|
||||||
|
Ask someone with write access to this repository to merge this request.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
%h4 Nothing to merge
|
%h4
|
||||||
%p
|
= icon("exclamation-triangle")
|
||||||
Nothing to merge from
|
Nothing to merge from
|
||||||
%span.label-branch #{@merge_request.source_branch}
|
%span.label-branch= source_branch_with_namespace(@merge_request)
|
||||||
to
|
into
|
||||||
%span.label-branch #{@merge_request.target_branch}
|
%span.label-branch= @merge_request.target_branch
|
||||||
%br
|
%p
|
||||||
Try to use different branches or push new code.
|
Please push new commits to the source branch or use a different target branch.
|
||||||
|
|
|
@ -1 +1,6 @@
|
||||||
This merge request cannot be merged. Try to reload the page.
|
%h4
|
||||||
|
= icon("exclamation-triangle")
|
||||||
|
This merge request failed to be merged automatically
|
||||||
|
|
||||||
|
%p
|
||||||
|
Please reload the page to find out the reason.
|
||||||
|
|
|
@ -1,13 +1,5 @@
|
||||||
- if @merge_request.can_be_merged_by?(current_user)
|
%h4
|
||||||
%h4
|
This merge request is currently a Work In Progress
|
||||||
This merge request cannot be accepted because it is marked as Work In Progress.
|
|
||||||
|
|
||||||
%p
|
%p
|
||||||
%button.btn.disabled{:type => 'button'}
|
When this merge request is ready, remove the "WIP" prefix from the title to allow it to be merged.
|
||||||
%i.fa.fa-warning
|
|
||||||
Accept Merge Request
|
|
||||||
|
|
||||||
When the merge request is ready, remove the "WIP" prefix from the title to allow it to be accepted.
|
|
||||||
- else
|
|
||||||
%strong This merge request is marked as Work In Progress.
|
|
||||||
Only those with write access to this repository can merge merge requests.
|
|
||||||
|
|
|
@ -16,10 +16,10 @@
|
||||||
%p.help-block
|
%p.help-block
|
||||||
- if issuable.work_in_progress?
|
- if issuable.work_in_progress?
|
||||||
Remove the <code>WIP</code> prefix from the title to allow this
|
Remove the <code>WIP</code> prefix from the title to allow this
|
||||||
<strong>Work In Progress</strong> merge request to be accepted when it's ready.
|
<strong>Work In Progress</strong> merge request to be merged when it's ready.
|
||||||
- else
|
- else
|
||||||
Start the title with <code>[WIP]</code> or <code>WIP:</code> to prevent a
|
Start the title with <code>[WIP]</code> or <code>WIP:</code> to prevent a
|
||||||
<strong>Work In Progress</strong> merge request from being accepted before it's ready.
|
<strong>Work In Progress</strong> merge request from being merged before it's ready.
|
||||||
.form-group.issuable-description
|
.form-group.issuable-description
|
||||||
= f.label :description, 'Description', class: 'control-label'
|
= f.label :description, 'Description', class: 'control-label'
|
||||||
.col-sm-10
|
.col-sm-10
|
||||||
|
|
|
@ -45,7 +45,7 @@ class PostReceive
|
||||||
|
|
||||||
def utf8_encode_changes(changes)
|
def utf8_encode_changes(changes)
|
||||||
changes = changes.dup
|
changes = changes.dup
|
||||||
|
|
||||||
changes.force_encoding("UTF-8")
|
changes.force_encoding("UTF-8")
|
||||||
return changes if changes.valid_encoding?
|
return changes if changes.valid_encoding?
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,15 @@ class Settings < Settingslogic
|
||||||
def gitlab_on_standard_port?
|
def gitlab_on_standard_port?
|
||||||
gitlab.port.to_i == (gitlab.https ? 443 : 80)
|
gitlab.port.to_i == (gitlab.https ? 443 : 80)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# get host without www, thanks to http://stackoverflow.com/a/6674363/1233435
|
||||||
|
def get_host_without_www(url)
|
||||||
|
url = URI.encode(url)
|
||||||
|
uri = URI.parse(url)
|
||||||
|
uri = URI.parse("http://#{url}") if uri.scheme.nil?
|
||||||
|
host = uri.host.downcase
|
||||||
|
host.start_with?('www.') ? host[4..-1] : host
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
@ -147,6 +156,7 @@ Settings['gravatar'] ||= Settingslogic.new({})
|
||||||
Settings.gravatar['enabled'] = true if Settings.gravatar['enabled'].nil?
|
Settings.gravatar['enabled'] = true if Settings.gravatar['enabled'].nil?
|
||||||
Settings.gravatar['plain_url'] ||= 'http://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
|
Settings.gravatar['plain_url'] ||= 'http://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
|
||||||
Settings.gravatar['ssl_url'] ||= 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
|
Settings.gravatar['ssl_url'] ||= 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon'
|
||||||
|
Settings.gravatar['host'] = Settings.get_host_without_www(Settings.gravatar['plain_url'])
|
||||||
|
|
||||||
#
|
#
|
||||||
# GitLab Shell
|
# GitLab Shell
|
||||||
|
|
|
@ -35,6 +35,7 @@ Feature: Profile
|
||||||
Then I change my avatar
|
Then I change my avatar
|
||||||
And I should see new avatar
|
And I should see new avatar
|
||||||
And I should see the "Remove avatar" button
|
And I should see the "Remove avatar" button
|
||||||
|
And I should see the gravatar host link
|
||||||
|
|
||||||
Scenario: I remove my avatar
|
Scenario: I remove my avatar
|
||||||
Given I visit profile page
|
Given I visit profile page
|
||||||
|
@ -42,6 +43,7 @@ Feature: Profile
|
||||||
When I remove my avatar
|
When I remove my avatar
|
||||||
Then I should see my gravatar
|
Then I should see my gravatar
|
||||||
And I should not see the "Remove avatar" button
|
And I should not see the "Remove avatar" button
|
||||||
|
And I should see the gravatar host link
|
||||||
|
|
||||||
Scenario: My password is expired
|
Scenario: My password is expired
|
||||||
Given my password is expired
|
Given my password is expired
|
||||||
|
|
|
@ -59,6 +59,10 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
|
||||||
step 'I should not see the "Remove avatar" button' do
|
step 'I should not see the "Remove avatar" button' do
|
||||||
expect(page).not_to have_link("Remove avatar")
|
expect(page).not_to have_link("Remove avatar")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
step 'I should see the gravatar host link' do
|
||||||
|
expect(page).to have_link("gravatar.com")
|
||||||
|
end
|
||||||
|
|
||||||
step 'I try change my password w/o old one' do
|
step 'I try change my password w/o old one' do
|
||||||
page.within '.update-password' do
|
page.within '.update-password' do
|
||||||
|
|
|
@ -57,10 +57,11 @@ module Gitlab
|
||||||
|
|
||||||
title = range.reference_title
|
title = range.reference_title
|
||||||
klass = reference_class(:commit_range)
|
klass = reference_class(:commit_range)
|
||||||
|
data = data_attribute(project.id)
|
||||||
|
|
||||||
project_ref += '@' if project_ref
|
project_ref += '@' if project_ref
|
||||||
|
|
||||||
%(<a href="#{url}"
|
%(<a href="#{url}" #{data}
|
||||||
title="#{title}"
|
title="#{title}"
|
||||||
class="#{klass}">#{project_ref}#{range}</a>)
|
class="#{klass}">#{project_ref}#{range}</a>)
|
||||||
else
|
else
|
||||||
|
|
|
@ -47,10 +47,11 @@ module Gitlab
|
||||||
|
|
||||||
title = escape_once(commit.link_title)
|
title = escape_once(commit.link_title)
|
||||||
klass = reference_class(:commit)
|
klass = reference_class(:commit)
|
||||||
|
data = data_attribute(project.id)
|
||||||
|
|
||||||
project_ref += '@' if project_ref
|
project_ref += '@' if project_ref
|
||||||
|
|
||||||
%(<a href="#{url}"
|
%(<a href="#{url}" #{data}
|
||||||
title="#{title}"
|
title="#{title}"
|
||||||
class="#{klass}">#{project_ref}#{commit.short_id}</a>)
|
class="#{klass}">#{project_ref}#{commit.short_id}</a>)
|
||||||
else
|
else
|
||||||
|
|
|
@ -49,8 +49,9 @@ module Gitlab
|
||||||
|
|
||||||
title = escape_once("Issue: #{issue.title}")
|
title = escape_once("Issue: #{issue.title}")
|
||||||
klass = reference_class(:issue)
|
klass = reference_class(:issue)
|
||||||
|
data = data_attribute(project.id)
|
||||||
|
|
||||||
%(<a href="#{url}"
|
%(<a href="#{url}" #{data}
|
||||||
title="#{title}"
|
title="#{title}"
|
||||||
class="#{klass}">#{match}</a>)
|
class="#{klass}">#{match}</a>)
|
||||||
else
|
else
|
||||||
|
|
|
@ -43,8 +43,9 @@ module Gitlab
|
||||||
|
|
||||||
url = url_for_label(project, label)
|
url = url_for_label(project, label)
|
||||||
klass = reference_class(:label)
|
klass = reference_class(:label)
|
||||||
|
data = data_attribute(project.id)
|
||||||
|
|
||||||
%(<a href="#{url}"
|
%(<a href="#{url}" #{data}
|
||||||
class="#{klass}">#{render_colored_label(label)}</a>)
|
class="#{klass}">#{render_colored_label(label)}</a>)
|
||||||
else
|
else
|
||||||
match
|
match
|
||||||
|
|
|
@ -47,10 +47,11 @@ module Gitlab
|
||||||
|
|
||||||
title = escape_once("Merge Request: #{merge_request.title}")
|
title = escape_once("Merge Request: #{merge_request.title}")
|
||||||
klass = reference_class(:merge_request)
|
klass = reference_class(:merge_request)
|
||||||
|
data = data_attribute(project.id)
|
||||||
|
|
||||||
url = url_for_merge_request(merge_request, project)
|
url = url_for_merge_request(merge_request, project)
|
||||||
|
|
||||||
%(<a href="#{url}"
|
%(<a href="#{url}" #{data}
|
||||||
title="#{title}"
|
title="#{title}"
|
||||||
class="#{klass}">#{match}</a>)
|
class="#{klass}">#{match}</a>)
|
||||||
else
|
else
|
||||||
|
|
|
@ -21,6 +21,22 @@ module Gitlab
|
||||||
result[:references] = Hash.new { |hash, type| hash[type] = [] }
|
result[:references] = Hash.new { |hash, type| hash[type] = [] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns a data attribute String to attach to a reference link
|
||||||
|
#
|
||||||
|
# id - Object ID
|
||||||
|
# type - Object type (default: :project)
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
#
|
||||||
|
# data_attribute(1) # => "data-project-id=\"1\""
|
||||||
|
# data_attribute(2, :user) # => "data-user-id=\"2\""
|
||||||
|
# data_attribute(3, :group) # => "data-group-id=\"3\""
|
||||||
|
#
|
||||||
|
# Returns a String
|
||||||
|
def data_attribute(id, type = :project)
|
||||||
|
%Q(data-#{type}-id="#{id}")
|
||||||
|
end
|
||||||
|
|
||||||
def escape_once(html)
|
def escape_once(html)
|
||||||
ERB::Util.html_escape_once(html)
|
ERB::Util.html_escape_once(html)
|
||||||
end
|
end
|
||||||
|
|
|
@ -47,10 +47,11 @@ module Gitlab
|
||||||
|
|
||||||
title = escape_once("Snippet: #{snippet.title}")
|
title = escape_once("Snippet: #{snippet.title}")
|
||||||
klass = reference_class(:snippet)
|
klass = reference_class(:snippet)
|
||||||
|
data = data_attribute(project.id)
|
||||||
|
|
||||||
url = url_for_snippet(snippet, project)
|
url = url_for_snippet(snippet, project)
|
||||||
|
|
||||||
%(<a href="#{url}"
|
%(<a href="#{url}" #{data}
|
||||||
title="#{title}"
|
title="#{title}"
|
||||||
class="#{klass}">#{match}</a>)
|
class="#{klass}">#{match}</a>)
|
||||||
else
|
else
|
||||||
|
|
|
@ -83,18 +83,20 @@ module Gitlab
|
||||||
push_result(:user, *namespace.users)
|
push_result(:user, *namespace.users)
|
||||||
|
|
||||||
url = urls.group_url(group, only_path: context[:only_path])
|
url = urls.group_url(group, only_path: context[:only_path])
|
||||||
|
data = data_attribute(namespace.id, :group)
|
||||||
|
|
||||||
text = Group.reference_prefix + group
|
text = Group.reference_prefix + group
|
||||||
%(<a href="#{url}" class="#{link_class}">#{text}</a>)
|
%(<a href="#{url}" #{data} class="#{link_class}">#{text}</a>)
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_to_user(user, namespace)
|
def link_to_user(user, namespace)
|
||||||
push_result(:user, namespace.owner)
|
push_result(:user, namespace.owner)
|
||||||
|
|
||||||
url = urls.user_url(user, only_path: context[:only_path])
|
url = urls.user_url(user, only_path: context[:only_path])
|
||||||
|
data = data_attribute(namespace.owner_id, :user)
|
||||||
|
|
||||||
text = User.reference_prefix + user
|
text = User.reference_prefix + user
|
||||||
%(<a href="#{url}" class="#{link_class}">#{text}</a>)
|
%(<a href="#{url}" #{data} class="#{link_class}">#{text}</a>)
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_can_reference_group?(group)
|
def user_can_reference_group?(group)
|
||||||
|
|
|
@ -80,6 +80,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-project-id attribute' do
|
||||||
|
doc = filter("See #{reference}")
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-project-id')
|
||||||
|
expect(link.attr('data-project-id')).to eq project.id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'supports an :only_path option' do
|
it 'supports an :only_path option' do
|
||||||
doc = filter("See #{reference}", only_path: true)
|
doc = filter("See #{reference}", only_path: true)
|
||||||
link = doc.css('a').first.attr('href')
|
link = doc.css('a').first.attr('href')
|
||||||
|
|
|
@ -76,6 +76,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-project-id attribute' do
|
||||||
|
doc = filter("See #{reference}")
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-project-id')
|
||||||
|
expect(link.attr('data-project-id')).to eq project.id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'supports an :only_path context' do
|
it 'supports an :only_path context' do
|
||||||
doc = filter("See #{reference}", only_path: true)
|
doc = filter("See #{reference}", only_path: true)
|
||||||
link = doc.css('a').first.attr('href')
|
link = doc.css('a').first.attr('href')
|
||||||
|
|
|
@ -73,6 +73,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-project-id attribute' do
|
||||||
|
doc = filter("Issue #{reference}")
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-project-id')
|
||||||
|
expect(link.attr('data-project-id')).to eq project.id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'supports an :only_path context' do
|
it 'supports an :only_path context' do
|
||||||
doc = filter("Issue #{reference}", only_path: true)
|
doc = filter("Issue #{reference}", only_path: true)
|
||||||
link = doc.css('a').first.attr('href')
|
link = doc.css('a').first.attr('href')
|
||||||
|
|
|
@ -30,6 +30,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-project-id attribute' do
|
||||||
|
doc = filter("Label #{reference}")
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-project-id')
|
||||||
|
expect(link.attr('data-project-id')).to eq project.id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'supports an :only_path context' do
|
it 'supports an :only_path context' do
|
||||||
doc = filter("Label #{reference}", only_path: true)
|
doc = filter("Label #{reference}", only_path: true)
|
||||||
link = doc.css('a').first.attr('href')
|
link = doc.css('a').first.attr('href')
|
||||||
|
|
|
@ -61,6 +61,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-project-id attribute' do
|
||||||
|
doc = filter("Merge #{reference}")
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-project-id')
|
||||||
|
expect(link.attr('data-project-id')).to eq project.id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'supports an :only_path context' do
|
it 'supports an :only_path context' do
|
||||||
doc = filter("Merge #{reference}", only_path: true)
|
doc = filter("Merge #{reference}", only_path: true)
|
||||||
link = doc.css('a').first.attr('href')
|
link = doc.css('a').first.attr('href')
|
||||||
|
|
|
@ -60,6 +60,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-project-id attribute' do
|
||||||
|
doc = filter("Snippet #{reference}")
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-project-id')
|
||||||
|
expect(link.attr('data-project-id')).to eq project.id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'supports an :only_path context' do
|
it 'supports an :only_path context' do
|
||||||
doc = filter("Snippet #{reference}", only_path: true)
|
doc = filter("Snippet #{reference}", only_path: true)
|
||||||
link = doc.css('a').first.attr('href')
|
link = doc.css('a').first.attr('href')
|
||||||
|
|
|
@ -64,6 +64,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').length).to eq 1
|
expect(doc.css('a').length).to eq 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-user-id attribute' do
|
||||||
|
doc = filter("Hey #{reference}")
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-user-id')
|
||||||
|
expect(link.attr('data-user-id')).to eq user.namespace.owner_id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'adds to the results hash' do
|
it 'adds to the results hash' do
|
||||||
result = pipeline_result("Hey #{reference}")
|
result = pipeline_result("Hey #{reference}")
|
||||||
expect(result[:references][:user]).to eq [user]
|
expect(result[:references][:user]).to eq [user]
|
||||||
|
@ -85,6 +93,14 @@ module Gitlab::Markdown
|
||||||
expect(doc.css('a').first.attr('href')).to eq urls.group_url(group)
|
expect(doc.css('a').first.attr('href')).to eq urls.group_url(group)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'includes a data-group-id attribute' do
|
||||||
|
doc = filter("Hey #{reference}", current_user: user)
|
||||||
|
link = doc.css('a').first
|
||||||
|
|
||||||
|
expect(link).to have_attribute('data-group-id')
|
||||||
|
expect(link.attr('data-group-id')).to eq group.id.to_s
|
||||||
|
end
|
||||||
|
|
||||||
it 'adds to the results hash' do
|
it 'adds to the results hash' do
|
||||||
result = pipeline_result("Hey #{reference}", current_user: user)
|
result = pipeline_result("Hey #{reference}", current_user: user)
|
||||||
expect(result[:references][:user]).to eq group.users
|
expect(result[:references][:user]).to eq group.users
|
||||||
|
|
Loading…
Reference in a new issue