diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-08-07 14:44:54 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-08-07 14:44:54 +0000 |
commit | 4773f38e28c91dbbb6e5e385e0c403877298bfed (patch) | |
tree | 586ae3380337aee5a757eee2134f22fb77844692 | |
parent | 0d5d80b735eb18ae79eb2bfe26c08896d53db414 (diff) | |
parent | fd2f907b0171c9c70b3a514d0452d2027980319e (diff) | |
download | gitlab-ce-4773f38e28c91dbbb6e5e385e0c403877298bfed.tar.gz |
Merge branch 'improve-merge-requests' into 'master'
Improve merge requests
- [x] Fetch merge request refs by IID
- [x] Ability to fetch any merge request
- [x] Link commits and diffs in merge request to target project
- [x] Improve merge request UI and command line instructions
- [x] Check merge request widget loading test coverage double
See merge request !1115
-rw-r--r-- | app/assets/javascripts/merge_request_widget.js.coffee | 6 | ||||
-rw-r--r-- | app/assets/stylesheets/pages/merge_requests.scss | 144 | ||||
-rw-r--r-- | app/helpers/merge_requests_helper.rb | 10 | ||||
-rw-r--r-- | app/models/merge_request.rb | 2 | ||||
-rw-r--r-- | app/models/merge_request_diff.rb | 4 | ||||
-rw-r--r-- | app/views/projects/merge_requests/_show.html.haml | 51 | ||||
-rw-r--r-- | app/views/projects/merge_requests/show/_commits.html.haml | 2 | ||||
-rw-r--r-- | app/views/projects/merge_requests/show/_diffs.html.haml | 2 | ||||
-rw-r--r-- | app/views/projects/merge_requests/widget/_heading.html.haml | 37 | ||||
-rw-r--r-- | app/views/projects/merge_requests/widget/open/_accept.html.haml | 6 | ||||
-rw-r--r-- | app/views/projects/merge_requests/widget/open/_conflicts.html.haml | 9 | ||||
-rw-r--r-- | doc/workflow/README.md | 1 | ||||
-rw-r--r-- | doc/workflow/merge_requests.md | 40 |
13 files changed, 154 insertions, 160 deletions
diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index c68a2a9d047..995a2f24093 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -49,10 +49,8 @@ class @MergeRequestWidget @setMergeButtonClass('btn-danger') showCiCoverage: (coverage) -> - cov_html = $('<span>') - cov_html.addClass('ci-coverage') - cov_html.text('Coverage ' + coverage + '%') - $('.ci_widget:visible').append(cov_html) + text = 'Coverage ' + coverage + '%' + $('.ci_widget:visible .ci-coverage').text(text) setMergeButtonClass: (css_class) -> $('.accept_merge_request').removeClass("btn-create").addClass(css_class) diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index 6185dabd39b..9af8227a52f 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -1,9 +1,15 @@ - - /** - * MR -> show: Automerge widget +/** + * MR -> show: Automerge widget * */ .mr-state-widget { + background: #FAFAFA; + margin-bottom: 20px; + color: #666; + border: 1px solid #e5e5e5; + @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.05)); + @include border-radius(3px); + form { margin-bottom: 0; .clearfix { @@ -20,16 +26,67 @@ display: inline-block; margin: 0; margin-left: 20px; - padding: 10px 0; + padding: 5px; line-height: 20px; - font-weight: bold; .remove_source_checkbox { margin: 0; - font-weight: bold; } } } + + .ci_widget { + border-bottom: 1px solid #EEE; + + i { + margin-right: 4px; + } + + &.ci-success { + color: $gl-success; + } + + &.ci-skipped { + background-color: #eee; + color: #888; + } + + &.ci-pending, + &.ci-running { + color: $gl-warning; + } + + &.ci-failed, + &.ci-canceled, + &.ci-error { + color: $gl-danger; + } + } + + .mr-widget-body, + .ci_widget, + .mr-widget-footer { + padding: 15px; + } + + .mr-widget-body { + h4 { + font-weight: bold; + margin: 5px 0; + } + + p:last-child { + margin-bottom: 0; + } + } + + .mr-widget-footer { + border-top: 1px solid #EEE; + } + + .ci-coverage { + float: right; + } } @media(min-width: $screen-sm-max) { @@ -58,23 +115,10 @@ } .label-branch { - @include border-radius(4px); - padding: 3px 4px; - border: none; - background: $hover; - color: #333; + color: #222; font-family: $monospace_font; - font-weight: normal; + font-weight: bold; overflow: hidden; - - .label-project { - @include border-radius-left(4px); - padding: 3px 4px; - background: #279; - position: relative; - left: -4px; - letter-spacing: -1px; - } } .mr-list { @@ -121,64 +165,6 @@ display: none; } -.mr-state-widget { - font-size: 13px; - background: #FAFAFA; - margin-bottom: 20px; - color: #666; - border: 1px solid #e5e5e5; - @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.05)); - @include border-radius(3px); - - .ci_widget { - padding: 10px 15px; - font-size: 15px; - border-bottom: 1px solid #EEE; - - &.ci-success { - color: $gl-success; - } - - &.ci-skipped { - background-color: #eee; - color: #888; - } - - &.ci-pending, - &.ci-running { - color: $gl-warning; - } - - &.ci-failed, - &.ci-canceled, - &.ci-error { - color: $gl-danger; - } - } - - .mr-widget-body { - padding: 10px 15px; - - h4 { - font-weight: bold; - margin: 5px 0; - } - - p:last-child { - margin-bottom: 0; - } - } - - .mr-widget-footer { - padding: 10px 15px; - border-top: 1px solid #EEE; - } - - .ci-coverage { - float: right; - } -} - .merge-request-show-labels { a { margin-right: 5px; diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 45ee4fe4135..f8169b4f288 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -61,4 +61,14 @@ module MergeRequestsHelper } ) end + + def source_branch_with_namespace(merge_request) + if merge_request.for_fork? + namespace = link_to(merge_request.source_project_namespace, + project_path(merge_request.source_project)) + namespace + ":#{merge_request.source_branch}" + else + merge_request.source_branch + end + end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 631a2d887cc..467b90861f9 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -432,7 +432,7 @@ class MergeRequest < ActiveRecord::Base target_project.repository.fetch_ref( source_project.repository.path_to_repo, "refs/heads/#{source_branch}", - "refs/merge-requests/#{id}/head" + "refs/merge-requests/#{iid}/head" ) end diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index 2177f972ca3..e317c8eac4d 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -161,8 +161,8 @@ class MergeRequestDiff < ActiveRecord::Base def compare_result @compare_result ||= begin - # Update ref if merge request is from fork - merge_request.fetch_ref if merge_request.for_fork? + # Update ref for merge request + merge_request.fetch_ref # Get latest sha of branch from source project source_sha = merge_request.source_project.commit(source_branch).sha diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index c57eee14143..2662e3aff6b 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -6,40 +6,25 @@ = render "projects/merge_requests/show/mr_box" %hr .append-bottom-20 - .slead - %span From - - if @merge_request.for_fork? - %strong.label-branch< - - if @merge_request.source_project - = link_to @merge_request.source_project_namespace, namespace_project_path(@merge_request.source_project.namespace, @merge_request.source_project) - - else - \ #{@merge_request.source_project_namespace} - \:#{@merge_request.source_branch} + - if @merge_request.open? + .btn-group.btn-group-sm.pull-right + %a.btn.btn-sm.dropdown-toggle{ data: {toggle: :dropdown} } + = icon('download') + Download as + %span.caret + %ul.dropdown-menu + %li= link_to "Email Patches", merge_request_path(@merge_request, format: :patch) + %li= link_to "Plain Diff", merge_request_path(@merge_request, format: :diff) + .light + %div + %span From + %span.label-branch #{source_branch_with_namespace(@merge_request)} %span into - %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} - - else - %strong.label-branch #{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_branch} - - if @merge_request.open? - .btn-group.btn-group-sm.pull-right - %a.btn.btn-sm.dropdown-toggle{ data: {toggle: :dropdown} } - = icon('download') - Download as - %span.caret - %ul.dropdown-menu - %li= link_to "Email Patches", merge_request_path(@merge_request, format: :patch) - %li= link_to "Plain Diff", merge_request_path(@merge_request, format: :diff) - - - if @merge_request.open? and @merge_request.source_branch_exists? - .append-bottom-20 - .slead - %span - Fetch the branch with - %strong.label-branch< - git fetch - \ #{@merge_request.source_project.http_url_to_repo} - \ #{@merge_request.source_branch} + %span.label-branch #{@merge_request.target_branch} + - if @merge_request.open? && !@merge_request.branch_missing? + %div + If you want to try or merge this request manually, you can use the + = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal" = render "projects/merge_requests/show/how_to_merge" = render "projects/merge_requests/widget/show.html.haml" diff --git a/app/views/projects/merge_requests/show/_commits.html.haml b/app/views/projects/merge_requests/show/_commits.html.haml index 3b7f283daf0..a71b181a6a5 100644 --- a/app/views/projects/merge_requests/show/_commits.html.haml +++ b/app/views/projects/merge_requests/show/_commits.html.haml @@ -1 +1 @@ -= render "projects/commits/commits", project: @merge_request.source_project += render "projects/commits/commits", project: @merge_request.project diff --git a/app/views/projects/merge_requests/show/_diffs.html.haml b/app/views/projects/merge_requests/show/_diffs.html.haml index 786b5f39063..626970f39be 100644 --- a/app/views/projects/merge_requests/show/_diffs.html.haml +++ b/app/views/projects/merge_requests/show/_diffs.html.haml @@ -1,5 +1,5 @@ - if @merge_request_diff.collected? - = render "projects/diffs/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project + = render "projects/diffs/diffs", diffs: @merge_request.diffs, project: @merge_request.project - elsif @merge_request_diff.empty? .nothing-here-block Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch} - else diff --git a/app/views/projects/merge_requests/widget/_heading.html.haml b/app/views/projects/merge_requests/widget/_heading.html.haml index f04eac0e3bb..17d529766e6 100644 --- a/app/views/projects/merge_requests/widget/_heading.html.haml +++ b/app/views/projects/merge_requests/widget/_heading.html.haml @@ -1,28 +1,14 @@ - if @merge_request.has_ci? .mr-widget-heading - .ci_widget.ci-success{style: "display:none"} - = icon("check") - %span CI build passed - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - - .ci_widget.ci-skipped{style: "display:none"} - = icon("check") - %span CI build skipped - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - - .ci_widget.ci-failed{style: "display:none"} - = icon("times") - %span CI build failed - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - - - [:running, :pending].each do |status| + - [:success, :skipped, :canceled, :failed, :running, :pending].each do |status| .ci_widget{class: "ci-#{status}", style: "display:none"} - = icon("clock-o") + - if status == :success + = 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" .ci_widget @@ -30,19 +16,12 @@ Checking for CI status for #{@merge_request.last_commit_short_sha} .ci_widget.ci-not_found{style: "display:none"} - = icon("times") + = icon("times-circle") %span Can not find commit in the CI server for #{@merge_request.last_commit_short_sha}. - - - .ci_widget.ci-canceled{style: "display:none"} - = icon("times") - %span CI build canceled - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" .ci_widget.ci-error{style: "display:none"} - = icon("times") + = icon("times-circle") %span Cannot connect to the CI server. Please check your settings and try again. :coffeescript diff --git a/app/views/projects/merge_requests/widget/open/_accept.html.haml b/app/views/projects/merge_requests/widget/open/_accept.html.haml index 3c0cd25ba07..1be98cbe8de 100644 --- a/app/views/projects/merge_requests/widget/open/_accept.html.haml +++ b/app/views/projects/merge_requests/widget/open/_accept.html.haml @@ -18,12 +18,6 @@ text: @merge_request.merge_commit_message, rows: 14, hint: true - %br - .light - If you want to merge this request manually, you can use the - %strong - = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal" - :coffeescript $('.accept-mr-form').on 'ajax:before', -> btn = $('.accept_merge_request') diff --git a/app/views/projects/merge_requests/widget/open/_conflicts.html.haml b/app/views/projects/merge_requests/widget/open/_conflicts.html.haml index 7dc3b4eb2cc..440a7aa1c61 100644 --- a/app/views/projects/merge_requests/widget/open/_conflicts.html.haml +++ b/app/views/projects/merge_requests/widget/open/_conflicts.html.haml @@ -1,10 +1,11 @@ +%h4 + This merge request contains merge conflicts that must be resolved. + - if @merge_request.can_be_merged_by?(current_user) - %h4 - This merge request contains merge conflicts that must be resolved. %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 - %strong This merge request contains merge conflicts that must be resolved. - Only those with write access to this repository can merge merge requests. + %p + Only those with write access to this repository can merge merge requests. diff --git a/doc/workflow/README.md b/doc/workflow/README.md index 3915198ad2a..5b8d72dfd34 100644 --- a/doc/workflow/README.md +++ b/doc/workflow/README.md @@ -13,4 +13,5 @@ - [Project users](add-user/add-user.md) - [Protected branches](protected_branches.md) - [Web Editor](web_editor.md) +- [Merge Requests](merge_requests.md) - ["Work In Progress" Merge Requests](wip_merge_requests.md) diff --git a/doc/workflow/merge_requests.md b/doc/workflow/merge_requests.md new file mode 100644 index 00000000000..751e19da7f1 --- /dev/null +++ b/doc/workflow/merge_requests.md @@ -0,0 +1,40 @@ +# Merge Requests + +Merge requests allow you to exchange changes you made to source code + +## Checkout merge requests locally + +Locate the section for your GitLab remote in the `.git/config` file. It looks like this: + +``` +[remote "origin"] + url = https://gitlab.com/gitlab-org/gitlab-ce.git + fetch = +refs/heads/*:refs/remotes/origin/* +``` + +Now add the line `fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*` to this section. + +It should looks like this: + +``` +[remote "origin"] + url = https://gitlab.com/gitlab-org/gitlab-ce.git + fetch = +refs/heads/*:refs/remotes/origin/* + fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* +``` + +Now you can fetch all the merge requests requests: + +``` +$ git fetch origin +From https://gitlab.com/gitlab-org/gitlab-ce.git + * [new ref] refs/merge-requests/1/head -> origin/merge-requests/1 + * [new ref] refs/merge-requests/2/head -> origin/merge-requests/2 +... +``` + +To check out a particular merge request: + +``` +$ git checkout origin/merge-requests/1 +``` |