diff options
21 files changed, 196 insertions, 29 deletions
diff --git a/Dangerfile b/Dangerfile index 715a2bcbbae..32f4b4d23c3 100644 --- a/Dangerfile +++ b/Dangerfile @@ -12,3 +12,4 @@ danger.import_dangerfile(path: 'danger/duplicate_yarn_dependencies') danger.import_dangerfile(path: 'danger/prettier') danger.import_dangerfile(path: 'danger/eslint') danger.import_dangerfile(path: 'danger/roulette') +danger.import_dangerfile(path: 'danger/single_codebase') diff --git a/app/assets/javascripts/diffs/components/compare_versions.vue b/app/assets/javascripts/diffs/components/compare_versions.vue index 0bf2dde8b96..fe49dfff10b 100644 --- a/app/assets/javascripts/diffs/components/compare_versions.vue +++ b/app/assets/javascripts/diffs/components/compare_versions.vue @@ -125,9 +125,9 @@ export default { > {{ __('Show latest version') }} </gl-button> - <a v-show="hasCollapsedFile" class="btn btn-default append-right-8" @click="expandAllFiles"> + <gl-button v-show="hasCollapsedFile" class="append-right-8" @click="expandAllFiles"> {{ __('Expand all') }} - </a> + </gl-button> <settings-dropdown /> </div> </div> diff --git a/app/assets/javascripts/diffs/components/diff_file.vue b/app/assets/javascripts/diffs/components/diff_file.vue index 1141a197c6a..0e779e1be9a 100644 --- a/app/assets/javascripts/diffs/components/diff_file.vue +++ b/app/assets/javascripts/diffs/components/diff_file.vue @@ -73,13 +73,23 @@ export default { if (!newVal && oldVal && !this.hasDiffLines) { this.handleLoadCollapsedDiff(); } + + this.setFileCollapsed({ filePath: this.file.file_path, collapsed: newVal }); + }, + 'file.viewer.collapsed': function setIsCollapsed(newVal) { + this.isCollapsed = newVal; }, }, created() { eventHub.$on(`loadCollapsedDiff/${this.file.file_hash}`, this.handleLoadCollapsedDiff); }, methods: { - ...mapActions('diffs', ['loadCollapsedDiff', 'assignDiscussionsToDiff', 'setRenderIt']), + ...mapActions('diffs', [ + 'loadCollapsedDiff', + 'assignDiscussionsToDiff', + 'setRenderIt', + 'setFileCollapsed', + ]), handleToggle() { if (!this.hasDiffLines) { this.handleLoadCollapsedDiff(); diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index 57ddc923a3e..4a04216d893 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -344,5 +344,8 @@ export const toggleFullDiff = ({ dispatch, getters, state }, filePath) => { } }; +export const setFileCollapsed = ({ commit }, { filePath, collapsed }) => + commit(types.SET_FILE_COLLAPSED, { filePath, collapsed }); + // prevent babel-plugin-rewire from generating an invalid default during karma tests export default () => {}; diff --git a/app/assets/javascripts/diffs/store/mutation_types.js b/app/assets/javascripts/diffs/store/mutation_types.js index b441b1de451..adf56eba3f8 100644 --- a/app/assets/javascripts/diffs/store/mutation_types.js +++ b/app/assets/javascripts/diffs/store/mutation_types.js @@ -27,3 +27,4 @@ export const TOGGLE_FILE_FINDER_VISIBLE = 'TOGGLE_FILE_FINDER_VISIBLE'; export const REQUEST_FULL_DIFF = 'REQUEST_FULL_DIFF'; export const RECEIVE_FULL_DIFF_SUCCESS = 'RECEIVE_FULL_DIFF_SUCCESS'; export const RECEIVE_FULL_DIFF_ERROR = 'RECEIVE_FULL_DIFF_ERROR'; +export const SET_FILE_COLLAPSED = 'SET_FILE_COLLAPSED'; diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js index 45187d93fef..856f4eaf00a 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -104,7 +104,10 @@ export default { [types.EXPAND_ALL_FILES](state) { state.diffFiles = state.diffFiles.map(file => ({ ...file, - collapsed: false, + viewer: { + ...file.viewer, + collapsed: false, + }, })); }, @@ -300,4 +303,11 @@ export default { }), }); }, + [types.SET_FILE_COLLAPSED](state, { filePath, collapsed }) { + const file = state.diffFiles.find(f => f.file_path === filePath); + + if (file && file.viewer) { + file.viewer.collapsed = collapsed; + } + }, }; diff --git a/app/assets/stylesheets/pages/stat_graph.scss b/app/assets/stylesheets/pages/stat_graph.scss index d331edaa302..79186480605 100644 --- a/app/assets/stylesheets/pages/stat_graph.scss +++ b/app/assets/stylesheets/pages/stat_graph.scss @@ -25,6 +25,8 @@ } #contributors { + flex: 1; + .contributors-list { margin: 0 0 10px; list-style: none; diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml index 39c0c113793..dbd01c3c61a 100644 --- a/app/views/groups/_home_panel.html.haml +++ b/app/views/groups/_home_panel.html.haml @@ -13,7 +13,7 @@ = visibility_level_icon(@group.visibility_level, fw: false, options: {class: 'icon'}) .home-panel-metadata.d-flex.align-items-center.text-secondary %span - = _("Group") + = _("Group ID: %{group_id}") % { group_id: @group.id } - if current_user %span.access-request-links.prepend-left-8 = render 'shared/members/access_request_links', source: @group diff --git a/changelogs/unreleased/expose-group-id-on-home-panel.yml b/changelogs/unreleased/expose-group-id-on-home-panel.yml new file mode 100644 index 00000000000..1efe15a6e1a --- /dev/null +++ b/changelogs/unreleased/expose-group-id-on-home-panel.yml @@ -0,0 +1,5 @@ +--- +title: Expose group id on home panel +merge_request: 25897 +author: Peter Marko +type: added diff --git a/config/karma.config.js b/config/karma.config.js index e1d7c30b1c2..1012a713eb6 100644 --- a/config/karma.config.js +++ b/config/karma.config.js @@ -112,13 +112,13 @@ module.exports = function(config) { preprocessors: { 'spec/javascripts/**/*.js': ['webpack', 'sourcemap'], }, - reporters: ['progress'], + reporters: ['mocha'], webpack: webpackConfig, webpackMiddleware: { stats: 'errors-only' }, }; if (process.env.CI) { - karmaConfig.reporters = ['mocha', 'junit']; + karmaConfig.reporters.push('junit'); karmaConfig.junitReporter = { outputFile: 'junit_karma.xml', useBrowserName: false, diff --git a/danger/roulette/Dangerfile b/danger/roulette/Dangerfile index 6cf54d0f854..808bc96a0a0 100644 --- a/danger/roulette/Dangerfile +++ b/danger/roulette/Dangerfile @@ -58,7 +58,9 @@ changes = helper.changes_by_category changes.delete(:none) categories = changes.keys - [:unknown] -unless changes.empty? +# Single codebase MRs are reviewed using a slightly different process, so we +# disable the review roulette for such MRs. +if changes.any? && !gitlab.mr_labels.include?('single codebase') team = begin helper.project_team diff --git a/danger/single_codebase/Dangerfile b/danger/single_codebase/Dangerfile new file mode 100644 index 00000000000..a5938cd6783 --- /dev/null +++ b/danger/single_codebase/Dangerfile @@ -0,0 +1,56 @@ +def mention_single_codebase_approvers + frontend_maintainers = %w(@filipa @iamphill) + backend_maintainers = %w(@rspeicher @rymai @yorickpeterse @godfat) + + rows = [] + users = [] + + if gitlab.mr_labels.include?('frontend') + frontend_maintainer = frontend_maintainers.sample + + rows << "| ~frontend | `#{frontend_maintainer}`" + users << frontend_maintainer + end + + if gitlab.mr_labels.include?('backend') + backend_maintainer = backend_maintainers.sample + + rows << "| ~backend | `#{backend_maintainer}`" + users << backend_maintainer + end + + if rows.empty? + backup_maintainer = backend_maintainers.sample + + rows << "| ~frontend / ~backend | `#{backup_maintainer}`" + users << backup_maintainer + end + + markdown(<<~MARKDOWN.strip) + ## Single codebase changes + + This merge request contains changes related to the work of moving towards a + [single codebase](https://gitlab.com/groups/gitlab-org/-/epics/802) for + Community Edition and Enterprise Edition. These changes will need to be + reviewed and approved by the following engineers: + + | Category | Reviewer + |----------|--------- + #{rows.join("\n")} + + To make sure this happens, please follow these steps: + + 1. Add all of the mentioned users to the list of merge request approvals. + 2. Assign the merge request to the first person in the above list. + + If you are a reviewer, please follow these steps: + + 1. Review the merge request. If it is good to go, approve it. + 2. Once approved, assign to the next person in the above list. If you are + the last person in the list, merge the merge request. + MARKDOWN +end + +if gitlab.mr_labels.include?('single codebase') + mention_single_codebase_approvers +end diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md index 5b66e513a76..feeba36b073 100644 --- a/doc/development/testing_guide/frontend_testing.md +++ b/doc/development/testing_guide/frontend_testing.md @@ -281,25 +281,6 @@ Information on setting up and running RSpec integration tests with ## Gotchas -### Errors due to use of unsupported JavaScript features - -Similar errors will be thrown if you're using JavaScript features not yet -supported by the PhantomJS test runner which is used for both Karma and RSpec -tests. We polyfill some JavaScript objects for older browsers, but some -features are still unavailable: - -- Array.from -- Array.first -- Async functions -- Generators -- Array destructuring -- For..Of -- Symbol/Symbol.iterator -- Spread - -Until these are polyfilled appropriately, they should not be used. Please -update this list with additional unsupported features. - ### RSpec errors due to JavaScript By default RSpec unit tests will not run JavaScript in the headless browser diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md index dcd5e6e2245..c78cfc41678 100644 --- a/doc/raketasks/backup_restore.md +++ b/doc/raketasks/backup_restore.md @@ -100,6 +100,13 @@ the gitlab task runner pod via `kubectl`. Refer to [backing up a GitLab installa kubectl exec -it <gitlab task-runner pod> backup-utility ``` +Similarly to the Kubernetes case, if you have scaled out your GitLab +cluster to use multiple application servers, you should pick a +designated node (that won't be auto-scaled away) for running the +backup rake task. Because the backup rake task is tightly coupled to +the main Rails application, this is typically a node on which you're +also running Unicorn/Puma and/or Sidekiq. + Example output: ``` diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 006ec1ec56f..df69e86c1ad 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -3789,6 +3789,9 @@ msgstr "" msgid "Group ID" msgstr "" +msgid "Group ID: %{group_id}" +msgstr "" + msgid "Group Runners" msgstr "" diff --git a/spec/features/merge_request/user_views_diffs_spec.rb b/spec/features/merge_request/user_views_diffs_spec.rb index 0434db04113..74342b16cb2 100644 --- a/spec/features/merge_request/user_views_diffs_spec.rb +++ b/spec/features/merge_request/user_views_diffs_spec.rb @@ -34,6 +34,16 @@ describe 'User views diffs', :js do expect(page).not_to have_selector('.mr-loading-status .loading', visible: true) end + it 'expands all diffs' do + first('#a5cc2925ca8258af241be7e5b0381edf30266302 .js-file-title').click + + expect(page).to have_button('Expand all') + + click_button 'Expand all' + + expect(page).not_to have_button('Expand all') + end + context 'when in the inline view' do include_examples 'unfold diffs' end diff --git a/spec/javascripts/diffs/components/diff_file_spec.js b/spec/javascripts/diffs/components/diff_file_spec.js index ba04c8c4a4c..d9b298e84da 100644 --- a/spec/javascripts/diffs/components/diff_file_spec.js +++ b/spec/javascripts/diffs/components/diff_file_spec.js @@ -109,6 +109,31 @@ describe('DiffFile', () => { done(); }); }); + + it('should update store state', done => { + spyOn(vm.$store, 'dispatch'); + + vm.isCollapsed = true; + + vm.$nextTick(() => { + expect(vm.$store.dispatch).toHaveBeenCalledWith('diffs/setFileCollapsed', { + filePath: vm.file.file_path, + collapsed: true, + }); + + done(); + }); + }); + + it('updates local state when changing file state', done => { + vm.file.viewer.collapsed = true; + + vm.$nextTick(() => { + expect(vm.isCollapsed).toBe(true); + + done(); + }); + }); }); }); diff --git a/spec/javascripts/diffs/store/actions_spec.js b/spec/javascripts/diffs/store/actions_spec.js index 070bfb2ccd0..6c637097893 100644 --- a/spec/javascripts/diffs/store/actions_spec.js +++ b/spec/javascripts/diffs/store/actions_spec.js @@ -35,6 +35,7 @@ import actions, { receiveFullDiffError, fetchFullDiff, toggleFullDiff, + setFileCollapsed, } from '~/diffs/store/actions'; import eventHub from '~/notes/event_hub'; import * as types from '~/diffs/store/mutation_types'; @@ -977,4 +978,17 @@ describe('DiffsStoreActions', () => { ); }); }); + + describe('setFileCollapsed', () => { + it('commits SET_FILE_COLLAPSED', done => { + testAction( + setFileCollapsed, + { filePath: 'test', collapsed: true }, + null, + [{ type: types.SET_FILE_COLLAPSED, payload: { filePath: 'test', collapsed: true } }], + [], + done, + ); + }); + }); }); diff --git a/spec/javascripts/diffs/store/mutations_spec.js b/spec/javascripts/diffs/store/mutations_spec.js index 270e7d75666..5556a994a14 100644 --- a/spec/javascripts/diffs/store/mutations_spec.js +++ b/spec/javascripts/diffs/store/mutations_spec.js @@ -58,13 +58,15 @@ describe('DiffsStoreMutations', () => { describe('EXPAND_ALL_FILES', () => { it('should change the collapsed prop from diffFiles', () => { const diffFile = { - collapsed: true, + viewer: { + collapsed: true, + }, }; const state = { expandAllFiles: true, diffFiles: [diffFile] }; mutations[types.EXPAND_ALL_FILES](state); - expect(state.diffFiles[0].collapsed).toEqual(false); + expect(state.diffFiles[0].viewer.collapsed).toEqual(false); }); }); @@ -742,4 +744,16 @@ describe('DiffsStoreMutations', () => { expect(state.diffFiles[0].isShowingFullFile).toBe(true); }); }); + + describe('SET_FILE_COLLAPSED', () => { + it('sets collapsed', () => { + const state = { + diffFiles: [{ file_path: 'test', viewer: { collapsed: false } }], + }; + + mutations[types.SET_FILE_COLLAPSED](state, { filePath: 'test', collapsed: true }); + + expect(state.diffFiles[0].viewer.collapsed).toBe(true); + }); + }); }); diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb index cd85151ec1b..52ce4d66b4a 100644 --- a/spec/requests/api/internal_spec.rb +++ b/spec/requests/api/internal_spec.rb @@ -237,6 +237,14 @@ describe API::Internal do expect(json_response['name']).to eq(user.name) end + + it 'responds successfully when a user is not found' do + get(api("/internal/discover"), params: { username: 'noone', secret_token: secret_token }) + + expect(response).to have_gitlab_http_status(200) + + expect(response.body).to eq('null') + end end describe "GET /internal/authorized_keys" do diff --git a/spec/views/groups/_home_panel.html.haml_spec.rb b/spec/views/groups/_home_panel.html.haml_spec.rb new file mode 100644 index 00000000000..91c5ca261b9 --- /dev/null +++ b/spec/views/groups/_home_panel.html.haml_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe 'groups/_home_panel' do + let(:group) { create(:group) } + + before do + assign(:group, group) + end + + it 'renders the group ID' do + render + + expect(rendered).to have_content("Group ID: #{group.id}") + end +end |