Commit 135ead1d authored by Filipa Lacerda's avatar Filipa Lacerda

Merge branch 'master' into 48237-toggle-file-comments

* master: (38 commits)
  Update bitbucket.md to fix typo and small grammar touchups.
  Update time_helper.rb to fix output for exact minutes.
  Document update for GitLab Pages users.
  Support manually stopping any environment from the UI
  Fix link to frontend in handbook
  Shorten CHANGELOG filename to avoid breaking ecryptfs users
  Replace 48976-rails5-invalid-single-table-inheritance-type-group-is-not-a-subclass-of-gitlab-backgroundmigration-fixcrossprojectlabellinks-namespace.yml
  Fix mountComponent helper path in docs
  Fix #48537 - Update avatar only via the projects API
  Add additional headline for Adding SSH keys to GitLab
  Request to be a proofreader.
  Fix specs
  Fix search bar text input alignment
  Fix API docs on unauthenticated projects return
  Adds with_projects optional parameter to /groups/:id API endpoint
  Docs: make it clear that you need a completely separate domain for Pages
  Document that we don't want to wait in tests
  Removes unused store in diffs mr refactor Removes double export for actions in diffs module in mr refactor
  Remove useless return
  Use latest gitlab-styles
  ...
parents ac71675d f3edbafe
...@@ -327,7 +327,7 @@ cloud-native-image: ...@@ -327,7 +327,7 @@ cloud-native-image:
cache: {} cache: {}
script: script:
- gem install gitlab --no-ri --no-rdoc - gem install gitlab --no-ri --no-rdoc
- ./trigger-build cng - ./scripts/trigger-build cng
only: only:
- tags@gitlab-org/gitlab-ce - tags@gitlab-org/gitlab-ce
- tags@gitlab-org/gitlab-ee - tags@gitlab-org/gitlab-ee
......
...@@ -199,12 +199,6 @@ Naming/HeredocDelimiterCase: ...@@ -199,12 +199,6 @@ Naming/HeredocDelimiterCase:
Naming/HeredocDelimiterNaming: Naming/HeredocDelimiterNaming:
Enabled: false Enabled: false
# Offense count: 27
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect.
Performance/HashEachMethods:
Enabled: false
# Offense count: 1 # Offense count: 1
Performance/UnfreezeString: Performance/UnfreezeString:
Exclude: Exclude:
......
...@@ -104,7 +104,7 @@ gem 'hashie-forbidden_attributes' ...@@ -104,7 +104,7 @@ gem 'hashie-forbidden_attributes'
gem 'kaminari', '~> 1.0' gem 'kaminari', '~> 1.0'
# HAML # HAML
gem 'hamlit', '~> 2.6.1' gem 'hamlit', '~> 2.8.8'
# Files attachments # Files attachments
gem 'carrierwave', '~> 1.2' gem 'carrierwave', '~> 1.2'
...@@ -351,9 +351,9 @@ group :development, :test do ...@@ -351,9 +351,9 @@ group :development, :test do
gem 'spring', '~> 2.0.0' gem 'spring', '~> 2.0.0'
gem 'spring-commands-rspec', '~> 1.0.4' gem 'spring-commands-rspec', '~> 1.0.4'
gem 'gitlab-styles', '~> 2.3', require: false gem 'gitlab-styles', '~> 2.4', require: false
# Pin these dependencies, otherwise a new rule could break the CI pipelines # Pin these dependencies, otherwise a new rule could break the CI pipelines
gem 'rubocop', '~> 0.52.1' gem 'rubocop', '~> 0.54.0'
gem 'rubocop-rspec', '~> 1.22.1' gem 'rubocop-rspec', '~> 1.22.1'
gem 'scss_lint', '~> 0.56.0', require: false gem 'scss_lint', '~> 0.56.0', require: false
......
...@@ -312,8 +312,8 @@ GEM ...@@ -312,8 +312,8 @@ GEM
mime-types (>= 1.16) mime-types (>= 1.16)
posix-spawn (~> 0.3) posix-spawn (~> 0.3)
gitlab-markup (1.6.4) gitlab-markup (1.6.4)
gitlab-styles (2.3.2) gitlab-styles (2.4.1)
rubocop (~> 0.51) rubocop (~> 0.54.0)
rubocop-gitlab-security (~> 0.1.0) rubocop-gitlab-security (~> 0.1.0)
rubocop-rspec (~> 1.19) rubocop-rspec (~> 1.19)
gitlab_omniauth-ldap (2.0.4) gitlab_omniauth-ldap (2.0.4)
...@@ -381,8 +381,8 @@ GEM ...@@ -381,8 +381,8 @@ GEM
rake (>= 10, < 13) rake (>= 10, < 13)
rubocop (>= 0.49.0) rubocop (>= 0.49.0)
sysexits (~> 1.1) sysexits (~> 1.1)
hamlit (2.6.1) hamlit (2.8.8)
temple (~> 0.7.6) temple (>= 0.8.0)
thor thor
tilt tilt
hashdiff (0.3.4) hashdiff (0.3.4)
...@@ -776,16 +776,16 @@ GEM ...@@ -776,16 +776,16 @@ GEM
pg pg
rails rails
sqlite3 sqlite3
rubocop (0.52.1) rubocop (0.54.0)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 2.4.0.2, < 3.0) parser (>= 2.5)
powerpack (~> 0.1) powerpack (~> 0.1)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1) unicode-display_width (~> 1.0, >= 1.0.1)
rubocop-gitlab-security (0.1.1) rubocop-gitlab-security (0.1.1)
rubocop (>= 0.51) rubocop (>= 0.51)
rubocop-rspec (1.22.1) rubocop-rspec (1.22.2)
rubocop (>= 0.52.1) rubocop (>= 0.52.1)
ruby-enum (0.7.2) ruby-enum (0.7.2)
i18n i18n
...@@ -889,7 +889,7 @@ GEM ...@@ -889,7 +889,7 @@ GEM
sys-filesystem (1.1.6) sys-filesystem (1.1.6)
ffi ffi
sysexits (1.2.0) sysexits (1.2.0)
temple (0.7.7) temple (0.8.0)
test-prof (0.2.5) test-prof (0.2.5)
test_after_commit (1.1.0) test_after_commit (1.1.0)
activerecord (>= 3.2) activerecord (>= 3.2)
...@@ -900,7 +900,7 @@ GEM ...@@ -900,7 +900,7 @@ GEM
rack (>= 1, < 3) rack (>= 1, < 3)
thor (0.19.4) thor (0.19.4)
thread_safe (0.3.6) thread_safe (0.3.6)
tilt (2.0.6) tilt (2.0.8)
timecop (0.8.1) timecop (0.8.1)
timfel-krb5-auth (0.8.3) timfel-krb5-auth (0.8.3)
toml (0.1.2) toml (0.1.2)
...@@ -1043,7 +1043,7 @@ DEPENDENCIES ...@@ -1043,7 +1043,7 @@ DEPENDENCIES
gitlab-gollum-lib (~> 4.2) gitlab-gollum-lib (~> 4.2)
gitlab-gollum-rugged_adapter (~> 0.4.4) gitlab-gollum-rugged_adapter (~> 0.4.4)
gitlab-markup (~> 1.6.4) gitlab-markup (~> 1.6.4)
gitlab-styles (~> 2.3) gitlab-styles (~> 2.4)
gitlab_omniauth-ldap (~> 2.0.4) gitlab_omniauth-ldap (~> 2.0.4)
gon (~> 6.2) gon (~> 6.2)
google-api-client (~> 0.19.8) google-api-client (~> 0.19.8)
...@@ -1057,7 +1057,7 @@ DEPENDENCIES ...@@ -1057,7 +1057,7 @@ DEPENDENCIES
graphql (~> 1.8.0) graphql (~> 1.8.0)
grpc (~> 1.11.0) grpc (~> 1.11.0)
haml_lint (~> 0.26.0) haml_lint (~> 0.26.0)
hamlit (~> 2.6.1) hamlit (~> 2.8.8)
hashie-forbidden_attributes hashie-forbidden_attributes
health_check (~> 2.6.0) health_check (~> 2.6.0)
hipchat (~> 1.5.0) hipchat (~> 1.5.0)
...@@ -1143,7 +1143,7 @@ DEPENDENCIES ...@@ -1143,7 +1143,7 @@ DEPENDENCIES
rspec-retry (~> 0.4.5) rspec-retry (~> 0.4.5)
rspec-set (~> 0.1.3) rspec-set (~> 0.1.3)
rspec_profiling (~> 0.0.5) rspec_profiling (~> 0.0.5)
rubocop (~> 0.52.1) rubocop (~> 0.54.0)
rubocop-rspec (~> 1.22.1) rubocop-rspec (~> 1.22.1)
ruby-fogbugz (~> 0.2.1) ruby-fogbugz (~> 0.2.1)
ruby-prof (~> 0.17.0) ruby-prof (~> 0.17.0)
......
...@@ -79,7 +79,7 @@ GEM ...@@ -79,7 +79,7 @@ GEM
babosa (1.0.2) babosa (1.0.2)
base32 (0.3.2) base32 (0.3.2)
batch-loader (1.2.1) batch-loader (1.2.1)
bcrypt (3.1.11) bcrypt (3.1.12)
bcrypt_pbkdf (1.0.0) bcrypt_pbkdf (1.0.0)
benchmark-ips (2.3.0) benchmark-ips (2.3.0)
better_errors (2.1.1) better_errors (2.1.1)
...@@ -111,7 +111,7 @@ GEM ...@@ -111,7 +111,7 @@ GEM
capybara-screenshot (1.0.14) capybara-screenshot (1.0.14)
capybara (>= 1.0, < 3) capybara (>= 1.0, < 3)
launchy launchy
carrierwave (1.2.1) carrierwave (1.2.3)
activemodel (>= 4.0.0) activemodel (>= 4.0.0)
activesupport (>= 4.0.0) activesupport (>= 4.0.0)
mime-types (>= 1.16) mime-types (>= 1.16)
...@@ -315,8 +315,8 @@ GEM ...@@ -315,8 +315,8 @@ GEM
mime-types (>= 1.16) mime-types (>= 1.16)
posix-spawn (~> 0.3) posix-spawn (~> 0.3)
gitlab-markup (1.6.4) gitlab-markup (1.6.4)
gitlab-styles (2.3.2) gitlab-styles (2.4.1)
rubocop (~> 0.51) rubocop (~> 0.54.0)
rubocop-gitlab-security (~> 0.1.0) rubocop-gitlab-security (~> 0.1.0)
rubocop-rspec (~> 1.19) rubocop-rspec (~> 1.19)
gitlab_omniauth-ldap (2.0.4) gitlab_omniauth-ldap (2.0.4)
...@@ -384,8 +384,8 @@ GEM ...@@ -384,8 +384,8 @@ GEM
rake (>= 10, < 13) rake (>= 10, < 13)
rubocop (>= 0.49.0) rubocop (>= 0.49.0)
sysexits (~> 1.1) sysexits (~> 1.1)
hamlit (2.6.1) hamlit (2.8.8)
temple (~> 0.7.6) temple (>= 0.8.0)
thor thor
tilt tilt
hashdiff (0.3.4) hashdiff (0.3.4)
...@@ -514,7 +514,7 @@ GEM ...@@ -514,7 +514,7 @@ GEM
net-ssh (5.0.1) net-ssh (5.0.1)
netrc (0.11.0) netrc (0.11.0)
nio4r (2.3.1) nio4r (2.3.1)
nokogiri (1.8.2) nokogiri (1.8.3)
mini_portile2 (~> 2.3.0) mini_portile2 (~> 2.3.0)
nokogumbo (1.5.0) nokogumbo (1.5.0)
nokogiri nokogiri
...@@ -785,16 +785,16 @@ GEM ...@@ -785,16 +785,16 @@ GEM
pg pg
rails rails
sqlite3 sqlite3
rubocop (0.52.1) rubocop (0.54.0)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 2.4.0.2, < 3.0) parser (>= 2.5)
powerpack (~> 0.1) powerpack (~> 0.1)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1) unicode-display_width (~> 1.0, >= 1.0.1)
rubocop-gitlab-security (0.1.1) rubocop-gitlab-security (0.1.1)
rubocop (>= 0.51) rubocop (>= 0.51)
rubocop-rspec (1.22.1) rubocop-rspec (1.22.2)
rubocop (>= 0.52.1) rubocop (>= 0.52.1)
ruby-enum (0.7.2) ruby-enum (0.7.2)
i18n i18n
...@@ -811,7 +811,7 @@ GEM ...@@ -811,7 +811,7 @@ GEM
rubyzip (1.2.1) rubyzip (1.2.1)
rufus-scheduler (3.4.0) rufus-scheduler (3.4.0)
et-orbi (~> 1.0) et-orbi (~> 1.0)
rugged (0.27.1) rugged (0.27.2)
safe_yaml (1.0.4) safe_yaml (1.0.4)
sanitize (4.6.5) sanitize (4.6.5)
crass (~> 1.0.2) crass (~> 1.0.2)
...@@ -877,7 +877,7 @@ GEM ...@@ -877,7 +877,7 @@ GEM
activesupport (>= 4.2) activesupport (>= 4.2)
spring-commands-rspec (1.0.4) spring-commands-rspec (1.0.4)
spring (>= 0.9.1) spring (>= 0.9.1)
sprockets (3.7.1) sprockets (3.7.2)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
rack (> 1, < 3) rack (> 1, < 3)
sprockets-rails (3.2.1) sprockets-rails (3.2.1)
...@@ -898,7 +898,7 @@ GEM ...@@ -898,7 +898,7 @@ GEM
sys-filesystem (1.1.6) sys-filesystem (1.1.6)
ffi ffi
sysexits (1.2.0) sysexits (1.2.0)
temple (0.7.7) temple (0.8.0)
test-prof (0.2.5) test-prof (0.2.5)
text (1.3.1) text (1.3.1)
thin (1.7.0) thin (1.7.0)
...@@ -1053,7 +1053,7 @@ DEPENDENCIES ...@@ -1053,7 +1053,7 @@ DEPENDENCIES
gitlab-gollum-lib (~> 4.2) gitlab-gollum-lib (~> 4.2)
gitlab-gollum-rugged_adapter (~> 0.4.4) gitlab-gollum-rugged_adapter (~> 0.4.4)
gitlab-markup (~> 1.6.4) gitlab-markup (~> 1.6.4)
gitlab-styles (~> 2.3) gitlab-styles (~> 2.4)
gitlab_omniauth-ldap (~> 2.0.4) gitlab_omniauth-ldap (~> 2.0.4)
gon (~> 6.2) gon (~> 6.2)
google-api-client (~> 0.19.8) google-api-client (~> 0.19.8)
...@@ -1067,7 +1067,7 @@ DEPENDENCIES ...@@ -1067,7 +1067,7 @@ DEPENDENCIES
graphql (~> 1.8.0) graphql (~> 1.8.0)
grpc (~> 1.11.0) grpc (~> 1.11.0)
haml_lint (~> 0.26.0) haml_lint (~> 0.26.0)
hamlit (~> 2.6.1) hamlit (~> 2.8.8)
hashie-forbidden_attributes hashie-forbidden_attributes
health_check (~> 2.6.0) health_check (~> 2.6.0)
hipchat (~> 1.5.0) hipchat (~> 1.5.0)
...@@ -1154,7 +1154,7 @@ DEPENDENCIES ...@@ -1154,7 +1154,7 @@ DEPENDENCIES
rspec-retry (~> 0.4.5) rspec-retry (~> 0.4.5)
rspec-set (~> 0.1.3) rspec-set (~> 0.1.3)
rspec_profiling (~> 0.0.5) rspec_profiling (~> 0.0.5)
rubocop (~> 0.52.1) rubocop (~> 0.54.0)
rubocop-rspec (~> 1.22.1) rubocop-rspec (~> 1.22.1)
ruby-fogbugz (~> 0.2.1) ruby-fogbugz (~> 0.2.1)
ruby-prof (~> 0.17.0) ruby-prof (~> 0.17.0)
......
# GitLab # GitLab
[![Build status](https://gitlab.com/gitlab-org/gitlab-ce/badges/master/build.svg)](https://gitlab.com/gitlab-org/gitlab-ce/commits/master)
[![Overall test coverage](https://gitlab.com/gitlab-org/gitlab-ce/badges/master/coverage.svg)](https://gitlab.com/gitlab-org/gitlab-ce/pipelines)
[![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.svg)](https://codeclimate.com/github/gitlabhq/gitlabhq)
[![Core Infrastructure Initiative Best Practices](https://bestpractices.coreinfrastructure.org/projects/42/badge)](https://bestpractices.coreinfrastructure.org/projects/42)
[![Gitter](https://badges.gitter.im/gitlabhq/gitlabhq.svg)](https://gitter.im/gitlabhq/gitlabhq?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
## Test coverage ## Test coverage
- [![Ruby coverage](https://gitlab.com/gitlab-org/gitlab-ce/badges/master/coverage.svg?job=coverage)](https://gitlab-org.gitlab.io/gitlab-ce/coverage-ruby) Ruby - [![Ruby coverage](https://gitlab.com/gitlab-org/gitlab-ce/badges/master/coverage.svg?job=coverage)](https://gitlab-org.gitlab.io/gitlab-ce/coverage-ruby) Ruby
......
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
# Add your own tasks in files placed in lib/tasks ending in .rake, # Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__) require File.expand_path('config/application', __dir__)
relative_url_conf = File.expand_path('../config/initializers/relative_url', __FILE__) relative_url_conf = File.expand_path('config/initializers/relative_url', __dir__)
require relative_url_conf if File.exist?("#{relative_url_conf}.rb") require relative_url_conf if File.exist?("#{relative_url_conf}.rb")
Gitlab::Application.load_tasks Gitlab::Application.load_tasks
......
...@@ -39,11 +39,6 @@ export default { ...@@ -39,11 +39,6 @@ export default {
required: false, required: false,
default: true, default: true,
}, },
discussionsExpanded: {
type: Boolean,
required: false,
default: true,
},
currentUser: { currentUser: {
type: Object, type: Object,
required: true, required: true,
...@@ -116,7 +111,7 @@ export default { ...@@ -116,7 +111,7 @@ export default {
}, },
methods: { methods: {
...mapActions('diffs', ['toggleFileDiscussions']), ...mapActions('diffs', ['toggleFileDiscussions']),
handleToggle(e, checkTarget) { handleToggleFile(e, checkTarget) {
if ( if (
!checkTarget || !checkTarget ||
e.target === this.$refs.header || e.target === this.$refs.header ||
...@@ -128,7 +123,7 @@ export default { ...@@ -128,7 +123,7 @@ export default {
showForkMessage() { showForkMessage() {
this.$emit('showForkMessage'); this.$emit('showForkMessage');
}, },
handleToggleDiscussions(){ handleToggleDiscussions() {
this.toggleFileDiscussions(this.diffFile); this.toggleFileDiscussions(this.diffFile);
}, },
}, },
...@@ -139,7 +134,7 @@ export default { ...@@ -139,7 +134,7 @@ export default {
<div <div
ref="header" ref="header"
class="js-file-title file-title file-title-flex-parent" class="js-file-title file-title file-title-flex-parent"
@click="handleToggle($event, true)" @click="handleToggleFile($event, true)"
> >
<div class="file-header-content"> <div class="file-header-content">
<icon <icon
...@@ -224,9 +219,9 @@ export default { ...@@ -224,9 +219,9 @@ export default {
<button <button
:class="{ active: hasExpandedDiscussions }" :class="{ active: hasExpandedDiscussions }"
:title="s__('MergeRequests|Toggle comments for this file')" :title="s__('MergeRequests|Toggle comments for this file')"
@click="handleToggleDiscussions" class="js-btn-vue-toggle-comments btn"
class="btn"
type="button" type="button"
@click="handleToggleDiscussions"
> >
<icon name="comment" /> <icon name="comment" />
</button> </button>
......
...@@ -112,15 +112,5 @@ export const toggleFileDiscussions = ({ getters, dispatch }, diff) => { ...@@ -112,15 +112,5 @@ export const toggleFileDiscussions = ({ getters, dispatch }, diff) => {
}); });
}; };
export default { // prevent babel-plugin-rewire from generating an invalid default during karma tests
setBaseConfig, export default () => {};
fetchDiffFiles,
setInlineDiffViewType,
setParallelDiffViewType,
showCommentForm,
cancelCommentForm,
loadMoreLines,
loadCollapsedDiff,
expandAllFiles,
toggleFileDiscussions,
};
...@@ -31,6 +31,20 @@ export const diffHasAllCollpasedDiscussions = (state, getters) => diff => { ...@@ -31,6 +31,20 @@ export const diffHasAllCollpasedDiscussions = (state, getters) => diff => {
return (discussions.length && discussions.every(discussion => !discussion.expanded)) || false; return (discussions.length && discussions.every(discussion => !discussion.expanded)) || false;
}; };
/**
* Checks if the diff has any open discussions
* @param {Object} diff
* @returns {Boolean}
*/
export const diffHasExpandedDiscussions = (state, getters) => diff => {
const discussions = getters.getDiffFileDiscussions(diff);
return (
(discussions.length && discussions.find(discussion => discussion.expanded) !== undefined) ||
false
);
};
/** /**
* Returns an array with the discussions of the given diff * Returns an array with the discussions of the given diff
* @param {Object} diff * @param {Object} diff
......
import Vue from 'vue';
import Vuex from 'vuex';
import diffsModule from './modules';
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
diffs: diffsModule,
},
});
import actions from '../actions'; import * as actions from '../actions';
import * as getters from '../getters'; import * as getters from '../getters';
import mutations from '../mutations'; import mutations from '../mutations';
import createState from './diff_state'; import createState from './diff_state';
......
...@@ -171,6 +171,8 @@ export default class DueDateSelectors { ...@@ -171,6 +171,8 @@ export default class DueDateSelectors {
initMilestoneDatePicker() { initMilestoneDatePicker() {
$('.datepicker').each(function initPikadayMilestone() { $('.datepicker').each(function initPikadayMilestone() {
const $datePicker = $(this); const $datePicker = $(this);
const datePickerVal = $datePicker.val();
const calendar = new Pikaday({ const calendar = new Pikaday({
field: $datePicker.get(0), field: $datePicker.get(0),
theme: 'gitlab-theme animate-picker', theme: 'gitlab-theme animate-picker',
...@@ -183,7 +185,7 @@ export default class DueDateSelectors { ...@@ -183,7 +185,7 @@ export default class DueDateSelectors {
}, },
}); });
calendar.setDate(parsePikadayDate($datePicker.val())); calendar.setDate(parsePikadayDate(datePickerVal));
$datePicker.data('pikaday', calendar); $datePicker.data('pikaday', calendar);
}); });
......
<script> <script>
import Icon from '~/vue_shared/components/icon.vue'; import Icon from '~/vue_shared/components/icon.vue';
import eventHub from '../event_hub'; import eventHub from '../event_hub';
import loadingIcon from '../../vue_shared/components/loading_icon.vue'; import loadingIcon from '../../vue_shared/components/loading_icon.vue';
import tooltip from '../../vue_shared/directives/tooltip'; import tooltip from '../../vue_shared/directives/tooltip';
export default { export default {
directives: { directives: {
tooltip, tooltip,
}, },
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
onClickAction(endpoint) { onClickAction(endpoint) {
this.isLoading = true; this.isLoading = true;
eventHub.$emit('postAction', endpoint); eventHub.$emit('postAction', { endpoint });
}, },
isActionDisabled(action) { isActionDisabled(action) {
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
return !action.playable; return !action.playable;
}, },
}, },
}; };
</script> </script>
<template> <template>
<div <div
...@@ -61,10 +61,7 @@ ...@@ -61,10 +61,7 @@
data-toggle="dropdown" data-toggle="dropdown"
> >
<span> <span>
<icon <icon name="play" />
:size="12"
name="play"
/>
<i <i
class="fa fa-caret-down" class="fa fa-caret-down"
aria-hidden="true" aria-hidden="true"
...@@ -85,10 +82,6 @@ ...@@ -85,10 +82,6 @@
class="js-manual-action-link no-btn btn" class="js-manual-action-link no-btn btn"
@click="onClickAction(action.play_path)" @click="onClickAction(action.play_path)"
> >
<icon
:size="12"
name="play"
/>
<span> <span>
{{ action.name }} {{ action.name }}
</span> </span>
......
<script> <script>
import Icon from '~/vue_shared/components/icon.vue'; import Icon from '~/vue_shared/components/icon.vue';
import tooltip from '../../vue_shared/directives/tooltip'; import tooltip from '../../vue_shared/directives/tooltip';
import { s__ } from '../../locale'; import { s__ } from '../../locale';
/** /**
* Renders the external url link in environments table. * Renders the external url link in environments table.
*/ */
export default { export default {
components: { components: {
Icon, Icon,
}, },
...@@ -21,10 +21,10 @@ ...@@ -21,10 +21,10 @@
}, },
computed: { computed: {
title() { title() {
return s__('Environments|Open'); return s__('Environments|Open live environment');
}, },
}, },
}; };
</script> </script>
<template> <template>
<a <a
...@@ -37,9 +37,6 @@ ...@@ -37,9 +37,6 @@
target="_blank" target="_blank"
rel="noopener noreferrer nofollow" rel="noopener noreferrer nofollow"
> >
<icon <icon name="external-link" />
:size="12"
name="external-link"
/>
</a> </a>
</template> </template>
<script> <script>
/** /**
* Renders the Monitoring (Metrics) link in environments table. * Renders the Monitoring (Metrics) link in environments table.
*/ */
import Icon from '~/vue_shared/components/icon.vue'; import Icon from '~/vue_shared/components/icon.vue';
import tooltip from '../../vue_shared/directives/tooltip'; import tooltip from '../../vue_shared/directives/tooltip';
export default { export default {
components: { components: {
Icon, Icon,
}, },
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
return 'Monitoring'; return 'Monitoring';
}, },
}, },
}; };
</script> </script>
<template> <template>
<a <a
...@@ -35,9 +35,6 @@ ...@@ -35,9 +35,6 @@
data-container="body" data-container="body"
rel="noopener noreferrer nofollow" rel="noopener noreferrer nofollow"
> >
<icon <icon name="chart" />
:size="12"
name="chart"
/>
</a> </a>
</template> </template>
<script> <script>
/** /**
* Renders Rollback or Re deploy button in environments table depending * Renders Rollback or Re deploy button in environments table depending
* of the provided property `isLastDeployment`. * of the provided property `isLastDeployment`.
* *
* Makes a post request when the button is clicked. * Makes a post request when the button is clicked.
*/ */
import eventHub from '../event_hub'; import { s__ } from '~/locale';
import loadingIcon from '../../vue_shared/components/loading_icon.vue'; import Icon from '~/vue_shared/components/icon.vue';
import tooltip from '~/vue_shared/directives/tooltip';
import eventHub from '../event_hub';
import LoadingIcon from '../../vue_shared/components/loading_icon.vue';
export default { export default {
components: { components: {
loadingIcon, Icon,
LoadingIcon,
}, },
directives: {
tooltip,
},
props: { props: {
retryUrl: { retryUrl: {
type: String, type: String,
...@@ -28,29 +37,38 @@ ...@@ -28,29 +37,38 @@
isLoading: false, isLoading: false,
}; };
}, },
computed: {
title() {
return this.isLastDeployment ? s__('Environments|Re-deploy to environment') : s__('Environments|Rollback environment');
},
},
methods: { methods: {
onClick() { onClick() {
this.isLoading = true; this.isLoading = true;
eventHub.$emit('postAction', this.retryUrl); eventHub.$emit('postAction', { endpoint: this.retryUrl });
}, },
}, },
}; };
</script> </script>
<template> <template>
<button <button
v-tooltip
:disabled="isLoading" :disabled="isLoading"
:title="title"
type="button" type="button"
class="btn d-none d-sm-none d-md-block" class="btn d-none d-sm-none d-md-block"
@click="onClick" @click="onClick"
> >
<span v-if="isLastDeployment"> <icon
{{ s__("Environments|Re-deploy") }} v-if="isLastDeployment"
</span> name="repeat" />
<span v-else> <icon
{{ s__("Environments|Rollback") }} v-else
</span> name="redo"/>
<loading-icon v-if="isLoading" /> <loading-icon v-if="isLoading" />
</button> </button>
......
<script> <script>
/** /**
* Renders the stop "button" that allows stop an environment. * Renders the stop "button" that allows stop an environment.
* Used in environments table. * Used in environments table.
*/ */
import $ from 'jquery'; import $ from 'jquery';
import eventHub from '../event_hub'; import Icon from '~/vue_shared/components/icon.vue';
import loadingIcon from '../../vue_shared/components/loading_icon.vue'; import { s__ } from '~/locale';
import tooltip from '../../vue_shared/directives/tooltip'; import eventHub from '../event_hub';
import LoadingButton from '../../vue_shared/components/loading_button.vue';
import tooltip from '../../vue_shared/directives/tooltip';
export default { export default {
components: { components: {
loadingIcon, Icon,
LoadingButton,
}, },
directives: { directives: {
...@@ -19,9 +22,9 @@ ...@@ -19,9 +22,9 @@
}, },
props: { props: {
stopUrl: { environment: {
type: String, type: Object,
default: '', required: true,
}, },
}, },
...@@ -33,40 +36,43 @@ ...@@ -33,40 +36,43 @@
computed: { computed: {
title() { title() {
return 'Stop'; return s__('Environments|Stop environment');
}, },
}, },
mounted() {
eventHub.$on('stopEnvironment', this.onStopEnvironment);
},
beforeDestroy() {
eventHub.$off('stopEnvironment', this.onStopEnvironment);
},
methods: { methods: {
onClick() { onClick() {
// eslint-disable-next-line no-alert
if (window.confirm('Are you sure you want to stop this environment?')) {
this.isLoading = true;
$(this.$el).tooltip('dispose'); $(this.$el).tooltip('dispose');
eventHub.$emit('requestStopEnvironment', this.environment);
eventHub.$emit('postAction', this.stopUrl); },
onStopEnvironment(environment) {
if (this.environment.id === environment.id) {
this.isLoading = true;
} }
}, },
}, },
}; };
</script> </script>
<template> <template>
<button <loading-button
v-tooltip v-tooltip
:disabled="isLoading" :loading="isLoading"
:title="title" :title="title"
:aria-label="title" :aria-label="title"
type="button" container-class="btn btn-danger d-none d-sm-none d-md-block"
class="btn stop-env-link d-none d-sm-none d-md-block"
data-container="body" data-container="body"
data-toggle="modal"
data-target="#stop-environment-modal"
@click="onClick" @click="onClick"
> >
<i <icon name="stop"/>
class="fa fa-stop stop-env-icon" </loading-button>
aria-hidden="true"
>
</i>
<loading-icon v-if="isLoading" />
</button>
</template> </template>
<script> <script>
/** /**
* Renders a terminal button to open a web terminal. * Renders a terminal button to open a web terminal.
* Used in environments table. * Used in environments table.
*/ */
import Icon from '~/vue_shared/components/icon.vue'; import Icon from '~/vue_shared/components/icon.vue';
import tooltip from '../../vue_shared/directives/tooltip'; import tooltip from '../../vue_shared/directives/tooltip';
export default { export default {
components: { components: {
Icon, Icon,
}, },
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
return 'Terminal'; return 'Terminal';
}, },
}, },
}; };
</script> </script>
<template> <template>
<a <a
...@@ -36,9 +36,6 @@ ...@@ -36,9 +36,6 @@
class="btn terminal-button d-none d-sm-none d-md-block" class="btn terminal-button d-none d-sm-none d-md-block"
data-container="body" data-container="body"
> >
<icon <icon name="terminal" />
:size="12"
name="terminal"
/>
</a> </a>
</template> </template>
...@@ -5,10 +5,12 @@ ...@@ -5,10 +5,12 @@
import eventHub from '../event_hub'; import eventHub from '../event_hub';
import environmentsMixin from '../mixins/environments_mixin'; import environmentsMixin from '../mixins/environments_mixin';
import CIPaginationMixin from '../../vue_shared/mixins/ci_pagination_api_mixin'; import CIPaginationMixin from '../../vue_shared/mixins/ci_pagination_api_mixin';
import StopEnvironmentModal from './stop_environment_modal.vue';
export default { export default {
components: { components: {
emptyState, emptyState,
StopEnvironmentModal,
}, },
mixins: [ mixins: [
...@@ -90,6 +92,8 @@ ...@@ -90,6 +92,8 @@
</script> </script>
<template> <template>
<div :class="cssContainerClass"> <div :class="cssContainerClass">
<stop-environment-modal :environment="environmentInStopModal" />
<div class="top-area"> <div class="top-area">
<tabs <tabs
:tabs="tabs" :tabs="tabs"
......
<script>
import GlModal from '~/vue_shared/components/gl_modal.vue';
import { s__, sprintf } from '~/locale';
import tooltip from '~/vue_shared/directives/tooltip';
import LoadingButton from '~/vue_shared/components/loading_button.vue';
import eventHub from '../event_hub';
export default {
id: 'stop-environment-modal',
name: 'StopEnvironmentModal',
components: {
GlModal,
LoadingButton,
},
directives: {
tooltip,
},
props: {
environment: {
type: Object,
required: true,
},
},
computed: {
noStopActionMessage() {
return sprintf(
s__(
`Environments|Note that this action will stop the environment,
but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment
due to no “stop environment action” being defined
in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file.`,
),
{
emphasisStart: '<strong>',
emphasisEnd: '</strong>',
ciConfigLinkStart:
'<a href="https://docs.gitlab.com/ee/ci/yaml/" target="_blank" rel="noopener noreferrer">',
ciConfigLinkEnd: '</a>',
},
false,
);
},
},
methods: {
onSubmit() {
eventHub.$emit('stopEnvironment', this.environment);
},
},
};
</script>
<template>
<gl-modal
:id="$options.id"
:footer-primary-button-text="s__('Environments|Stop environment')"
footer-primary-button-variant="danger"
@submit="onSubmit"
>
<template slot="header">
<h4
class="modal-title d-flex mw-100"
>
Stopping
<span
v-tooltip
:title="environment.name"
class="text-truncate ml-1 mr-1 flex-fill"
>{{ environment.name }}</span>
?
</h4>
</template>
<p>{{ s__('Environments|Are you sure you want to stop this environment?') }}</p>
<div
v-if="!environment.has_stop_action"
class="warning_message"
>
<p v-html="noStopActionMessage"></p>
<a
href="https://docs.gitlab.com/ee/ci/environments.html#stopping-an-environment"
target="_blank"
rel="noopener noreferrer"
>{{ s__('Environments|Learn more about stopping environments') }}</a>
</div>
</gl-modal>
</template>
<script> <script>
import environmentsMixin from '../mixins/environments_mixin'; import environmentsMixin from '../mixins/environments_mixin';
import CIPaginationMixin from '../../vue_shared/mixins/ci_pagination_api_mixin'; import CIPaginationMixin from '../../vue_shared/mixins/ci_pagination_api_mixin';
import StopEnvironmentModal from '../components/stop_environment_modal.vue';
export default { export default {
components: {
StopEnvironmentModal,
},
mixins: [ mixins: [
environmentsMixin, environmentsMixin,
CIPaginationMixin, CIPaginationMixin,
], ],
props: { props: {
endpoint: { endpoint: {
type: String, type: String,
...@@ -38,6 +44,8 @@ ...@@ -38,6 +44,8 @@
</script> </script>
<template> <template>
<div :class="cssContainerClass"> <div :class="cssContainerClass">
<stop-environment-modal :environment="environmentInStopModal" />
<div <div
v-if="!isLoading" v-if="!isLoading"
class="top-area" class="top-area"
......
...@@ -40,6 +40,7 @@ export default { ...@@ -40,6 +40,7 @@ export default {
scope: getParameterByName('scope') || 'available', scope: getParameterByName('scope') || 'available',
page: getParameterByName('page') || '1', page: getParameterByName('page') || '1',
requestData: {}, requestData: {},
environmentInStopModal: {},
}; };
}, },
...@@ -85,7 +86,7 @@ export default { ...@@ -85,7 +86,7 @@ export default {
Flash(s__('Environments|An error occurred while fetching the environments.')); Flash(s__('Environments|An error occurred while fetching the environments.'));
}, },
postAction(endpoint) { postAction({ endpoint, errorMessage }) {
if (!this.isMakingRequest) { if (!this.isMakingRequest) {
this.isLoading = true; this.isLoading = true;
...@@ -93,7 +94,7 @@ export default { ...@@ -93,7 +94,7 @@ export default {
.then(() => this.fetchEnvironments()) .then(() => this.fetchEnvironments())
.catch(() => { .catch(() => {
this.isLoading = false; this.isLoading = false;
Flash(s__('Environments|An error occurred while making the request.')); Flash(errorMessage || s__('Environments|An error occurred while making the request.'));
}); });
} }
}, },
...@@ -106,6 +107,15 @@ export default { ...@@ -106,6 +107,15 @@ export default {
.catch(this.errorCallback); .catch(this.errorCallback);
}, },
updateStopModal(environment) {
this.environmentInStopModal = environment;
},
stopEnvironment(environment) {
const endpoint = environment.stop_path;
const errorMessage = s__('Environments|An error occurred while stopping the environment, please try again');
this.postAction({ endpoint, errorMessage });
},
}, },
computed: { computed: {
...@@ -162,9 +172,13 @@ export default { ...@@ -162,9 +172,13 @@ export default {
}); });
eventHub.$on('postAction', this.postAction); eventHub.$on('postAction', this.postAction);
eventHub.$on('requestStopEnvironment', this.updateStopModal);
eventHub.$on('stopEnvironment', this.stopEnvironment);
}, },
beforeDestroyed() { beforeDestroy() {
eventHub.$off('postAction'); eventHub.$off('postAction', this.postAction);
eventHub.$off('requestStopEnvironment', this.updateStopModal);
eventHub.$off('stopEnvironment', this.stopEnvironment);
}, },
}; };
...@@ -13,7 +13,7 @@ export default class EnvironmentsService { ...@@ -13,7 +13,7 @@ export default class EnvironmentsService {
// eslint-disable-next-line class-methods-use-this // eslint-disable-next-line class-methods-use-this
postAction(endpoint) { postAction(endpoint) {
return axios.post(endpoint, {}, { emulateJSON: true }); return axios.post(endpoint, {});
} }
getFolderContent(folderUrl) { getFolderContent(folderUrl) {
......
export const ADD_NEW_NOTE = 'ADD_NEW_NOTE'; export const ADD_NEW_NOTE = 'ADD_NEW_NOTE';
export const ADD_NEW_REPLY_TO_DISCUSSION = 'ADD_NEW_REPLY_TO_DISCUSSION'; export const ADD_NEW_REPLY_TO_DISCUSSION = 'ADD_NEW_REPLY_TO_DISCUSSION';
export const DELETE_NOTE = 'DELETE_NOTE'; export const DELETE_NOTE = 'DELETE_NOTE';
export const EXPAND_DISCUSSION = 'EXPAND_DISCUSSION';
export const REMOVE_PLACEHOLDER_NOTES = 'REMOVE_PLACEHOLDER_NOTES'; export const REMOVE_PLACEHOLDER_NOTES = 'REMOVE_PLACEHOLDER_NOTES';
export const SET_NOTES_DATA = 'SET_NOTES_DATA'; export const SET_NOTES_DATA = 'SET_NOTES_DATA';
export const SET_NOTEABLE_DATA = 'SET_NOTEABLE_DATA'; export const SET_NOTEABLE_DATA = 'SET_NOTEABLE_DATA';
...@@ -11,15 +10,15 @@ export const SET_LAST_FETCHED_AT = 'SET_LAST_FETCHED_AT'; ...@@ -11,15 +10,15 @@ export const SET_LAST_FETCHED_AT = 'SET_LAST_FETCHED_AT';
export const SET_TARGET_NOTE_HASH = 'SET_TARGET_NOTE_HASH'; export const SET_TARGET_NOTE_HASH = 'SET_TARGET_NOTE_HASH';
export const SHOW_PLACEHOLDER_NOTE = 'SHOW_PLACEHOLDER_NOTE'; export const SHOW_PLACEHOLDER_NOTE = 'SHOW_PLACEHOLDER_NOTE';
export const TOGGLE_AWARD = 'TOGGLE_AWARD'; export const TOGGLE_AWARD = 'TOGGLE_AWARD';
export const TOGGLE_DISCUSSION = 'TOGGLE_DISCUSSION';
export const UPDATE_NOTE = 'UPDATE_NOTE'; export const UPDATE_NOTE = 'UPDATE_NOTE';
export const UPDATE_DISCUSSION = 'UPDATE_DISCUSSION'; export const UPDATE_DISCUSSION = 'UPDATE_DISCUSSION';
export const SET_DISCUSSION_DIFF_LINES = 'SET_DISCUSSION_DIFF_LINES'; export const SET_DISCUSSION_DIFF_LINES = 'SET_DISCUSSION_DIFF_LINES';
export const SET_NOTES_FETCHED_STATE = 'SET_NOTES_FETCHED_STATE'; export const SET_NOTES_FETCHED_STATE = 'SET_NOTES_FETCHED_STATE';
// DISCUSSION // DISCUSSION
export const COLLAPSE_DISCUSSION = 'COLLAPSE_DISCUSSION'; export const COLLAPSE_DISCUSSION = 'COLLAPSE_DISCUSSION';
export const EXPAND_DISCUSSION = 'EXPAND_DISCUSSION';
export const TOGGLE_DISCUSSION = 'TOGGLE_DISCUSSION';
// Issue // Issue
export const CLOSE_ISSUE = 'CLOSE_ISSUE'; export const CLOSE_ISSUE = 'CLOSE_ISSUE';
......
...@@ -224,7 +224,10 @@ ...@@ -224,7 +224,10 @@
.form-control { .form-control {
position: relative; position: relative;
min-width: 200px; min-width: 200px;
padding: 5px 25px 6px 0; padding-right: 25px;
padding-left: 0;
height: $input-height;
line-height: inherit;
border-color: transparent; border-color: transparent;
&:focus, &:focus,
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
} }
.btn-group { .btn-group {
> a { > .btn:not(.btn-danger) {
color: $gl-text-color-secondary; color: $gl-text-color-secondary;
} }
......
...@@ -22,7 +22,7 @@ class Admin::DeployKeysController < Admin::ApplicationController ...@@ -22,7 +22,7 @@ class Admin::DeployKeysController < Admin::ApplicationController
end end
def update def update
if deploy_key.update_attributes(update_params) if deploy_key.update(update_params)
flash[:notice] = 'Deploy key was successfully updated.' flash[:notice] = 'Deploy key was successfully updated.'
redirect_to admin_deploy_keys_path redirect_to admin_deploy_keys_path
else else
...@@ -34,7 +34,7 @@ class Admin::DeployKeysController < Admin::ApplicationController ...@@ -34,7 +34,7 @@ class Admin::DeployKeysController < Admin::ApplicationController
deploy_key.destroy deploy_key.destroy
respond_to do |format| respond_to do |format|
format.html { redirect_to admin_deploy_keys_path, status: 302 } format.html { redirect_to admin_deploy_keys_path, status: :found }
format.json { head :ok } format.json { head :ok }
end end
end end
......
...@@ -39,7 +39,7 @@ class Admin::GroupsController < Admin::ApplicationController ...@@ -39,7 +39,7 @@ class Admin::GroupsController < Admin::ApplicationController
end end
def update def update
if @group.update_attributes(group_params) if @group.update(group_params)
redirect_to [:admin, @group], notice: 'Group was successfully updated.' redirect_to [:admin, @group], notice: 'Group was successfully updated.'
else else
render "edit" render "edit"
......
...@@ -23,7 +23,7 @@ class Admin::HooksController < Admin::ApplicationController ...@@ -23,7 +23,7 @@ class Admin::HooksController < Admin::ApplicationController
end end
def update def update
if hook.update_attributes(hook_params) if hook.update(hook_params)
flash[:notice] = 'System hook was successfully updated.' flash[:notice] = 'System hook was successfully updated.'
redirect_to admin_hooks_path redirect_to admin_hooks_path
else else
...@@ -34,7 +34,7 @@ class Admin::HooksController < Admin::ApplicationController ...@@ -34,7 +34,7 @@ class Admin::HooksController < Admin::ApplicationController
def destroy def destroy
hook.destroy hook.destroy
redirect_to admin_hooks_path, status: 302 redirect_to admin_hooks_path, status: :found
end end
def test def test
......
...@@ -25,7 +25,7 @@ class Admin::IdentitiesController < Admin::ApplicationController ...@@ -25,7 +25,7 @@ class Admin::IdentitiesController < Admin::ApplicationController
end end
def update def update
if @identity.update_attributes(identity_params) if @identity.update(identity_params)
RepairLdapBlockedUserService.new(@user).execute RepairLdapBlockedUserService.new(@user).execute
redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully updated.' redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully updated.'
else else
......
...@@ -11,7 +11,7 @@ class Admin::ImpersonationsController < Admin::ApplicationController ...@@ -11,7 +11,7 @@ class Admin::ImpersonationsController < Admin::ApplicationController
session[:impersonator_id] = nil session[:impersonator_id] = nil
redirect_to admin_user_path(original_user), status: 302 redirect_to admin_user_path(original_user), status: :found
end end
private private
......
...@@ -20,6 +20,6 @@ class Admin::JobsController < Admin::ApplicationController ...@@ -20,6 +20,6 @@ class Admin::JobsController < Admin::ApplicationController
def cancel_all def cancel_all
Ci::Build.running_or_pending.each(&:cancel) Ci::Build.running_or_pending.each(&:cancel)
redirect_to admin_jobs_path, status: 303 redirect_to admin_jobs_path, status: :see_other
end end
end end
...@@ -16,7 +16,7 @@ class Admin::RunnerProjectsController < Admin::ApplicationController ...@@ -16,7 +16,7 @@ class Admin::RunnerProjectsController < Admin::ApplicationController
runner = rp.runner runner = rp.runner
rp.destroy rp.destroy
redirect_to admin_runner_path(runner), status: 302 redirect_to admin_runner_path(runner), status: :found
end end
private private
......
...@@ -28,7 +28,7 @@ class Admin::RunnersController < Admin::ApplicationController ...@@ -28,7 +28,7 @@ class Admin::RunnersController < Admin::ApplicationController
def destroy def destroy
@runner.destroy @runner.destroy
redirect_to admin_runners_path, status: 302 redirect_to admin_runners_path, status: :found
end end
def resume def resume
......
...@@ -16,7 +16,7 @@ class Admin::ServicesController < Admin::ApplicationController ...@@ -16,7 +16,7 @@ class Admin::ServicesController < Admin::ApplicationController
end end
def update def update
if service.update_attributes(service_params[:service]) if service.update(service_params[:service])
PropagateServiceTemplateWorker.perform_async(service.id) if service.active? PropagateServiceTemplateWorker.perform_async(service.id) if service.active?
redirect_to admin_application_settings_services_path, redirect_to admin_application_settings_services_path,
......
...@@ -163,7 +163,7 @@ class Admin::UsersController < Admin::ApplicationController ...@@ -163,7 +163,7 @@ class Admin::UsersController < Admin::ApplicationController
format.json { head :ok } format.json { head :ok }
else else
format.html { redirect_back_or_admin_user(alert: 'There was an error removing the e-mail.') } format.html { redirect_back_or_admin_user(alert: 'There was an error removing the e-mail.') }
format.json { render json: 'There was an error removing the e-mail.', status: 400 } format.json { render json: 'There was an error removing the e-mail.', status: :bad_request }
end end
end end
end end
......
...@@ -127,7 +127,7 @@ module IssuableActions ...@@ -127,7 +127,7 @@ module IssuableActions
errors: [ errors: [
"Someone edited this #{issuable.human_class_name} at the same time you did. Please refresh your browser and make sure your changes will not unintentionally remove theirs." "Someone edited this #{issuable.human_class_name} at the same time you did. Please refresh your browser and make sure your changes will not unintentionally remove theirs."
] ]
}, status: 409 }, status: :conflict
end end
end end
end end
......
...@@ -27,7 +27,7 @@ module LfsRequest ...@@ -27,7 +27,7 @@ module LfsRequest
message: 'Git LFS is not enabled on this GitLab server, contact your admin.', message: 'Git LFS is not enabled on this GitLab server, contact your admin.',
documentation_url: help_url documentation_url: help_url
}, },
status: 501 status: :not_implemented
) )
end end
......
...@@ -7,6 +7,6 @@ class Groups::AvatarsController < Groups::ApplicationController ...@@ -7,6 +7,6 @@ class Groups::AvatarsController < Groups::ApplicationController
@group.remove_avatar! @group.remove_avatar!
@group.save @group.save
redirect_to edit_group_path(@group), status: 302 redirect_to edit_group_path(@group), status: :found
end end
end end
...@@ -23,7 +23,7 @@ class Groups::RunnersController < Groups::ApplicationController ...@@ -23,7 +23,7 @@ class Groups::RunnersController < Groups::ApplicationController
def destroy def destroy
@runner.destroy @runner.destroy
redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), status: 302 redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), status: :found
end end
def resume def resume
......
...@@ -41,7 +41,7 @@ class JwtController < ApplicationController ...@@ -41,7 +41,7 @@ class JwtController < ApplicationController
"You must use a personal access token with 'api' scope for Git over HTTP.\n" \ "You must use a personal access token with 'api' scope for Git over HTTP.\n" \
"You can generate one at #{profile_personal_access_tokens_url}" } "You can generate one at #{profile_personal_access_tokens_url}" }
] ]
}, status: 401 }, status: :unauthorized
end end
def render_unauthorized def render_unauthorized
...@@ -50,7 +50,7 @@ class JwtController < ApplicationController ...@@ -50,7 +50,7 @@ class JwtController < ApplicationController
{ code: 'UNAUTHORIZED', { code: 'UNAUTHORIZED',
message: 'HTTP Basic: Access denied' } message: 'HTTP Basic: Access denied' }
] ]
}, status: 401 }, status: :unauthorized
end end
def auth_params def auth_params
......
...@@ -5,14 +5,14 @@ class NotificationSettingsController < ApplicationController ...@@ -5,14 +5,14 @@ class NotificationSettingsController < ApplicationController
return render_404 unless can_read?(resource) return render_404 unless can_read?(resource)
@notification_setting = current_user.notification_settings_for(resource) @notification_setting = current_user.notification_settings_for(resource)
@saved = @notification_setting.update_attributes(notification_setting_params) @saved = @notification_setting.update(notification_setting_params)
render_response render_response
end end
def update def update
@notification_setting = current_user.notification_settings.find(params[:id]) @notification_setting = current_user.notification_settings.find(params[:id])
@saved = @notification_setting.update_attributes(notification_setting_params) @saved = @notification_setting.update(notification_setting_params)
render_response render_response
end end
......
...@@ -7,7 +7,7 @@ class Profiles::ActiveSessionsController < Profiles::ApplicationController ...@@ -7,7 +7,7 @@ class Profiles::ActiveSessionsController < Profiles::ApplicationController
ActiveSession.destroy(current_user, params[:id]) ActiveSession.destroy(current_user, params[:id])
respond_to do |format| respond_to do |format|
format.html { redirect_to profile_active_sessions_url, status: 302 } format.html { redirect_to profile_active_sessions_url, status: :found }
format.js { head :ok } format.js { head :ok }
end end
end end
......
...@@ -4,6 +4,6 @@ class Profiles::AvatarsController < Profiles::ApplicationController ...@@ -4,6 +4,6 @@ class Profiles::AvatarsController < Profiles::ApplicationController
Users::UpdateService.new(current_user, user: @user).execute { |user| user.remove_avatar! } Users::UpdateService.new(current_user, user: @user).execute { |user| user.remove_avatar! }
redirect_to profile_path, status: 302 redirect_to profile_path, status: :found
end end
end end
...@@ -39,7 +39,7 @@ class Profiles::ChatNamesController < Profiles::ApplicationController ...@@ -39,7 +39,7 @@ class Profiles::ChatNamesController < Profiles::ApplicationController
flash[:alert] = "Could not delete chat nickname #{@chat_name.chat_name}." flash[:alert] = "Could not delete chat nickname #{@chat_name.chat_name}."
end end
redirect_to profile_chat_names_path, status: 302 redirect_to profile_chat_names_path, status: :found
end end
private private
......
...@@ -19,7 +19,7 @@ class Profiles::EmailsController < Profiles::ApplicationController ...@@ -19,7 +19,7 @@ class Profiles::EmailsController < Profiles::ApplicationController
Emails::DestroyService.new(current_user, user: current_user).execute(@email) Emails::DestroyService.new(current_user, user: current_user).execute(@email)
respond_to do |format| respond_to do |format|
format.html { redirect_to profile_emails_url, status: 302 } format.html { redirect_to profile_emails_url, status: :found }
format.js { head :ok } format.js { head :ok }
end end
end end
......
...@@ -21,7 +21,7 @@ class Profiles::GpgKeysController < Profiles::ApplicationController ...@@ -21,7 +21,7 @@ class Profiles::GpgKeysController < Profiles::ApplicationController
@gpg_key.destroy @gpg_key.destroy
respond_to do |format| respond_to do |format|
format.html { redirect_to profile_gpg_keys_url, status: 302 } format.html { redirect_to profile_gpg_keys_url, status: :found }
format.js { head :ok } format.js { head :ok }
end end
end end
...@@ -30,7 +30,7 @@ class Profiles::GpgKeysController < Profiles::ApplicationController ...@@ -30,7 +30,7 @@ class Profiles::GpgKeysController < Profiles::ApplicationController
@gpg_key.revoke @gpg_key.revoke
respond_to do |format| respond_to do |format|
format.html { redirect_to profile_gpg_keys_url, status: 302 } format.html { redirect_to profile_gpg_keys_url, status: :found }
format.js { head :ok } format.js { head :ok }
end end
end end
......
...@@ -26,7 +26,7 @@ class Profiles::KeysController < Profiles::ApplicationController ...@@ -26,7 +26,7 @@ class Profiles::KeysController < Profiles::ApplicationController
Keys::DestroyService.new(current_user).execute(@key) Keys::DestroyService.new(current_user).execute(@key)
respond_to do |format| respond_to do |format|
format.html { redirect_to profile_keys_url, status: 302 } format.html { redirect_to profile_keys_url, status: :found }
format.js { head :ok } format.js { head :ok }
end end
end end
......
...@@ -78,7 +78,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController ...@@ -78,7 +78,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
def destroy def destroy
current_user.disable_two_factor! current_user.disable_two_factor!
redirect_to profile_account_path, status: 302 redirect_to profile_account_path, status: :found
end end
def skip def skip
......
...@@ -61,7 +61,7 @@ class Projects::ApplicationController < ApplicationController ...@@ -61,7 +61,7 @@ class Projects::ApplicationController < ApplicationController
def require_non_empty_project def require_non_empty_project
# Be sure to return status code 303 to avoid a double DELETE: # Be sure to return status code 303 to avoid a double DELETE:
# http://api.rubyonrails.org/classes/ActionController/Redirecting.html # http://api.rubyonrails.org/classes/ActionController/Redirecting.html
redirect_to project_path(@project), status: 303 if @project.empty_repo? redirect_to project_path(@project), status: :see_other if @project.empty_repo?
end end
def require_branch_head def require_branch_head
......
...@@ -21,6 +21,6 @@ class Projects::AvatarsController < Projects::ApplicationController ...@@ -21,6 +21,6 @@ class Projects::AvatarsController < Projects::ApplicationController
@project.save @project.save
redirect_to edit_project_path(@project), status: 302 redirect_to edit_project_path(@project), status: :found
end end
end end
...@@ -98,7 +98,7 @@ class Projects::BranchesController < Projects::ApplicationController ...@@ -98,7 +98,7 @@ class Projects::BranchesController < Projects::ApplicationController
flash_type = result[:status] == :error ? :alert : :notice flash_type = result[:status] == :error ? :alert : :notice
flash[flash_type] = result[:message] flash[flash_type] = result[:message]
redirect_to project_branches_path(@project), status: 303 redirect_to project_branches_path(@project), status: :see_other
end end
format.js { render nothing: true, status: result[:return_code] } format.js { render nothing: true, status: result[:return_code] }
......
...@@ -62,7 +62,7 @@ class Projects::ClustersController < Projects::ApplicationController ...@@ -62,7 +62,7 @@ class Projects::ClustersController < Projects::ApplicationController
def destroy def destroy
if cluster.destroy if cluster.destroy
flash[:notice] = _('Kubernetes cluster integration was successfully removed.') flash[:notice] = _('Kubernetes cluster integration was successfully removed.')
redirect_to project_clusters_path(project), status: 302 redirect_to project_clusters_path(project), status: :found
else else
flash[:notice] = _('Kubernetes cluster integration was not removed.') flash[:notice] = _('Kubernetes cluster integration was not removed.')
render :show render :show
......
...@@ -35,7 +35,7 @@ class Projects::DeployKeysController < Projects::ApplicationController ...@@ -35,7 +35,7 @@ class Projects::DeployKeysController < Projects::ApplicationController
end end
def update def update
if deploy_key.update_attributes(update_params) if deploy_key.update(update_params)
flash[:notice] = 'Deploy key was successfully updated.' flash[:notice] = 'Deploy key was successfully updated.'
redirect_to_repository_settings(@project) redirect_to_repository_settings(@project)
else else
......
...@@ -2,7 +2,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController ...@@ -2,7 +2,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController
layout 'project' layout 'project'
before_action :authorize_read_environment! before_action :authorize_read_environment!
before_action :authorize_create_environment!, only: [:new, :create] before_action :authorize_create_environment!, only: [:new, :create]
before_action :authorize_create_deployment!, only: [:stop] before_action :authorize_stop_environment!, only: [:stop]
before_action :authorize_update_environment!, only: [:edit, :update] before_action :authorize_update_environment!, only: [:edit, :update]
before_action :authorize_admin_environment!, only: [:terminal, :terminal_websocket_authorize] before_action :authorize_admin_environment!, only: [:terminal, :terminal_websocket_authorize]
before_action :environment, only: [:show, :edit, :update, :stop, :terminal, :terminal_websocket_authorize, :metrics] before_action :environment, only: [:show, :edit, :update, :stop, :terminal, :terminal_websocket_authorize, :metrics]
...@@ -116,7 +116,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController ...@@ -116,7 +116,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController
set_workhorse_internal_api_content_type set_workhorse_internal_api_content_type
render json: Gitlab::Workhorse.terminal_websocket(terminal) render json: Gitlab::Workhorse.terminal_websocket(terminal)
else else
render text: 'Not found', status: 404 render text: 'Not found', status: :not_found
end end
end end
...@@ -175,4 +175,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController ...@@ -175,4 +175,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController
def environment def environment
@environment ||= project.environments.find(params[:id]) @environment ||= project.environments.find(params[:id])
end end
def authorize_stop_environment!
access_denied! unless can?(current_user, :stop_environment, environment)
end
end end
...@@ -53,7 +53,7 @@ class Projects::GitHttpClientController < Projects::ApplicationController ...@@ -53,7 +53,7 @@ class Projects::GitHttpClientController < Projects::ApplicationController
end end
send_challenges send_challenges
render plain: "HTTP Basic: Access denied\n", status: 401 render plain: "HTTP Basic: Access denied\n", status: :unauthorized
rescue Gitlab::Auth::MissingPersonalAccessTokenError rescue Gitlab::Auth::MissingPersonalAccessTokenError
render_missing_personal_access_token render_missing_personal_access_token
end end
...@@ -83,7 +83,7 @@ class Projects::GitHttpClientController < Projects::ApplicationController ...@@ -83,7 +83,7 @@ class Projects::GitHttpClientController < Projects::ApplicationController
render plain: "HTTP Basic: Access denied\n" \ render plain: "HTTP Basic: Access denied\n" \
"You must use a personal access token with 'api' scope for Git over HTTP.\n" \ "You must use a personal access token with 'api' scope for Git over HTTP.\n" \
"You can generate one at #{profile_personal_access_tokens_url}", "You can generate one at #{profile_personal_access_tokens_url}",
status: 401 status: :unauthorized
end end
def repository def repository
......
...@@ -24,7 +24,7 @@ class Projects::GroupLinksController < Projects::ApplicationController ...@@ -24,7 +24,7 @@ class Projects::GroupLinksController < Projects::ApplicationController
def update def update
@group_link = @project.project_group_links.find(params[:id]) @group_link = @project.project_group_links.find(params[:id])
@group_link.update_attributes(group_link_params) @group_link.update(group_link_params)
end end
def destroy def destroy
...@@ -34,7 +34,7 @@ class Projects::GroupLinksController < Projects::ApplicationController ...@@ -34,7 +34,7 @@ class Projects::GroupLinksController < Projects::ApplicationController
respond_to do |format| respond_to do |format|
format.html do format.html do
redirect_to project_project_members_path(project), status: 302 redirect_to project_project_members_path(project), status: :found
end end
format.js { head :ok } format.js { head :ok }
end end
......
...@@ -29,7 +29,7 @@ class Projects::HooksController < Projects::ApplicationController ...@@ -29,7 +29,7 @@ class Projects::HooksController < Projects::ApplicationController
end end
def update def update
if hook.update_attributes(hook_params) if hook.update(hook_params)
flash[:notice] = 'Hook was successfully updated.' flash[:notice] = 'Hook was successfully updated.'
redirect_to project_settings_integrations_path(@project) redirect_to project_settings_integrations_path(@project)
else else
...@@ -48,7 +48,7 @@ class Projects::HooksController < Projects::ApplicationController ...@@ -48,7 +48,7 @@ class Projects::HooksController < Projects::ApplicationController
def destroy def destroy
hook.destroy hook.destroy
redirect_to project_settings_integrations_path(@project), status: 302 redirect_to project_settings_integrations_path(@project), status: :found
end end
private private
......
...@@ -39,7 +39,7 @@ class Projects::LabelsController < Projects::ApplicationController ...@@ -39,7 +39,7 @@ class Projects::LabelsController < Projects::ApplicationController
else else
respond_to do |format| respond_to do |format|
format.html { render :new } format.html { render :new }
format.json { render json: { message: @label.errors.messages }, status: 400 } format.json { render json: { message: @label.errors.messages }, status: :bad_request }
end end
end end
end end
...@@ -115,7 +115,7 @@ class Projects::LabelsController < Projects::ApplicationController ...@@ -115,7 +115,7 @@ class Projects::LabelsController < Projects::ApplicationController
flash[:notice] = "#{@label.title} promoted to <a href=\"#{group_labels_path(@project.group)}\">group label</a>.".html_safe flash[:notice] = "#{@label.title} promoted to <a href=\"#{group_labels_path(@project.group)}\">group label</a>.".html_safe
respond_to do |format| respond_to do |format|
format.html do format.html do
redirect_to(project_labels_path(@project), status: 303) redirect_to(project_labels_path(@project), status: :see_other)
end end
format.json do format.json do
render json: { url: project_labels_path(@project) } render json: { url: project_labels_path(@project) }
......
...@@ -25,7 +25,7 @@ class Projects::LfsApiController < Projects::GitHttpClientController ...@@ -25,7 +25,7 @@ class Projects::LfsApiController < Projects::GitHttpClientController
message: 'Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.', message: 'Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.',
documentation_url: "#{Gitlab.config.gitlab.url}/help" documentation_url: "#{Gitlab.config.gitlab.url}/help"
}, },
status: 501 status: :not_implemented
) )
end end
......
...@@ -28,7 +28,7 @@ class Projects::LfsStorageController < Projects::GitHttpClientController ...@@ -28,7 +28,7 @@ class Projects::LfsStorageController < Projects::GitHttpClientController
if store_file!(oid, size) if store_file!(oid, size)
head 200 head 200
else else
render plain: 'Unprocessable entity', status: 422 render plain: 'Unprocessable entity', status: :unprocessable_entity
end end
rescue ActiveRecord::RecordInvalid rescue ActiveRecord::RecordInvalid
render_lfs_forbidden render_lfs_forbidden
......
...@@ -192,7 +192,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo ...@@ -192,7 +192,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
deployment = environment.first_deployment_for(@merge_request.diff_head_sha) deployment = environment.first_deployment_for(@merge_request.diff_head_sha)
stop_url = stop_url =
if environment.stop_action? && can?(current_user, :create_deployment, environment) if can?(current_user, :stop_environment, environment)
stop_project_environment_path(project, environment) stop_project_environment_path(project, environment)
end end
...@@ -227,7 +227,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo ...@@ -227,7 +227,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
def rebase def rebase
RebaseWorker.perform_async(@merge_request.id, current_user.id) RebaseWorker.perform_async(@merge_request.id, current_user.id)
render nothing: true, status: 200 render nothing: true, status: :ok
end end
protected protected
......
...@@ -96,7 +96,7 @@ class Projects::MilestonesController < Projects::ApplicationController ...@@ -96,7 +96,7 @@ class Projects::MilestonesController < Projects::ApplicationController
Milestones::DestroyService.new(project, current_user).execute(milestone) Milestones::DestroyService.new(project, current_user).execute(milestone)
respond_to do |format| respond_to do |format|
format.html { redirect_to namespace_project_milestones_path, status: 303 } format.html { redirect_to namespace_project_milestones_path, status: :see_other }
format.js { head :ok } format.js { head :ok }
end end
end end
......
...@@ -13,7 +13,7 @@ class Projects::MirrorsController < Projects::ApplicationController ...@@ -13,7 +13,7 @@ class Projects::MirrorsController < Projects::ApplicationController
end end
def update def update
if project.update_attributes(mirror_params) if project.update(mirror_params)
flash[:notice] = 'Mirroring settings were successfully updated.' flash[:notice] = 'Mirroring settings were successfully updated.'
else else
flash[:alert] = project.errors.full_messages.join(', ').html_safe flash[:alert] = project.errors.full_messages.join(', ').html_safe
......
...@@ -64,7 +64,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController ...@@ -64,7 +64,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
def destroy def destroy
if schedule.destroy if schedule.destroy
redirect_to pipeline_schedules_path(@project), status: 302 redirect_to pipeline_schedules_path(@project), status: :found
else else
redirect_to pipeline_schedules_path(@project), redirect_to pipeline_schedules_path(@project),
status: :forbidden, status: :forbidden,
......
...@@ -14,7 +14,7 @@ class Projects::ReleasesController < Projects::ApplicationController ...@@ -14,7 +14,7 @@ class Projects::ReleasesController < Projects::ApplicationController
# it exists only to save a description to each Tag. # it exists only to save a description to each Tag.
# If description is empty we should destroy the existing record. # If description is empty we should destroy the existing record.
if release_params[:description].present? if release_params[:description].present?
release.update_attributes(release_params) release.update(release_params)
else else
release.destroy release.destroy
end end
......
...@@ -24,7 +24,7 @@ class Projects::RepositoriesController < Projects::ApplicationController ...@@ -24,7 +24,7 @@ class Projects::RepositoriesController < Projects::ApplicationController
send_git_archive @repository, ref: @ref, format: params[:format], append_sha: append_sha send_git_archive @repository, ref: @ref, format: params[:format], append_sha: append_sha
rescue => ex rescue => ex
logger.error("#{self.class.name}: #{ex}") logger.error("#{self.class.name}: #{ex}")
return git_not_found! git_not_found!
end end
def assign_archive_vars def assign_archive_vars
......
...@@ -21,6 +21,6 @@ class Projects::RunnerProjectsController < Projects::ApplicationController ...@@ -21,6 +21,6 @@ class Projects::RunnerProjectsController < Projects::ApplicationController
runner_project = project.runner_projects.find(params[:id]) runner_project = project.runner_projects.find(params[:id])
runner_project.destroy runner_project.destroy
redirect_to project_runners_path(project), status: 302 redirect_to project_runners_path(project), status: :found
end end
end end
...@@ -24,7 +24,7 @@ class Projects::RunnersController < Projects::ApplicationController ...@@ -24,7 +24,7 @@ class Projects::RunnersController < Projects::ApplicationController
@runner.destroy @runner.destroy
end end
redirect_to project_runners_path(@project), status: 302 redirect_to project_runners_path(@project), status: :found
end end
def resume def resume
......
...@@ -34,7 +34,7 @@ class Projects::ServicesController < Projects::ApplicationController ...@@ -34,7 +34,7 @@ class Projects::ServicesController < Projects::ApplicationController
private private
def service_test_response def service_test_response
if @service.update_attributes(service_params[:service]) if @service.update(service_params[:service])
data = @service.test_data(project, current_user) data = @service.test_data(project, current_user)
outcome = @service.test(data) outcome = @service.test(data)
......
...@@ -82,7 +82,7 @@ class Projects::SnippetsController < Projects::ApplicationController ...@@ -82,7 +82,7 @@ class Projects::SnippetsController < Projects::ApplicationController
@snippet.destroy @snippet.destroy
redirect_to project_snippets_path(@project), status: 302 redirect_to project_snippets_path(@project), status: :found
end end
protected protected
......
...@@ -50,7 +50,7 @@ class Projects::TagsController < Projects::ApplicationController ...@@ -50,7 +50,7 @@ class Projects::TagsController < Projects::ApplicationController
respond_to do |format| respond_to do |format|
if result[:status] == :success if result[:status] == :success
format.html do format.html do
redirect_to project_tags_path(@project), status: 303 redirect_to project_tags_path(@project), status: :see_other
end end
format.js format.js
......
...@@ -14,6 +14,6 @@ class Projects::TemplatesController < Projects::ApplicationController ...@@ -14,6 +14,6 @@ class Projects::TemplatesController < Projects::ApplicationController
def get_template_class def get_template_class
template_types = { issue: Gitlab::Template::IssueTemplate, merge_request: Gitlab::Template::MergeRequestTemplate }.with_indifferent_access template_types = { issue: Gitlab::Template::IssueTemplate, merge_request: Gitlab::Template::MergeRequestTemplate }.with_indifferent_access
@template_type = template_types[params[:template_type]] @template_type = template_types[params[:template_type]]
render json: [], status: 404 unless @template_type render json: [], status: :not_found unless @template_type
end end
end end
...@@ -50,7 +50,7 @@ class Projects::TriggersController < Projects::ApplicationController ...@@ -50,7 +50,7 @@ class Projects::TriggersController < Projects::ApplicationController
flash[:alert] = "Could not remove the trigger." flash[:alert] = "Could not remove the trigger."
end end
redirect_to project_settings_ci_cd_path(@project), status: 302 redirect_to project_settings_ci_cd_path(@project), status: :found
end end
private private
......
...@@ -120,7 +120,7 @@ class Projects::WikisController < Projects::ApplicationController ...@@ -120,7 +120,7 @@ class Projects::WikisController < Projects::ApplicationController
rescue ProjectWiki::CouldNotCreateWikiError rescue ProjectWiki::CouldNotCreateWikiError
flash[:notice] = "Could not create Wiki Repository at this time. Please try again later." flash[:notice] = "Could not create Wiki Repository at this time. Please try again later."
redirect_to project_path(@project) redirect_to project_path(@project)
return false false
end end
def wiki_params def wiki_params
...@@ -129,7 +129,7 @@ class Projects::WikisController < Projects::ApplicationController ...@@ -129,7 +129,7 @@ class Projects::WikisController < Projects::ApplicationController
def build_page(args) def build_page(args)
WikiPage.new(@project_wiki).tap do |page| WikiPage.new(@project_wiki).tap do |page|
page.update_attributes(args) page.update_attributes(args) # rubocop:disable Rails/ActiveRecordAliases
end end
end end
end end
...@@ -133,7 +133,7 @@ class ProjectsController < Projects::ApplicationController ...@@ -133,7 +133,7 @@ class ProjectsController < Projects::ApplicationController
::Projects::DestroyService.new(@project, current_user, {}).async_execute ::Projects::DestroyService.new(@project, current_user, {}).async_execute
flash[:notice] = _("Project '%{project_name}' is in the process of being deleted.") % { project_name: @project.full_name } flash[:notice] = _("Project '%{project_name}' is in the process of being deleted.") % { project_name: @project.full_name }
redirect_to dashboard_projects_path, status: 302 redirect_to dashboard_projects_path, status: :found
rescue Projects::DestroyService::DestroyError => ex rescue Projects::DestroyService::DestroyError => ex
redirect_to edit_project_path(@project), status: 302, alert: ex.message redirect_to edit_project_path(@project), status: 302, alert: ex.message
end end
......
...@@ -32,7 +32,7 @@ class SessionsController < Devise::SessionsController ...@@ -32,7 +32,7 @@ class SessionsController < Devise::SessionsController
super do |resource| super do |resource|
# User has successfully signed in, so clear any unused reset token # User has successfully signed in, so clear any unused reset token
if resource.reset_password_token.present? if resource.reset_password_token.present?
resource.update_attributes(reset_password_token: nil, resource.update(reset_password_token: nil,
reset_password_sent_at: nil) reset_password_sent_at: nil)
end end
......
...@@ -13,7 +13,7 @@ module Sherlock ...@@ -13,7 +13,7 @@ module Sherlock
def destroy_all def destroy_all
Gitlab::Sherlock.collection.clear Gitlab::Sherlock.collection.clear
redirect_to :back, status: 302 redirect_to :back, status: :found
end end
end end
end end
...@@ -89,7 +89,7 @@ class SnippetsController < ApplicationController ...@@ -89,7 +89,7 @@ class SnippetsController < ApplicationController
@snippet.destroy @snippet.destroy
redirect_to snippets_path, status: 302 redirect_to snippets_path, status: :found
end end
protected protected
......
...@@ -5,9 +5,13 @@ module TimeHelper ...@@ -5,9 +5,13 @@ module TimeHelper
seconds = interval_in_seconds - minutes * 60 seconds = interval_in_seconds - minutes * 60
if minutes >= 1 if minutes >= 1
"#{pluralize(minutes, "minute")} #{pluralize(seconds, "second")}" if seconds % 60 == 0
pluralize(minutes, "minute")
else else
"#{pluralize(seconds, "second")}" [pluralize(minutes, "minute"), pluralize(seconds, "second")].to_sentence
end
else
pluralize(seconds, "second")
end end
end end
......
...@@ -371,7 +371,7 @@ module Ci ...@@ -371,7 +371,7 @@ module Ci
def update_coverage def update_coverage
coverage = trace.extract_coverage(coverage_regex) coverage = trace.extract_coverage(coverage_regex)
update_attributes(coverage: coverage) if coverage.present? update(coverage: coverage) if coverage.present?
end end
def parse_trace_sections! def parse_trace_sections!
...@@ -437,9 +437,9 @@ module Ci ...@@ -437,9 +437,9 @@ module Ci
end end
def artifacts_metadata_entry(path, **options) def artifacts_metadata_entry(path, **options)
artifacts_metadata.use_file do |metadata_path| artifacts_metadata.open do |metadata_stream|
metadata = Gitlab::Ci::Build::Artifacts::Metadata.new( metadata = Gitlab::Ci::Build::Artifacts::Metadata.new(
metadata_path, metadata_stream,
path, path,
**options) **options)
......
...@@ -23,7 +23,7 @@ module ProtectedRef ...@@ -23,7 +23,7 @@ module ProtectedRef
# If we don't `protected_branch` or `protected_tag` would be empty and # If we don't `protected_branch` or `protected_tag` would be empty and
# `project` cannot be delegated to it, which in turn would cause validations # `project` cannot be delegated to it, which in turn would cause validations
# to fail. # to fail.
has_many :"#{type}_access_levels", inverse_of: self.model_name.singular # rubocop:disable Cop/ActiveRecordDependent has_many :"#{type}_access_levels", inverse_of: self.model_name.singular
validates :"#{type}_access_levels", length: { is: 1, message: "are restricted to a single instance per #{self.model_name.human}." } validates :"#{type}_access_levels", length: { is: 1, message: "are restricted to a single instance per #{self.model_name.human}." }
......
...@@ -11,8 +11,8 @@ module Network ...@@ -11,8 +11,8 @@ module Network
@parent_spaces = [] @parent_spaces = []
end end
def method_missing(m, *args, &block) def method_missing(msg, *args, &block)
@commit.__send__(m, *args, &block) # rubocop:disable GitlabSecurity/PublicSend @commit.__send__(msg, *args, &block) # rubocop:disable GitlabSecurity/PublicSend
end end
def space def space
......
...@@ -107,7 +107,7 @@ class ProjectWiki ...@@ -107,7 +107,7 @@ class ProjectWiki
update_project_activity update_project_activity
rescue Gitlab::Git::Wiki::DuplicatePageError => e rescue Gitlab::Git::Wiki::DuplicatePageError => e
@error_message = "Duplicate page: #{e.message}" @error_message = "Duplicate page: #{e.message}"
return false false
end end
def update_page(page, content:, title: nil, format: :markdown, message: nil) def update_page(page, content:, title: nil, format: :markdown, message: nil)
......
...@@ -57,7 +57,7 @@ class RemoteMirror < ActiveRecord::Base ...@@ -57,7 +57,7 @@ class RemoteMirror < ActiveRecord::Base
Gitlab::Metrics.add_event(:remote_mirrors_finished, path: remote_mirror.project.full_path) Gitlab::Metrics.add_event(:remote_mirrors_finished, path: remote_mirror.project.full_path)
timestamp = Time.now timestamp = Time.now
remote_mirror.update_attributes!( remote_mirror.update!(
last_update_at: timestamp, last_successful_update_at: timestamp, last_error: nil last_update_at: timestamp, last_successful_update_at: timestamp, last_error: nil
) )
end end
......
...@@ -462,12 +462,12 @@ class Repository ...@@ -462,12 +462,12 @@ class Repository
expire_branches_cache expire_branches_cache
end end
def method_missing(m, *args, &block) def method_missing(msg, *args, &block)
if m == :lookup && !block_given? if msg == :lookup && !block_given?
lookup_cache[m] ||= {} lookup_cache[msg] ||= {}
lookup_cache[m][args.join(":")] ||= raw_repository.__send__(m, *args, &block) # rubocop:disable GitlabSecurity/PublicSend lookup_cache[msg][args.join(":")] ||= raw_repository.__send__(msg, *args, &block) # rubocop:disable GitlabSecurity/PublicSend
else else
raw_repository.__send__(m, *args, &block) # rubocop:disable GitlabSecurity/PublicSend raw_repository.__send__(msg, *args, &block) # rubocop:disable GitlabSecurity/PublicSend
end end
end end
......
...@@ -496,7 +496,7 @@ class User < ActiveRecord::Base ...@@ -496,7 +496,7 @@ class User < ActiveRecord::Base
def disable_two_factor! def disable_two_factor!
transaction do transaction do
update_attributes( update(
otp_required_for_login: false, otp_required_for_login: false,
encrypted_otp_secret: nil, encrypted_otp_secret: nil,
encrypted_otp_secret_iv: nil, encrypted_otp_secret_iv: nil,
...@@ -1053,7 +1053,7 @@ class User < ActiveRecord::Base ...@@ -1053,7 +1053,7 @@ class User < ActiveRecord::Base
return @global_notification_setting if defined?(@global_notification_setting) return @global_notification_setting if defined?(@global_notification_setting)
@global_notification_setting = notification_settings.find_or_initialize_by(source: nil) @global_notification_setting = notification_settings.find_or_initialize_by(source: nil)
@global_notification_setting.update_attributes(level: NotificationSetting.levels[DEFAULT_NOTIFICATION_LEVEL]) unless @global_notification_setting.persisted? @global_notification_setting.update(level: NotificationSetting.levels[DEFAULT_NOTIFICATION_LEVEL]) unless @global_notification_setting.persisted?
@global_notification_setting @global_notification_setting
end end
...@@ -1333,8 +1333,8 @@ class User < ActiveRecord::Base ...@@ -1333,8 +1333,8 @@ class User < ActiveRecord::Base
end end
end end
def self.unique_internal(scope, username, email_pattern, &b) def self.unique_internal(scope, username, email_pattern, &block)
scope.first || create_unique_internal(scope, username, email_pattern, &b) scope.first || create_unique_internal(scope, username, email_pattern, &block)
end end
def self.create_unique_internal(scope, username, email_pattern, &creation_block) def self.create_unique_internal(scope, username, email_pattern, &creation_block)
......
# rubocop:disable Rails/ActiveRecordAliases
class WikiPage class WikiPage
PageChangedError = Class.new(StandardError) PageChangedError = Class.new(StandardError)
PageRenameError = Class.new(StandardError) PageRenameError = Class.new(StandardError)
......
class EnvironmentPolicy < BasePolicy class EnvironmentPolicy < BasePolicy
delegate { @subject.project } delegate { @subject.project }
condition(:stop_action_allowed) do condition(:stop_with_deployment_allowed) do
@subject.stop_action? && can?(:update_build, @subject.stop_action) @subject.stop_action? && can?(:create_deployment) && can?(:update_build, @subject.stop_action)
end end
rule { can?(:create_deployment) & stop_action_allowed }.enable :stop_environment condition(:stop_with_update_allowed) do
!@subject.stop_action? && can?(:update_environment, @subject)
end
rule { stop_with_deployment_allowed | stop_with_update_allowed }.enable :stop_environment
end end
...@@ -7,7 +7,7 @@ class EnvironmentEntity < Grape::Entity ...@@ -7,7 +7,7 @@ class EnvironmentEntity < Grape::Entity
expose :external_url expose :external_url
expose :environment_type expose :environment_type
expose :last_deployment, using: DeploymentEntity expose :last_deployment, using: DeploymentEntity
expose :stop_action? expose :stop_action?, as: :has_stop_action
expose :metrics_path, if: -> (environment, _) { environment.has_metrics? } do |environment| expose :metrics_path, if: -> (environment, _) { environment.has_metrics? } do |environment|
metrics_project_environment_path(environment.project, environment) metrics_project_environment_path(environment.project, environment)
...@@ -31,4 +31,14 @@ class EnvironmentEntity < Grape::Entity ...@@ -31,4 +31,14 @@ class EnvironmentEntity < Grape::Entity
end end
expose :created_at, :updated_at expose :created_at, :updated_at
expose :can_stop do |environment|
environment.available? && can?(current_user, :stop_environment, environment)
end
private
def current_user
request.current_user
end
end end
...@@ -3,7 +3,7 @@ module Badges ...@@ -3,7 +3,7 @@ module Badges
# returns the updated badge # returns the updated badge
def execute(badge) def execute(badge)
if params.present? if params.present?
badge.update_attributes(params) badge.update(params)
end end
badge badge
......
...@@ -13,8 +13,6 @@ module Commits ...@@ -13,8 +13,6 @@ module Commits
# rubocop:disable GitlabSecurity/PublicSend # rubocop:disable GitlabSecurity/PublicSend
message = @commit.public_send(:"#{action}_message", current_user) message = @commit.public_send(:"#{action}_message", current_user)
# rubocop:disable GitlabSecurity/PublicSend
repository.public_send( repository.public_send(
action, action,
current_user, current_user,
......
...@@ -130,7 +130,7 @@ class IssuableBaseService < BaseService ...@@ -130,7 +130,7 @@ class IssuableBaseService < BaseService
def create_issuable(issuable, attributes, label_ids:) def create_issuable(issuable, attributes, label_ids:)
issuable.with_transaction_returning_status do issuable.with_transaction_returning_status do
if issuable.save if issuable.save
issuable.update_attributes(label_ids: label_ids) issuable.update(label_ids: label_ids)
end end
end end
end end
......
...@@ -6,7 +6,7 @@ module Members ...@@ -6,7 +6,7 @@ module Members
old_access_level = member.human_access old_access_level = member.human_access
if member.update_attributes(params) if member.update(params)
after_execute(action: permission, old_access_level: old_access_level, member: member) after_execute(action: permission, old_access_level: old_access_level, member: member)
end end
......
...@@ -26,7 +26,7 @@ module MergeRequests ...@@ -26,7 +26,7 @@ module MergeRequests
Gitlab::GitLogger.info("#{log_prefix} rebased to #{rebase_sha}") Gitlab::GitLogger.info("#{log_prefix} rebased to #{rebase_sha}")
merge_request.update_attributes(rebase_commit_sha: rebase_sha) merge_request.update(rebase_commit_sha: rebase_sha)
Gitlab::GitLogger.info("#{log_prefix} rebase SHA saved: #{rebase_sha}") Gitlab::GitLogger.info("#{log_prefix} rebase SHA saved: #{rebase_sha}")
......
...@@ -11,7 +11,7 @@ module Milestones ...@@ -11,7 +11,7 @@ module Milestones
end end
if params.present? if params.present?
milestone.update_attributes(params.except(:state_event)) milestone.update(params.except(:state_event))
end end
milestone milestone
......
...@@ -5,7 +5,7 @@ module Notes ...@@ -5,7 +5,7 @@ module Notes
old_mentioned_users = note.mentioned_users.to_a old_mentioned_users = note.mentioned_users.to_a
note.update_attributes(params.merge(updated_by: current_user)) note.update(params.merge(updated_by: current_user))
note.create_new_cross_references!(current_user) note.create_new_cross_references!(current_user)
if note.previous_changes.include?('note') if note.previous_changes.include?('note')
......
...@@ -10,16 +10,16 @@ module NotificationRecipientService ...@@ -10,16 +10,16 @@ module NotificationRecipientService
NotificationRecipient.new(user, *args).notifiable? NotificationRecipient.new(user, *args).notifiable?
end end
def self.build_recipients(*a) def self.build_recipients(*args)
Builder::Default.new(*a).notification_recipients Builder::Default.new(*args).notification_recipients
end end
def self.build_new_note_recipients(*a) def self.build_new_note_recipients(*args)
Builder::NewNote.new(*a).notification_recipients Builder::NewNote.new(*args).notification_recipients
end end
def self.build_merge_request_unmergeable_recipients(*a) def self.build_merge_request_unmergeable_recipients(*args)
Builder::MergeRequestUnmergeable.new(*a).notification_recipients Builder::MergeRequestUnmergeable.new(*args).notification_recipients
end end
module Builder module Builder
...@@ -44,7 +44,6 @@ module NotificationRecipientService ...@@ -44,7 +44,6 @@ module NotificationRecipientService
raise 'abstract' raise 'abstract'
end end
# rubocop:disable Rails/Delegate
def project def project
target.project target.project
end end
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment