diff options
62 files changed, 356 insertions, 214 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8a729f957a2..498c7447ede 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -24,7 +24,12 @@ before_script: - bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}" - RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load db:migrate +stages: +- test +- notifications + spec:feature: + stage: test script: - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature @@ -33,6 +38,7 @@ spec:feature: - mysql spec:api: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:api tags: @@ -40,6 +46,7 @@ spec:api: - mysql spec:models: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:models tags: @@ -47,6 +54,7 @@ spec:models: - mysql spec:lib: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:lib tags: @@ -54,6 +62,7 @@ spec:lib: - mysql spec:services: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:services tags: @@ -61,6 +70,7 @@ spec:services: - mysql spec:benchmark: + stage: test script: - RAILS_ENV=test bundle exec rake spec:benchmark tags: @@ -69,6 +79,7 @@ spec:benchmark: allow_failure: true spec:other: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:other tags: @@ -76,6 +87,7 @@ spec:other: - mysql spinach:project:half: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:half tags: @@ -83,6 +95,7 @@ spinach:project:half: - mysql spinach:project:rest: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:rest tags: @@ -90,6 +103,7 @@ spinach:project:rest: - mysql spinach:other: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other tags: @@ -97,6 +111,7 @@ spinach:other: - mysql teaspoon: + stage: test script: - RAILS_ENV=test bundle exec teaspoon tags: @@ -104,6 +119,7 @@ teaspoon: - mysql rubocop: + stage: test script: - bundle exec rubocop tags: @@ -111,6 +127,7 @@ rubocop: - mysql brakeman: + stage: test script: - bundle exec rake brakeman tags: @@ -118,6 +135,7 @@ brakeman: - mysql flog: + stage: test script: - bundle exec rake flog tags: @@ -125,6 +143,7 @@ flog: - mysql flay: + stage: test script: - bundle exec rake flay tags: @@ -132,6 +151,7 @@ flay: - mysql bundler:audit: + stage: test script: - "bundle exec bundle-audit update" - "bundle exec bundle-audit check" @@ -143,6 +163,7 @@ bundler:audit: # Ruby 2.2 jobs spec:feature:ruby22: + stage: test image: ruby:2.2 only: - master @@ -158,6 +179,7 @@ spec:feature:ruby22: - mysql spec:api:ruby22: + stage: test image: ruby:2.2 only: - master @@ -172,6 +194,7 @@ spec:api:ruby22: - mysql spec:models:ruby22: + stage: test image: ruby:2.2 only: - master @@ -186,6 +209,7 @@ spec:models:ruby22: - mysql spec:lib:ruby22: + stage: test image: ruby:2.2 only: - master @@ -200,6 +224,7 @@ spec:lib:ruby22: - mysql spec:services:ruby22: + stage: test image: ruby:2.2 only: - master @@ -214,6 +239,7 @@ spec:services:ruby22: - mysql spec:benchmark:ruby22: + stage: test image: ruby:2.2 only: - master @@ -229,6 +255,7 @@ spec:benchmark:ruby22: allow_failure: true spec:other:ruby22: + stage: test image: ruby:2.2 only: - master @@ -243,6 +270,7 @@ spec:other:ruby22: - mysql spinach:project:half:ruby22: + stage: test image: ruby:2.2 only: - master @@ -257,6 +285,7 @@ spinach:project:half:ruby22: - mysql spinach:project:rest:ruby22: + stage: test image: ruby:2.2 only: - master @@ -271,6 +300,7 @@ spinach:project:rest:ruby22: - mysql spinach:other:ruby22: + stage: test image: ruby:2.2 only: - master @@ -284,3 +314,14 @@ spinach:other:ruby22: - ruby - mysql + +notify:slack: + stage: notifications + script: + - ./scripts/notify_slack.sh "#builds" "Build failed for master/tags!" + when: on_failure + only: + - master@gitlab-org/gitlab-ce + - tags@gitlab-org/gitlab-ce + - master@gitlab-org/gitlab-ee + - tags@gitlab-org/gitlab-ee
\ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG index 7fcb4628058..4abe86f8ced 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,25 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.6.0 (unreleased) + - Improve the formatting for the user page bio (Connor Shea) + +v 8.5.1 + - Fix group projects styles + - Show Crowd login tab when sign in is disabled and Crowd is enabled (Peter Hudec) + - Fix a set of small UI glitches in project, profile, and wiki pages + - Restrict permissions on public/uploads + - Fix the merge request side-by-side view after loading diff results + - Fix the look of tooltip for the "Revert" button + - Add when the Builds & Runners API changes got introduced + - Fix error 500 on some merged merge requests + - Fix an issue causing the content of the issuable sidebar to disappear + - Fix error 500 when trying to mark an already done todo as "done" + - Fix an issue where MRs weren't sortable + - Issues can now be dragged & dropped into empty milestone lists. This is also + possible with MRs + - Changed padding & background color for highlighted notes + - Re-add the newrelic_rpm gem which was removed without any deprecation or warning (Stan Hu) + - Update sentry-raven gem to 0.15.6 v 8.5.0 - Fix duplicate "me" in tooltip of the "thumbsup" awards Emoji (Stan Hu) @@ -218,7 +218,7 @@ gem 'virtus', '~> 1.0.1' gem 'net-ssh', '~> 3.0.1' # Sentry integration -gem 'sentry-raven' +gem 'sentry-raven', '~> 0.15' # Metrics group :metrics do @@ -303,6 +303,8 @@ group :production do gem "gitlab_meta", '7.0' end +gem "newrelic_rpm", '~> 3.14' + gem 'octokit', '~> 3.8.0' gem "mail_room", "~> 0.6.1" diff --git a/Gemfile.lock b/Gemfile.lock index 4681adf2bd0..7a1b94cff6c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -479,6 +479,7 @@ GEM net-ldap (0.12.1) net-ssh (3.0.1) netrc (0.11.0) + newrelic_rpm (3.14.1.311) nokogiri (1.6.7.2) mini_portile2 (~> 2.0.0.rc2) nprogress-rails (0.1.6.7) @@ -722,7 +723,7 @@ GEM activesupport (>= 3.1, < 4.3) select2-rails (3.5.9.3) thor (~> 0.14) - sentry-raven (0.15.4) + sentry-raven (0.15.6) faraday (>= 0.7.6) settingslogic (2.0.9) sexp_processor (4.6.0) @@ -960,6 +961,7 @@ DEPENDENCIES nested_form (~> 0.3.2) net-ssh (~> 3.0.1) nokogiri (~> 1.6.7, >= 1.6.7.2) + newrelic_rpm (~> 3.14) nprogress-rails (~> 0.1.6.7) oauth2 (~> 1.0.0) octokit (~> 3.8.0) @@ -1007,7 +1009,7 @@ DEPENDENCIES sdoc (~> 0.3.20) seed-fu (~> 2.3.5) select2-rails (~> 3.5.9) - sentry-raven + sentry-raven (~> 0.15) settingslogic (~> 2.0.9) sham_rack shoulda-matchers (~> 2.8.0) diff --git a/app/assets/javascripts/activities.js.coffee b/app/assets/javascripts/activities.js.coffee index 3b6b453ac51..5092e824e65 100644 --- a/app/assets/javascripts/activities.js.coffee +++ b/app/assets/javascripts/activities.js.coffee @@ -1,7 +1,7 @@ class @Activities constructor: -> Pager.init 20, true - $(".event-filter a").bind "click", (event) => + $(".event-filter-link").on "click", (event) => event.preventDefault() @toggleFilter($(event.currentTarget)) @reloadActivities() @@ -12,18 +12,10 @@ class @Activities toggleFilter: (sender) -> - sender.closest('li').toggleClass "active" + $('.event-filter .active').removeClass "active" event_filters = $.cookie("event_filter") filter = sender.attr("id").split("_")[0] - if event_filters - event_filters = event_filters.split(",") - else - event_filters = new Array() + $.cookie "event_filter", (if event_filters isnt filter then filter else ""), { path: '/' } - index = event_filters.indexOf(filter) - if index is -1 - event_filters.push filter - else - event_filters.splice index, 1 - - $.cookie "event_filter", event_filters.join(","), { path: '/' } + if event_filters isnt filter + sender.closest('li').toggleClass "active" diff --git a/app/assets/javascripts/awards_handler.coffee b/app/assets/javascripts/awards_handler.coffee index 360acb864f6..8f89d3e61a2 100644 --- a/app/assets/javascripts/awards_handler.coffee +++ b/app/assets/javascripts/awards_handler.coffee @@ -1,10 +1,10 @@ class @AwardsHandler constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) -> - $(".add-award").click (event)-> + $(".add-award").click (event) => event.stopPropagation() event.preventDefault() - $(".emoji-menu").show() - $("#emoji_search").focus() + + @showEmojiMenu() $("html").on 'click', (event) -> if !$(event.target).closest(".emoji-menu").length @@ -14,6 +14,16 @@ class @AwardsHandler @renderFrequentlyUsedBlock() @setupSearch() + showEmojiMenu: -> + if $(".emoji-menu").length + $(".emoji-menu").show() + $("#emoji_search").focus() + else + $.get "/emojis", (response) -> + $(".add-award").after response + $(".emoji-menu").show() + $("#emoji_search").focus() + addAward: (emoji) -> emoji = @normilizeEmojiName(emoji) @postEmoji emoji, => diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index 4c6cf3417e8..89f1993797f 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -90,6 +90,7 @@ class Dispatcher when 'groups:new', 'groups:edit', 'admin:groups:edit', 'admin:groups:new' new GroupAvatar() when 'projects:tree:show' + shortcut_handler = new ShortcutsNavigation() new TreeView() when 'projects:find_file:show' shortcut_handler = true diff --git a/app/assets/javascripts/shortcuts_issuable.coffee b/app/assets/javascripts/shortcuts_issuable.coffee index cefa1857d7f..bbf02f1db24 100644 --- a/app/assets/javascripts/shortcuts_issuable.coffee +++ b/app/assets/javascripts/shortcuts_issuable.coffee @@ -24,6 +24,10 @@ class @ShortcutsIssuable extends ShortcutsNavigation @nextIssue() return false ) + Mousetrap.bind('e', => + @editIssue() + return false + ) if isMergeRequest @@ -63,3 +67,7 @@ class @ShortcutsIssuable extends ShortcutsNavigation # Focus the input field replyField.focus() + + editIssue: -> + $editBtn = $('.issuable-edit') + Turbolinks.visit($editBtn.attr('href')) diff --git a/app/assets/javascripts/wikis.js.coffee b/app/assets/javascripts/wikis.js.coffee index 19420f42468..1ee827f1fa3 100644 --- a/app/assets/javascripts/wikis.js.coffee +++ b/app/assets/javascripts/wikis.js.coffee @@ -2,7 +2,7 @@ class @Wikis constructor: -> - $('.build-new-wiki').bind 'click', (e) => + $('.new-wiki-page').on 'submit', (e) => $('[data-error~=slug]').addClass('hidden') field = $('#new_wiki_path') slug = @slugify(field.val()) @@ -10,6 +10,7 @@ class @Wikis if (slug.length > 0) path = field.attr('data-wikis-path') location.href = path + '/' + slug + e.preventDefault() dasherize: (value) -> value.replace(/[_\s]+/g, '-') diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss index bd89cc7dc1d..d7e4153ddc0 100644 --- a/app/assets/stylesheets/framework/blocks.scss +++ b/app/assets/stylesheets/framework/blocks.scss @@ -66,7 +66,7 @@ } .oneline { - line-height: 42px; + line-height: 35px; } > p:last-child { diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index c7f3604850d..07907e6e5a6 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -158,7 +158,7 @@ } &:hover { - background: $hover; + background: $row-hover; } } } diff --git a/app/assets/stylesheets/framework/jquery.scss b/app/assets/stylesheets/framework/jquery.scss index d6cd78813c0..0cdcd923b3c 100644 --- a/app/assets/stylesheets/framework/jquery.scss +++ b/app/assets/stylesheets/framework/jquery.scss @@ -48,8 +48,8 @@ .ui-state-hover, .ui-state-focus { - border: 1px solid $hover; - background: $hover; + border: 1px solid $row-hover; + background: $row-hover; color: #333; } } diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss index 5c65383ec1a..354392d5ec3 100644 --- a/app/assets/stylesheets/framework/lists.scss +++ b/app/assets/stylesheets/framework/lists.scss @@ -38,7 +38,7 @@ &.smoke { background-color: $background-color; } &:hover { - background: $hover; + background: $row-hover; } &:last-child { diff --git a/app/assets/stylesheets/framework/nav.scss b/app/assets/stylesheets/framework/nav.scss index 252a586358c..d24faa897a1 100644 --- a/app/assets/stylesheets/framework/nav.scss +++ b/app/assets/stylesheets/framework/nav.scss @@ -77,12 +77,21 @@ margin-bottom: 0px; > .dropdown { - margin-right: 10px; + margin-right: $gl-padding-top; display: inline-block; } > .btn { + margin-right: $gl-padding-top; display: inline-block; + + &:last-child { + margin-right: 0; + } + } + + > .btn-grouped { + float: none; } > form { @@ -94,7 +103,7 @@ display: inline-block; position: relative; top: 1px; - margin-right: 10px; + margin-right: $gl-padding-top; /* Medium devices (desktops, 992px and up) */ @media (min-width: $screen-md-min) { width: 200px; } diff --git a/app/assets/stylesheets/framework/timeline.scss b/app/assets/stylesheets/framework/timeline.scss index 47b843e5e3d..aa244fe548d 100644 --- a/app/assets/stylesheets/framework/timeline.scss +++ b/app/assets/stylesheets/framework/timeline.scss @@ -5,13 +5,13 @@ padding: 0; .timeline-entry { - padding: $gl-padding 0; + padding: $gl-padding $gl-btn-padding; border-color: $table-border-color; color: $gl-gray; border-bottom: 1px solid $border-white-light; &:target { - background: $hover; + background: $row-hover; } &:last-child { diff --git a/app/assets/stylesheets/framework/tw_bootstrap_variables.scss b/app/assets/stylesheets/framework/tw_bootstrap_variables.scss index 33270388e64..b1b8295411b 100644 --- a/app/assets/stylesheets/framework/tw_bootstrap_variables.scss +++ b/app/assets/stylesheets/framework/tw_bootstrap_variables.scss @@ -70,7 +70,7 @@ $pagination-bg: #fff; $pagination-border: $border-color; $pagination-hover-color: $gl-gray; -$pagination-hover-bg: $hover; +$pagination-hover-bg: $row-hover; $pagination-hover-border: $border-color; $pagination-active-color: $blue-dark; diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index 04db0da73d1..4d72c7e905e 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -1,4 +1,4 @@ -$hover: #faf9f9; +$row-hover: #f4f8fe; $gl-text-color: #54565B; $gl-text-green: #4A2; $gl-text-red: #D12F19; diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss index 95fc26a608a..4767c65d9a7 100644 --- a/app/assets/stylesheets/pages/profile.scss +++ b/app/assets/stylesheets/pages/profile.scss @@ -51,9 +51,17 @@ .profile-link-holder { display: inline; + a { + color: $blue-dark; + text-decoration: none; + } +} + +// Middle dot divider between each element in a list of items. +.middle-dot-divider { &:after { - content: "\00B7"; - padding: 0px 6px; + content: "\00B7"; // Middle Dot + padding: 0 6px; font-weight: bold; } @@ -63,9 +71,10 @@ padding: 0; } } +} - a { - color: $blue-dark; - text-decoration: none; - } +.profile-user-bio { + // Limits the width of the user bio for readability. + max-width: 750px; + margin: auto; } diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index c7411617cb3..ef63b010600 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -21,7 +21,7 @@ &:hover { td { - background: $hover; + background: $row-hover; } cursor: pointer; } diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index cdf514197cb..dfaeba41cf6 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -4,8 +4,3 @@ margin-right: auto; padding-right: 7px; } - -.wiki-last-edit-by { - font-size: 80%; - font-weight: normal; -} diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb index 9ee9039f004..43cf8fa71af 100644 --- a/app/controllers/dashboard/todos_controller.rb +++ b/app/controllers/dashboard/todos_controller.rb @@ -15,7 +15,7 @@ class Dashboard::TodosController < Dashboard::ApplicationController end def destroy_all - @todos.each(&:done) + @todos.each(&:done!) respond_to do |format| format.html { redirect_to dashboard_todos_path, notice: 'All todos were marked as done.' } diff --git a/app/controllers/emojis_controller.rb b/app/controllers/emojis_controller.rb new file mode 100644 index 00000000000..1bec5a7d27f --- /dev/null +++ b/app/controllers/emojis_controller.rb @@ -0,0 +1,6 @@ +class EmojisController < ApplicationController + layout false + + def index + end +end diff --git a/app/models/todo.rb b/app/models/todo.rb index 34d71c1b0d3..5f91991f781 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -36,7 +36,7 @@ class Todo < ActiveRecord::Base state_machine :state, initial: :pending do event :done do - transition pending: :done + transition [:pending, :done] => :done end state :pending diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index dbc8eda6196..1136afbf29c 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -1,6 +1,6 @@ - page_title "Sign in" %div - - if signin_enabled? || ldap_enabled? + - if signin_enabled? || ldap_enabled? || crowd_enabled? = render 'devise/shared/signin_box' -# Omniauth fits between signin/ldap signin and signup and does not have a surrounding box diff --git a/app/views/emojis/index.html.haml b/app/views/emojis/index.html.haml new file mode 100644 index 00000000000..b66e513e4d2 --- /dev/null +++ b/app/views/emojis/index.html.haml @@ -0,0 +1,9 @@ +.emoji-menu + .emoji-menu-content + = text_field_tag :emoji_search, "", class: "emoji-search search-input form-control" + - AwardEmoji.emoji_by_category.each do |category, emojis| + %h5= AwardEmoji::CATEGORIES[category] + %ul + - emojis.each do |emoji| + %li + = emoji_icon(emoji["name"], emoji["unicode"], emoji["aliases"])
\ No newline at end of file diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 9c16ab7e30f..209729dc7ee 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -1,11 +1,12 @@ .top-area .nav-controls = form_tag request.original_url, method: :get, class: 'project-filter-form', id: 'project-filter-form' do |f| - = search_field_tag :filter_projects, params[:filter_projects], placeholder: 'Filter by name...', class: 'input-short project-filter-form-field form-control projects-list-filter', spellcheck: false, id: 'project-filter-form-field' - - if current_user && current_user.can_create_project? - = link_to new_project_path, class: 'btn btn-new' do - = icon('plus') - New Project + - if @projects.present? + = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control', spellcheck: false + - if can? current_user, :create_projects, @group + = link_to new_project_path(namespace_id: @group.id), class: 'btn btn-new pull-right' do + = icon('plus') + New Project .projects-list-holder = render 'shared/projects/list', projects: @projects, projects_limit: 20, stars: false, skip_namespace: true diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index a0ba11b11a1..6148d8cb3d2 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -32,10 +32,9 @@ %li.active = link_to "#activity", 'data-toggle' => 'tab' do Activity - - if @projects.present? - %li - = link_to "#projects", 'data-toggle' => 'tab' do - Projects + %li + = link_to "#projects", 'data-toggle' => 'tab' do + Projects - if can?(current_user, :read_group, @group) %div{ class: container_class } diff --git a/app/views/help/_shortcuts.html.haml b/app/views/help/_shortcuts.html.haml index 8e982718d23..82d2d4aabed 100644 --- a/app/views/help/_shortcuts.html.haml +++ b/app/views/help/_shortcuts.html.haml @@ -229,6 +229,10 @@ %td.shortcut .key r %td Reply (quoting selected text) + %tr + %td.shortcut + .key e + %td Edit issue %tbody{ class: 'hidden-shortcut merge_requests', style: 'display:none' } %tr %th @@ -245,3 +249,7 @@ %td.shortcut .key r %td Reply (quoting selected text) + %tr + %td.shortcut + .key e + %td Edit merge request diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml index 0436c2213da..86f35823406 100644 --- a/app/views/profiles/applications.html.haml +++ b/app/views/profiles/applications.html.haml @@ -1,7 +1,7 @@ - page_title "Applications" - header_title page_title, applications_profile_path -.gray-content-block.top-block +.alert.alert-help.prepend-top-default - if user_oauth_applications? Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account. diff --git a/app/views/profiles/audit_log.html.haml b/app/views/profiles/audit_log.html.haml index 8fdba45b193..8f45f41cfe3 100644 --- a/app/views/profiles/audit_log.html.haml +++ b/app/views/profiles/audit_log.html.haml @@ -1,7 +1,7 @@ - page_title "Audit Log" - header_title page_title, audit_log_profile_path -.gray-content-block.top-block +.alert.alert-help.prepend-top-default History of authentications .prepend-top-default diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml index 1d140347a5f..705e1804717 100644 --- a/app/views/profiles/emails/index.html.haml +++ b/app/views/profiles/emails/index.html.haml @@ -1,24 +1,22 @@ - page_title "Emails" - header_title page_title, profile_emails_path -.gray-content-block.top-block - Control emails linked to your account - -%ul.prepend-top-default - %li - Your - %b Primary Email - will be used for avatar detection and web based operations, such as edits and merges. - %li - Your - %b Notification Email - will be used for account notifications. - %li - Your - %b Public Email - will be displayed on your public profile. - %li - All email addresses will be used to identify your commits. +.alert.alert-help.prepend-top-default + %ul + %li + Your + %b Primary Email + will be used for avatar detection and web based operations, such as edits and merges. + %li + Your + %b Notification Email + will be used for account notifications. + %li + Your + %b Public Email + will be displayed on your public profile. + %li + All email addresses will be used to identify your commits. .panel.panel-default .panel-heading diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index 17a4195030e..c9a6a93f545 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -1,14 +1,14 @@ - page_title "SSH Keys" - header_title page_title, profile_keys_path -.gray-content-block.top-block - .pull-right +.top-area + .nav-text + Before you can add an SSH key you need to + = link_to "generate it.", help_page_path("ssh", "README") + .nav-controls = link_to new_profile_key_path, class: "btn btn-new" do = icon('plus') Add SSH Key - .oneline - Before you can add an SSH key you need to - = link_to "generate it.", help_page_path("ssh", "README") .prepend-top-default = render 'key_table' diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index 0bcadc965fa..d5f61d9f0ca 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -1,9 +1,6 @@ - page_title "Notifications" - header_title page_title, profile_notifications_path -.gray-content-block.top-block - These are your global notification settings. - .prepend-top-default = form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications form-horizontal global-notifications-form' } do |f| -if @user.errors.any? diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml index fab7c45c9b2..ab070c09beb 100644 --- a/app/views/profiles/passwords/edit.html.haml +++ b/app/views/profiles/passwords/edit.html.haml @@ -1,7 +1,7 @@ - page_title "Password" - header_title page_title, edit_profile_password_path -.gray-content-block.top-block +.alert.alert-help.prepend-top-default - if @user.password_automatically_set? Set your password. - else diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index 877589dc390..1a53b4393e4 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -1,8 +1,7 @@ - page_title 'Preferences' - header_title page_title, profile_preferences_path -- @blank_container = true -.alert.alert-help +.alert.alert-help.prepend-top-default These settings allow you to customize the appearance and behavior of the site. They are saved with your account and will persist to any device you use to access the site. diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index add9a00138b..5051c6bf83b 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -1,4 +1,4 @@ -.gray-content-block.top-block +.alert.alert-help.prepend-top-default This information will appear on your profile. - if current_user.ldap_user? Some options are unavailable for LDAP accounts diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 042f660077e..f2e56081afe 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -1,5 +1,3 @@ -- @blank_container = true - .project-edit-container.prepend-top-default .project-edit-errors .project-edit-content diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index 673020a4e30..eb9c225df2f 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -1,7 +1,7 @@ - content_for :note_actions do - if can?(current_user, :update_issue, @issue) - = link_to 'Reopen Issue', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen Issue' - = link_to 'Close Issue', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close Issue' + = link_to 'Reopen issue', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue' + = link_to 'Close issue', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close issue' #notes = render 'projects/notes/notes_with_form' diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 69a0e2a0c4d..1173e0a78c7 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -8,12 +8,12 @@ .detail-page-header .pull-right - if can?(current_user, :create_issue, @project) - = link_to new_namespace_project_issue_path(@project.namespace, @project), class: 'btn btn-nr btn-grouped new-issue-link btn-success', title: 'New Issue', id: 'new_issue_link' do + = link_to new_namespace_project_issue_path(@project.namespace, @project), class: 'btn btn-nr btn-grouped new-issue-link btn-success', title: 'New issue', id: 'new_issue_link' do = icon('plus') - New Issue + New issue - if can?(current_user, :update_issue, @issue) - = link_to 'Reopen', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen Issue' - = link_to 'Close', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-close #{issue_button_visibility(@issue, true)}", title: 'Close Issue' + = link_to 'Reopen issue', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue' + = link_to 'Close issue', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true}, class: "btn btn-nr btn-grouped btn-close #{issue_button_visibility(@issue, true)}", title: 'Close issue' = link_to edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: 'btn btn-nr btn-grouped issuable-edit' do = icon('pencil-square-o') diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml index 29bf5d62abe..2b91b7e8f65 100644 --- a/app/views/projects/wikis/_main_links.html.haml +++ b/app/views/projects/wikis/_main_links.html.haml @@ -1,12 +1,11 @@ -%span.pull-right - - if (@page && @page.persisted?) - = link_to namespace_project_wiki_history_path(@project.namespace, @project, @page), class: "btn btn-grouped" do - Page History - - if can?(current_user, :create_wiki, @project) - = link_to namespace_project_wiki_edit_path(@project.namespace, @project, @page), class: "btn btn-grouped" do - %i.fa.fa-pencil-square-o - Edit - - if can?(current_user, :admin_wiki, @project) - = link_to namespace_project_wiki_path(@project.namespace, @project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-remove" do - = icon('trash') - Delete +- if (@page && @page.persisted?) + = link_to namespace_project_wiki_history_path(@project.namespace, @project, @page), class: "btn btn-grouped" do + Page History + - if can?(current_user, :create_wiki, @project) + = link_to namespace_project_wiki_edit_path(@project.namespace, @project, @page), class: "btn btn-grouped" do + %i.fa.fa-pencil-square-o + Edit + - if can?(current_user, :admin_wiki, @project) + = link_to namespace_project_wiki_path(@project.namespace, @project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-remove" do + = icon('trash') + Delete diff --git a/app/views/projects/wikis/_nav.html.haml b/app/views/projects/wikis/_nav.html.haml index 56a53ffff2a..a722fbc5352 100644 --- a/app/views/projects/wikis/_nav.html.haml +++ b/app/views/projects/wikis/_nav.html.haml @@ -16,4 +16,4 @@ = icon('plus') New Page - = render 'projects/wikis/new' += render 'projects/wikis/new' diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml index 53b37b1104e..919daf0a7b2 100644 --- a/app/views/projects/wikis/_new.html.haml +++ b/app/views/projects/wikis/_new.html.haml @@ -5,9 +5,10 @@ %a.close{href: "#", "data-dismiss" => "modal"} × %h3.page-title New Wiki Page .modal-body - .form-group - = label_tag :new_wiki_path do - %span Page slug - = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project) - .form-actions - = link_to 'Create Page', '#', class: 'build-new-wiki btn btn-create' + %form.new-wiki-page + .form-group + = label_tag :new_wiki_path do + %span Page slug + = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project), autofocus: true + .form-actions + = button_tag 'Create Page', class: 'build-new-wiki btn btn-create' diff --git a/app/views/projects/wikis/edit.html.haml b/app/views/projects/wikis/edit.html.haml index 23f64fbbd10..4dd818c7f67 100644 --- a/app/views/projects/wikis/edit.html.haml +++ b/app/views/projects/wikis/edit.html.haml @@ -1,16 +1,20 @@ - page_title "Edit", @page.title.capitalize, "Wiki" = render "header_title" - = render 'nav' -.gray-content-block - .pull-right + +.top-area + .nav-text + %strong + - if @page.persisted? + = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) + - else + = @page.title.capitalize + %span.light + · + Edit Page + + .nav-controls = render 'main_links' - %h3.page-title.oneline - %span.light Edit Page - - if @page.persisted? - = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) - - else - = @page.title = render 'form' diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index 4322146ce34..dcaddae2b04 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -1,11 +1,14 @@ - page_title "History", @page.title.capitalize, "Wiki" = render "header_title" - = render 'nav' -.gray-content-block - %h3.page-title - %span.light History for - = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) + +.top-area + .nav-text + %strong + = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) + %span.light + · + History .table-holder %table.table diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index aae1ad69ad9..92b494a513c 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -2,15 +2,12 @@ = render "header_title" = render 'nav' -.gray-content-block - All pages in this wiki are listed below. - + %ul.content-list - @wiki_pages.each do |wiki_page| %li - %h4 - = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) - %small (#{wiki_page.format}) - .pull-right - %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} + = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) + %small (#{wiki_page.format}) + .pull-right + %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} = paginate @wiki_pages, theme: 'gitlab' diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index 309d40f52bc..067fb7f8f54 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -1,17 +1,18 @@ - page_title @page.title.capitalize, "Wiki" = render "header_title" - = render 'nav' -.gray-content-block - = render 'main_links' - %h3.page-title.oneline - = @page.title.capitalize +.top-area + .nav-text + %strong= @page.title.capitalize %span.wiki-last-edit-by · last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} + .nav-controls + = render 'main_links' + - if @page.historical? .warning_message This is an old version of this page. diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 3bfd781e51d..d109635fa1e 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -35,35 +35,37 @@ = @user.name .cover-desc - %span - @#{@user.username}. - - if @user.bio.present? - %span - #{@user.bio}. - %span + %span.middle-dot-divider + @#{@user.username} + %span.middle-dot-divider Member since #{@user.created_at.to_s(:medium)} + + - if @user.bio.present? + .cover-desc + %p.profile-user-bio + = @user.bio .cover-desc - unless @user.public_email.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to @user.public_email, "mailto:#{@user.public_email}" - unless @user.skype.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to "skype:#{@user.skype}", title: "Skype" do = icon('skype') - unless @user.linkedin.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to "https://www.linkedin.com/in/#{@user.linkedin}", title: "LinkedIn" do = icon('linkedin-square') - unless @user.twitter.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to "https://twitter.com/#{@user.twitter}", title: "Twitter" do = icon('twitter-square') - unless @user.website_url.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = link_to @user.short_website_url, @user.full_website_url - unless @user.location.blank? - .profile-link-holder + .profile-link-holder.middle-dot-divider = icon('map-marker') = @user.location diff --git a/app/views/votes/_votes_block.html.haml b/app/views/votes/_votes_block.html.haml index 91c5b7eac5e..176fd29cb57 100644 --- a/app/views/votes/_votes_block.html.haml +++ b/app/views/votes/_votes_block.html.haml @@ -9,15 +9,6 @@ .awards-controls %a.add-award{"href" => "#"} = icon('smile-o') - .emoji-menu - .emoji-menu-content - = text_field_tag :emoji_search, "", class: "emoji-search search-input form-control" - - AwardEmoji.emoji_by_category.each do |category, emojis| - %h5= AwardEmoji::CATEGORIES[category] - %ul - - emojis.each do |emoji| - %li - = emoji_icon(emoji["name"], emoji["unicode"], emoji["aliases"]) - if current_user :javascript diff --git a/config/newrelic.yml b/config/newrelic.yml new file mode 100644 index 00000000000..9ef922a38d9 --- /dev/null +++ b/config/newrelic.yml @@ -0,0 +1,16 @@ +# New Relic configuration file +# +# This file is here to make sure the New Relic gem stays +# quiet by default. +# +# To enable and configure New Relic, please use +# environment variables, e.g. NEW_RELIC_ENABLED=true + +production: + enabled: false + +development: + enabled: false + +test: + enabled: false diff --git a/config/routes.rb b/config/routes.rb index 30681356c5f..1485b64da19 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -43,6 +43,8 @@ Rails.application.routes.draw do get '/autocomplete/users' => 'autocomplete#users' get '/autocomplete/users/:id' => 'autocomplete#user' + # Emojis + resources :emojis, only: :index # Search get 'search' => 'search#show' diff --git a/doc/install/installation.md b/doc/install/installation.md index 2a5b99609e4..c1787a7c6a8 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -265,8 +265,9 @@ sudo usermod -aG redis git # Create the public/uploads/ directory sudo -u git -H mkdir public/uploads/ - # Make sure GitLab can write to the public/uploads/ directory - sudo chmod -R u+rwX public/uploads + # Make sure only the GitLab user has access to the public/uploads/ directory + # now that files in public/uploads are served by gitlab-workhorse + sudo chmod 0700 public/uploads # Change the permissions of the directory where CI build traces are stored sudo chmod -R u+rwX builds/ diff --git a/doc/workflow/shortcuts.png b/doc/workflow/shortcuts.png Binary files differindex e5914aa8e67..83e562d6929 100644 --- a/doc/workflow/shortcuts.png +++ b/doc/workflow/shortcuts.png diff --git a/features/dashboard/event_filters.feature b/features/dashboard/event_filters.feature index 96399ea21a6..8c3ff64164f 100644 --- a/features/dashboard/event_filters.feature +++ b/features/dashboard/event_filters.feature @@ -43,10 +43,16 @@ Feature: Event Filters And I should not see new member event When I click "team" event filter And I visit dashboard activity page - Then I should see push event + Then I should not see push event And I should see new member event And I should not see merge request event When I click "push" event filter - Then I should not see push event - And I should see new member event + And I visit dashboard activity page + Then I should see push event + And I should not see new member event And I should not see merge request event + When I click "merge" event filter + And I visit dashboard activity page + Then I should see merge request event + And I should not see push event + And I should not see new member event diff --git a/features/login_form.feature b/features/login_form.feature index b4d95754482..7965882f7fc 100644 --- a/features/login_form.feature +++ b/features/login_form.feature @@ -1,5 +1,11 @@ Feature: Login form - Scenario: I see crowd form + Scenario: I see Crowd form Given Crowd integration enabled When I visit sign in page - Then I should see Crowd login form
\ No newline at end of file + Then I should see Crowd login form + + Scenario: I see Crowd form when sign-in is disabled + Given Crowd integration enabled + And Sign-in is disabled + When I visit sign in page + Then I should see Crowd login form diff --git a/features/steps/login_form.rb b/features/steps/login_form.rb index b9ff6ae67fd..90ab10e6229 100644 --- a/features/steps/login_form.rb +++ b/features/steps/login_form.rb @@ -5,18 +5,18 @@ class Spinach::Features::LoginForm < Spinach::FeatureSteps include SharedUser include SharedSearch + step 'Sign-in is disabled' do + allow_any_instance_of(ApplicationHelper).to receive(:signin_enabled?).and_return(false) + end + step 'Crowd integration enabled' do - @providers_orig = Gitlab::OAuth::Provider.providers - @omniauth_conf_orig = Gitlab.config.omniauth.enabled expect(Gitlab::OAuth::Provider).to receive(:providers).and_return([:crowd]) - allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_return(root_path) expect(Gitlab.config.omniauth).to receive(:enabled).and_return(true) + allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_return(root_path) end step 'I should see Crowd login form' do expect(page).to have_selector '#tab-crowd form' - Gitlab::OAuth::Provider.stub(:providers).and_return(@providers_orig) - Gitlab.config.omniauth.stub(:enabled).and_return(@omniauth_conf_orig) end step 'I visit sign in page' do diff --git a/features/steps/profile/profile.rb b/features/steps/profile/profile.rb index 0305f7e6da0..6b0c1049ece 100644 --- a/features/steps/profile/profile.rb +++ b/features/steps/profile/profile.rb @@ -97,7 +97,7 @@ class Spinach::Features::Profile < Spinach::FeatureSteps end step "I should see a password error message" do - page.within '.alert' do + page.within '.alert-danger' do expect(page).to have_content "Password confirmation doesn't match" end end diff --git a/features/steps/project/issues/award_emoji.rb b/features/steps/project/issues/award_emoji.rb index 93cf608cc62..277c63914d1 100644 --- a/features/steps/project/issues/award_emoji.rb +++ b/features/steps/project/issues/award_emoji.rb @@ -96,6 +96,7 @@ class Spinach::Features::AwardEmoji < Spinach::FeatureSteps end step 'The search field is focused' do - page.evaluate_script("document.activeElement.id").should eq "emoji_search" + expect(page).to have_selector('#emoji_search') + expect(page.evaluate_script('document.activeElement.id')).to eq('emoji_search') end end diff --git a/features/steps/project/source/markdown_render.rb b/features/steps/project/source/markdown_render.rb index 3a4f7a6e01c..2134dae168a 100644 --- a/features/steps/project/source/markdown_render.rb +++ b/features/steps/project/source/markdown_render.rb @@ -238,7 +238,11 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps step 'I see new wiki page named test' do expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "test") - expect(page).to have_content "Edit Page test" + + page.within(:css, ".nav-text") do + expect(page).to have_content "Test" + expect(page).to have_content "Edit Page" + end end When 'I go back to wiki page home' do @@ -252,7 +256,11 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps step 'I see Gitlab API document' do expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "api") - expect(page).to have_content "Edit Page api" + + page.within(:css, ".nav-text") do + expect(page).to have_content "Edit" + expect(page).to have_content "Api" + end end step 'I click on Rake tasks link' do @@ -261,7 +269,11 @@ class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps step 'I see Rake tasks directory' do expect(current_path).to eq namespace_project_wiki_path(@project.namespace, @project, "raketasks") - expect(page).to have_content "Edit Page raketasks" + + page.within(:css, ".nav-text") do + expect(page).to have_content "Edit" + expect(page).to have_content "Rake" + end end step 'I go directory which contains README file' do diff --git a/features/steps/project/wiki.rb b/features/steps/project/wiki.rb index 2a735afbe7b..223b7277b51 100644 --- a/features/steps/project/wiki.rb +++ b/features/steps/project/wiki.rb @@ -120,7 +120,7 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps step 'I should see the new wiki page form' do expect(current_path).to match('wikis/image.jpg') expect(page).to have_content('New Wiki Page') - expect(page).to have_content('Edit Page image.jpg') + expect(page).to have_content('Edit Page') end step 'I create a New page with paths' do @@ -159,7 +159,9 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps end step 'I should see the page history' do - expect(page).to have_content('History for') + page.within(:css, ".nav-text") do + expect(page).to have_content('History') + end end step 'I search for Wiki content' do diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake index 81099cb8ba9..d59872dc3a2 100644 --- a/lib/tasks/gitlab/check.rake +++ b/lib/tasks/gitlab/check.rake @@ -266,7 +266,7 @@ namespace :gitlab do unless File.directory?(Rails.root.join('public/uploads')) puts "no".red try_fixing_it( - "sudo -u #{gitlab_user} mkdir -m 750 #{Rails.root}/public/uploads" + "sudo -u #{gitlab_user} mkdir #{Rails.root}/public/uploads" ) for_more_information( see_installation_guide_section "GitLab" @@ -278,21 +278,22 @@ namespace :gitlab do upload_path = File.realpath(Rails.root.join('public/uploads')) upload_path_tmp = File.join(upload_path, 'tmp') - if File.stat(upload_path).mode == 040750 + if File.stat(upload_path).mode == 040700 unless Dir.exists?(upload_path_tmp) puts 'skipped (no tmp uploads folder yet)'.magenta return end - # if tmp upload dir has incorrect permissions, assume others do as well - if File.stat(upload_path_tmp).mode == 040755 && File.owned?(upload_path_tmp) # verify drwxr-xr-x permissions + # If tmp upload dir has incorrect permissions, assume others do as well + # Verify drwx------ permissions + if File.stat(upload_path_tmp).mode == 040700 && File.owned?(upload_path_tmp) puts "yes".green else puts "no".red try_fixing_it( "sudo chown -R #{gitlab_user} #{upload_path}", "sudo find #{upload_path} -type f -exec chmod 0644 {} \\;", - "sudo find #{upload_path} -type d -not -path #{upload_path} -exec chmod 0755 {} \\;" + "sudo find #{upload_path} -type d -not -path #{upload_path} -exec chmod 0700 {} \\;" ) for_more_information( see_installation_guide_section "GitLab" @@ -302,7 +303,7 @@ namespace :gitlab do else puts "no".red try_fixing_it( - "sudo chmod 0750 #{upload_path}", + "sudo find #{upload_path} -type d -not -path #{upload_path} -exec chmod 0700 {} \\;" ) for_more_information( see_installation_guide_section "GitLab" diff --git a/scripts/notify_slack.sh b/scripts/notify_slack.sh new file mode 100755 index 00000000000..0a4239e132c --- /dev/null +++ b/scripts/notify_slack.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# Sends Slack notification ERROR_MSG to CHANNEL +# An env. variable CI_SLACK_WEBHOOK_URL needs to be set. + +CHANNEL=$1 +ERROR_MSG=$2 + +if [ -z "$CHANNEL" ] || [ -z "$ERROR_MSG" ] || [ -z "$CI_SLACK_WEBHOOK_URL" ]; then + echo "Missing argument(s) - Use: $0 channel message" + echo "and set CI_SLACK_WEBHOOK_URL environment variable." +else + curl -X POST --data-urlencode 'payload={"channel": "'"$CHANNEL"'", "username": "gitlab-ci", "text": "'"$ERROR_MSG"'", "icon_emoji": ":gitlab:"}' "$CI_SLACK_WEBHOOK_URL" +fi
\ No newline at end of file diff --git a/spec/models/todo_spec.rb.rb b/spec/models/todo_spec.rb index ac481bf9fbd..fe9ea7e7d1e 100644 --- a/spec/models/todo_spec.rb.rb +++ b/spec/models/todo_spec.rb @@ -37,20 +37,6 @@ describe Todo, models: true do it { is_expected.to validate_presence_of(:user) } end - describe '#action_name' do - it 'returns proper message when action is an assigment' do - subject.action = Todo::ASSIGNED - - expect(subject.action_name).to eq 'assigned' - end - - it 'returns proper message when action is a mention' do - subject.action = Todo::MENTIONED - - expect(subject.action_name).to eq 'mentioned you on' - end - end - describe '#body' do before do subject.target = build(:issue, title: 'Bugfix') @@ -69,21 +55,15 @@ describe Todo, models: true do end end - describe '#target_iid' do - let(:issue) { build(:issue, id: 1, iid: 5) } - - before do - subject.target = issue - end - - it 'returns target.iid when target respond to iid' do - expect(subject.target_iid).to eq 5 + describe '#done!' do + it 'changes state to done' do + todo = create(:todo, state: :pending) + expect { todo.done! }.to change(todo, :state).from('pending').to('done') end - it 'returns target_id when target does not respond to iid' do - allow(issue).to receive(:respond_to?).with(:iid).and_return(false) - - expect(subject.target_iid).to eq 1 + it 'does not raise error when is already done' do + todo = create(:todo, state: :done) + expect { todo.done! }.not_to raise_error end end end |