diff --git a/.eslintrc.yml b/.eslintrc.yml index 3c304e957b4143de27329b80280867923ac3d537..15e02a41bee8542ea371026b6b8a224531cdbf6c 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -51,7 +51,6 @@ rules: no-jquery/no-animate-toggle: off no-jquery/no-event-shorthand: off no-jquery/no-serialize: error - no-jquery/no-sizzle: off promise/always-return: off promise/no-callback-in-promise: off overrides: diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js index 1a8f1c659a4205054c31b9b045dab7c215f12069..4195ea6425f1f1839ae11373288ece87d583327c 100644 --- a/app/assets/javascripts/notes.js +++ b/app/assets/javascripts/notes.js @@ -1359,7 +1359,8 @@ export default class Notes { const $systemNote = $(systemNote); const headerMessage = $systemNote .find('.note-text') - .find('p:first') + .find('p') + .first() .text() .replace(':', ''); diff --git a/app/assets/javascripts/notifications_dropdown.js b/app/assets/javascripts/notifications_dropdown.js index 08545dcea463ef4586622a76f11ef1d4874aedb2..ab87b0d973c1e2c9e54c11905809f35e766e7c7a 100644 --- a/app/assets/javascripts/notifications_dropdown.js +++ b/app/assets/javascripts/notifications_dropdown.js @@ -11,7 +11,9 @@ export default function notificationsDropdown() { } const notificationLevel = $(this).data('notificationLevel'); - const form = $(this).parents('.notification-form:first'); + const form = $(this) + .parents('.notification-form') + .first(); form.find('.js-notification-loading').toggleClass('fa-bell fa-spin fa-spinner'); if (form.hasClass('no-label')) { diff --git a/app/assets/javascripts/notifications_form.js b/app/assets/javascripts/notifications_form.js index 45f033f282282590f1f7f55b9c40aa383db3b2a6..dcd226795a63fd31c1d6dc2ea589ec018f592a1e 100644 --- a/app/assets/javascripts/notifications_form.js +++ b/app/assets/javascripts/notifications_form.js @@ -31,7 +31,7 @@ export default class NotificationsForm { } saveEvent($checkbox, $parent) { - const form = $parent.parents('form:first'); + const form = $parent.parents('form').first(); this.showCheckboxLoadingSpinner($parent); diff --git a/app/assets/javascripts/snippets/components/app.vue b/app/assets/javascripts/snippets/components/app.vue index bd2cb8e45954cb398540d6fb21fca0903b76a047..7a2145a800ccff96b98291aa8996f669027bb984 100644 --- a/app/assets/javascripts/snippets/components/app.vue +++ b/app/assets/javascripts/snippets/components/app.vue @@ -1,11 +1,13 @@ + diff --git a/app/assets/javascripts/tree.js b/app/assets/javascripts/tree.js index a530c4a99e272f46d2258606e4608bdb3762aa86..59276ee79d80c9d5c3f421b06896dff2203fd698 100644 --- a/app/assets/javascripts/tree.js +++ b/app/assets/javascripts/tree.js @@ -21,7 +21,9 @@ export default class TreeView { } }); // Show the "Loading commit data" for only the first element - $('span.log_loading:first').removeClass('hide'); + $('span.log_loading') + .first() + .removeClass('hide'); } initKeyNav() { diff --git a/doc/development/architecture.md b/doc/development/architecture.md index eff83da523be012b84ef0d3e11b56b6d26618644..778cc1aa1d7313e29d846dfdfdba4087575c0aea 100644 --- a/doc/development/architecture.md +++ b/doc/development/architecture.md @@ -625,7 +625,7 @@ Note: It is recommended to log into the `git` user using `sudo -i -u git` or `su ## GitLab.com -We've also detailed [our architecture of GitLab.com](https://about.gitlab.com/handbook/engineering/infrastructure/production-architecture/) but this is probably over the top unless you have millions of users. +We've also detailed [our architecture of GitLab.com](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/) but this is probably over the top unless you have millions of users. [alertmanager-omnibus]: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template [alertmanager-charts]: https://github.com/helm/charts/tree/master/stable/prometheus diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md index 8b3a5d893fe6f1b36fa2188a7d60a7e639cab3b2..11fb4b0b9be280dd2dcf1f3eed40f8a9208251dc 100644 --- a/doc/development/i18n/proofreader.md +++ b/doc/development/i18n/proofreader.md @@ -58,6 +58,7 @@ are very appreciative of the work done by translators and proofreaders! - Japanese - Hiroyuki Sato - [GitLab](https://gitlab.com/hiroponz), [Crowdin](https://crowdin.com/profile/hiroponz) - Tomo Dote - [GitLab](https://gitlab.com/fu7mu4), [Crowdin](https://crowdin.com/profile/fu7mu4) + - Hiromi Nozawa - [GitLab](https://gitlab.com/hir0mi), [Crowdin](https://crowdin.com/profile/hir0mi) - Korean - Chang-Ho Cha - [GitLab](https://gitlab.com/changho-cha), [Crowdin](https://crowdin.com/profile/zzazang) - Ji Hun Oh - [GitLab](https://gitlab.com/Baw-Appie), [Crowdin](https://crowdin.com/profile/BawAppie) diff --git a/doc/user/project/releases/img/custom_notifications_dropdown_v12_5.png b/doc/user/project/releases/img/custom_notifications_dropdown_v12_5.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5a8807d4ab0f4346c9392fdc6ed029593e30ff Binary files /dev/null and b/doc/user/project/releases/img/custom_notifications_dropdown_v12_5.png differ diff --git a/doc/user/project/releases/img/custom_notifications_new_release_v12_4.png b/doc/user/project/releases/img/custom_notifications_new_release_v12_4.png deleted file mode 100644 index 6b4231d5804d765bee1092e0dfec7dfddf72a276..0000000000000000000000000000000000000000 Binary files a/doc/user/project/releases/img/custom_notifications_new_release_v12_4.png and /dev/null differ diff --git a/doc/user/project/releases/img/custom_notifications_new_release_v12_5.png b/doc/user/project/releases/img/custom_notifications_new_release_v12_5.png new file mode 100644 index 0000000000000000000000000000000000000000..61af62ca4604107e137774fb8ae47d2443929e7f Binary files /dev/null and b/doc/user/project/releases/img/custom_notifications_new_release_v12_5.png differ diff --git a/doc/user/project/releases/img/new_tag_12_5.png b/doc/user/project/releases/img/new_tag_12_5.png index 6137ad2ee568b0fa639ad33d8cba37a9cea5ba10..9a6145d71c70d3646eb50b5658abf9b866c454e8 100644 Binary files a/doc/user/project/releases/img/new_tag_12_5.png and b/doc/user/project/releases/img/new_tag_12_5.png differ diff --git a/doc/user/project/releases/img/tags_12_5.png b/doc/user/project/releases/img/tags_12_5.png index 4c032f961253ac5b47d7f6cbb1bcc7029d35d2dc..c9673a5232db88febc174212912c5ae5f4dd9c54 100644 Binary files a/doc/user/project/releases/img/tags_12_5.png and b/doc/user/project/releases/img/tags_12_5.png differ diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md index 58e028c89beeaca6f7b9579ac45f08cc79bf39af..b5c4ad76fb9a94380b76af12e71b7facc14ef6ce 100644 --- a/doc/user/project/releases/index.md +++ b/doc/user/project/releases/index.md @@ -6,7 +6,7 @@ type: reference, howto > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/issues/41766) in GitLab 11.7. -It's typical to create a [Git tag](../../../university/training/topics/tags.md) at +It is typical to create a [Git tag](../../../university/training/topics/tags.md) at the moment of release to introduce a checkpoint in your source code history, but in most cases your users will need compiled objects or other assets output by your CI system to use them, not just the raw source @@ -38,7 +38,7 @@ Release descriptions are unrelated. Description supports [Markdown](../../markdo You can currently add the following types of assets to each Release: -- [Source code](#source-code): state of the repo at the time of the Release +- [Source code](#source-code): state of the repository at the time of the Release - [Links](#links): to content such as built binaries or documentation GitLab will support more asset types in the future, including objects such @@ -117,11 +117,14 @@ of GitLab. You can be notified by email when a new Release is created for your project. -To subscribe to these notifications, navigate to your **Project**'s landing page, then click on the -bell icon. Choose **Custom** from the dropdown menu. The -following modal window will be then displayed, from which you can select **New release** to complete your subscription to new Releases notifications. +To subscribe to Release notifications: -![Custom notification - New release](img/custom_notifications_new_release_v12_4.png) +1. Navigate to your **Project**'s landing page. +1. Click the bell icon (**Notification setting**). +1. Select **Custom** from the dropdown menu. + ![Custom notification - Dropdown menu](img/custom_notifications_dropdown_v12_5.png) +1. Select **New release**. + ![Custom notification - New release](img/custom_notifications_new_release_v12_5.png) ## Add release notes to Git tags @@ -145,7 +148,7 @@ You can also edit an existing tag to add release notes: ![tags](img/tags_12_5.png "Addition of note to an existing tag") -## Release Evidence +## Release evidence > [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/26019) in GitLab 12.6. @@ -154,11 +157,11 @@ parallel. This dataset will be a snapshot this new release (including linked milestones and issues) at moment of creation. Such collection of data will provide a chain of custody and facilitate processes like external audits, for example. -The gathered Evidence data is stored in the database upon creation of a new +The gathered evidence data is stored in the database upon creation of a new release as a JSON object. In GitLab 12.6, a link to -the Evidence data is provided for [each Release](#releases-list). +the evidence data is provided for [each Release](#releases-list). -Here's what this object can look like: +Here is what this object can look like: ```json { diff --git a/lib/gitlab/git.rb b/lib/gitlab/git.rb index 8d13c74dca2531065e57f979b2adb822b19103c1..c58fb1d0be35e119f99df4a70d78327dec621629 100644 --- a/lib/gitlab/git.rb +++ b/lib/gitlab/git.rb @@ -88,6 +88,7 @@ module Gitlab end def shas_eql?(sha1, sha2) + return true if sha1.nil? && sha2.nil? return false if sha1.nil? || sha2.nil? return false unless sha1.class == sha2.class diff --git a/lib/gitlab/sidekiq_logging/structured_logger.rb b/lib/gitlab/sidekiq_logging/structured_logger.rb index ca9e3b8428cc32cf902da1d2500d85015a51c0da..bcc2e77714d3e9d6f23b239cf8ad2a1c38f8d8ba 100644 --- a/lib/gitlab/sidekiq_logging/structured_logger.rb +++ b/lib/gitlab/sidekiq_logging/structured_logger.rb @@ -117,7 +117,7 @@ module Gitlab def format_time(timestamp) return timestamp if timestamp.is_a?(String) - Time.at(timestamp).utc.iso8601(6) + Time.at(timestamp).utc.iso8601(3) end def limited_job_args(args) diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb index a96bfde49f354c4717a59c081fc8a94c6819fdbd..54014ff7067b1690a40f2f00c874780254be5af4 100644 --- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb +++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb @@ -50,7 +50,8 @@ module QA end end - describe 'Auto DevOps support', :orchestrated, :kubernetes do + # Failure issue: https://gitlab.com/gitlab-org/gitlab/issues/118481 + describe 'Auto DevOps support', :orchestrated, :kubernetes, :quarantine do context 'when rbac is enabled' do before(:all) do @cluster = Service::KubernetesCluster.new.create! diff --git a/spec/frontend/snippets/components/snippet_title_spec.js b/spec/frontend/snippets/components/snippet_title_spec.js new file mode 100644 index 0000000000000000000000000000000000000000..fb2193b26b0f93b33793beda66e02c3c333f46e3 --- /dev/null +++ b/spec/frontend/snippets/components/snippet_title_spec.js @@ -0,0 +1,72 @@ +import SnippetTitle from '~/snippets/components/snippet_title.vue'; +import { GlSprintf } from '@gitlab/ui'; +import { shallowMount } from '@vue/test-utils'; + +describe('Snippet header component', () => { + let wrapper; + const title = 'The property of Thor'; + const description = 'Do not touch this hammer'; + const snippet = { + snippet: { + title, + description, + }, + }; + + function createComponent({ props = snippet } = {}) { + const defaultProps = Object.assign({}, props); + + wrapper = shallowMount(SnippetTitle, { + sync: false, + propsData: { + ...defaultProps, + }, + }); + } + + afterEach(() => { + wrapper.destroy(); + }); + + it('renders itself', () => { + createComponent(); + expect(wrapper.find('.snippet-header').exists()).toBe(true); + }); + + it('renders snippets title and description', () => { + createComponent(); + expect(wrapper.text().trim()).toContain(title); + expect(wrapper.text().trim()).toContain(description); + }); + + it('does not render recent changes time stamp if there were no updates', () => { + createComponent(); + expect(wrapper.find(GlSprintf).exists()).toBe(false); + }); + + it('does not render recent changes time stamp if the time for creation and updates match', () => { + const props = Object.assign(snippet, { + snippet: { + ...snippet.snippet, + createdAt: '2019-12-16T21:45:36Z', + updatedAt: '2019-12-16T21:45:36Z', + }, + }); + createComponent({ props }); + + expect(wrapper.find(GlSprintf).exists()).toBe(false); + }); + + it('renders translated string with most recent changes timestamp if changes were made', () => { + const props = Object.assign(snippet, { + snippet: { + ...snippet.snippet, + createdAt: '2019-12-16T21:45:36Z', + updatedAt: '2019-15-16T21:45:36Z', + }, + }); + createComponent({ props }); + + expect(wrapper.find(GlSprintf).exists()).toBe(true); + }); +}); diff --git a/spec/lib/gitlab/git_spec.rb b/spec/lib/gitlab/git_spec.rb index fbc49e05c37e474078817bd796c3d313517a893c..cb07bbdbaaacf89b5d11b1b542543d10ed98ad12 100644 --- a/spec/lib/gitlab/git_spec.rb +++ b/spec/lib/gitlab/git_spec.rb @@ -73,7 +73,8 @@ describe Gitlab::Git do [sha, short_sha, true], [sha, sha.reverse, false], [sha, too_short_sha, false], - [sha, nil, false] + [sha, nil, false], + [nil, nil, true] ] end diff --git a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb index cb870cc996b11dc7719d56bc5585090607df93ef..772b0168a2add55b7b8aba1c29a7f6782ac8ac6e 100644 --- a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb +++ b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb @@ -4,7 +4,7 @@ require 'fast_spec_helper' describe Gitlab::SidekiqLogging::StructuredLogger do describe '#call' do - let(:timestamp) { Time.iso8601('2018-01-01T12:00:00Z') } + let(:timestamp) { Time.iso8601('2018-01-01T12:00:00.000Z') } let(:created_at) { timestamp - 1.second } let(:scheduling_latency_s) { 1.0 } @@ -30,8 +30,8 @@ describe Gitlab::SidekiqLogging::StructuredLogger do 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: start', 'job_status' => 'start', 'pid' => Process.pid, - 'created_at' => created_at.iso8601(6), - 'enqueued_at' => created_at.iso8601(6), + 'created_at' => created_at.iso8601(3), + 'enqueued_at' => created_at.iso8601(3), 'scheduling_latency_s' => scheduling_latency_s ) end @@ -40,7 +40,7 @@ describe Gitlab::SidekiqLogging::StructuredLogger do 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: done: 0.0 sec', 'job_status' => 'done', 'duration' => 0.0, - "completed_at" => timestamp.iso8601(6), + "completed_at" => timestamp.iso8601(3), "cpu_s" => 1.111112 ) end @@ -145,7 +145,7 @@ describe Gitlab::SidekiqLogging::StructuredLogger do end context 'with latency' do - let(:created_at) { Time.iso8601('2018-01-01T10:00:00Z') } + let(:created_at) { Time.iso8601('2018-01-01T10:00:00.000Z') } let(:scheduling_latency_s) { 7200.0 } it 'logs with scheduling latency' do diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb index 1c1b550c69b05d28ca1b51e4055c986667d0f26c..930ec8892066bf581051de8e240650f1fd49d3e3 100644 --- a/spec/models/commit_spec.rb +++ b/spec/models/commit_spec.rb @@ -63,6 +63,20 @@ describe Commit do end end + describe '#diff_refs' do + it 'is equal to itself' do + expect(commit.diff_refs).to eq(commit.diff_refs) + end + + context 'from a factory' do + let(:commit) { create(:commit) } + + it 'is equal to itself' do + expect(commit.diff_refs).to eq(commit.diff_refs) + end + end + end + describe '#author', :request_store do it 'looks up the author in a case-insensitive way' do user = create(:user, email: commit.author_email.upcase)