Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
a174146bf0
commit
fc8614660e
|
|
@ -46,12 +46,6 @@ Lint/RedundantCopDisableDirective:
|
||||||
Lint/UselessMethodDefinition:
|
Lint/UselessMethodDefinition:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
# Offense count: 321
|
|
||||||
# Configuration parameters: ForbiddenDelimiters.
|
|
||||||
# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
|
|
||||||
Naming/HeredocDelimiterNaming:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
# Offense count: 218
|
# Offense count: 218
|
||||||
# Cop supports --auto-correct.
|
# Cop supports --auto-correct.
|
||||||
# Configuration parameters: PreferredName.
|
# Configuration parameters: PreferredName.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
---
|
||||||
|
Naming/HeredocDelimiterNaming:
|
||||||
|
# Offense count: 388
|
||||||
|
# Temporarily disabled due to too many offenses
|
||||||
|
Enabled: false
|
||||||
|
Exclude:
|
||||||
|
- 'app/models/ci/build_trace_chunks/redis_base.rb'
|
||||||
|
- 'app/models/concerns/counter_attribute.rb'
|
||||||
|
- 'app/models/concerns/legacy_bulk_insert.rb'
|
||||||
|
- 'app/models/trending_project.rb'
|
||||||
|
- 'app/services/ci/ensure_stage_service.rb'
|
||||||
|
- 'app/services/packages/debian/generate_distribution_key_service.rb'
|
||||||
|
- 'app/workers/concerns/limited_capacity/job_tracker.rb'
|
||||||
|
- 'config/initializers/01_secret_token.rb'
|
||||||
|
- 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
|
||||||
|
- 'ee/db/geo/migrate/20180322062741_migrate_ci_job_artifacts_to_separate_registry.rb'
|
||||||
|
- 'ee/db/geo/migrate/20191010204941_migrate_lfs_objects_to_separate_registry.rb'
|
||||||
|
- 'ee/lib/api/elasticsearch_indexed_namespaces.rb'
|
||||||
|
- 'ee/spec/lib/ee/gitlab/ci/config_spec.rb'
|
||||||
|
- 'ee/spec/lib/ee/gitlab/ci/templates/templates_spec.rb'
|
||||||
|
- 'ee/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb'
|
||||||
|
- 'ee/spec/lib/gitlab/elastic/search_results_spec.rb'
|
||||||
|
- 'ee/spec/lib/gitlab/patch/database_config_spec.rb'
|
||||||
|
- 'ee/spec/lib/gitlab/sitemaps/sitemap_file_spec.rb'
|
||||||
|
- 'ee/spec/services/ci/create_pipeline_service/compliance_spec.rb'
|
||||||
|
- 'ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb'
|
||||||
|
- 'ee/spec/services/ci/create_pipeline_service/needs_spec.rb'
|
||||||
|
- 'ee/spec/services/ci/create_pipeline_service/runnable_builds_spec.rb'
|
||||||
|
- 'ee/spec/services/ci/create_pipeline_service_spec.rb'
|
||||||
|
- 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
|
||||||
|
- 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb'
|
||||||
|
- 'ee/spec/support/helpers/ee/ldap_helpers.rb'
|
||||||
|
- 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
|
||||||
|
- 'lib/api/version.rb'
|
||||||
|
- 'lib/backup/helper.rb'
|
||||||
|
- 'lib/feature/shared.rb'
|
||||||
|
- 'lib/gitlab/cache/import/caching.rb'
|
||||||
|
- 'lib/gitlab/conflict/file_collection.rb'
|
||||||
|
- 'lib/gitlab/database.rb'
|
||||||
|
- 'lib/gitlab/database/migration_helpers.rb'
|
||||||
|
- 'lib/gitlab/database/migration_helpers/v2.rb'
|
||||||
|
- 'lib/gitlab/exclusive_lease.rb'
|
||||||
|
- 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
|
||||||
|
- 'lib/gitlab/sql/set_operator.rb'
|
||||||
|
- 'lib/gitlab/utils/delegator_override/validator.rb'
|
||||||
|
- 'lib/tasks/gitlab/docs/compile_deprecations.rake'
|
||||||
|
- 'lib/tasks/gitlab/password.rake'
|
||||||
|
- 'qa/qa/scenario/test/sanity/selectors.rb'
|
||||||
|
- 'qa/qa/service/docker_run/gitlab_runner.rb'
|
||||||
|
- 'qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb'
|
||||||
|
- 'qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb'
|
||||||
|
- 'qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb'
|
||||||
|
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb'
|
||||||
|
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb'
|
||||||
|
- 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb'
|
||||||
|
- 'rubocop/cop/database/multiple_databases.rb'
|
||||||
|
- 'rubocop/cop/default_scope.rb'
|
||||||
|
- 'rubocop/cop/file_decompression.rb'
|
||||||
|
- 'rubocop/cop/gitlab/httparty.rb'
|
||||||
|
- 'rubocop/cop/gitlab/json.rb'
|
||||||
|
- 'rubocop/cop/gitlab/module_with_instance_variables.rb'
|
||||||
|
- 'rubocop/cop/gitlab/predicate_memoization.rb'
|
||||||
|
- 'spec/controllers/projects/pipelines_controller_spec.rb'
|
||||||
|
- 'spec/deprecation_toolkit_env.rb'
|
||||||
|
- 'spec/factories/packages/debian/distribution.rb'
|
||||||
|
- 'spec/factories/packages/debian/file_metadatum.rb'
|
||||||
|
- 'spec/features/projects/commit/user_comments_on_commit_spec.rb'
|
||||||
|
- 'spec/features/task_lists_spec.rb'
|
||||||
|
- 'spec/helpers/markup_helper_spec.rb'
|
||||||
|
- 'spec/initializers/100_patch_omniauth_oauth2_spec.rb'
|
||||||
|
- 'spec/initializers/rack_multipart_patch_spec.rb'
|
||||||
|
- 'spec/initializers/secret_token_spec.rb'
|
||||||
|
- 'spec/initializers/validate_database_config_spec.rb'
|
||||||
|
- 'spec/lib/banzai/filter/footnote_filter_spec.rb'
|
||||||
|
- 'spec/lib/banzai/pipeline/full_pipeline_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/auth/ldap/config_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/ci/config_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/ci/parsers/coverage/sax_document_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/ci/templates/templates_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/conflict/file_collection_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/diff/file_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/diff/pair_selector_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/diff/parser_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/file_hook_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/git/diff_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/git_post_receive_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/import_export/attributes_permitter_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/import_export/config_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v2/delete_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v2/init_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v2/install_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v2/patch_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v2/reset_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v3/delete_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v3/install_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/kubernetes/helm/v3/patch_command_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/metrics/samplers/puma_sampler_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/patch/database_config_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/quick_actions/substitution_definition_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/static_site_editor/config/file_config_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/web_ide/config_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/webpack/file_loader_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/webpack/graphql_known_operations_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/webpack/manifest_spec.rb'
|
||||||
|
- 'spec/lib/gitlab/word_diff/parser_spec.rb'
|
||||||
|
- 'spec/models/ci/bridge_spec.rb'
|
||||||
|
- 'spec/models/clusters/applications/cert_manager_spec.rb'
|
||||||
|
- 'spec/models/concerns/ci/maskable_spec.rb'
|
||||||
|
- 'spec/models/integrations/asana_spec.rb'
|
||||||
|
- 'spec/models/ssh_host_key_spec.rb'
|
||||||
|
- 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
|
||||||
|
- 'spec/services/ci/after_requeue_job_service_spec.rb'
|
||||||
|
- 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service/cache_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service/include_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service/merge_requests_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service/parallel_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service/parameter_content_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service/rules_spec.rb'
|
||||||
|
- 'spec/services/ci/create_pipeline_service_spec.rb'
|
||||||
|
- 'spec/services/ci/create_web_ide_terminal_service_spec.rb'
|
||||||
|
- 'spec/services/ci/parse_dotenv_artifact_service_spec.rb'
|
||||||
|
- 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
|
||||||
|
- 'spec/services/google_cloud/generate_pipeline_service_spec.rb'
|
||||||
|
- 'spec/services/task_list_toggle_service_spec.rb'
|
||||||
|
- 'spec/support/helpers/seed_helper.rb'
|
||||||
|
- 'spec/support/helpers/stub_object_storage.rb'
|
||||||
|
- 'spec/support/shared_examples/helm_commands_shared_examples.rb'
|
||||||
|
- 'spec/support/shared_examples/models/taskable_shared_examples.rb'
|
||||||
|
- 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
|
||||||
|
- 'spec/support/test_reports/test_reports_helper.rb'
|
||||||
|
- 'spec/workers/post_receive_spec.rb'
|
||||||
|
|
@ -0,0 +1,210 @@
|
||||||
|
/* eslint-disable @gitlab/require-i18n-strings */
|
||||||
|
// List of languages referenced from https://github.com/wooorm/lowlight#data
|
||||||
|
const CODE_BLOCK_LANGUAGES = [
|
||||||
|
{ syntax: '1c', label: '1C:Enterprise' },
|
||||||
|
{ syntax: 'abnf', label: 'Augmented Backus-Naur Form' },
|
||||||
|
{ syntax: 'accesslog', label: 'Apache Access Log' },
|
||||||
|
{ syntax: 'actionscript', variants: 'as', label: 'ActionScript' },
|
||||||
|
{ syntax: 'ada', label: 'Ada' },
|
||||||
|
{ syntax: 'angelscript', variants: 'asc', label: 'AngelScript' },
|
||||||
|
{ syntax: 'apache', variants: 'apacheconf', label: 'Apache config' },
|
||||||
|
{ syntax: 'applescript', variants: 'osascript', label: 'AppleScript' },
|
||||||
|
{ syntax: 'arcade', label: 'ArcGIS Arcade' },
|
||||||
|
{ syntax: 'arduino', variants: 'ino', label: 'Arduino' },
|
||||||
|
{ syntax: 'armasm', variants: 'arm', label: 'ARM Assembly' },
|
||||||
|
{ syntax: 'asciidoc', variants: 'adoc', label: 'AsciiDoc' },
|
||||||
|
{ syntax: 'aspectj', label: 'AspectJ' },
|
||||||
|
{ syntax: 'autohotkey', variants: 'ahk', label: 'AutoHotkey' },
|
||||||
|
{ syntax: 'autoit', label: 'AutoIt' },
|
||||||
|
{ syntax: 'avrasm', label: 'AVR Assembly' },
|
||||||
|
{ syntax: 'awk', label: 'Awk' },
|
||||||
|
{ syntax: 'axapta', variants: 'x++', label: 'X++' },
|
||||||
|
{ syntax: 'bash', variants: 'sh', label: 'Bash' },
|
||||||
|
{ syntax: 'basic', label: 'BASIC' },
|
||||||
|
{ syntax: 'bnf', label: 'Backus-Naur Form' },
|
||||||
|
{ syntax: 'brainfuck', variants: 'bf', label: 'Brainfuck' },
|
||||||
|
{ syntax: 'c', variants: 'h', label: 'C' },
|
||||||
|
{ syntax: 'cal', label: 'C/AL' },
|
||||||
|
{ syntax: 'capnproto', variants: 'capnp', label: "Cap'n Proto" },
|
||||||
|
{ syntax: 'ceylon', label: 'Ceylon' },
|
||||||
|
{ syntax: 'clean', variants: 'icl, dcl', label: 'Clean' },
|
||||||
|
{ syntax: 'clojure', variants: 'clj, edn', label: 'Clojure' },
|
||||||
|
{ syntax: 'clojure-repl', label: 'Clojure REPL' },
|
||||||
|
{ syntax: 'cmake', variants: 'cmake.in', label: 'CMake' },
|
||||||
|
{ syntax: 'coffeescript', variants: 'coffee, cson, iced', label: 'CoffeeScript' },
|
||||||
|
{ syntax: 'coq', label: 'Coq' },
|
||||||
|
{ syntax: 'cos', variants: 'cls', label: 'Caché Object Script' },
|
||||||
|
{ syntax: 'cpp', variants: 'cc, c++, h++, hpp, hh, hxx, cxx', label: 'C++' },
|
||||||
|
{ syntax: 'crmsh', variants: 'crm, pcmk', label: 'crmsh' },
|
||||||
|
{ syntax: 'crystal', variants: 'cr', label: 'Crystal' },
|
||||||
|
{ syntax: 'csharp', variants: 'cs, c#', label: 'C#' },
|
||||||
|
{ syntax: 'csp', label: 'CSP' },
|
||||||
|
{ syntax: 'css', label: 'CSS' },
|
||||||
|
{ syntax: 'd', label: 'D' },
|
||||||
|
{ syntax: 'dart', label: 'Dart' },
|
||||||
|
{ syntax: 'delphi', variants: 'dpr, dfm, pas, pascal', label: 'Delphi' },
|
||||||
|
{ syntax: 'diff', variants: 'patch', label: 'Diff' },
|
||||||
|
{ syntax: 'django', variants: 'jinja', label: 'Django' },
|
||||||
|
{ syntax: 'dns', variants: 'bind, zone', label: 'DNS Zone' },
|
||||||
|
{ syntax: 'dockerfile', variants: 'docker', label: 'Dockerfile' },
|
||||||
|
{ syntax: 'dos', variants: 'bat, cmd', label: 'Batch file (DOS)' },
|
||||||
|
{ syntax: 'dsconfig', label: 'DSConfig' },
|
||||||
|
{ syntax: 'dts', label: 'Device Tree' },
|
||||||
|
{ syntax: 'dust', variants: 'dst', label: 'Dust' },
|
||||||
|
{ syntax: 'ebnf', label: 'Extended Backus-Naur Form' },
|
||||||
|
{ syntax: 'elixir', variants: 'ex, exs', label: 'Elixir' },
|
||||||
|
{ syntax: 'elm', label: 'Elm' },
|
||||||
|
{ syntax: 'erb', label: 'ERB' },
|
||||||
|
{ syntax: 'erlang', variants: 'erl', label: 'Erlang' },
|
||||||
|
{ syntax: 'erlang-repl', label: 'Erlang REPL' },
|
||||||
|
{ syntax: 'excel', variants: 'xlsx, xls', label: 'Excel formulae' },
|
||||||
|
{ syntax: 'fix', label: 'FIX' },
|
||||||
|
{ syntax: 'flix', label: 'Flix' },
|
||||||
|
{ syntax: 'fortran', variants: 'f90, f95', label: 'Fortran' },
|
||||||
|
{ syntax: 'fsharp', variants: 'fs, f#', label: 'F#' },
|
||||||
|
{ syntax: 'gams', variants: 'gms', label: 'GAMS' },
|
||||||
|
{ syntax: 'gauss', variants: 'gss', label: 'GAUSS' },
|
||||||
|
{ syntax: 'gcode', variants: 'nc', label: 'G-code (ISO 6983)' },
|
||||||
|
{ syntax: 'gherkin', variants: 'feature', label: 'Gherkin' },
|
||||||
|
{ syntax: 'glsl', label: 'GLSL' },
|
||||||
|
{ syntax: 'gml', label: 'GML' },
|
||||||
|
{ syntax: 'go', variants: 'golang', label: 'Go' },
|
||||||
|
{ syntax: 'golo', label: 'Golo' },
|
||||||
|
{ syntax: 'gradle', label: 'Gradle' },
|
||||||
|
{ syntax: 'graphql', variants: 'gql', label: 'GraphQL' },
|
||||||
|
{ syntax: 'groovy', label: 'Groovy' },
|
||||||
|
{ syntax: 'haml', label: 'HAML' },
|
||||||
|
{
|
||||||
|
syntax: 'handlebars',
|
||||||
|
variants: 'hbs, html.hbs, html.handlebars, htmlbars',
|
||||||
|
label: 'Handlebars',
|
||||||
|
},
|
||||||
|
{ syntax: 'haskell', variants: 'hs', label: 'Haskell' },
|
||||||
|
{ syntax: 'haxe', variants: 'hx', label: 'Haxe' },
|
||||||
|
{ syntax: 'hsp', label: 'HSP' },
|
||||||
|
{ syntax: 'http', variants: 'https', label: 'HTTP' },
|
||||||
|
{ syntax: 'hy', variants: 'hylang', label: 'Hy' },
|
||||||
|
{ syntax: 'inform7', variants: 'i7', label: 'Inform 7' },
|
||||||
|
{ syntax: 'ini', variants: 'toml', label: 'TOML, also INI' },
|
||||||
|
{ syntax: 'irpf90', label: 'IRPF90' },
|
||||||
|
{ syntax: 'isbl', label: 'ISBL' },
|
||||||
|
{ syntax: 'java', variants: 'jsp', label: 'Java' },
|
||||||
|
{ syntax: 'javascript', variants: 'js, jsx, mjs, cjs', label: 'Javascript' },
|
||||||
|
{ syntax: 'jboss-cli', variants: 'wildfly-cli', label: 'JBoss CLI' },
|
||||||
|
{ syntax: 'json', label: 'JSON' },
|
||||||
|
{ syntax: 'julia', label: 'Julia' },
|
||||||
|
{ syntax: 'julia-repl', variants: 'jldoctest', label: 'Julia REPL' },
|
||||||
|
{ syntax: 'kotlin', variants: 'kt, kts', label: 'Kotlin' },
|
||||||
|
{ syntax: 'lasso', variants: 'ls, lassoscript', label: 'Lasso' },
|
||||||
|
{ syntax: 'latex', variants: 'tex', label: 'LaTeX' },
|
||||||
|
{ syntax: 'ldif', label: 'LDIF' },
|
||||||
|
{ syntax: 'leaf', label: 'Leaf' },
|
||||||
|
{ syntax: 'less', label: 'Less' },
|
||||||
|
{ syntax: 'lisp', label: 'Lisp' },
|
||||||
|
{ syntax: 'livecodeserver', label: 'LiveCode' },
|
||||||
|
{ syntax: 'livescript', variants: 'ls', label: 'LiveScript' },
|
||||||
|
{ syntax: 'llvm', label: 'LLVM IR' },
|
||||||
|
{ syntax: 'lsl', label: 'LSL (Linden Scripting Language)' },
|
||||||
|
{ syntax: 'lua', label: 'Lua' },
|
||||||
|
{ syntax: 'makefile', variants: 'mk, mak, make', label: 'Makefile' },
|
||||||
|
{ syntax: 'markdown', variants: 'md, mkdown, mkd', label: 'Markdown' },
|
||||||
|
{ syntax: 'mathematica', variants: 'mma, wl', label: 'Mathematica' },
|
||||||
|
{ syntax: 'matlab', label: 'Matlab' },
|
||||||
|
{ syntax: 'maxima', label: 'Maxima' },
|
||||||
|
{ syntax: 'mel', label: 'MEL' },
|
||||||
|
{ syntax: 'mercury', variants: 'm, moo', label: 'Mercury' },
|
||||||
|
{ syntax: 'mipsasm', variants: 'mips', label: 'MIPS Assembly' },
|
||||||
|
{ syntax: 'mizar', label: 'Mizar' },
|
||||||
|
{ syntax: 'mojolicious', label: 'Mojolicious' },
|
||||||
|
{ syntax: 'monkey', label: 'Monkey' },
|
||||||
|
{ syntax: 'moonscript', variants: 'moon', label: 'MoonScript' },
|
||||||
|
{ syntax: 'n1ql', label: 'N1QL' },
|
||||||
|
{ syntax: 'nestedtext', variants: 'nt', label: 'Nested Text' },
|
||||||
|
{ syntax: 'nginx', variants: 'nginxconf', label: 'Nginx config' },
|
||||||
|
{ syntax: 'nim', label: 'Nim' },
|
||||||
|
{ syntax: 'nix', variants: 'nixos', label: 'Nix' },
|
||||||
|
{ syntax: 'node-repl', label: 'Node REPL' },
|
||||||
|
{ syntax: 'nsis', label: 'NSIS' },
|
||||||
|
{
|
||||||
|
syntax: 'objectivec',
|
||||||
|
variants: 'mm, objc, obj-c, obj-c++, objective-c++',
|
||||||
|
label: 'Objective-C',
|
||||||
|
},
|
||||||
|
{ syntax: 'ocaml', variants: 'ml', label: 'OCaml' },
|
||||||
|
{ syntax: 'openscad', variants: 'scad', label: 'OpenSCAD' },
|
||||||
|
{ syntax: 'oxygene', label: 'Oxygene' },
|
||||||
|
{ syntax: 'parser3', label: 'Parser3' },
|
||||||
|
{ syntax: 'perl', variants: 'pl, pm', label: 'Perl' },
|
||||||
|
{ syntax: 'pf', variants: 'pf.conf', label: 'Packet Filter config' },
|
||||||
|
{ syntax: 'pgsql', variants: 'postgres, postgresql', label: 'PostgreSQL' },
|
||||||
|
{ syntax: 'php', label: 'PHP' },
|
||||||
|
{ syntax: 'php-template', label: 'PHP template' },
|
||||||
|
{ syntax: 'plaintext', variants: 'text, txt', label: 'Plain text' },
|
||||||
|
{ syntax: 'pony', label: 'Pony' },
|
||||||
|
{ syntax: 'powershell', variants: 'pwsh, ps, ps1', label: 'PowerShell' },
|
||||||
|
{ syntax: 'processing', variants: 'pde', label: 'Processing' },
|
||||||
|
{ syntax: 'profile', label: 'Python profiler' },
|
||||||
|
{ syntax: 'prolog', label: 'Prolog' },
|
||||||
|
{ syntax: 'properties', label: '.properties' },
|
||||||
|
{ syntax: 'protobuf', label: 'Protocol Buffers' },
|
||||||
|
{ syntax: 'puppet', variants: 'pp', label: 'Puppet' },
|
||||||
|
{ syntax: 'purebasic', variants: 'pb, pbi', label: 'PureBASIC' },
|
||||||
|
{ syntax: 'python', variants: 'py, gyp, ipython', label: 'Python' },
|
||||||
|
{ syntax: 'python-repl', variants: 'pycon', label: 'Python REPL' },
|
||||||
|
{ syntax: 'q', variants: 'k, kdb', label: 'Q' },
|
||||||
|
{ syntax: 'qml', variants: 'qt', label: 'QML' },
|
||||||
|
{ syntax: 'r', label: 'R' },
|
||||||
|
{ syntax: 'reasonml', variants: 're', label: 'ReasonML' },
|
||||||
|
{ syntax: 'rib', label: 'RenderMan RIB' },
|
||||||
|
{ syntax: 'roboconf', variants: 'graph, instances', label: 'Roboconf' },
|
||||||
|
{ syntax: 'routeros', variants: 'mikrotik', label: 'Microtik RouterOS script' },
|
||||||
|
{ syntax: 'rsl', label: 'RenderMan RSL' },
|
||||||
|
{ syntax: 'ruby', variants: 'rb, gemspec, podspec, thor, irb', label: 'Ruby' },
|
||||||
|
{ syntax: 'ruleslanguage', label: 'Oracle Rules Language' },
|
||||||
|
{ syntax: 'rust', variants: 'rs', label: 'Rust' },
|
||||||
|
{ syntax: 'sas', label: 'SAS' },
|
||||||
|
{ syntax: 'scala', label: 'Scala' },
|
||||||
|
{ syntax: 'scheme', label: 'Scheme' },
|
||||||
|
{ syntax: 'scilab', variants: 'sci', label: 'Scilab' },
|
||||||
|
{ syntax: 'scss', label: 'SCSS' },
|
||||||
|
{ syntax: 'shell', variants: 'console, shellsession', label: 'Shell Session' },
|
||||||
|
{ syntax: 'smali', label: 'Smali' },
|
||||||
|
{ syntax: 'smalltalk', variants: 'st', label: 'Smalltalk' },
|
||||||
|
{ syntax: 'sml', variants: 'ml', label: 'SML (Standard ML)' },
|
||||||
|
{ syntax: 'sqf', label: 'SQF' },
|
||||||
|
{ syntax: 'sql', label: 'SQL' },
|
||||||
|
{ syntax: 'stan', variants: 'stanfuncs', label: 'Stan' },
|
||||||
|
{ syntax: 'stata', variants: 'do, ado', label: 'Stata' },
|
||||||
|
{ syntax: 'step21', variants: 'p21, step, stp', label: 'STEP Part 21' },
|
||||||
|
{ syntax: 'stylus', variants: 'styl', label: 'Stylus' },
|
||||||
|
{ syntax: 'subunit', label: 'SubUnit' },
|
||||||
|
{ syntax: 'swift', label: 'Swift' },
|
||||||
|
{ syntax: 'taggerscript', label: 'Tagger Script' },
|
||||||
|
{ syntax: 'tap', label: 'Test Anything Protocol' },
|
||||||
|
{ syntax: 'tcl', variants: 'tk', label: 'Tcl' },
|
||||||
|
{ syntax: 'thrift', label: 'Thrift' },
|
||||||
|
{ syntax: 'tp', label: 'TP' },
|
||||||
|
{ syntax: 'twig', variants: 'craftcms', label: 'Twig' },
|
||||||
|
{ syntax: 'typescript', variants: 'ts, tsx', label: 'TypeScript' },
|
||||||
|
{ syntax: 'vala', label: 'Vala' },
|
||||||
|
{ syntax: 'vbnet', variants: 'vb', label: 'Visual Basic .NET' },
|
||||||
|
{ syntax: 'vbscript', variants: 'vbs', label: 'VBScript' },
|
||||||
|
{ syntax: 'vbscript-html', label: 'VBScript in HTML' },
|
||||||
|
{ syntax: 'verilog', variants: 'v, sv, svh', label: 'Verilog' },
|
||||||
|
{ syntax: 'vhdl', label: 'VHDL' },
|
||||||
|
{ syntax: 'vim', label: 'Vim Script' },
|
||||||
|
{ syntax: 'wasm', label: 'WebAssembly' },
|
||||||
|
{ syntax: 'wren', label: 'Wren' },
|
||||||
|
{ syntax: 'x86asm', label: 'Intel x86 Assembly' },
|
||||||
|
{ syntax: 'xl', variants: 'tao', label: 'XL' },
|
||||||
|
{
|
||||||
|
syntax: 'xml',
|
||||||
|
variants: 'html, xhtml, rss, atom, xjb, xsd, xsl, plist, wsf, svg',
|
||||||
|
label: 'HTML, XML',
|
||||||
|
},
|
||||||
|
{ syntax: 'xquery', variants: 'xpath, xq', label: 'XQuery' },
|
||||||
|
{ syntax: 'yaml', variants: 'yml', label: 'YAML' },
|
||||||
|
{ syntax: 'zephir', variants: 'zep', label: 'Zephir' },
|
||||||
|
];
|
||||||
|
|
||||||
|
export default CODE_BLOCK_LANGUAGES;
|
||||||
|
|
@ -1,215 +1,6 @@
|
||||||
import { lowlight } from 'lowlight/lib/core';
|
import { lowlight } from 'lowlight/lib/core';
|
||||||
import { __, sprintf } from '~/locale';
|
import { __, sprintf } from '~/locale';
|
||||||
|
import CODE_BLOCK_LANGUAGES from '../constants/code_block_languages';
|
||||||
/* eslint-disable @gitlab/require-i18n-strings */
|
|
||||||
// List of languages referenced from https://github.com/wooorm/lowlight#data
|
|
||||||
const CODE_BLOCK_LANGUAGES = [
|
|
||||||
{ syntax: '1c', label: '1C:Enterprise' },
|
|
||||||
{ syntax: 'abnf', label: 'Augmented Backus-Naur Form' },
|
|
||||||
{ syntax: 'accesslog', label: 'Apache Access Log' },
|
|
||||||
{ syntax: 'actionscript', variants: 'as', label: 'ActionScript' },
|
|
||||||
{ syntax: 'ada', label: 'Ada' },
|
|
||||||
{ syntax: 'angelscript', variants: 'asc', label: 'AngelScript' },
|
|
||||||
{ syntax: 'apache', variants: 'apacheconf', label: 'Apache config' },
|
|
||||||
{ syntax: 'applescript', variants: 'osascript', label: 'AppleScript' },
|
|
||||||
{ syntax: 'arcade', label: 'ArcGIS Arcade' },
|
|
||||||
{ syntax: 'arduino', variants: 'ino', label: 'Arduino' },
|
|
||||||
{ syntax: 'armasm', variants: 'arm', label: 'ARM Assembly' },
|
|
||||||
{ syntax: 'asciidoc', variants: 'adoc', label: 'AsciiDoc' },
|
|
||||||
{ syntax: 'aspectj', label: 'AspectJ' },
|
|
||||||
{ syntax: 'autohotkey', variants: 'ahk', label: 'AutoHotkey' },
|
|
||||||
{ syntax: 'autoit', label: 'AutoIt' },
|
|
||||||
{ syntax: 'avrasm', label: 'AVR Assembly' },
|
|
||||||
{ syntax: 'awk', label: 'Awk' },
|
|
||||||
{ syntax: 'axapta', variants: 'x++', label: 'X++' },
|
|
||||||
{ syntax: 'bash', variants: 'sh', label: 'Bash' },
|
|
||||||
{ syntax: 'basic', label: 'BASIC' },
|
|
||||||
{ syntax: 'bnf', label: 'Backus-Naur Form' },
|
|
||||||
{ syntax: 'brainfuck', variants: 'bf', label: 'Brainfuck' },
|
|
||||||
{ syntax: 'c', variants: 'h', label: 'C' },
|
|
||||||
{ syntax: 'cal', label: 'C/AL' },
|
|
||||||
{ syntax: 'capnproto', variants: 'capnp', label: "Cap'n Proto" },
|
|
||||||
{ syntax: 'ceylon', label: 'Ceylon' },
|
|
||||||
{ syntax: 'clean', variants: 'icl, dcl', label: 'Clean' },
|
|
||||||
{ syntax: 'clojure', variants: 'clj, edn', label: 'Clojure' },
|
|
||||||
{ syntax: 'clojure-repl', label: 'Clojure REPL' },
|
|
||||||
{ syntax: 'cmake', variants: 'cmake.in', label: 'CMake' },
|
|
||||||
{ syntax: 'coffeescript', variants: 'coffee, cson, iced', label: 'CoffeeScript' },
|
|
||||||
{ syntax: 'coq', label: 'Coq' },
|
|
||||||
{ syntax: 'cos', variants: 'cls', label: 'Caché Object Script' },
|
|
||||||
{ syntax: 'cpp', variants: 'cc, c++, h++, hpp, hh, hxx, cxx', label: 'C++' },
|
|
||||||
{ syntax: 'crmsh', variants: 'crm, pcmk', label: 'crmsh' },
|
|
||||||
{ syntax: 'crystal', variants: 'cr', label: 'Crystal' },
|
|
||||||
{ syntax: 'csharp', variants: 'cs, c#', label: 'C#' },
|
|
||||||
{ syntax: 'csp', label: 'CSP' },
|
|
||||||
{ syntax: 'css', label: 'CSS' },
|
|
||||||
{ syntax: 'd', label: 'D' },
|
|
||||||
{ syntax: 'dart', label: 'Dart' },
|
|
||||||
{ syntax: 'delphi', variants: 'dpr, dfm, pas, pascal', label: 'Delphi' },
|
|
||||||
{ syntax: 'diff', variants: 'patch', label: 'Diff' },
|
|
||||||
{ syntax: 'django', variants: 'jinja', label: 'Django' },
|
|
||||||
{ syntax: 'dns', variants: 'bind, zone', label: 'DNS Zone' },
|
|
||||||
{ syntax: 'dockerfile', variants: 'docker', label: 'Dockerfile' },
|
|
||||||
{ syntax: 'dos', variants: 'bat, cmd', label: 'Batch file (DOS)' },
|
|
||||||
{ syntax: 'dsconfig', label: 'DSConfig' },
|
|
||||||
{ syntax: 'dts', label: 'Device Tree' },
|
|
||||||
{ syntax: 'dust', variants: 'dst', label: 'Dust' },
|
|
||||||
{ syntax: 'ebnf', label: 'Extended Backus-Naur Form' },
|
|
||||||
{ syntax: 'elixir', variants: 'ex, exs', label: 'Elixir' },
|
|
||||||
{ syntax: 'elm', label: 'Elm' },
|
|
||||||
{ syntax: 'erb', label: 'ERB' },
|
|
||||||
{ syntax: 'erlang', variants: 'erl', label: 'Erlang' },
|
|
||||||
{ syntax: 'erlang-repl', label: 'Erlang REPL' },
|
|
||||||
{ syntax: 'excel', variants: 'xlsx, xls', label: 'Excel formulae' },
|
|
||||||
{ syntax: 'fix', label: 'FIX' },
|
|
||||||
{ syntax: 'flix', label: 'Flix' },
|
|
||||||
{ syntax: 'fortran', variants: 'f90, f95', label: 'Fortran' },
|
|
||||||
{ syntax: 'fsharp', variants: 'fs, f#', label: 'F#' },
|
|
||||||
{ syntax: 'gams', variants: 'gms', label: 'GAMS' },
|
|
||||||
{ syntax: 'gauss', variants: 'gss', label: 'GAUSS' },
|
|
||||||
{ syntax: 'gcode', variants: 'nc', label: 'G-code (ISO 6983)' },
|
|
||||||
{ syntax: 'gherkin', variants: 'feature', label: 'Gherkin' },
|
|
||||||
{ syntax: 'glsl', label: 'GLSL' },
|
|
||||||
{ syntax: 'gml', label: 'GML' },
|
|
||||||
{ syntax: 'go', variants: 'golang', label: 'Go' },
|
|
||||||
{ syntax: 'golo', label: 'Golo' },
|
|
||||||
{ syntax: 'gradle', label: 'Gradle' },
|
|
||||||
{ syntax: 'graphql', variants: 'gql', label: 'GraphQL' },
|
|
||||||
{ syntax: 'groovy', label: 'Groovy' },
|
|
||||||
{ syntax: 'haml', label: 'HAML' },
|
|
||||||
{
|
|
||||||
syntax: 'handlebars',
|
|
||||||
variants: 'hbs, html.hbs, html.handlebars, htmlbars',
|
|
||||||
label: 'Handlebars',
|
|
||||||
},
|
|
||||||
{ syntax: 'haskell', variants: 'hs', label: 'Haskell' },
|
|
||||||
{ syntax: 'haxe', variants: 'hx', label: 'Haxe' },
|
|
||||||
{ syntax: 'hsp', label: 'HSP' },
|
|
||||||
{ syntax: 'http', variants: 'https', label: 'HTTP' },
|
|
||||||
{ syntax: 'hy', variants: 'hylang', label: 'Hy' },
|
|
||||||
{ syntax: 'inform7', variants: 'i7', label: 'Inform 7' },
|
|
||||||
{ syntax: 'ini', variants: 'toml', label: 'TOML, also INI' },
|
|
||||||
{ syntax: 'irpf90', label: 'IRPF90' },
|
|
||||||
{ syntax: 'isbl', label: 'ISBL' },
|
|
||||||
{ syntax: 'java', variants: 'jsp', label: 'Java' },
|
|
||||||
{ syntax: 'javascript', variants: 'js, jsx, mjs, cjs', label: 'Javascript' },
|
|
||||||
{ syntax: 'jboss-cli', variants: 'wildfly-cli', label: 'JBoss CLI' },
|
|
||||||
{ syntax: 'json', label: 'JSON' },
|
|
||||||
{ syntax: 'julia', label: 'Julia' },
|
|
||||||
{ syntax: 'julia-repl', variants: 'jldoctest', label: 'Julia REPL' },
|
|
||||||
{ syntax: 'kotlin', variants: 'kt, kts', label: 'Kotlin' },
|
|
||||||
{ syntax: 'lasso', variants: 'ls, lassoscript', label: 'Lasso' },
|
|
||||||
{ syntax: 'latex', variants: 'tex', label: 'LaTeX' },
|
|
||||||
{ syntax: 'ldif', label: 'LDIF' },
|
|
||||||
{ syntax: 'leaf', label: 'Leaf' },
|
|
||||||
{ syntax: 'less', label: 'Less' },
|
|
||||||
{ syntax: 'lisp', label: 'Lisp' },
|
|
||||||
{ syntax: 'livecodeserver', label: 'LiveCode' },
|
|
||||||
{ syntax: 'livescript', variants: 'ls', label: 'LiveScript' },
|
|
||||||
{ syntax: 'llvm', label: 'LLVM IR' },
|
|
||||||
{ syntax: 'lsl', label: 'LSL (Linden Scripting Language)' },
|
|
||||||
{ syntax: 'lua', label: 'Lua' },
|
|
||||||
{ syntax: 'makefile', variants: 'mk, mak, make', label: 'Makefile' },
|
|
||||||
{ syntax: 'markdown', variants: 'md, mkdown, mkd', label: 'Markdown' },
|
|
||||||
{ syntax: 'mathematica', variants: 'mma, wl', label: 'Mathematica' },
|
|
||||||
{ syntax: 'matlab', label: 'Matlab' },
|
|
||||||
{ syntax: 'maxima', label: 'Maxima' },
|
|
||||||
{ syntax: 'mel', label: 'MEL' },
|
|
||||||
{ syntax: 'mercury', variants: 'm, moo', label: 'Mercury' },
|
|
||||||
{ syntax: 'mipsasm', variants: 'mips', label: 'MIPS Assembly' },
|
|
||||||
{ syntax: 'mizar', label: 'Mizar' },
|
|
||||||
{ syntax: 'mojolicious', label: 'Mojolicious' },
|
|
||||||
{ syntax: 'monkey', label: 'Monkey' },
|
|
||||||
{ syntax: 'moonscript', variants: 'moon', label: 'MoonScript' },
|
|
||||||
{ syntax: 'n1ql', label: 'N1QL' },
|
|
||||||
{ syntax: 'nestedtext', variants: 'nt', label: 'Nested Text' },
|
|
||||||
{ syntax: 'nginx', variants: 'nginxconf', label: 'Nginx config' },
|
|
||||||
{ syntax: 'nim', label: 'Nim' },
|
|
||||||
{ syntax: 'nix', variants: 'nixos', label: 'Nix' },
|
|
||||||
{ syntax: 'node-repl', label: 'Node REPL' },
|
|
||||||
{ syntax: 'nsis', label: 'NSIS' },
|
|
||||||
{
|
|
||||||
syntax: 'objectivec',
|
|
||||||
variants: 'mm, objc, obj-c, obj-c++, objective-c++',
|
|
||||||
label: 'Objective-C',
|
|
||||||
},
|
|
||||||
{ syntax: 'ocaml', variants: 'ml', label: 'OCaml' },
|
|
||||||
{ syntax: 'openscad', variants: 'scad', label: 'OpenSCAD' },
|
|
||||||
{ syntax: 'oxygene', label: 'Oxygene' },
|
|
||||||
{ syntax: 'parser3', label: 'Parser3' },
|
|
||||||
{ syntax: 'perl', variants: 'pl, pm', label: 'Perl' },
|
|
||||||
{ syntax: 'pf', variants: 'pf.conf', label: 'Packet Filter config' },
|
|
||||||
{ syntax: 'pgsql', variants: 'postgres, postgresql', label: 'PostgreSQL' },
|
|
||||||
{ syntax: 'php', label: 'PHP' },
|
|
||||||
{ syntax: 'php-template', label: 'PHP template' },
|
|
||||||
{ syntax: 'plaintext', variants: 'text, txt', label: 'Plain text' },
|
|
||||||
{ syntax: 'pony', label: 'Pony' },
|
|
||||||
{ syntax: 'powershell', variants: 'pwsh, ps, ps1', label: 'PowerShell' },
|
|
||||||
{ syntax: 'processing', variants: 'pde', label: 'Processing' },
|
|
||||||
{ syntax: 'profile', label: 'Python profiler' },
|
|
||||||
{ syntax: 'prolog', label: 'Prolog' },
|
|
||||||
{ syntax: 'properties', label: '.properties' },
|
|
||||||
{ syntax: 'protobuf', label: 'Protocol Buffers' },
|
|
||||||
{ syntax: 'puppet', variants: 'pp', label: 'Puppet' },
|
|
||||||
{ syntax: 'purebasic', variants: 'pb, pbi', label: 'PureBASIC' },
|
|
||||||
{ syntax: 'python', variants: 'py, gyp, ipython', label: 'Python' },
|
|
||||||
{ syntax: 'python-repl', variants: 'pycon', label: 'Python REPL' },
|
|
||||||
{ syntax: 'q', variants: 'k, kdb', label: 'Q' },
|
|
||||||
{ syntax: 'qml', variants: 'qt', label: 'QML' },
|
|
||||||
{ syntax: 'r', label: 'R' },
|
|
||||||
{ syntax: 'reasonml', variants: 're', label: 'ReasonML' },
|
|
||||||
{ syntax: 'rib', label: 'RenderMan RIB' },
|
|
||||||
{ syntax: 'roboconf', variants: 'graph, instances', label: 'Roboconf' },
|
|
||||||
{ syntax: 'routeros', variants: 'mikrotik', label: 'Microtik RouterOS script' },
|
|
||||||
{ syntax: 'rsl', label: 'RenderMan RSL' },
|
|
||||||
{ syntax: 'ruby', variants: 'rb, gemspec, podspec, thor, irb', label: 'Ruby' },
|
|
||||||
{ syntax: 'ruleslanguage', label: 'Oracle Rules Language' },
|
|
||||||
{ syntax: 'rust', variants: 'rs', label: 'Rust' },
|
|
||||||
{ syntax: 'sas', label: 'SAS' },
|
|
||||||
{ syntax: 'scala', label: 'Scala' },
|
|
||||||
{ syntax: 'scheme', label: 'Scheme' },
|
|
||||||
{ syntax: 'scilab', variants: 'sci', label: 'Scilab' },
|
|
||||||
{ syntax: 'scss', label: 'SCSS' },
|
|
||||||
{ syntax: 'shell', variants: 'console, shellsession', label: 'Shell Session' },
|
|
||||||
{ syntax: 'smali', label: 'Smali' },
|
|
||||||
{ syntax: 'smalltalk', variants: 'st', label: 'Smalltalk' },
|
|
||||||
{ syntax: 'sml', variants: 'ml', label: 'SML (Standard ML)' },
|
|
||||||
{ syntax: 'sqf', label: 'SQF' },
|
|
||||||
{ syntax: 'sql', label: 'SQL' },
|
|
||||||
{ syntax: 'stan', variants: 'stanfuncs', label: 'Stan' },
|
|
||||||
{ syntax: 'stata', variants: 'do, ado', label: 'Stata' },
|
|
||||||
{ syntax: 'step21', variants: 'p21, step, stp', label: 'STEP Part 21' },
|
|
||||||
{ syntax: 'stylus', variants: 'styl', label: 'Stylus' },
|
|
||||||
{ syntax: 'subunit', label: 'SubUnit' },
|
|
||||||
{ syntax: 'swift', label: 'Swift' },
|
|
||||||
{ syntax: 'taggerscript', label: 'Tagger Script' },
|
|
||||||
{ syntax: 'tap', label: 'Test Anything Protocol' },
|
|
||||||
{ syntax: 'tcl', variants: 'tk', label: 'Tcl' },
|
|
||||||
{ syntax: 'thrift', label: 'Thrift' },
|
|
||||||
{ syntax: 'tp', label: 'TP' },
|
|
||||||
{ syntax: 'twig', variants: 'craftcms', label: 'Twig' },
|
|
||||||
{ syntax: 'typescript', variants: 'ts, tsx', label: 'TypeScript' },
|
|
||||||
{ syntax: 'vala', label: 'Vala' },
|
|
||||||
{ syntax: 'vbnet', variants: 'vb', label: 'Visual Basic .NET' },
|
|
||||||
{ syntax: 'vbscript', variants: 'vbs', label: 'VBScript' },
|
|
||||||
{ syntax: 'vbscript-html', label: 'VBScript in HTML' },
|
|
||||||
{ syntax: 'verilog', variants: 'v, sv, svh', label: 'Verilog' },
|
|
||||||
{ syntax: 'vhdl', label: 'VHDL' },
|
|
||||||
{ syntax: 'vim', label: 'Vim Script' },
|
|
||||||
{ syntax: 'wasm', label: 'WebAssembly' },
|
|
||||||
{ syntax: 'wren', label: 'Wren' },
|
|
||||||
{ syntax: 'x86asm', label: 'Intel x86 Assembly' },
|
|
||||||
{ syntax: 'xl', variants: 'tao', label: 'XL' },
|
|
||||||
{
|
|
||||||
syntax: 'xml',
|
|
||||||
variants: 'html, xhtml, rss, atom, xjb, xsd, xsl, plist, wsf, svg',
|
|
||||||
label: 'HTML, XML',
|
|
||||||
},
|
|
||||||
{ syntax: 'xquery', variants: 'xpath, xq', label: 'XQuery' },
|
|
||||||
{ syntax: 'yaml', variants: 'yml', label: 'YAML' },
|
|
||||||
{ syntax: 'zephir', variants: 'zep', label: 'Zephir' },
|
|
||||||
];
|
|
||||||
/* eslint-enable @gitlab/require-i18n-strings */
|
|
||||||
|
|
||||||
const codeBlockLanguageLoader = {
|
const codeBlockLanguageLoader = {
|
||||||
lowlight,
|
lowlight,
|
||||||
|
|
|
||||||
|
|
@ -1,42 +1,33 @@
|
||||||
<script>
|
<script>
|
||||||
import { GlIcon } from '@gitlab/ui';
|
import { GlTooltipDirective, GlSafeHtmlDirective, GlIcon, GlLoadingIcon } from '@gitlab/ui';
|
||||||
import { mapState, mapActions } from 'vuex';
|
import { mapActions } from 'vuex';
|
||||||
import createFlash from '~/flash';
|
import createFlash from '~/flash';
|
||||||
import { s__, sprintf } from '~/locale';
|
import { s__, sprintf } from '~/locale';
|
||||||
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
|
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
|
||||||
import { UNFOLD_COUNT, INLINE_DIFF_VIEW_TYPE, INLINE_DIFF_LINES_KEY } from '../constants';
|
import { UNFOLD_COUNT, INLINE_DIFF_LINES_KEY } from '../constants';
|
||||||
import * as utils from '../store/utils';
|
import * as utils from '../store/utils';
|
||||||
|
|
||||||
const EXPAND_ALL = 0;
|
const EXPAND_ALL = 0;
|
||||||
const EXPAND_UP = 1;
|
const EXPAND_UP = 1;
|
||||||
const EXPAND_DOWN = 2;
|
const EXPAND_DOWN = 2;
|
||||||
|
|
||||||
const lineNumberByViewType = (viewType, diffLine) => {
|
|
||||||
const numberGetters = {
|
|
||||||
[INLINE_DIFF_VIEW_TYPE]: (line) => line?.new_line,
|
|
||||||
};
|
|
||||||
const numberGetter = numberGetters[viewType];
|
|
||||||
return numberGetter && numberGetter(diffLine);
|
|
||||||
};
|
|
||||||
|
|
||||||
const i18n = {
|
|
||||||
showMore: sprintf(s__('Diffs|Show %{unfoldCount} lines'), { unfoldCount: UNFOLD_COUNT }),
|
|
||||||
showAll: s__('Diffs|Show all unchanged lines'),
|
|
||||||
};
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
i18n,
|
i18n: {
|
||||||
|
showMore: sprintf(s__('Diffs|Show %{unfoldCount} lines'), { unfoldCount: UNFOLD_COUNT }),
|
||||||
|
showAll: s__('Diffs|Show all unchanged lines'),
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
GlIcon,
|
GlIcon,
|
||||||
|
GlLoadingIcon,
|
||||||
|
},
|
||||||
|
directives: {
|
||||||
|
GlTooltip: GlTooltipDirective,
|
||||||
|
SafeHtml: GlSafeHtmlDirective,
|
||||||
},
|
},
|
||||||
mixins: [glFeatureFlagsMixin()],
|
mixins: [glFeatureFlagsMixin()],
|
||||||
props: {
|
props: {
|
||||||
fileHash: {
|
file: {
|
||||||
type: String,
|
type: Object,
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
contextLinesPath: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
line: {
|
line: {
|
||||||
|
|
@ -53,34 +44,45 @@ export default {
|
||||||
required: false,
|
required: false,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
lineCountBetween: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: -1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return { loading: { up: false, down: false, all: false } };
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState({
|
|
||||||
diffFiles: (state) => state.diffs.diffFiles,
|
|
||||||
}),
|
|
||||||
canExpandUp() {
|
canExpandUp() {
|
||||||
return !this.isBottom;
|
return !this.isBottom;
|
||||||
},
|
},
|
||||||
canExpandDown() {
|
canExpandDown() {
|
||||||
return this.isBottom || !this.isTop;
|
return this.isBottom || !this.isTop;
|
||||||
},
|
},
|
||||||
},
|
isLineCountSmall() {
|
||||||
created() {
|
return this.lineCountBetween >= 20 || this.lineCountBetween === -1;
|
||||||
this.EXPAND_DOWN = EXPAND_DOWN;
|
},
|
||||||
this.EXPAND_UP = EXPAND_UP;
|
showExpandDown() {
|
||||||
|
return this.canExpandDown && this.isLineCountSmall;
|
||||||
|
},
|
||||||
|
showExpandUp() {
|
||||||
|
return this.canExpandUp && this.isLineCountSmall;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions('diffs', ['loadMoreLines']),
|
...mapActions('diffs', ['loadMoreLines']),
|
||||||
getPrevLineNumber(oldLineNumber, newLineNumber) {
|
getPrevLineNumber(oldLineNumber, newLineNumber) {
|
||||||
const diffFile = utils.findDiffFile(this.diffFiles, this.fileHash);
|
const index = utils.getPreviousLineIndex(this.file, {
|
||||||
const index = utils.getPreviousLineIndex(INLINE_DIFF_VIEW_TYPE, diffFile, {
|
|
||||||
oldLineNumber,
|
oldLineNumber,
|
||||||
newLineNumber,
|
newLineNumber,
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return this.file[INLINE_DIFF_LINES_KEY][index - 2]?.new_line || 0;
|
||||||
lineNumberByViewType(INLINE_DIFF_VIEW_TYPE, diffFile[INLINE_DIFF_LINES_KEY][index - 2]) || 0
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
callLoadMoreLines(
|
callLoadMoreLines(
|
||||||
endpoint,
|
endpoint,
|
||||||
|
|
@ -99,6 +101,9 @@ export default {
|
||||||
message: s__('Diffs|Something went wrong while fetching diff lines.'),
|
message: s__('Diffs|Something went wrong while fetching diff lines.'),
|
||||||
});
|
});
|
||||||
this.isRequesting = false;
|
this.isRequesting = false;
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.loading = { up: false, down: false, all: false };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
handleExpandLines(type = EXPAND_ALL) {
|
handleExpandLines(type = EXPAND_ALL) {
|
||||||
|
|
@ -107,25 +112,26 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.isRequesting = true;
|
this.isRequesting = true;
|
||||||
const endpoint = this.contextLinesPath;
|
const endpoint = this.file.context_lines_path;
|
||||||
const { fileHash } = this;
|
|
||||||
const view = INLINE_DIFF_VIEW_TYPE;
|
|
||||||
const oldLineNumber = this.line.meta_data.old_pos || 0;
|
const oldLineNumber = this.line.meta_data.old_pos || 0;
|
||||||
const newLineNumber = this.line.meta_data.new_pos || 0;
|
const newLineNumber = this.line.meta_data.new_pos || 0;
|
||||||
const offset = newLineNumber - oldLineNumber;
|
const offset = newLineNumber - oldLineNumber;
|
||||||
|
|
||||||
const expandOptions = { endpoint, fileHash, view, oldLineNumber, newLineNumber, offset };
|
const expandOptions = { endpoint, oldLineNumber, newLineNumber, offset };
|
||||||
|
|
||||||
if (type === EXPAND_UP) {
|
if (type === EXPAND_UP) {
|
||||||
|
this.loading.up = true;
|
||||||
this.handleExpandUpLines(expandOptions);
|
this.handleExpandUpLines(expandOptions);
|
||||||
} else if (type === EXPAND_DOWN) {
|
} else if (type === EXPAND_DOWN) {
|
||||||
|
this.loading.down = true;
|
||||||
this.handleExpandDownLines(expandOptions);
|
this.handleExpandDownLines(expandOptions);
|
||||||
} else {
|
} else {
|
||||||
|
this.loading.all = true;
|
||||||
this.handleExpandAllLines(expandOptions);
|
this.handleExpandAllLines(expandOptions);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleExpandUpLines(expandOptions) {
|
handleExpandUpLines(expandOptions) {
|
||||||
const { endpoint, fileHash, view, oldLineNumber, newLineNumber, offset } = expandOptions;
|
const { endpoint, oldLineNumber, newLineNumber, offset } = expandOptions;
|
||||||
|
|
||||||
const bottom = this.isBottom;
|
const bottom = this.isBottom;
|
||||||
const lineNumber = newLineNumber - 1;
|
const lineNumber = newLineNumber - 1;
|
||||||
|
|
@ -139,15 +145,13 @@ export default {
|
||||||
unfold = false;
|
unfold = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const params = { since, to, bottom, offset, unfold, view };
|
const params = { since, to, bottom, offset, unfold };
|
||||||
const lineNumbers = { oldLineNumber, newLineNumber };
|
const lineNumbers = { oldLineNumber, newLineNumber };
|
||||||
this.callLoadMoreLines(endpoint, params, lineNumbers, fileHash);
|
this.callLoadMoreLines(endpoint, params, lineNumbers, this.file.file_hash);
|
||||||
},
|
},
|
||||||
handleExpandDownLines(expandOptions) {
|
handleExpandDownLines(expandOptions) {
|
||||||
const {
|
const {
|
||||||
endpoint,
|
endpoint,
|
||||||
fileHash,
|
|
||||||
view,
|
|
||||||
oldLineNumber: metaOldPos,
|
oldLineNumber: metaOldPos,
|
||||||
newLineNumber: metaNewPos,
|
newLineNumber: metaNewPos,
|
||||||
offset,
|
offset,
|
||||||
|
|
@ -183,19 +187,19 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const params = { since, to, bottom, offset, unfold, view };
|
const params = { since, to, bottom, offset, unfold };
|
||||||
const lineNumbers = { oldLineNumber, newLineNumber };
|
const lineNumbers = { oldLineNumber, newLineNumber };
|
||||||
this.callLoadMoreLines(
|
this.callLoadMoreLines(
|
||||||
endpoint,
|
endpoint,
|
||||||
params,
|
params,
|
||||||
lineNumbers,
|
lineNumbers,
|
||||||
fileHash,
|
this.file.file_hash,
|
||||||
isExpandDown,
|
isExpandDown,
|
||||||
nextLineNumbers,
|
nextLineNumbers,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
handleExpandAllLines(expandOptions) {
|
handleExpandAllLines(expandOptions) {
|
||||||
const { endpoint, fileHash, view, oldLineNumber, newLineNumber, offset } = expandOptions;
|
const { endpoint, oldLineNumber, newLineNumber, offset } = expandOptions;
|
||||||
const bottom = this.isBottom;
|
const bottom = this.isBottom;
|
||||||
const unfold = false;
|
const unfold = false;
|
||||||
let since;
|
let since;
|
||||||
|
|
@ -213,21 +217,71 @@ export default {
|
||||||
to = newLineNumber - 1;
|
to = newLineNumber - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const params = { since, to, bottom, offset, unfold, view };
|
const params = { since, to, bottom, offset, unfold };
|
||||||
const lineNumbers = { oldLineNumber, newLineNumber };
|
const lineNumbers = { oldLineNumber, newLineNumber };
|
||||||
this.callLoadMoreLines(endpoint, params, lineNumbers, fileHash);
|
this.callLoadMoreLines(endpoint, params, lineNumbers, this.file.file_hash);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
EXPAND_DOWN,
|
||||||
|
EXPAND_UP,
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="content js-line-expansion-content">
|
<div
|
||||||
|
v-if="glFeatures.updatedDiffExpansionButtons"
|
||||||
|
class="diff-grid-row diff-grid-row-full diff-tr line_holder match expansion"
|
||||||
|
>
|
||||||
|
<div :class="{ parallel: !inline }" class="diff-grid-left diff-grid-2-col left-side">
|
||||||
|
<div
|
||||||
|
class="diff-td diff-line-num gl-text-center! gl-p-0! gl-w-full! gl-display-flex gl-flex-direction-column"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
v-if="showExpandDown"
|
||||||
|
v-gl-tooltip
|
||||||
|
:title="s__('Diffs|Next 20 lines')"
|
||||||
|
type="button"
|
||||||
|
class="js-unfold-down gl-rounded-0 gl-border-0 diff-line-expand-button"
|
||||||
|
@click="handleExpandLines($options.EXPAND_DOWN)"
|
||||||
|
>
|
||||||
|
<gl-loading-icon v-if="loading.down" size="sm" color="dark" inline />
|
||||||
|
<gl-icon v-else name="expand-down" />
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-if="lineCountBetween !== -1 && lineCountBetween < 20"
|
||||||
|
v-gl-tooltip
|
||||||
|
:title="s__('Diffs|Expand all lines')"
|
||||||
|
type="button"
|
||||||
|
class="js-unfold-all gl-rounded-0 gl-border-0 diff-line-expand-button"
|
||||||
|
@click="handleExpandLines()"
|
||||||
|
>
|
||||||
|
<gl-loading-icon v-if="loading.all" size="sm" color="dark" inline />
|
||||||
|
<gl-icon v-else name="expand" />
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-if="showExpandUp"
|
||||||
|
v-gl-tooltip
|
||||||
|
:title="s__('Diffs|Previous 20 lines')"
|
||||||
|
type="button"
|
||||||
|
class="js-unfold gl-rounded-0 gl-border-0 diff-line-expand-button"
|
||||||
|
@click="handleExpandLines($options.EXPAND_UP)"
|
||||||
|
>
|
||||||
|
<gl-loading-icon v-if="loading.up" size="sm" color="dark" inline />
|
||||||
|
<gl-icon v-else name="expand-up" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-safe-html="line.rich_text"
|
||||||
|
class="gl-display-flex! gl-flex-direction-column gl-justify-content-center diff-td line_content left-side gl-white-space-normal!"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else class="content js-line-expansion-content">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
:disabled="!canExpandDown"
|
:disabled="!canExpandDown"
|
||||||
class="js-unfold-down gl-mx-2 gl-py-4 gl-cursor-pointer"
|
class="js-unfold-down gl-mx-2 gl-py-4 gl-cursor-pointer"
|
||||||
@click="handleExpandLines(EXPAND_DOWN)"
|
@click="handleExpandLines($options.EXPAND_DOWN)"
|
||||||
>
|
>
|
||||||
<gl-icon :size="12" name="expand-down" />
|
<gl-icon :size="12" name="expand-down" />
|
||||||
<span>{{ $options.i18n.showMore }}</span>
|
<span>{{ $options.i18n.showMore }}</span>
|
||||||
|
|
@ -244,7 +298,7 @@ export default {
|
||||||
type="button"
|
type="button"
|
||||||
:disabled="!canExpandUp"
|
:disabled="!canExpandUp"
|
||||||
class="js-unfold gl-mx-2 gl-py-4 gl-cursor-pointer"
|
class="js-unfold gl-mx-2 gl-py-4 gl-cursor-pointer"
|
||||||
@click="handleExpandLines(EXPAND_UP)"
|
@click="handleExpandLines($options.EXPAND_UP)"
|
||||||
>
|
>
|
||||||
<gl-icon :size="12" name="expand-up" />
|
<gl-icon :size="12" name="expand-up" />
|
||||||
<span>{{ $options.i18n.showMore }}</span>
|
<span>{{ $options.i18n.showMore }}</span>
|
||||||
|
|
|
||||||
|
|
@ -160,7 +160,13 @@ export default {
|
||||||
|
|
||||||
<!-- eslint-disable-next-line vue/no-deprecated-functional-template -->
|
<!-- eslint-disable-next-line vue/no-deprecated-functional-template -->
|
||||||
<template functional>
|
<template functional>
|
||||||
<div :class="$options.classNameMap(props)" class="diff-grid-row diff-tr line_holder">
|
<div
|
||||||
|
:class="[
|
||||||
|
$options.classNameMap(props),
|
||||||
|
{ expansion: props.line.left && props.line.left.type === 'expanded' },
|
||||||
|
]"
|
||||||
|
class="diff-grid-row diff-tr line_holder"
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
:id="props.line.left && props.line.left.line_code"
|
:id="props.line.left && props.line.left.line_code"
|
||||||
data-testid="left-side"
|
data-testid="left-side"
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import {
|
||||||
CONFLICT_MARKER_THEIR,
|
CONFLICT_MARKER_THEIR,
|
||||||
CONFLICT_THEIR,
|
CONFLICT_THEIR,
|
||||||
CONFLICT_OUR,
|
CONFLICT_OUR,
|
||||||
|
EXPANDED_LINE_TYPE,
|
||||||
} from '../constants';
|
} from '../constants';
|
||||||
|
|
||||||
export const isHighlighted = (highlightedRow, line, isCommented) => {
|
export const isHighlighted = (highlightedRow, line, isCommented) => {
|
||||||
|
|
@ -118,10 +119,12 @@ export const mapParallel = (content) => (line) => {
|
||||||
if (right) {
|
if (right) {
|
||||||
right = {
|
right = {
|
||||||
...right,
|
...right,
|
||||||
renderDiscussion: Boolean(hasExpandedDiscussionOnRight && right.type),
|
renderDiscussion: Boolean(
|
||||||
|
hasExpandedDiscussionOnRight && right.type && right.type !== EXPANDED_LINE_TYPE,
|
||||||
|
),
|
||||||
hasDraft: content.hasParallelDraftRight(content.diffFile.file_hash, line),
|
hasDraft: content.hasParallelDraftRight(content.diffFile.file_hash, line),
|
||||||
lineDraft: content.draftForLine(content.diffFile.file_hash, line, 'right'),
|
lineDraft: content.draftForLine(content.diffFile.file_hash, line, 'right'),
|
||||||
hasCommentForm: Boolean(right.hasForm && right.type),
|
hasCommentForm: Boolean(right.hasForm && right.type && right.type !== EXPANDED_LINE_TYPE),
|
||||||
emptyCellClassMap: { conflict_their: line.left?.type === CONFLICT_OUR },
|
emptyCellClassMap: { conflict_their: line.left?.type === CONFLICT_OUR },
|
||||||
addCommentTooltip: addCommentTooltip(line.right),
|
addCommentTooltip: addCommentTooltip(line.right),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -141,6 +141,18 @@ export default {
|
||||||
table.classList.add(`${lineClass}-selected`);
|
table.classList.add(`${lineClass}-selected`);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getCountBetweenIndex(index) {
|
||||||
|
if (index === 0) {
|
||||||
|
return -1;
|
||||||
|
} else if (!this.diffLines[index + 1]) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
Number(this.diffLines[index + 1].left.new_line) -
|
||||||
|
Number(this.diffLines[index - 1].left.new_line)
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
userColorScheme: window.gon.user_color_scheme,
|
userColorScheme: window.gon.user_color_scheme,
|
||||||
};
|
};
|
||||||
|
|
@ -158,38 +170,51 @@ export default {
|
||||||
>
|
>
|
||||||
<template v-for="(line, index) in diffLines">
|
<template v-for="(line, index) in diffLines">
|
||||||
<template v-if="line.isMatchLineLeft || line.isMatchLineRight">
|
<template v-if="line.isMatchLineLeft || line.isMatchLineRight">
|
||||||
<div :key="`expand-${index}`" class="diff-tr line_expansion match">
|
<diff-expansion-cell
|
||||||
<div class="diff-td text-center gl-font-regular">
|
v-if="glFeatures.updatedDiffExpansionButtons"
|
||||||
<diff-expansion-cell
|
:key="`expand-${index}`"
|
||||||
:file-hash="diffFile.file_hash"
|
:file="diffFile"
|
||||||
:context-lines-path="diffFile.context_lines_path"
|
:line="line.left"
|
||||||
:line="line.left"
|
:is-top="index === 0"
|
||||||
:is-top="index === 0"
|
:is-bottom="index + 1 === diffLinesLength"
|
||||||
:is-bottom="index + 1 === diffLinesLength"
|
:inline="inline"
|
||||||
/>
|
:line-count-between="getCountBetweenIndex(index)"
|
||||||
|
/>
|
||||||
|
<template v-else>
|
||||||
|
<div :key="`expand-${index}`" class="diff-tr line_expansion old-line_expansion match">
|
||||||
|
<div class="diff-td text-center gl-font-regular">
|
||||||
|
<diff-expansion-cell
|
||||||
|
:file="diffFile"
|
||||||
|
:context-lines-path="diffFile.context_lines_path"
|
||||||
|
:line="line.left"
|
||||||
|
:is-top="index === 0"
|
||||||
|
:is-bottom="index + 1 === diffLinesLength"
|
||||||
|
:inline="inline"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div
|
||||||
<div
|
v-if="line.left.rich_text"
|
||||||
v-if="line.left.rich_text"
|
:key="`expand-definition-${index}`"
|
||||||
:key="`expand-definition-${index}`"
|
class="diff-grid-row diff-tr line_holder match"
|
||||||
class="diff-grid-row diff-tr line_holder match"
|
>
|
||||||
>
|
<div class="diff-grid-left diff-grid-3-col left-side">
|
||||||
<div class="diff-grid-left diff-grid-3-col left-side">
|
<div class="diff-td diff-line-num"></div>
|
||||||
<div class="diff-td diff-line-num"></div>
|
<div v-if="inline" class="diff-td diff-line-num"></div>
|
||||||
<div v-if="inline" class="diff-td diff-line-num"></div>
|
<div
|
||||||
<div
|
v-safe-html="line.left.rich_text"
|
||||||
v-safe-html="line.left.rich_text"
|
class="diff-td line_content left-side gl-white-space-normal!"
|
||||||
class="diff-td line_content left-side gl-white-space-normal!"
|
></div>
|
||||||
></div>
|
</div>
|
||||||
|
<div v-if="!inline" class="diff-grid-right diff-grid-3-col right-side">
|
||||||
|
<div class="diff-td diff-line-num"></div>
|
||||||
|
<div
|
||||||
|
v-safe-html="line.left.rich_text"
|
||||||
|
class="diff-td line_content right-side gl-white-space-normal!"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!inline" class="diff-grid-right diff-grid-3-col right-side">
|
</template>
|
||||||
<div class="diff-td diff-line-num"></div>
|
|
||||||
<div
|
|
||||||
v-safe-html="line.left.rich_text"
|
|
||||||
class="diff-td line_content right-side gl-white-space-normal!"
|
|
||||||
></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
<diff-row
|
<diff-row
|
||||||
v-if="!line.isMatchLineLeft && !line.isMatchLineRight"
|
v-if="!line.isMatchLineLeft && !line.isMatchLineRight"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
export const INLINE_DIFF_VIEW_TYPE = 'inline';
|
export const INLINE_DIFF_VIEW_TYPE = 'inline';
|
||||||
export const PARALLEL_DIFF_VIEW_TYPE = 'parallel';
|
export const PARALLEL_DIFF_VIEW_TYPE = 'parallel';
|
||||||
export const MATCH_LINE_TYPE = 'match';
|
export const MATCH_LINE_TYPE = 'match';
|
||||||
|
export const EXPANDED_LINE_TYPE = 'expanded';
|
||||||
export const OLD_NO_NEW_LINE_TYPE = 'old-nonewline';
|
export const OLD_NO_NEW_LINE_TYPE = 'old-nonewline';
|
||||||
export const NEW_NO_NEW_LINE_TYPE = 'new-nonewline';
|
export const NEW_NO_NEW_LINE_TYPE = 'new-nonewline';
|
||||||
export const CONTEXT_LINE_TYPE = 'context';
|
export const CONTEXT_LINE_TYPE = 'context';
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import {
|
||||||
DIFF_FILE_MANUAL_COLLAPSE,
|
DIFF_FILE_MANUAL_COLLAPSE,
|
||||||
DIFF_FILE_AUTOMATIC_COLLAPSE,
|
DIFF_FILE_AUTOMATIC_COLLAPSE,
|
||||||
INLINE_DIFF_LINES_KEY,
|
INLINE_DIFF_LINES_KEY,
|
||||||
|
EXPANDED_LINE_TYPE,
|
||||||
} from '../constants';
|
} from '../constants';
|
||||||
import * as types from './mutation_types';
|
import * as types from './mutation_types';
|
||||||
import {
|
import {
|
||||||
|
|
@ -131,6 +132,7 @@ export default {
|
||||||
: line.line_code || `${fileHash}_${line.old_line}_${line.new_line}`;
|
: line.line_code || `${fileHash}_${line.old_line}_${line.new_line}`;
|
||||||
return {
|
return {
|
||||||
...line,
|
...line,
|
||||||
|
type: line.type || EXPANDED_LINE_TYPE,
|
||||||
line_code: lineCode,
|
line_code: lineCode,
|
||||||
discussions: line.discussions || [],
|
discussions: line.discussions || [],
|
||||||
hasForm: false,
|
hasForm: false,
|
||||||
|
|
|
||||||
|
|
@ -15,13 +15,15 @@ import {
|
||||||
CONFLICT_MARKER,
|
CONFLICT_MARKER,
|
||||||
CONFLICT_MARKER_OUR,
|
CONFLICT_MARKER_OUR,
|
||||||
CONFLICT_MARKER_THEIR,
|
CONFLICT_MARKER_THEIR,
|
||||||
|
EXPANDED_LINE_TYPE,
|
||||||
} from '../constants';
|
} from '../constants';
|
||||||
import { prepareRawDiffFile } from '../utils/diff_file';
|
import { prepareRawDiffFile } from '../utils/diff_file';
|
||||||
|
|
||||||
export const isAdded = (line) => ['new', 'new-nonewline'].includes(line.type);
|
export const isAdded = (line) => ['new', 'new-nonewline'].includes(line.type);
|
||||||
export const isRemoved = (line) => ['old', 'old-nonewline'].includes(line.type);
|
export const isRemoved = (line) => ['old', 'old-nonewline'].includes(line.type);
|
||||||
export const isUnchanged = (line) => !line.type;
|
export const isUnchanged = (line) => !line.type;
|
||||||
export const isMeta = (line) => ['match', 'new-nonewline', 'old-nonewline'].includes(line.type);
|
export const isMeta = (line) =>
|
||||||
|
['match', EXPANDED_LINE_TYPE, 'new-nonewline', 'old-nonewline'].includes(line.type);
|
||||||
export const isConflictMarker = (line) =>
|
export const isConflictMarker = (line) =>
|
||||||
[CONFLICT_MARKER_OUR, CONFLICT_MARKER_THEIR].includes(line.type);
|
[CONFLICT_MARKER_OUR, CONFLICT_MARKER_THEIR].includes(line.type);
|
||||||
export const isConflictSeperator = (line) => line.type === CONFLICT_MARKER;
|
export const isConflictSeperator = (line) => line.type === CONFLICT_MARKER;
|
||||||
|
|
@ -205,7 +207,7 @@ export const findIndexInInlineLines = (lines, lineNumbers) => {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getPreviousLineIndex = (diffViewType, file, lineNumbers) => {
|
export const getPreviousLineIndex = (file, lineNumbers) => {
|
||||||
return findIndexInInlineLines(file[INLINE_DIFF_LINES_KEY], lineNumbers);
|
return findIndexInInlineLines(file[INLINE_DIFF_LINES_KEY], lineNumbers);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,11 @@
|
||||||
p {
|
p {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.broadcast-notification-message {
|
.broadcast-notification-message {
|
||||||
|
|
|
||||||
|
|
@ -582,25 +582,6 @@ table.code {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.diff-expansion-cell {
|
|
||||||
flex: 1 1;
|
|
||||||
min-width: max-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
.diff-expansion-cell-middle {
|
|
||||||
flex: 0 1 max-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: $breakpoint-xl) {
|
|
||||||
.diff-expansion-cell-start {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.diff-expansion-cell-end {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Merge request diff grid layout
|
// Merge request diff grid layout
|
||||||
.diff-grid {
|
.diff-grid {
|
||||||
.diff-td {
|
.diff-td {
|
||||||
|
|
@ -612,6 +593,10 @@ table.code {
|
||||||
.diff-grid-row {
|
.diff-grid-row {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
|
|
||||||
|
&.diff-grid-row-full {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.diff-grid-left,
|
.diff-grid-left,
|
||||||
|
|
@ -626,6 +611,14 @@ table.code {
|
||||||
grid-template-columns: 50px 1fr !important;
|
grid-template-columns: 50px 1fr !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.diff-grid-2-col {
|
||||||
|
grid-template-columns: 100px 1fr !important;
|
||||||
|
|
||||||
|
&.parallel {
|
||||||
|
grid-template-columns: 50px 1fr !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&.inline-diff-view .diff-grid-3-col {
|
&.inline-diff-view .diff-grid-3-col {
|
||||||
grid-template-columns: 50px 50px 1fr !important;
|
grid-template-columns: 50px 50px 1fr !important;
|
||||||
}
|
}
|
||||||
|
|
@ -1209,3 +1202,10 @@ table.code {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 100vh;
|
bottom: 100vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.diff-line-expand-button {
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
@include gl-bg-gray-200;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,17 @@
|
||||||
background: $dark-diff-match-color;
|
background: $dark-diff-match-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin diff-expansion($background, $border, $link) {
|
@mixin diff-expansion($background, $color, $hover-background, $hover-color) {
|
||||||
|
background-color: $background;
|
||||||
|
color: $color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $hover-background;
|
||||||
|
color: $hover-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin old-diff-expansion($background, $border, $link) {
|
||||||
background-color: $background;
|
background-color: $background;
|
||||||
|
|
||||||
.diff-td,
|
.diff-td,
|
||||||
|
|
@ -49,6 +59,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@mixin dark-diff-expansion-line {
|
||||||
|
&.expansion .diff-td {
|
||||||
|
background-color: $dark-diff-match-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@mixin line-coverage-border-color($coverage, $no-coverage) {
|
@mixin line-coverage-border-color($coverage, $no-coverage) {
|
||||||
transition: border-left 0.1s ease-out;
|
transition: border-left 0.1s ease-out;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,8 +154,12 @@ $dark-il: #de935f;
|
||||||
color: $dark-line-color;
|
color: $dark-line-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.line_expansion {
|
.old-line_expansion {
|
||||||
@include diff-expansion($dark-main-bg, $dark-border, $dark-na);
|
@include old-diff-expansion($dark-main-bg, $dark-border, $dark-na);
|
||||||
|
}
|
||||||
|
|
||||||
|
.diff-line-expand-button {
|
||||||
|
@include diff-expansion($gray-600, $gray-200, $gray-300, $white);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Diff line
|
// Diff line
|
||||||
|
|
@ -166,6 +170,10 @@ $dark-il: #de935f;
|
||||||
@include dark-diff-match-line;
|
@include dark-diff-match-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.diff-grid-row {
|
||||||
|
@include dark-diff-expansion-line;
|
||||||
|
}
|
||||||
|
|
||||||
.diff-td.diff-line-num.hll:not(.empty-cell),
|
.diff-td.diff-line-num.hll:not(.empty-cell),
|
||||||
.diff-td.line-coverage.hll:not(.empty-cell),
|
.diff-td.line-coverage.hll:not(.empty-cell),
|
||||||
.diff-td.line-codequality.hll:not(.empty-cell),
|
.diff-td.line-codequality.hll:not(.empty-cell),
|
||||||
|
|
|
||||||
|
|
@ -125,8 +125,12 @@ $monokai-gh: #75715e;
|
||||||
color: $monokai-text-color;
|
color: $monokai-text-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.line_expansion {
|
.old-line_expansion {
|
||||||
@include diff-expansion($monokai-bg, $monokai-border, $monokai-k);
|
@include old-diff-expansion($monokai-bg, $monokai-border, $monokai-k);
|
||||||
|
}
|
||||||
|
|
||||||
|
.diff-line-expand-button {
|
||||||
|
@include diff-expansion($gray-600, $gray-200, $gray-300, $white);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Diff line
|
// Diff line
|
||||||
|
|
@ -137,6 +141,10 @@ $monokai-gh: #75715e;
|
||||||
@include dark-diff-match-line;
|
@include dark-diff-match-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.diff-grid-row {
|
||||||
|
@include dark-diff-expansion-line;
|
||||||
|
}
|
||||||
|
|
||||||
.diff-td.diff-line-num.hll:not(.empty-cell),
|
.diff-td.diff-line-num.hll:not(.empty-cell),
|
||||||
.diff-td.line-coverage.hll:not(.empty-cell),
|
.diff-td.line-coverage.hll:not(.empty-cell),
|
||||||
.diff-td.line-codequality.hll:not(.empty-cell),
|
.diff-td.line-codequality.hll:not(.empty-cell),
|
||||||
|
|
|
||||||
|
|
@ -44,10 +44,15 @@
|
||||||
color: $gl-text-color;
|
color: $gl-text-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.line_expansion {
|
.old-line_expansion {
|
||||||
@include diff-expansion($gray-light, $white-normal, $gl-text-color);
|
@include old-diff-expansion($gray-light, $white-normal, $gl-text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.diff-line-expand-button {
|
||||||
|
@include diff-expansion($gray-100, $gray-700, $gray-200, $gray-800);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Diff line
|
// Diff line
|
||||||
$none-expanded-border: #e0e0e0;
|
$none-expanded-border: #e0e0e0;
|
||||||
$none-expanded-bg: #e0e0e0;
|
$none-expanded-bg: #e0e0e0;
|
||||||
|
|
|
||||||
|
|
@ -128,8 +128,12 @@ $solarized-dark-il: #2aa198;
|
||||||
color: $solarized-dark-pre-color;
|
color: $solarized-dark-pre-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.line_expansion {
|
.old-line_expansion {
|
||||||
@include diff-expansion($solarized-dark-line-bg, $solarized-dark-border, $solarized-dark-kd);
|
@include old-diff-expansion($solarized-dark-line-bg, $solarized-dark-border, $solarized-dark-kd);
|
||||||
|
}
|
||||||
|
|
||||||
|
.diff-line-expand-button {
|
||||||
|
@include diff-expansion(lighten($solarized-dark-pre-bg, 10%), $gray-200, lighten($solarized-dark-pre-bg, 20%), $white);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Diff line
|
// Diff line
|
||||||
|
|
@ -140,6 +144,10 @@ $solarized-dark-il: #2aa198;
|
||||||
@include dark-diff-match-line;
|
@include dark-diff-match-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.diff-grid-row {
|
||||||
|
@include dark-diff-expansion-line;
|
||||||
|
}
|
||||||
|
|
||||||
.diff-td.diff-line-num.hll:not(.empty-cell),
|
.diff-td.diff-line-num.hll:not(.empty-cell),
|
||||||
.diff-td.line-coverage.hll:not(.empty-cell),
|
.diff-td.line-coverage.hll:not(.empty-cell),
|
||||||
.diff-td.line-codequality.hll:not(.empty-cell),
|
.diff-td.line-codequality.hll:not(.empty-cell),
|
||||||
|
|
|
||||||
|
|
@ -134,9 +134,13 @@ $solarized-light-il: #2aa198;
|
||||||
background-color: $solarized-light-pre-bg;
|
background-color: $solarized-light-pre-bg;
|
||||||
color: $solarized-light-pre-color;
|
color: $solarized-light-pre-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.old-line_expansion {
|
||||||
|
@include old-diff-expansion($solarized-light-line-bg, $solarized-light-border, $solarized-light-kd);
|
||||||
|
}
|
||||||
|
|
||||||
.line_expansion {
|
.diff-line-expand-button {
|
||||||
@include diff-expansion($solarized-light-line-bg, $solarized-light-border, $solarized-light-kd);
|
@include diff-expansion($gray-100, $gray-700, $gray-200, $gray-800);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Diff line
|
// Diff line
|
||||||
|
|
@ -147,6 +151,10 @@ $solarized-light-il: #2aa198;
|
||||||
@include match-line;
|
@include match-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.diff-grid-row.expansion .diff-td {
|
||||||
|
background-color: $solarized-light-matchline-bg;
|
||||||
|
}
|
||||||
|
|
||||||
.diff-td.diff-line-num.hll:not(.empty-cell),
|
.diff-td.diff-line-num.hll:not(.empty-cell),
|
||||||
.diff-td.line-coverage.hll:not(.empty-cell),
|
.diff-td.line-coverage.hll:not(.empty-cell),
|
||||||
.diff-td.line-codequality.hll:not(.empty-cell),
|
.diff-td.line-codequality.hll:not(.empty-cell),
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,22 @@ $white-gc-bg: #eaf2f5;
|
||||||
background-color: $gray-light;
|
background-color: $gray-light;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@mixin diff-match-line {
|
||||||
|
&.expansion {
|
||||||
|
&.match .diff-td {
|
||||||
|
color: $gray-400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.diff-td {
|
||||||
|
background-color: $gray-50;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-color: $gray-100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Line numbers
|
// Line numbers
|
||||||
.file-line-num {
|
.file-line-num {
|
||||||
@include line-number-link($black-transparent);
|
@include line-number-link($black-transparent);
|
||||||
|
|
@ -117,8 +133,8 @@ pre.code,
|
||||||
color: $white-code-color;
|
color: $white-code-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.line_expansion {
|
.old-line_expansion {
|
||||||
@include diff-expansion($gray-light, $border-color, $blue-600);
|
@include old-diff-expansion($gray-light, $border-color, $blue-600);
|
||||||
|
|
||||||
&.diff-tr:last-child {
|
&.diff-tr:last-child {
|
||||||
border-bottom-right-radius: 4px;
|
border-bottom-right-radius: 4px;
|
||||||
|
|
@ -130,6 +146,10 @@ pre.code,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.diff-line-expand-button {
|
||||||
|
@include diff-expansion($gray-100, $gray-700, $gray-200, $gray-800);
|
||||||
|
}
|
||||||
|
|
||||||
// Diff line
|
// Diff line
|
||||||
.line_holder {
|
.line_holder {
|
||||||
&.match .line_content,
|
&.match .line_content,
|
||||||
|
|
@ -138,6 +158,10 @@ pre.code,
|
||||||
@include match-line;
|
@include match-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.diff-grid-row {
|
||||||
|
@include diff-match-line;
|
||||||
|
}
|
||||||
|
|
||||||
&:not(.match) .diff-grid-left:hover,
|
&:not(.match) .diff-grid-left:hover,
|
||||||
&:not(.match) .diff-grid-right:hover,
|
&:not(.match) .diff-grid-right:hover,
|
||||||
&.code-search-line:hover {
|
&.code-search-line:hover {
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
|
||||||
push_frontend_feature_flag(:secure_vulnerability_training, project, default_enabled: :yaml)
|
push_frontend_feature_flag(:secure_vulnerability_training, project, default_enabled: :yaml)
|
||||||
push_frontend_feature_flag(:issue_assignees_widget, @project, default_enabled: :yaml)
|
push_frontend_feature_flag(:issue_assignees_widget, @project, default_enabled: :yaml)
|
||||||
push_frontend_feature_flag(:realtime_labels, project, default_enabled: :yaml)
|
push_frontend_feature_flag(:realtime_labels, project, default_enabled: :yaml)
|
||||||
|
push_frontend_feature_flag(:updated_diff_expansion_buttons, project, default_enabled: :yaml)
|
||||||
end
|
end
|
||||||
|
|
||||||
before_action do
|
before_action do
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ module Ci
|
||||||
expose :name
|
expose :name
|
||||||
|
|
||||||
expose :started?, as: :started
|
expose :started?, as: :started
|
||||||
|
expose :started_at, if: -> (job) { job.started? }
|
||||||
expose :complete?, as: :complete
|
expose :complete?, as: :complete
|
||||||
expose :archived?, as: :archived
|
expose :archived?, as: :archived
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,21 +4,20 @@
|
||||||
%li.snippet-row.py-3{ data: { qa_selector: 'snippet_link', qa_snippet_title: snippet.title } }
|
%li.snippet-row.py-3{ data: { qa_selector: 'snippet_link', qa_snippet_title: snippet.title } }
|
||||||
= image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: ''
|
= image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: ''
|
||||||
|
|
||||||
.title
|
= link_to gitlab_snippet_path(snippet), class: "title" do
|
||||||
= link_to gitlab_snippet_path(snippet) do
|
= snippet.title
|
||||||
= snippet.title
|
|
||||||
|
|
||||||
%ul.controls{ data: { qa_selector: 'snippet_file_count_content', qa_snippet_files: snippet.statistics&.file_count } }
|
%ul.controls{ data: { qa_selector: 'snippet_file_count_content', qa_snippet_files: snippet.statistics&.file_count } }
|
||||||
%li
|
%li
|
||||||
= snippet_file_count(snippet)
|
= snippet_file_count(snippet)
|
||||||
%li
|
%li
|
||||||
= link_to gitlab_snippet_path(snippet, anchor: 'notes'), class: ('no-comments' if notes_count == 0) do
|
= link_to gitlab_snippet_path(snippet, anchor: 'notes'), class: ('no-comments' if notes_count == 0) do
|
||||||
= sprite_icon('comments', css_class: 'gl-vertical-align-text-bottom')
|
= sprite_icon('comments', css_class: 'gl-vertical-align-text-bottom')
|
||||||
= notes_count
|
= notes_count
|
||||||
%li
|
%li
|
||||||
%span.sr-only{ data: { qa_selector: 'snippet_visibility_content', qa_snippet_visibility: visibility_level_label(snippet.visibility_level) } }
|
%span.sr-only{ data: { qa_selector: 'snippet_visibility_content', qa_snippet_visibility: visibility_level_label(snippet.visibility_level) } }
|
||||||
= visibility_level_label(snippet.visibility_level)
|
= visibility_level_label(snippet.visibility_level)
|
||||||
= visibility_level_icon(snippet.visibility_level)
|
= visibility_level_icon(snippet.visibility_level)
|
||||||
|
|
||||||
.snippet-info
|
.snippet-info
|
||||||
#{snippet.to_reference} ·
|
#{snippet.to_reference} ·
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
name: updated_diff_expansion_buttons
|
||||||
|
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80890
|
||||||
|
rollout_issue_url:
|
||||||
|
milestone: '14.10'
|
||||||
|
type: development
|
||||||
|
group: group::code review
|
||||||
|
default_enabled: false
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
- name: "Dependency Scanning default Java version changed to 17"
|
||||||
|
announcement_milestone: "14.10"
|
||||||
|
announcement_date: "2022-04-22"
|
||||||
|
removal_milestone: "15.0"
|
||||||
|
removal_date: "2021-05-22"
|
||||||
|
breaking_change: true
|
||||||
|
reporter: NicoleSchwartz
|
||||||
|
body: |
|
||||||
|
In GitLab 15.0, for Dependency Scanning, the default version of Java will be updated to 17. This is the same as [the most up-to-date Long Term Support (LTS) version](https://en.wikipedia.org/wiki/Java_version_history). GitLab still [supports the same versions as it does today (8, 11, 13, 14, 15, 16, 17)](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning). Only the enabled default is changing. To change the default, set the `DS_Java_Version` variable.
|
||||||
|
# The following items are not published on the docs page, but may be used in the future.
|
||||||
|
stage: secure # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
|
||||||
|
tiers: ultimate # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
|
||||||
|
issue_url: # (optional) This is a link to the deprecation issue in GitLab
|
||||||
|
documentation_url: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning
|
||||||
|
image_url: # (optional) This is a link to a thumbnail image depicting the feature
|
||||||
|
video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
- name: "SaaS certificate-based integration with Kubernetes"
|
||||||
|
announcement_milestone: "14.5"
|
||||||
|
announcement_date: "2021-11-15"
|
||||||
|
removal_milestone: "15.0"
|
||||||
|
removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
|
||||||
|
breaking_change: true
|
||||||
|
body: |
|
||||||
|
The certificate-based integration with Kubernetes will be [deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). As a GitLab SaaS customer, you will no longer be able to integrate GitLab and your cluster using the certificate-based approach as of GitLab 15.0.
|
||||||
|
|
||||||
|
For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
|
||||||
|
[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
|
||||||
|
|
||||||
|
For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
|
||||||
|
stage: Configure
|
||||||
|
tiers: [Free, Premium, Ultimate]
|
||||||
|
issue_url: 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
|
||||||
|
documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated'
|
||||||
|
|
@ -1,27 +1,21 @@
|
||||||
- name: "Certificate-based integration with Kubernetes"
|
- name: "Self-managed certificate-based integration with Kubernetes"
|
||||||
announcement_milestone: "14.5"
|
announcement_milestone: "14.5"
|
||||||
announcement_date: "2021-11-15"
|
announcement_date: "2021-11-15"
|
||||||
removal_milestone: "15.6"
|
removal_milestone: "15.6"
|
||||||
removal_date: "2022-11-22" # the date of the milestone release when this feature is planned to be removed
|
removal_date: "2022-11-22" # the date of the milestone release when this feature is planned to be removed
|
||||||
breaking_change: true
|
breaking_change: true
|
||||||
body: |
|
body: |
|
||||||
[The certificate-based integration with Kubernetes will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
|
The certificate-based integration with Kubernetes [will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
|
||||||
|
|
||||||
If you are a self-managed customer, in GitLab 15.0, a feature flag will be introduced so you can keep
|
As a self-managed customer, we are introducing a feature flag in GitLab 15.0 so you can keep your certificate-based integration enabled. However, the feature flag will be disabled by default, so this change is a **breaking change**.
|
||||||
certificate-based integration enabled. The flag will be disabled by default.
|
|
||||||
The flag and the related code will be removed in GitLab 15.6.
|
|
||||||
|
|
||||||
Until the final removal in 15.6, features built on the integration will continue to work, and
|
In GitLab 15.6 we will remove both the feature, and its related code. Until the final removal in 15.6, features built on this integration will continue to work, if you enable the feature flag. Until the feature is removed, GitLab will continue to fix security and critical issues as they arise.
|
||||||
GitLab will continue to fix security and critical issues.
|
|
||||||
|
|
||||||
If you use GitLab.com, certificate-based integrations will cease functioning in 15.0.
|
|
||||||
|
|
||||||
For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
|
For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
|
||||||
[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab.
|
[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
|
||||||
See the documentation for [how to migrate](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html).
|
|
||||||
|
|
||||||
For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
|
For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
|
||||||
stage: Configure
|
stage: Configure
|
||||||
tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
|
tiers: [Core, Premium, Ultimate]
|
||||||
issue_url: 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
|
issue_url: 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
|
||||||
documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated'
|
documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated'
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,18 @@ Most of the deprecations are **planned for removal in 15.0**, and many of them a
|
||||||
|
|
||||||
## 14.10
|
## 14.10
|
||||||
|
|
||||||
|
### Dependency Scanning default Java version changed to 17
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
This feature will be changed or removed in 15.0
|
||||||
|
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
|
||||||
|
Before updating GitLab, review the details carefully to determine if you need to make any
|
||||||
|
changes to your code, settings, or workflow.
|
||||||
|
|
||||||
|
In GitLab 15.0, for Dependency Scanning, the default version of Java will be updated to 17. This is the same as [the most up-to-date Long Term Support (LTS) version](https://en.wikipedia.org/wiki/Java_version_history). GitLab still [supports the same versions as it does today (8, 11, 13, 14, 15, 16, 17)](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning). Only the enabled default is changing. To change the default, set the `DS_Java_Version` variable.
|
||||||
|
|
||||||
|
**Planned removal milestone: 15.0 (2021-05-22)**
|
||||||
|
|
||||||
### Manual iteration management
|
### Manual iteration management
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
|
|
@ -1250,33 +1262,6 @@ If you have explicitly excluded bundler-audit using DS_EXCLUDED_ANALYZERS you wi
|
||||||
|
|
||||||
## 14.5
|
## 14.5
|
||||||
|
|
||||||
### Certificate-based integration with Kubernetes
|
|
||||||
|
|
||||||
WARNING:
|
|
||||||
This feature will be changed or removed in 15.6
|
|
||||||
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
|
|
||||||
Before updating GitLab, review the details carefully to determine if you need to make any
|
|
||||||
changes to your code, settings, or workflow.
|
|
||||||
|
|
||||||
[The certificate-based integration with Kubernetes will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
|
|
||||||
|
|
||||||
If you are a self-managed customer, in GitLab 15.0, a feature flag will be introduced so you can keep
|
|
||||||
certificate-based integration enabled. The flag will be disabled by default.
|
|
||||||
The flag and the related code will be removed in GitLab 15.6.
|
|
||||||
|
|
||||||
Until the final removal in 15.6, features built on the integration will continue to work, and
|
|
||||||
GitLab will continue to fix security and critical issues.
|
|
||||||
|
|
||||||
If you use GitLab.com, certificate-based integrations will cease functioning in 15.0.
|
|
||||||
|
|
||||||
For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
|
|
||||||
[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab.
|
|
||||||
See the documentation for [how to migrate](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html).
|
|
||||||
|
|
||||||
For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
|
|
||||||
|
|
||||||
**Planned removal milestone: 15.6 (2022-11-22)**
|
|
||||||
|
|
||||||
### Converting an instance (shared) runner to a project (specific) runner
|
### Converting an instance (shared) runner to a project (specific) runner
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
|
|
@ -1349,6 +1334,44 @@ When checking if a runner is `paused`, API users are advised to check the boolea
|
||||||
|
|
||||||
**Planned removal milestone: 16.0 (2023-04-22)**
|
**Planned removal milestone: 16.0 (2023-04-22)**
|
||||||
|
|
||||||
|
### SaaS certificate-based integration with Kubernetes
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
This feature will be changed or removed in 15.0
|
||||||
|
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
|
||||||
|
Before updating GitLab, review the details carefully to determine if you need to make any
|
||||||
|
changes to your code, settings, or workflow.
|
||||||
|
|
||||||
|
The certificate-based integration with Kubernetes will be [deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). As a GitLab SaaS customer, you will no longer be able to integrate GitLab and your cluster using the certificate-based approach as of GitLab 15.0.
|
||||||
|
|
||||||
|
For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
|
||||||
|
[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
|
||||||
|
|
||||||
|
For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
|
||||||
|
|
||||||
|
**Planned removal milestone: 15.0 (2022-05-22)**
|
||||||
|
|
||||||
|
### Self-managed certificate-based integration with Kubernetes
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
This feature will be changed or removed in 15.6
|
||||||
|
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
|
||||||
|
Before updating GitLab, review the details carefully to determine if you need to make any
|
||||||
|
changes to your code, settings, or workflow.
|
||||||
|
|
||||||
|
The certificate-based integration with Kubernetes [will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
|
||||||
|
|
||||||
|
As a self-managed customer, we are introducing a feature flag in GitLab 15.0 so you can keep your certificate-based integration enabled. However, the feature flag will be disabled by default, so this change is a **breaking change**.
|
||||||
|
|
||||||
|
In GitLab 15.6 we will remove both the feature, and its related code. Until the final removal in 15.6, features built on this integration will continue to work, if you enable the feature flag. Until the feature is removed, GitLab will continue to fix security and critical issues as they arise.
|
||||||
|
|
||||||
|
For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
|
||||||
|
[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
|
||||||
|
|
||||||
|
For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
|
||||||
|
|
||||||
|
**Planned removal milestone: 15.6 (2022-11-22)**
|
||||||
|
|
||||||
### Support for SLES 12 SP2
|
### Support for SLES 12 SP2
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,11 @@ To connect your Kubernetes cluster with GitLab, you can use:
|
||||||
|
|
||||||
The certificate-based integration is
|
The certificate-based integration is
|
||||||
[**deprecated**](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/)
|
[**deprecated**](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/)
|
||||||
in GitLab 14.5. It is expected to be
|
in GitLab 14.5. The removal dates are:
|
||||||
[turned off by default in 15.0](../../../update/deprecations.md#certificate-based-integration-with-kubernetes)
|
|
||||||
and removed in GitLab 15.6.
|
- [GitLab.com customers](../../../update/deprecations.md#saas-certificate-based-integration-with-kubernetes): GitLab 15.0.
|
||||||
|
- [Self-managed customers](../../../update/deprecations.md#self-managed-certificate-based-integration-with-kubernetes):
|
||||||
|
Placed behind a disabled feature flag in GitLab 15.0, and removed entirely in GitLab 15.6.
|
||||||
|
|
||||||
If you are using the certificate-based integration, you should move to another workflow as soon as possible.
|
If you are using the certificate-based integration, you should move to another workflow as soon as possible.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13076,9 +13076,18 @@ msgid_plural "Diffs|%d deletions"
|
||||||
msgstr[0] ""
|
msgstr[0] ""
|
||||||
msgstr[1] ""
|
msgstr[1] ""
|
||||||
|
|
||||||
|
msgid "Diffs|Expand all lines"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Diffs|Next 20 lines"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Diffs|No file name available"
|
msgid "Diffs|No file name available"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Diffs|Previous 20 lines"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Diffs|Show %{unfoldCount} lines"
|
msgid "Diffs|Show %{unfoldCount} lines"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,7 +154,7 @@ RSpec.describe 'User comments on a diff', :js do
|
||||||
it 'allows comments on previously hidden lines the middle of a file' do
|
it 'allows comments on previously hidden lines the middle of a file' do
|
||||||
# Click 27, expand up, select 18, add and verify comment
|
# Click 27, expand up, select 18, add and verify comment
|
||||||
page.within find_by_scrolling('[data-path="files/ruby/popen.rb"]') do
|
page.within find_by_scrolling('[data-path="files/ruby/popen.rb"]') do
|
||||||
all('.js-unfold-all')[1].click
|
first('.js-unfold-all').click
|
||||||
end
|
end
|
||||||
click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="21"]').find(:xpath, '../..'), 'left')
|
click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="21"]').find(:xpath, '../..'), 'left')
|
||||||
add_comment('18', '21')
|
add_comment('18', '21')
|
||||||
|
|
@ -163,10 +163,10 @@ RSpec.describe 'User comments on a diff', :js do
|
||||||
it 'allows comments on previously hidden lines at the bottom of a file' do
|
it 'allows comments on previously hidden lines at the bottom of a file' do
|
||||||
# Click +28, expand down, select 37 add and verify comment
|
# Click +28, expand down, select 37 add and verify comment
|
||||||
page.within find_by_scrolling('[data-path="files/ruby/popen.rb"]') do
|
page.within find_by_scrolling('[data-path="files/ruby/popen.rb"]') do
|
||||||
all('.js-unfold-down:not([disabled])')[1].click
|
first('.js-unfold-down').click
|
||||||
end
|
end
|
||||||
click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="30"]').find(:xpath, '../..'), 'left')
|
click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="30"]').find(:xpath, '../..'), 'left')
|
||||||
add_comment('+28', '37')
|
add_comment('+28', '30')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ RSpec.describe 'User views diffs', :js do
|
||||||
|
|
||||||
it 'unfolds diffs in the middle' do
|
it 'unfolds diffs in the middle' do
|
||||||
page.within('.file-holder[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd"]') do
|
page.within('.file-holder[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd"]') do
|
||||||
all('.js-unfold-all')[1].click
|
first('.js-unfold-all').click
|
||||||
|
|
||||||
expect(page).to have_selector('[data-interop-type="new"] [data-linenumber="24"]', count: 1)
|
expect(page).to have_selector('[data-interop-type="new"] [data-linenumber="24"]', count: 1)
|
||||||
expect(page).not_to have_selector('[data-interop-type="new"] [data-linenumber="1"]')
|
expect(page).not_to have_selector('[data-interop-type="new"] [data-linenumber="1"]')
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ function makeLoadMoreLinesPayload({
|
||||||
sinceLine,
|
sinceLine,
|
||||||
toLine,
|
toLine,
|
||||||
oldLineNumber,
|
oldLineNumber,
|
||||||
diffViewType,
|
|
||||||
fileHash,
|
fileHash,
|
||||||
nextLineNumbers = {},
|
nextLineNumbers = {},
|
||||||
unfold = false,
|
unfold = false,
|
||||||
|
|
@ -28,12 +27,11 @@ function makeLoadMoreLinesPayload({
|
||||||
isExpandDown = false,
|
isExpandDown = false,
|
||||||
}) {
|
}) {
|
||||||
return {
|
return {
|
||||||
endpoint: 'contextLinesPath',
|
endpoint: diffFileMockData.context_lines_path,
|
||||||
params: {
|
params: {
|
||||||
since: sinceLine,
|
since: sinceLine,
|
||||||
to: toLine,
|
to: toLine,
|
||||||
offset: toLine + 1 - oldLineNumber,
|
offset: toLine + 1 - oldLineNumber,
|
||||||
view: diffViewType,
|
|
||||||
unfold,
|
unfold,
|
||||||
bottom,
|
bottom,
|
||||||
},
|
},
|
||||||
|
|
@ -70,10 +68,11 @@ describe('DiffExpansionCell', () => {
|
||||||
const createComponent = (options = {}) => {
|
const createComponent = (options = {}) => {
|
||||||
const defaults = {
|
const defaults = {
|
||||||
fileHash: mockFile.file_hash,
|
fileHash: mockFile.file_hash,
|
||||||
contextLinesPath: 'contextLinesPath',
|
|
||||||
line: mockLine,
|
line: mockLine,
|
||||||
isTop: false,
|
isTop: false,
|
||||||
isBottom: false,
|
isBottom: false,
|
||||||
|
file: mockFile,
|
||||||
|
inline: true,
|
||||||
};
|
};
|
||||||
const propsData = { ...defaults, ...options };
|
const propsData = { ...defaults, ...options };
|
||||||
|
|
||||||
|
|
@ -124,7 +123,7 @@ describe('DiffExpansionCell', () => {
|
||||||
|
|
||||||
describe('any row', () => {
|
describe('any row', () => {
|
||||||
[
|
[
|
||||||
{ diffViewType: INLINE_DIFF_VIEW_TYPE, lineIndex: 8, file: { parallel_diff_lines: [] } },
|
{ diffViewType: INLINE_DIFF_VIEW_TYPE, lineIndex: 8, file: cloneDeep(diffFileMockData) },
|
||||||
].forEach(({ diffViewType, file, lineIndex }) => {
|
].forEach(({ diffViewType, file, lineIndex }) => {
|
||||||
describe(`with diffViewType (${diffViewType})`, () => {
|
describe(`with diffViewType (${diffViewType})`, () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
|
@ -140,12 +139,12 @@ describe('DiffExpansionCell', () => {
|
||||||
it('on expand all clicked, dispatch loadMoreLines', () => {
|
it('on expand all clicked, dispatch loadMoreLines', () => {
|
||||||
const oldLineNumber = mockLine.meta_data.old_pos;
|
const oldLineNumber = mockLine.meta_data.old_pos;
|
||||||
const newLineNumber = mockLine.meta_data.new_pos;
|
const newLineNumber = mockLine.meta_data.new_pos;
|
||||||
const previousIndex = getPreviousLineIndex(diffViewType, mockFile, {
|
const previousIndex = getPreviousLineIndex(mockFile, {
|
||||||
oldLineNumber,
|
oldLineNumber,
|
||||||
newLineNumber,
|
newLineNumber,
|
||||||
});
|
});
|
||||||
|
|
||||||
const wrapper = createComponent();
|
const wrapper = createComponent({ file });
|
||||||
|
|
||||||
findExpandAll(wrapper).click();
|
findExpandAll(wrapper).click();
|
||||||
|
|
||||||
|
|
@ -156,7 +155,6 @@ describe('DiffExpansionCell', () => {
|
||||||
toLine: newLineNumber - 1,
|
toLine: newLineNumber - 1,
|
||||||
sinceLine: previousIndex,
|
sinceLine: previousIndex,
|
||||||
oldLineNumber,
|
oldLineNumber,
|
||||||
diffViewType,
|
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
@ -168,7 +166,7 @@ describe('DiffExpansionCell', () => {
|
||||||
const oldLineNumber = mockLine.meta_data.old_pos;
|
const oldLineNumber = mockLine.meta_data.old_pos;
|
||||||
const newLineNumber = mockLine.meta_data.new_pos;
|
const newLineNumber = mockLine.meta_data.new_pos;
|
||||||
|
|
||||||
const wrapper = createComponent();
|
const wrapper = createComponent({ file });
|
||||||
|
|
||||||
findExpandUp(wrapper).trigger('click');
|
findExpandUp(wrapper).trigger('click');
|
||||||
|
|
||||||
|
|
@ -196,17 +194,16 @@ describe('DiffExpansionCell', () => {
|
||||||
mockLine.meta_data.old_pos = 200;
|
mockLine.meta_data.old_pos = 200;
|
||||||
mockLine.meta_data.new_pos = 200;
|
mockLine.meta_data.new_pos = 200;
|
||||||
|
|
||||||
const wrapper = createComponent();
|
const wrapper = createComponent({ file });
|
||||||
|
|
||||||
findExpandDown(wrapper).trigger('click');
|
findExpandDown(wrapper).trigger('click');
|
||||||
|
|
||||||
expect(store.dispatch).toHaveBeenCalledWith('diffs/loadMoreLines', {
|
expect(store.dispatch).toHaveBeenCalledWith('diffs/loadMoreLines', {
|
||||||
endpoint: 'contextLinesPath',
|
endpoint: diffFileMockData.context_lines_path,
|
||||||
params: {
|
params: {
|
||||||
since: 1,
|
since: 1,
|
||||||
to: 21, // the load amount, plus 1 line
|
to: 21, // the load amount, plus 1 line
|
||||||
offset: 0,
|
offset: 0,
|
||||||
view: diffViewType,
|
|
||||||
unfold: true,
|
unfold: true,
|
||||||
bottom: true,
|
bottom: true,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,14 @@ describe('DiffsStoreMutations', () => {
|
||||||
const options = {
|
const options = {
|
||||||
lineNumbers: { oldLineNumber: 1, newLineNumber: 2 },
|
lineNumbers: { oldLineNumber: 1, newLineNumber: 2 },
|
||||||
contextLines: [
|
contextLines: [
|
||||||
{ old_line: 1, new_line: 1, line_code: 'ff9200_1_1', discussions: [], hasForm: false },
|
{
|
||||||
|
old_line: 1,
|
||||||
|
new_line: 1,
|
||||||
|
line_code: 'ff9200_1_1',
|
||||||
|
discussions: [],
|
||||||
|
hasForm: false,
|
||||||
|
type: 'expanded',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
fileHash: 'ff9200',
|
fileHash: 'ff9200',
|
||||||
params: {
|
params: {
|
||||||
|
|
|
||||||
|
|
@ -51,21 +51,19 @@ describe('DiffsStoreUtils', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getPreviousLineIndex', () => {
|
describe('getPreviousLineIndex', () => {
|
||||||
describe(`with diffViewType (inline) in split diffs`, () => {
|
let diffFile;
|
||||||
let diffFile;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
diffFile = { ...clone(diffFileMockData) };
|
diffFile = { ...clone(diffFileMockData) };
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return the correct previous line number', () => {
|
it('should return the correct previous line number', () => {
|
||||||
expect(
|
expect(
|
||||||
utils.getPreviousLineIndex(INLINE_DIFF_VIEW_TYPE, diffFile, {
|
utils.getPreviousLineIndex(diffFile, {
|
||||||
oldLineNumber: 3,
|
oldLineNumber: 3,
|
||||||
newLineNumber: 5,
|
newLineNumber: 5,
|
||||||
}),
|
}),
|
||||||
).toBe(4);
|
).toBe(4);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,15 @@ RSpec.describe Ci::JobEntity do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when job is running' do
|
||||||
|
let_it_be(:job) { create(:ci_build, :running) }
|
||||||
|
|
||||||
|
it 'contains started_at' do
|
||||||
|
expect(subject[:started]).to be_truthy
|
||||||
|
expect(subject[:started_at]).to eq(job.started_at)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when job is generic commit status' do
|
context 'when job is generic commit status' do
|
||||||
let(:job) { create(:generic_commit_status, target_url: 'http://google.com') }
|
let(:job) { create(:generic_commit_status, target_url: 'http://google.com') }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue