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.
|
||||
- Disabled autocapitalize and autocorrect on login field (Daryl Chan)
|
||||
- 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
|
||||
- Add support for CI skipped status
|
||||
- Fetch code from forks to refs/merge-requests/:id/head when merge request created
|
||||
- Remove satellites
|
||||
- Remove comments and email addresses when publicly exposing ssh keys (Zeger-Jan van de Weg)
|
||||
- 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
|
||||
|
||||
v 7.13.3
|
||||
|
|
|
@ -154,7 +154,7 @@ GEM
|
|||
doorkeeper (2.1.3)
|
||||
railties (>= 3.2)
|
||||
dotenv (0.9.0)
|
||||
dropzonejs-rails (0.4.14)
|
||||
dropzonejs-rails (0.7.1)
|
||||
rails (> 3.1)
|
||||
email_spec (1.6.0)
|
||||
launchy (~> 2.1)
|
||||
|
@ -373,7 +373,7 @@ GEM
|
|||
mini_portile (0.6.2)
|
||||
minitest (5.3.5)
|
||||
mousetrap-rails (1.4.6)
|
||||
multi_json (1.11.1)
|
||||
multi_json (1.11.2)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (1.2.0)
|
||||
mysql2 (0.3.16)
|
||||
|
|
|
@ -8,6 +8,7 @@ class @DropzoneInput
|
|||
divAlert = "<div class=\"" + alertClass + "\"></div>"
|
||||
iconPaperclip = "<i class=\"fa fa-paperclip 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>"
|
||||
project_uploads_path = window.project_uploads_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.append divSpinner
|
||||
form_dropzone.find(".div-dropzone-spinner").append iconSpinner
|
||||
form_dropzone.find(".div-dropzone-spinner").append uploadProgress
|
||||
form_dropzone.find(".div-dropzone-spinner").css
|
||||
"opacity": 0
|
||||
"display": "none"
|
||||
|
@ -112,13 +114,18 @@ class @DropzoneInput
|
|||
$(".div-dropzone-alert").append btnAlert + errorMessage
|
||||
return
|
||||
|
||||
totaluploadprogress: (totalUploadProgress) ->
|
||||
uploadProgress.text Math.round(totalUploadProgress) + "%"
|
||||
return
|
||||
|
||||
sending: ->
|
||||
form_dropzone.find(".div-dropzone-spinner").css
|
||||
"opacity": 0.7
|
||||
"display": "inherit"
|
||||
return
|
||||
|
||||
complete: ->
|
||||
queuecomplete: ->
|
||||
uploadProgress.text ""
|
||||
$(".dz-preview").remove()
|
||||
$(".markdown-area").trigger "input"
|
||||
$(".div-dropzone-spinner").css
|
||||
|
|
|
@ -40,6 +40,15 @@
|
|||
font-size: inherit;
|
||||
}
|
||||
|
||||
.div-dropzone-progress {
|
||||
position: absolute;
|
||||
top: 7px;
|
||||
left: -40px;
|
||||
width: 35px;
|
||||
font-size: 13px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.dz-preview {
|
||||
display: none;
|
||||
}
|
||||
|
|
|
@ -183,6 +183,10 @@
|
|||
width: 250px !important;
|
||||
}
|
||||
|
||||
#modal_merge_info .modal-dialog {
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
.mr-source-target {
|
||||
line-height: 31px;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,71 @@
|
|||
class PostCommitService < BaseService
|
||||
include Gitlab::Popen
|
||||
|
||||
attr_reader :changes, :repo_path
|
||||
|
||||
def execute(sha, branch)
|
||||
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
|
||||
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
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
.event-item-timestamp
|
||||
#{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:''
|
||||
- if event.created_project?
|
||||
= render "events/event/created_project", event: event
|
||||
|
|
|
@ -82,12 +82,12 @@
|
|||
You can change your avatar here
|
||||
- if Gitlab.config.gravatar.enabled
|
||||
%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
|
||||
You can upload an avatar here
|
||||
- if Gitlab.config.gravatar.enabled
|
||||
%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
|
||||
%a.choose-btn.btn.btn-sm.js-choose-user-avatar-button
|
||||
%i.fa.fa-paperclip
|
||||
|
|
|
@ -3,42 +3,45 @@
|
|||
.modal-content
|
||||
.modal-header
|
||||
%a.close{href: "#", "data-dismiss" => "modal"} ×
|
||||
%h3 How to merge
|
||||
%h3 Check out, review and merge locally
|
||||
.modal-body
|
||||
- if @merge_request.for_fork?
|
||||
- source_remote = @merge_request.source_project.namespace.nil? ? "source" :@merge_request.source_project.namespace.path
|
||||
- target_remote = @merge_request.target_project.namespace.nil? ? "target" :@merge_request.target_project.namespace.path
|
||||
%p
|
||||
%strong Step 1.
|
||||
Fetch the code and create a new branch pointing to it
|
||||
Fetch and check out the branch for this merge request
|
||||
%pre.dark
|
||||
- if @merge_request.for_fork?
|
||||
:preserve
|
||||
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
|
||||
%p
|
||||
%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
|
||||
git fetch origin
|
||||
git checkout -b #{@merge_request.source_branch} origin/#{@merge_request.source_branch}
|
||||
%p
|
||||
%strong Step 2.
|
||||
Merge the branch and push the changes to GitLab
|
||||
Review the changes locally
|
||||
|
||||
%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
|
||||
git checkout #{@merge_request.target_branch}
|
||||
git merge --no-ff #{@merge_request.source_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
|
||||
$(function(){
|
||||
|
|
|
@ -6,4 +6,7 @@
|
|||
- if @merge_request.closed_event
|
||||
by #{link_to_member(@project, @merge_request.closed_event.author, avatar: true)}
|
||||
#{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|
|
||||
.ci_widget{class: "ci-#{status}", style: "display:none"}
|
||||
- if status == :success
|
||||
- status = "passed"
|
||||
= icon("check-circle")
|
||||
- else
|
||||
= icon("circle")
|
||||
%span CI build #{status}
|
||||
for #{@merge_request.last_commit_short_sha}.
|
||||
%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
|
||||
= 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"}
|
||||
= icon("times-circle")
|
||||
%span Can not find commit in the CI server
|
||||
for #{@merge_request.last_commit_short_sha}.
|
||||
Could not find CI status for #{@merge_request.last_commit_short_sha}.
|
||||
|
||||
.ci_widget.ci-error{style: "display:none"}
|
||||
= 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
|
||||
$ ->
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
= render 'projects/merge_requests/widget/heading'
|
||||
.mr-widget-body
|
||||
%h4
|
||||
Merge in progress...
|
||||
= icon("spinner spin")
|
||||
Merge in progress…
|
||||
%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)}
|
||||
#{time_ago_with_tooltip(@merge_request.merge_event.created_at)}
|
||||
%div
|
||||
- if @source_branch.blank?
|
||||
Source branch has been removed
|
||||
- if !@merge_request.source_branch_exists?
|
||||
= 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
|
||||
%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
|
||||
%i.fa.fa-times
|
||||
Remove Source Branch
|
||||
|
||||
.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
|
||||
%i.fa.fa-spinner.fa-spin
|
||||
|
||||
Removing source branch '#{@merge_request.source_branch}'. Please wait. Page will be automatically reloaded.
|
||||
%p
|
||||
= icon('spinner spin')
|
||||
Removing source branch '#{@merge_request.source_branch}'. Please wait. This page will be automatically reload.
|
||||
|
||||
:coffeescript
|
||||
$('.remove_source_branch').on 'click', ->
|
||||
|
|
|
@ -22,6 +22,6 @@
|
|||
.mr-widget-footer
|
||||
%span
|
||||
%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
|
||||
!= gfm(issues_sentence(@closes_issues))
|
||||
|
|
|
@ -8,10 +8,10 @@
|
|||
.accept-control.checkbox
|
||||
= label_tag :should_remove_source_branch, class: "remove_source_checkbox" do
|
||||
= check_box_tag :should_remove_source_branch
|
||||
Remove source-branch
|
||||
Remove source branch
|
||||
.accept-control
|
||||
= link_to "#", class: "modify-merge-commit-link js-toggle-button", title: "Modify merge commit message" do
|
||||
%i.fa.fa-edit
|
||||
= link_to "#", class: "modify-merge-commit-link js-toggle-button" do
|
||||
= icon('edit')
|
||||
Modify commit message
|
||||
.js-toggle-content.hide.prepend-top-20
|
||||
= render 'shared/commit_message_container', params: params,
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
%h4
|
||||
Project is archived
|
||||
%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
|
||||
%i.fa.fa-spinner.fa-spin
|
||||
Checking automatic merge…
|
||||
= icon("spinner spin")
|
||||
Checking ability to merge automatically…
|
||||
|
||||
:coffeescript
|
||||
$ ->
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
%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
|
||||
You can merge it manually using the
|
||||
%strong
|
||||
= link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal"
|
||||
- else
|
||||
%p
|
||||
Only those with write access to this repository can merge merge requests.
|
||||
%p
|
||||
Please resolve these conflicts or
|
||||
- if @merge_request.can_be_merged_by?(current_user)
|
||||
#{link_to "merge this request manually", "#modal_merge_info", class: "how_to_merge_link vlink", "data-toggle" => "modal"}.
|
||||
- else
|
||||
ask someone with write access to this repository to merge this request manually.
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
%h4
|
||||
Can't be merged
|
||||
%p
|
||||
This merge request can not be accepted because branch
|
||||
- unless @merge_request.source_branch_exists?
|
||||
%span.label.label-inverse= @merge_request.source_branch
|
||||
does not exist in
|
||||
%span.label.label-info= @merge_request.source_project_path
|
||||
%br
|
||||
%strong Please close this merge request and open a new merge request to change source branches.
|
||||
- else
|
||||
%span.label.label-inverse= @merge_request.target_branch
|
||||
does not exist in
|
||||
%span.label.label-info= @merge_request.target_project_path
|
||||
%br
|
||||
%strong Please close this merge request or change to another target branch.
|
||||
- unless @merge_request.source_branch_exists?
|
||||
%h4
|
||||
= icon("exclamation-triangle")
|
||||
Source branch
|
||||
%span.label-branch= source_branch_with_namespace(@merge_request)
|
||||
does not exist
|
||||
%p
|
||||
Please restore the source branch or close this merge request and open a new merge request with a different source branch.
|
||||
- else
|
||||
%h4
|
||||
= icon("exclamation-triangle")
|
||||
Target branch
|
||||
%span.label-branch= @merge_request.target_branch
|
||||
does not exist
|
||||
%p
|
||||
Please restore the target branch or use a different target branch.
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
%strong This request can be merged automatically.
|
||||
Only those with write access to this repository can merge merge requests.
|
||||
%h4
|
||||
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
|
||||
%p
|
||||
%h4
|
||||
= icon("exclamation-triangle")
|
||||
Nothing to merge from
|
||||
%span.label-branch #{@merge_request.source_branch}
|
||||
to
|
||||
%span.label-branch #{@merge_request.target_branch}
|
||||
%br
|
||||
Try to use different branches or push new code.
|
||||
%span.label-branch= source_branch_with_namespace(@merge_request)
|
||||
into
|
||||
%span.label-branch= @merge_request.target_branch
|
||||
%p
|
||||
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
|
||||
This merge request cannot be accepted because it is marked as Work In Progress.
|
||||
%h4
|
||||
This merge request is currently a Work In Progress
|
||||
|
||||
%p
|
||||
%button.btn.disabled{:type => 'button'}
|
||||
%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.
|
||||
%p
|
||||
When this merge request is ready, remove the "WIP" prefix from the title to allow it to be merged.
|
||||
|
|
|
@ -16,10 +16,10 @@
|
|||
%p.help-block
|
||||
- if issuable.work_in_progress?
|
||||
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
|
||||
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
|
||||
= f.label :description, 'Description', class: 'control-label'
|
||||
.col-sm-10
|
||||
|
|
|
@ -9,6 +9,15 @@ class Settings < Settingslogic
|
|||
gitlab.port.to_i == (gitlab.https ? 443 : 80)
|
||||
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
|
||||
|
||||
def build_gitlab_shell_ssh_path_prefix
|
||||
|
@ -147,6 +156,7 @@ Settings['gravatar'] ||= Settingslogic.new({})
|
|||
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['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
|
||||
|
|
|
@ -35,6 +35,7 @@ Feature: Profile
|
|||
Then I change my avatar
|
||||
And I should see new avatar
|
||||
And I should see the "Remove avatar" button
|
||||
And I should see the gravatar host link
|
||||
|
||||
Scenario: I remove my avatar
|
||||
Given I visit profile page
|
||||
|
@ -42,6 +43,7 @@ Feature: Profile
|
|||
When I remove my avatar
|
||||
Then I should see my gravatar
|
||||
And I should not see the "Remove avatar" button
|
||||
And I should see the gravatar host link
|
||||
|
||||
Scenario: My password is expired
|
||||
Given my password is expired
|
||||
|
|
|
@ -60,6 +60,10 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
|
|||
expect(page).not_to have_link("Remove avatar")
|
||||
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
|
||||
page.within '.update-password' do
|
||||
fill_in "user_password", with: "22233344"
|
||||
|
|
|
@ -57,10 +57,11 @@ module Gitlab
|
|||
|
||||
title = range.reference_title
|
||||
klass = reference_class(:commit_range)
|
||||
data = data_attribute(project.id)
|
||||
|
||||
project_ref += '@' if project_ref
|
||||
|
||||
%(<a href="#{url}"
|
||||
%(<a href="#{url}" #{data}
|
||||
title="#{title}"
|
||||
class="#{klass}">#{project_ref}#{range}</a>)
|
||||
else
|
||||
|
|
|
@ -47,10 +47,11 @@ module Gitlab
|
|||
|
||||
title = escape_once(commit.link_title)
|
||||
klass = reference_class(:commit)
|
||||
data = data_attribute(project.id)
|
||||
|
||||
project_ref += '@' if project_ref
|
||||
|
||||
%(<a href="#{url}"
|
||||
%(<a href="#{url}" #{data}
|
||||
title="#{title}"
|
||||
class="#{klass}">#{project_ref}#{commit.short_id}</a>)
|
||||
else
|
||||
|
|
|
@ -49,8 +49,9 @@ module Gitlab
|
|||
|
||||
title = escape_once("Issue: #{issue.title}")
|
||||
klass = reference_class(:issue)
|
||||
data = data_attribute(project.id)
|
||||
|
||||
%(<a href="#{url}"
|
||||
%(<a href="#{url}" #{data}
|
||||
title="#{title}"
|
||||
class="#{klass}">#{match}</a>)
|
||||
else
|
||||
|
|
|
@ -43,8 +43,9 @@ module Gitlab
|
|||
|
||||
url = url_for_label(project, label)
|
||||
klass = reference_class(:label)
|
||||
data = data_attribute(project.id)
|
||||
|
||||
%(<a href="#{url}"
|
||||
%(<a href="#{url}" #{data}
|
||||
class="#{klass}">#{render_colored_label(label)}</a>)
|
||||
else
|
||||
match
|
||||
|
|
|
@ -47,10 +47,11 @@ module Gitlab
|
|||
|
||||
title = escape_once("Merge Request: #{merge_request.title}")
|
||||
klass = reference_class(:merge_request)
|
||||
data = data_attribute(project.id)
|
||||
|
||||
url = url_for_merge_request(merge_request, project)
|
||||
|
||||
%(<a href="#{url}"
|
||||
%(<a href="#{url}" #{data}
|
||||
title="#{title}"
|
||||
class="#{klass}">#{match}</a>)
|
||||
else
|
||||
|
|
|
@ -21,6 +21,22 @@ module Gitlab
|
|||
result[:references] = Hash.new { |hash, type| hash[type] = [] }
|
||||
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)
|
||||
ERB::Util.html_escape_once(html)
|
||||
end
|
||||
|
|
|
@ -47,10 +47,11 @@ module Gitlab
|
|||
|
||||
title = escape_once("Snippet: #{snippet.title}")
|
||||
klass = reference_class(:snippet)
|
||||
data = data_attribute(project.id)
|
||||
|
||||
url = url_for_snippet(snippet, project)
|
||||
|
||||
%(<a href="#{url}"
|
||||
%(<a href="#{url}" #{data}
|
||||
title="#{title}"
|
||||
class="#{klass}">#{match}</a>)
|
||||
else
|
||||
|
|
|
@ -83,18 +83,20 @@ module Gitlab
|
|||
push_result(:user, *namespace.users)
|
||||
|
||||
url = urls.group_url(group, only_path: context[:only_path])
|
||||
data = data_attribute(namespace.id, :group)
|
||||
|
||||
text = Group.reference_prefix + group
|
||||
%(<a href="#{url}" class="#{link_class}">#{text}</a>)
|
||||
%(<a href="#{url}" #{data} class="#{link_class}">#{text}</a>)
|
||||
end
|
||||
|
||||
def link_to_user(user, namespace)
|
||||
push_result(:user, namespace.owner)
|
||||
|
||||
url = urls.user_url(user, only_path: context[:only_path])
|
||||
data = data_attribute(namespace.owner_id, :user)
|
||||
|
||||
text = User.reference_prefix + user
|
||||
%(<a href="#{url}" class="#{link_class}">#{text}</a>)
|
||||
%(<a href="#{url}" #{data} class="#{link_class}">#{text}</a>)
|
||||
end
|
||||
|
||||
def user_can_reference_group?(group)
|
||||
|
|
|
@ -80,6 +80,14 @@ module Gitlab::Markdown
|
|||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||
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
|
||||
doc = filter("See #{reference}", only_path: true)
|
||||
link = doc.css('a').first.attr('href')
|
||||
|
|
|
@ -76,6 +76,14 @@ module Gitlab::Markdown
|
|||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||
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
|
||||
doc = filter("See #{reference}", only_path: true)
|
||||
link = doc.css('a').first.attr('href')
|
||||
|
|
|
@ -73,6 +73,14 @@ module Gitlab::Markdown
|
|||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||
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
|
||||
doc = filter("Issue #{reference}", only_path: true)
|
||||
link = doc.css('a').first.attr('href')
|
||||
|
|
|
@ -30,6 +30,14 @@ module Gitlab::Markdown
|
|||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||
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
|
||||
doc = filter("Label #{reference}", only_path: true)
|
||||
link = doc.css('a').first.attr('href')
|
||||
|
|
|
@ -61,6 +61,14 @@ module Gitlab::Markdown
|
|||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||
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
|
||||
doc = filter("Merge #{reference}", only_path: true)
|
||||
link = doc.css('a').first.attr('href')
|
||||
|
|
|
@ -60,6 +60,14 @@ module Gitlab::Markdown
|
|||
expect(doc.css('a').first.attr('class')).to include 'custom'
|
||||
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
|
||||
doc = filter("Snippet #{reference}", only_path: true)
|
||||
link = doc.css('a').first.attr('href')
|
||||
|
|
|
@ -64,6 +64,14 @@ module Gitlab::Markdown
|
|||
expect(doc.css('a').length).to eq 1
|
||||
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
|
||||
result = pipeline_result("Hey #{reference}")
|
||||
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)
|
||||
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
|
||||
result = pipeline_result("Hey #{reference}", current_user: user)
|
||||
expect(result[:references][:user]).to eq group.users
|
||||
|
|
Loading…
Reference in a new issue