Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-12-15 12:10:00 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-12-15 12:10:00 +0300
commita79324ad1f94b0c497a89c1ee35bd7d33f318008 (patch)
tree51758517c955d805e343b5b640724964100219f9 /app
parent4f33294e27e82f7d281c7ff7e390aa6c2ea32cb9 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/blob/file_template_mediator.js7
-rw-r--r--app/assets/javascripts/blob_edit/edit_blob.js3
-rw-r--r--app/assets/javascripts/diffs/store/actions.js8
-rw-r--r--app/assets/javascripts/diffs/store/mutations.js7
-rw-r--r--app/assets/javascripts/diffs/store/utils.js4
-rw-r--r--app/assets/javascripts/diffs/utils/diff_file.js22
-rw-r--r--app/assets/javascripts/ide/lib/common/model.js3
-rw-r--r--app/assets/javascripts/ide/utils.js4
-rw-r--r--app/assets/javascripts/lib/utils/text_utility.js10
-rw-r--r--app/controllers/groups/group_members_controller.rb2
-rw-r--r--app/controllers/import/bulk_imports_controller.rb4
-rw-r--r--app/models/merge_request_diff.rb26
-rw-r--r--app/models/raw_usage_data.rb2
-rw-r--r--app/serializers/diffs_metadata_entity.rb4
-rw-r--r--app/serializers/import/bulk_import_entity.rb4
-rw-r--r--app/serializers/paginated_diff_entity.rb2
-rw-r--r--app/services/submit_usage_ping_service.rb2
-rw-r--r--app/views/groups/group_members/index.html.haml2
-rw-r--r--app/views/projects/tags/_tag.html.haml3
19 files changed, 60 insertions, 59 deletions
diff --git a/app/assets/javascripts/blob/file_template_mediator.js b/app/assets/javascripts/blob/file_template_mediator.js
index 5058ca7122d..8f64bda1ba6 100644
--- a/app/assets/javascripts/blob/file_template_mediator.js
+++ b/app/assets/javascripts/blob/file_template_mediator.js
@@ -82,7 +82,6 @@ export default class FileTemplateMediator {
initPageEvents() {
this.listenForFilenameInput();
- this.prepFileContentForSubmit();
this.listenForPreviewMode();
}
@@ -92,12 +91,6 @@ export default class FileTemplateMediator {
});
}
- prepFileContentForSubmit() {
- this.$commitForm.submit(() => {
- this.$fileContent.val(this.editor.getValue());
- });
- }
-
listenForPreviewMode() {
this.$navLinks.on('click', 'a', e => {
const urlPieces = e.target.href.split('#');
diff --git a/app/assets/javascripts/blob_edit/edit_blob.js b/app/assets/javascripts/blob_edit/edit_blob.js
index c8a31d96a69..1bc51aa1d6f 100644
--- a/app/assets/javascripts/blob_edit/edit_blob.js
+++ b/app/assets/javascripts/blob_edit/edit_blob.js
@@ -6,6 +6,7 @@ import TemplateSelectorMediator from '../blob/file_template_mediator';
import { addEditorMarkdownListeners } from '~/lib/utils/text_markdown';
import EditorLite from '~/editor/editor_lite';
import { FileTemplateExtension } from '~/editor/editor_file_template_ext';
+import { insertFinalNewline } from '~/lib/utils/text_utility';
export default class EditBlob {
// The options object has:
@@ -49,7 +50,7 @@ export default class EditBlob {
});
form.addEventListener('submit', () => {
- fileContentEl.value = this.editor.getValue();
+ fileContentEl.value = insertFinalNewline(this.editor.getValue());
});
}
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index 8c72971682d..5b410051705 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -191,7 +191,13 @@ export const fetchDiffFilesMeta = ({ commit, state }) => {
commit(types.SET_MERGE_REQUEST_DIFFS, data.merge_request_diffs || []);
commit(types.SET_DIFF_METADATA, strippedData);
- worker.postMessage(prepareDiffData(data, state.diffFiles));
+ worker.postMessage(
+ prepareDiffData({
+ diff: data,
+ priorFiles: state.diffFiles,
+ meta: true,
+ }),
+ );
return data;
})
diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js
index 90940d82226..19122c3096f 100644
--- a/app/assets/javascripts/diffs/store/mutations.js
+++ b/app/assets/javascripts/diffs/store/mutations.js
@@ -73,7 +73,10 @@ export default {
},
[types.SET_DIFF_DATA_BATCH](state, data) {
- const files = prepareDiffData(data, state.diffFiles);
+ const files = prepareDiffData({
+ diff: data,
+ priorFiles: state.diffFiles,
+ });
Object.assign(state, {
...convertObjectPropsToCamelCase(data),
@@ -143,7 +146,7 @@ export default {
},
[types.ADD_COLLAPSED_DIFFS](state, { file, data }) {
- const files = prepareDiffData(data);
+ const files = prepareDiffData({ diff: data });
const [newFileData] = files.filter(f => f.file_hash === file.file_hash);
const selectedFile = state.diffFiles.find(f => f.file_hash === file.file_hash);
Object.assign(selectedFile, { ...newFileData });
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index 8949c8cd23e..1839df12c96 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -386,9 +386,9 @@ function deduplicateFilesList(files) {
return Object.values(dedupedFiles);
}
-export function prepareDiffData(diff, priorFiles = []) {
+export function prepareDiffData({ diff, priorFiles = [], meta = false }) {
const cleanedFiles = (diff.diff_files || [])
- .map((file, index, allFiles) => prepareRawDiffFile({ file, allFiles }))
+ .map((file, index, allFiles) => prepareRawDiffFile({ file, allFiles, meta }))
.map(ensureBasicDiffFileLines)
.map(prepareDiffFileLines)
.map(finalizeDiffFile);
diff --git a/app/assets/javascripts/diffs/utils/diff_file.js b/app/assets/javascripts/diffs/utils/diff_file.js
index aa801783c57..67f117bc4d3 100644
--- a/app/assets/javascripts/diffs/utils/diff_file.js
+++ b/app/assets/javascripts/diffs/utils/diff_file.js
@@ -4,6 +4,7 @@ import {
DIFF_FILE_MANUAL_COLLAPSE,
DIFF_FILE_AUTOMATIC_COLLAPSE,
} from '../constants';
+import { uuids } from './uuids';
function fileSymlinkInformation(file, fileList) {
const duplicates = fileList.filter(iteratedFile => iteratedFile.file_hash === file.file_hash);
@@ -32,16 +33,29 @@ function collapsed(file) {
};
}
-export function prepareRawDiffFile({ file, allFiles }) {
- Object.assign(file, {
+function identifier(file) {
+ return uuids({
+ seeds: [file.file_identifier_hash, file.content_sha],
+ })[0];
+}
+
+export function prepareRawDiffFile({ file, allFiles, meta = false }) {
+ const additionalProperties = {
brokenSymlink: fileSymlinkInformation(file, allFiles),
viewer: {
...file.viewer,
...collapsed(file),
},
- });
+ };
+
+ // It's possible, but not confirmed, that `content_sha` isn't available sometimes
+ // See: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49506#note_464692057
+ // We don't want duplicate IDs if that's the case, so we just don't assign an ID
+ if (!meta && file.content_sha) {
+ additionalProperties.id = identifier(file);
+ }
- return file;
+ return Object.assign(file, additionalProperties);
}
export function collapsedType(file) {
diff --git a/app/assets/javascripts/ide/lib/common/model.js b/app/assets/javascripts/ide/lib/common/model.js
index c5bb00c3dee..2471b3627ce 100644
--- a/app/assets/javascripts/ide/lib/common/model.js
+++ b/app/assets/javascripts/ide/lib/common/model.js
@@ -1,7 +1,8 @@
import { editor as monacoEditor, Uri } from 'monaco-editor';
import Disposable from './disposable';
import eventHub from '../../eventhub';
-import { trimTrailingWhitespace, insertFinalNewline } from '../../utils';
+import { trimTrailingWhitespace } from '../../utils';
+import { insertFinalNewline } from '~/lib/utils/text_utility';
import { defaultModelOptions } from '../editor_options';
export default class Model {
diff --git a/app/assets/javascripts/ide/utils.js b/app/assets/javascripts/ide/utils.js
index 1ca1b971de1..43276f32322 100644
--- a/app/assets/javascripts/ide/utils.js
+++ b/app/assets/javascripts/ide/utils.js
@@ -97,10 +97,6 @@ export function trimTrailingWhitespace(content) {
return content.replace(/[^\S\r\n]+$/gm, '');
}
-export function insertFinalNewline(content, eol = '\n') {
- return content.slice(-eol.length) !== eol ? `${content}${eol}` : content;
-}
-
export function getPathParents(path, maxDepth = Infinity) {
const pathComponents = path.split('/');
const paths = [];
diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js
index a81ca3f211f..c398874db24 100644
--- a/app/assets/javascripts/lib/utils/text_utility.js
+++ b/app/assets/javascripts/lib/utils/text_utility.js
@@ -411,3 +411,13 @@ export const hasContent = obj => isString(obj) && obj.trim() !== '';
export const isValidSha1Hash = str => {
return /^[0-9a-f]{5,40}$/.test(str);
};
+
+/**
+ * Adds a final newline to the content if it doesn't already exist
+ *
+ * @param {*} content Content
+ * @param {*} endOfLine Type of newline: CRLF='\r\n', LF='\n', CR='\r'
+ */
+export function insertFinalNewline(content, endOfLine = '\n') {
+ return content.slice(-endOfLine.length) !== endOfLine ? `${content}${endOfLine}` : content;
+}
diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb
index 8f836010d70..d1b09e1b49e 100644
--- a/app/controllers/groups/group_members_controller.rb
+++ b/app/controllers/groups/group_members_controller.rb
@@ -15,7 +15,7 @@ class Groups::GroupMembersController < Groups::ApplicationController
before_action :authorize_admin_group_member!, except: admin_not_required_endpoints
before_action do
- push_frontend_feature_flag(:group_members_filtered_search, @group)
+ push_frontend_feature_flag(:group_members_filtered_search, @group, default_enabled: true)
end
skip_before_action :check_two_factor_requirement, only: :leave
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index 2da5832a1ef..705e0c136ef 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -57,7 +57,7 @@ class Import::BulkImportsController < ApplicationController
end
def create_params
- params.permit(:bulk_import, [*bulk_import_params])
+ params.permit(bulk_import: bulk_import_params)[:bulk_import]
end
def bulk_import_params
@@ -127,7 +127,7 @@ class Import::BulkImportsController < ApplicationController
def credentials
{
url: session[url_key],
- access_token: [access_token_key]
+ access_token: session[access_token_key]
}
end
end
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index 6f063c607b3..d23e66b9697 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -745,31 +745,7 @@ class MergeRequestDiff < ApplicationRecord
def sort_diffs(diffs)
return diffs unless sort_diffs?
- diffs.sort do |a, b|
- compare_path_parts(path_parts(a), path_parts(b))
- end
- end
-
- def path_parts(diff)
- (diff.new_path.presence || diff.old_path).split(::File::SEPARATOR)
- end
-
- # Used for sorting the file paths by:
- # 1. Directory name
- # 2. Depth
- # 3. File name
- def compare_path_parts(a_parts, b_parts)
- a_part = a_parts.shift
- b_part = b_parts.shift
-
- return 1 if a_parts.size < b_parts.size && a_parts.empty?
- return -1 if a_parts.size > b_parts.size && b_parts.empty?
-
- comparison = a_part <=> b_part
-
- return comparison unless comparison == 0
-
- compare_path_parts(a_parts, b_parts)
+ Gitlab::Diff::FileCollectionSorter.new(diffs).sort
end
def sort_diffs?
diff --git a/app/models/raw_usage_data.rb b/app/models/raw_usage_data.rb
index 18cee55d06e..06cd4ad3f6c 100644
--- a/app/models/raw_usage_data.rb
+++ b/app/models/raw_usage_data.rb
@@ -5,6 +5,6 @@ class RawUsageData < ApplicationRecord
validates :recorded_at, presence: true, uniqueness: true
def update_sent_at!
- self.update_column(:sent_at, Time.current) if Feature.enabled?(:save_raw_usage_data)
+ self.update_column(:sent_at, Time.current)
end
end
diff --git a/app/serializers/diffs_metadata_entity.rb b/app/serializers/diffs_metadata_entity.rb
index 8973f23734a..7b0de3bce4e 100644
--- a/app/serializers/diffs_metadata_entity.rb
+++ b/app/serializers/diffs_metadata_entity.rb
@@ -2,7 +2,9 @@
class DiffsMetadataEntity < DiffsEntity
unexpose :diff_files
- expose :raw_diff_files, as: :diff_files, using: DiffFileMetadataEntity
+ expose :diff_files, using: DiffFileMetadataEntity do |diffs, _|
+ diffs.raw_diff_files(sorted: true)
+ end
expose :conflict_resolution_path do |_, options|
presenter(options[:merge_request]).conflict_resolution_path
diff --git a/app/serializers/import/bulk_import_entity.rb b/app/serializers/import/bulk_import_entity.rb
index 8f0a9dd4428..9daa6699a20 100644
--- a/app/serializers/import/bulk_import_entity.rb
+++ b/app/serializers/import/bulk_import_entity.rb
@@ -12,4 +12,8 @@ class Import::BulkImportEntity < Grape::Entity
expose :full_path do |entity|
entity['full_path']
end
+
+ expose :web_url do |entity|
+ entity['web_url']
+ end
end
diff --git a/app/serializers/paginated_diff_entity.rb b/app/serializers/paginated_diff_entity.rb
index fe59686278c..1118b1aa4fe 100644
--- a/app/serializers/paginated_diff_entity.rb
+++ b/app/serializers/paginated_diff_entity.rb
@@ -13,7 +13,7 @@ class PaginatedDiffEntity < Grape::Entity
submodule_links = Gitlab::SubmoduleLinks.new(merge_request.project.repository)
DiffFileEntity.represent(
- diffs.diff_files,
+ diffs.diff_files(sorted: true),
options.merge(
submodule_links: submodule_links,
code_navigation_path: code_navigation_path(diffs),
diff --git a/app/services/submit_usage_ping_service.rb b/app/services/submit_usage_ping_service.rb
index 2fbeaf4405c..8ab1193b04f 100644
--- a/app/services/submit_usage_ping_service.rb
+++ b/app/services/submit_usage_ping_service.rb
@@ -43,8 +43,6 @@ class SubmitUsagePingService
private
def save_raw_usage_data(usage_data)
- return unless Feature.enabled?(:save_raw_usage_data)
-
RawUsageData.safe_find_or_create_by(recorded_at: usage_data[:recorded_at]) do |record|
record.payload = usage_data
end
diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml
index a08212f151c..a1527a74898 100644
--- a/app/views/groups/group_members/index.html.haml
+++ b/app/views/groups/group_members/index.html.haml
@@ -4,7 +4,7 @@
- show_access_requests = can_manage_members && @requesters.exists?
- invited_active = params[:search_invited].present? || params[:invited_members_page].present?
- vue_members_list_enabled = Feature.enabled?(:vue_group_members_list, @group, default_enabled: true)
-- filtered_search_enabled = Feature.enabled?(:group_members_filtered_search, @group)
+- filtered_search_enabled = Feature.enabled?(:group_members_filtered_search, @group, default_enabled: true)
- current_user_is_group_owner = @group && @group.has_owner?(current_user)
- form_item_label_css_class = 'label-bold gl-mr-2 gl-mb-0 gl-py-2 align-self-md-center'
diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml
index 7679e0714fe..9d4e5d629f4 100644
--- a/app/views/projects/tags/_tag.html.haml
+++ b/app/views/projects/tags/_tag.html.haml
@@ -27,9 +27,6 @@
= sprite_icon("rocket", size: 12)
= _("Release")
= link_to release.name, project_releases_path(@project, anchor: release.tag), class: 'gl-text-blue-600!'
- - if release.description.present?
- .md.gl-mt-3
- = markdown_field(release, :description)
.row-fixed-content.controls.flex-row
- if tag.has_signature?