Merge branch 'master' into 37860-pipelines-page
* master: (88 commits) Fix deletion of container registry or images returning an error The fog-aliyun gem had a bug in v0.1.0 for file storage creation/update. This merge requests update the gem to v0.2.0 which contains the fix: Decrease ABC threshold to 54.28 Update VERSION to 10.2.0-pre Update CHANGELOG.md for 10.1.0 Document `CI_SHARED_ENVIRONMENT` and `CI_DISPOSABLE_ENVIRONMENT` Fix the external URLs generated for online view of HTML artifacts Use title as placeholder instead of issue title for reusability Fix failure in current_settings_spec.rb Clarify the difference between project_update and project_rename URI decode Page-Title header to preserve UTF-8 characters Update Gitaly version to v0.49.0 Decrease Perceived Complexity threshold to 14 Resolve "Remove help text regarding group issues on group issues page (and group merge requests page)" Force non diff resolved discussion to display when collapse toggled Added submodule support in multi-file editor add note about after_script being run separately Check for element before evaluate_script Merge branch 'master-i18n' into 'master' Update Prometheus gem to fix problems with other files overwriting current file ...
This commit is contained in:
commit
4ad8c9997d
144
.gitlab-ci.yml
144
.gitlab-ci.yml
|
|
@ -49,11 +49,11 @@ stages:
|
|||
- gitlab-org
|
||||
|
||||
.tests-metadata-state: &tests-metadata-state
|
||||
services: []
|
||||
<<: *dedicated-runner
|
||||
variables:
|
||||
SETUP_DB: "false"
|
||||
USE_BUNDLE_INSTALL: "false"
|
||||
TESTS_METADATA_S3_BUCKET: "gitlab-ce-cache"
|
||||
before_script:
|
||||
- source scripts/utils.sh
|
||||
artifacts:
|
||||
expire_in: 31d
|
||||
paths:
|
||||
|
|
@ -80,6 +80,7 @@ stages:
|
|||
.rspec-metadata: &rspec-metadata
|
||||
<<: *dedicated-runner
|
||||
<<: *pull-cache
|
||||
<<: *except-docs
|
||||
stage: test
|
||||
script:
|
||||
- JOB_NAME=( $CI_JOB_NAME )
|
||||
|
|
@ -109,16 +110,15 @@ stages:
|
|||
.rspec-metadata-pg: &rspec-metadata-pg
|
||||
<<: *rspec-metadata
|
||||
<<: *use-pg
|
||||
<<: *except-docs
|
||||
|
||||
.rspec-metadata-mysql: &rspec-metadata-mysql
|
||||
<<: *rspec-metadata
|
||||
<<: *use-mysql
|
||||
<<: *except-docs
|
||||
|
||||
.spinach-metadata: &spinach-metadata
|
||||
<<: *dedicated-runner
|
||||
<<: *pull-cache
|
||||
<<: *except-docs
|
||||
stage: test
|
||||
script:
|
||||
- JOB_NAME=( $CI_JOB_NAME )
|
||||
|
|
@ -141,12 +141,10 @@ stages:
|
|||
.spinach-metadata-pg: &spinach-metadata-pg
|
||||
<<: *spinach-metadata
|
||||
<<: *use-pg
|
||||
<<: *except-docs
|
||||
|
||||
.spinach-metadata-mysql: &spinach-metadata-mysql
|
||||
<<: *spinach-metadata
|
||||
<<: *use-mysql
|
||||
<<: *except-docs
|
||||
|
||||
.only-canonical-masters: &only-canonical-masters
|
||||
only:
|
||||
|
|
@ -157,12 +155,8 @@ stages:
|
|||
|
||||
# Trigger a package build in omnibus-gitlab repository
|
||||
build-package:
|
||||
image: ruby:2.3-alpine
|
||||
image: ruby:2.4-alpine
|
||||
before_script: []
|
||||
services: []
|
||||
variables:
|
||||
SETUP_DB: "false"
|
||||
USE_BUNDLE_INSTALL: "false"
|
||||
stage: build
|
||||
cache: {}
|
||||
when: manual
|
||||
|
|
@ -183,13 +177,9 @@ build-package:
|
|||
- apk add --update openssl
|
||||
- wget https://gitlab.com/gitlab-org/gitlab-ce/raw/master/scripts/trigger-build-docs
|
||||
- chmod 755 trigger-build-docs
|
||||
services: []
|
||||
cache: {}
|
||||
dependencies: []
|
||||
artifacts: {}
|
||||
variables:
|
||||
SETUP_DB: "false"
|
||||
USE_BUNDLE_INSTALL: "false"
|
||||
GIT_STRATEGY: none
|
||||
when: manual
|
||||
only:
|
||||
|
|
@ -222,7 +212,6 @@ review-docs-cleanup:
|
|||
# Retrieve knapsack and rspec_flaky reports
|
||||
retrieve-tests-metadata:
|
||||
<<: *tests-metadata-state
|
||||
<<: *dedicated-runner
|
||||
<<: *except-docs
|
||||
stage: prepare
|
||||
cache:
|
||||
|
|
@ -240,7 +229,6 @@ retrieve-tests-metadata:
|
|||
|
||||
update-tests-metadata:
|
||||
<<: *tests-metadata-state
|
||||
<<: *dedicated-runner
|
||||
<<: *only-canonical-masters
|
||||
stage: post-test
|
||||
cache:
|
||||
|
|
@ -305,69 +293,69 @@ setup-test-env:
|
|||
- public/assets
|
||||
- tmp/tests
|
||||
|
||||
rspec-pg 0 25: *rspec-metadata-pg
|
||||
rspec-pg 1 25: *rspec-metadata-pg
|
||||
rspec-pg 2 25: *rspec-metadata-pg
|
||||
rspec-pg 3 25: *rspec-metadata-pg
|
||||
rspec-pg 4 25: *rspec-metadata-pg
|
||||
rspec-pg 5 25: *rspec-metadata-pg
|
||||
rspec-pg 6 25: *rspec-metadata-pg
|
||||
rspec-pg 7 25: *rspec-metadata-pg
|
||||
rspec-pg 8 25: *rspec-metadata-pg
|
||||
rspec-pg 9 25: *rspec-metadata-pg
|
||||
rspec-pg 10 25: *rspec-metadata-pg
|
||||
rspec-pg 11 25: *rspec-metadata-pg
|
||||
rspec-pg 12 25: *rspec-metadata-pg
|
||||
rspec-pg 13 25: *rspec-metadata-pg
|
||||
rspec-pg 14 25: *rspec-metadata-pg
|
||||
rspec-pg 15 25: *rspec-metadata-pg
|
||||
rspec-pg 16 25: *rspec-metadata-pg
|
||||
rspec-pg 17 25: *rspec-metadata-pg
|
||||
rspec-pg 18 25: *rspec-metadata-pg
|
||||
rspec-pg 19 25: *rspec-metadata-pg
|
||||
rspec-pg 20 25: *rspec-metadata-pg
|
||||
rspec-pg 21 25: *rspec-metadata-pg
|
||||
rspec-pg 22 25: *rspec-metadata-pg
|
||||
rspec-pg 23 25: *rspec-metadata-pg
|
||||
rspec-pg 24 25: *rspec-metadata-pg
|
||||
rspec-pg 0 26: *rspec-metadata-pg
|
||||
rspec-pg 1 26: *rspec-metadata-pg
|
||||
rspec-pg 2 26: *rspec-metadata-pg
|
||||
rspec-pg 3 26: *rspec-metadata-pg
|
||||
rspec-pg 4 26: *rspec-metadata-pg
|
||||
rspec-pg 5 26: *rspec-metadata-pg
|
||||
rspec-pg 6 26: *rspec-metadata-pg
|
||||
rspec-pg 7 26: *rspec-metadata-pg
|
||||
rspec-pg 8 26: *rspec-metadata-pg
|
||||
rspec-pg 9 26: *rspec-metadata-pg
|
||||
rspec-pg 10 26: *rspec-metadata-pg
|
||||
rspec-pg 11 26: *rspec-metadata-pg
|
||||
rspec-pg 12 26: *rspec-metadata-pg
|
||||
rspec-pg 13 26: *rspec-metadata-pg
|
||||
rspec-pg 14 26: *rspec-metadata-pg
|
||||
rspec-pg 15 26: *rspec-metadata-pg
|
||||
rspec-pg 16 26: *rspec-metadata-pg
|
||||
rspec-pg 17 26: *rspec-metadata-pg
|
||||
rspec-pg 18 26: *rspec-metadata-pg
|
||||
rspec-pg 19 26: *rspec-metadata-pg
|
||||
rspec-pg 20 26: *rspec-metadata-pg
|
||||
rspec-pg 21 26: *rspec-metadata-pg
|
||||
rspec-pg 22 26: *rspec-metadata-pg
|
||||
rspec-pg 23 26: *rspec-metadata-pg
|
||||
rspec-pg 24 26: *rspec-metadata-pg
|
||||
rspec-pg 25 26: *rspec-metadata-pg
|
||||
|
||||
rspec-mysql 0 25: *rspec-metadata-mysql
|
||||
rspec-mysql 1 25: *rspec-metadata-mysql
|
||||
rspec-mysql 2 25: *rspec-metadata-mysql
|
||||
rspec-mysql 3 25: *rspec-metadata-mysql
|
||||
rspec-mysql 4 25: *rspec-metadata-mysql
|
||||
rspec-mysql 5 25: *rspec-metadata-mysql
|
||||
rspec-mysql 6 25: *rspec-metadata-mysql
|
||||
rspec-mysql 7 25: *rspec-metadata-mysql
|
||||
rspec-mysql 8 25: *rspec-metadata-mysql
|
||||
rspec-mysql 9 25: *rspec-metadata-mysql
|
||||
rspec-mysql 10 25: *rspec-metadata-mysql
|
||||
rspec-mysql 11 25: *rspec-metadata-mysql
|
||||
rspec-mysql 12 25: *rspec-metadata-mysql
|
||||
rspec-mysql 13 25: *rspec-metadata-mysql
|
||||
rspec-mysql 14 25: *rspec-metadata-mysql
|
||||
rspec-mysql 15 25: *rspec-metadata-mysql
|
||||
rspec-mysql 16 25: *rspec-metadata-mysql
|
||||
rspec-mysql 17 25: *rspec-metadata-mysql
|
||||
rspec-mysql 18 25: *rspec-metadata-mysql
|
||||
rspec-mysql 19 25: *rspec-metadata-mysql
|
||||
rspec-mysql 20 25: *rspec-metadata-mysql
|
||||
rspec-mysql 21 25: *rspec-metadata-mysql
|
||||
rspec-mysql 22 25: *rspec-metadata-mysql
|
||||
rspec-mysql 23 25: *rspec-metadata-mysql
|
||||
rspec-mysql 24 25: *rspec-metadata-mysql
|
||||
rspec-mysql 0 26: *rspec-metadata-mysql
|
||||
rspec-mysql 1 26: *rspec-metadata-mysql
|
||||
rspec-mysql 2 26: *rspec-metadata-mysql
|
||||
rspec-mysql 3 26: *rspec-metadata-mysql
|
||||
rspec-mysql 4 26: *rspec-metadata-mysql
|
||||
rspec-mysql 5 26: *rspec-metadata-mysql
|
||||
rspec-mysql 6 26: *rspec-metadata-mysql
|
||||
rspec-mysql 7 26: *rspec-metadata-mysql
|
||||
rspec-mysql 8 26: *rspec-metadata-mysql
|
||||
rspec-mysql 9 26: *rspec-metadata-mysql
|
||||
rspec-mysql 10 26: *rspec-metadata-mysql
|
||||
rspec-mysql 11 26: *rspec-metadata-mysql
|
||||
rspec-mysql 12 26: *rspec-metadata-mysql
|
||||
rspec-mysql 13 26: *rspec-metadata-mysql
|
||||
rspec-mysql 14 26: *rspec-metadata-mysql
|
||||
rspec-mysql 15 26: *rspec-metadata-mysql
|
||||
rspec-mysql 16 26: *rspec-metadata-mysql
|
||||
rspec-mysql 17 26: *rspec-metadata-mysql
|
||||
rspec-mysql 18 26: *rspec-metadata-mysql
|
||||
rspec-mysql 19 26: *rspec-metadata-mysql
|
||||
rspec-mysql 20 26: *rspec-metadata-mysql
|
||||
rspec-mysql 21 26: *rspec-metadata-mysql
|
||||
rspec-mysql 22 26: *rspec-metadata-mysql
|
||||
rspec-mysql 23 26: *rspec-metadata-mysql
|
||||
rspec-mysql 24 26: *rspec-metadata-mysql
|
||||
rspec-mysql 25 26: *rspec-metadata-mysql
|
||||
|
||||
spinach-pg 0 5: *spinach-metadata-pg
|
||||
spinach-pg 1 5: *spinach-metadata-pg
|
||||
spinach-pg 2 5: *spinach-metadata-pg
|
||||
spinach-pg 3 5: *spinach-metadata-pg
|
||||
spinach-pg 4 5: *spinach-metadata-pg
|
||||
spinach-pg 0 4: *spinach-metadata-pg
|
||||
spinach-pg 1 4: *spinach-metadata-pg
|
||||
spinach-pg 2 4: *spinach-metadata-pg
|
||||
spinach-pg 3 4: *spinach-metadata-pg
|
||||
|
||||
spinach-mysql 0 5: *spinach-metadata-mysql
|
||||
spinach-mysql 1 5: *spinach-metadata-mysql
|
||||
spinach-mysql 2 5: *spinach-metadata-mysql
|
||||
spinach-mysql 3 5: *spinach-metadata-mysql
|
||||
spinach-mysql 4 5: *spinach-metadata-mysql
|
||||
spinach-mysql 0 4: *spinach-metadata-mysql
|
||||
spinach-mysql 1 4: *spinach-metadata-mysql
|
||||
spinach-mysql 2 4: *spinach-metadata-mysql
|
||||
spinach-mysql 3 4: *spinach-metadata-mysql
|
||||
|
||||
# Static analysis jobs
|
||||
.ruby-static-analysis: &ruby-static-analysis
|
||||
|
|
|
|||
|
|
@ -624,7 +624,7 @@ Style/PredicateName:
|
|||
# branches, and conditions.
|
||||
Metrics/AbcSize:
|
||||
Enabled: true
|
||||
Max: 55.25
|
||||
Max: 54.28
|
||||
|
||||
# This cop checks if the length of a block exceeds some maximum value.
|
||||
Metrics/BlockLength:
|
||||
|
|
@ -665,7 +665,7 @@ Metrics/ParameterLists:
|
|||
# A complexity metric geared towards measuring complexity for a human reader.
|
||||
Metrics/PerceivedComplexity:
|
||||
Enabled: true
|
||||
Max: 15
|
||||
Max: 14
|
||||
|
||||
# Lint ########################################################################
|
||||
|
||||
|
|
|
|||
192
CHANGELOG.md
192
CHANGELOG.md
|
|
@ -2,6 +2,198 @@
|
|||
documentation](doc/development/changelog.md) for instructions on adding your own
|
||||
entry.
|
||||
|
||||
## 10.1.0 (2017-10-22)
|
||||
|
||||
- [SECURITY] Use a timeout on certain git operations. !14872
|
||||
- [SECURITY] Move project repositories between namespaces when renaming users.
|
||||
- [SECURITY] Prevent an open redirect on project pages.
|
||||
- [SECURITY] Prevent a persistent XSS in user-provided markup.
|
||||
- [REMOVED] Remove the ability to visit the issue edit form directly. !14523
|
||||
- [REMOVED] Remove animate.js and label animation.
|
||||
- [FIXED] Perform prometheus data endpoint requests in parallel. !14003
|
||||
- [FIXED] Escape quotes in git username. !14020 (Brandon Everett)
|
||||
- [FIXED] Fixed non-UTF-8 valid branch names from causing an error. !14090
|
||||
- [FIXED] Read import sources from setting at first initialization. !14141 (Visay Keo)
|
||||
- [FIXED] Display full pre-receive and post-receive hook output in GitLab UI. !14222 (Robin Bobbitt)
|
||||
- [FIXED] Fix incorrect X-axis labels in Prometheus graphs. !14258
|
||||
- [FIXED] Fix the default branches sorting to actually be 'Last updated'. !14295
|
||||
- [FIXED] Fixes project denial of service via gitmodules using Extended ASCII. !14301
|
||||
- [FIXED] Fix the filesystem shard health check to check all configured shards. !14341
|
||||
- [FIXED] Compare email addresses case insensitively when verifying GPG signatures. !14376 (Tim Bishop)
|
||||
- [FIXED] Allow the git circuit breaker to correctly handle missing repository storages. !14417
|
||||
- [FIXED] Fix `rake gitlab:incoming_email:check` and make it report the actual error. !14423
|
||||
- [FIXED] Does not check if an invariant hashed storage path exists on disk when renaming projects. !14428
|
||||
- [FIXED] Also reserve refs/replace after importing a project. !14436
|
||||
- [FIXED] Fix profile image orientation based on EXIF data gvieira37. !14461 (gvieira37)
|
||||
- [FIXED] Move the deployment flag content to the left when deployment marker is near the end. !14514
|
||||
- [FIXED] Fix notes type created from import. This should fix some missing notes issues from imported projects. !14524
|
||||
- [FIXED] Fix bottom spacing for dropdowns that open upwards. !14535
|
||||
- [FIXED] Adjusts tag link to avoid underlining spaces. !14544 (Guilherme Vieira)
|
||||
- [FIXED] Add missing space in Sidekiq memory killer log message. !14553 (Benjamin Drung)
|
||||
- [FIXED] Ensure no exception is raised when Raven tries to get the current user in API context. !14580
|
||||
- [FIXED] Fix edit project service cancel button position. !14596 (Matt Coleman)
|
||||
- [FIXED] Fix case sensitive email confirmation on signup. !14606 (robdel12)
|
||||
- [FIXED] Whitelist authorized_keys.lock in the gitlab:check rake task. !14624
|
||||
- [FIXED] Allow merge in MR widget with no pipeline but using "Only allow merge requests to be merged if the pipeline succeeds". !14633
|
||||
- [FIXED] Fix navigation dropdown close animation on mobile screens. !14649
|
||||
- [FIXED] Fix the project import with issues and milestones. !14657
|
||||
- [FIXED] Use explicit boolean true attribute for show-disabled-button in Vue files. !14672
|
||||
- [FIXED] Make tabs on top scrollable on admin dashboard. !14685 (Takuya Noguchi)
|
||||
- [FIXED] Fix broken Y-axis scaling in some Prometheus graphs. !14693
|
||||
- [FIXED] Search or compare LDAP DNs case-insensitively and ignore excess whitespace. !14697
|
||||
- [FIXED] Allow prometheus graphs to correctly handle NaN values. !14741
|
||||
- [FIXED] Don't show an "Unsubscribe" link in snippet comment notifications. !14764
|
||||
- [FIXED] Fixed duplicate notifications when added multiple labels on an issue. !14798
|
||||
- [FIXED] Fix alignment for indeterminate marker in dropdowns. !14809
|
||||
- [FIXED] Fix error when updating a forked project with deleted `ForkedProjectLink`. !14916
|
||||
- [FIXED] Correctly render asset path for locales with a region. !14924
|
||||
- [FIXED] Fix the external URLs generated for online view of HTML artifacts. !14977
|
||||
- [FIXED] Reschedule merge request diff background migrations to catch failures from 9.5 run.
|
||||
- [FIXED] fix merge request widget status icon for failed CI.
|
||||
- [FIXED] Fix the number representing the amount of commits related to a push event.
|
||||
- [FIXED] Sync up hover and legend data across all graphs for the prometheus dashboard.
|
||||
- [FIXED] Fixes mini pipeline graph in commit view.
|
||||
- [FIXED] Fix comment deletion confirmation dialog typo.
|
||||
- [FIXED] Fix project snippets breadcrumb link.
|
||||
- [FIXED] Make usage ping scheduling more robust.
|
||||
- [FIXED] Make "merge ongoing" check more consistent.
|
||||
- [FIXED] Add 1000+ counters to job page.
|
||||
- [FIXED] Fixed issue/merge request breadcrumb titles not having links.
|
||||
- [FIXED] Fixed commit avatars being centered vertically.
|
||||
- [FIXED] Tooltips in the commit info box now all face the same direction. (Jedidiah Broadbent)
|
||||
- [FIXED] Fixed navbar title colors leaking out of the navbar.
|
||||
- [FIXED] Fix bug that caused merge requests with diff notes imported from Bitbucket to raise errors.
|
||||
- [FIXED] Correctly detect multiple issue URLs after 'Closes...' in MR descriptions.
|
||||
- [FIXED] Set default scope on PATs that don't have one set to allow them to be revoked.
|
||||
- [FIXED] Fix application setting to cache nil object.
|
||||
- [FIXED] Fix image diff swipe handle offset to correctly align with the frame.
|
||||
- [FIXED] Force non diff resolved discussion to display when collapse toggled.
|
||||
- [FIXED] Fix resolved discussions not expanding on side by side view.
|
||||
- [FIXED] Fixed the sidebar scrollbar overlapping links.
|
||||
- [FIXED] Issue board tooltips are now the correct width when the column is collapsed. (Jedidiah Broadbent)
|
||||
- [FIXED] Improve autodevops banner UX and render it only in project page.
|
||||
- [FIXED] Fix typo in cycle analytics breaking time component.
|
||||
- [FIXED] Force two up view to load by default for image diffs.
|
||||
- [FIXED] Fixed milestone breadcrumb links.
|
||||
- [FIXED] Fixed group sort dropdown defaulting to empty.
|
||||
- [FIXED] Fixed notes not being scrolled to in merge requests.
|
||||
- [FIXED] Adds Event polyfill for IE11.
|
||||
- [FIXED] Update native unicode emojis to always render as normal text (previously could render italicized). (Branka Martinovic)
|
||||
- [FIXED] Sort JobsController by id, not created_at.
|
||||
- [FIXED] Fix revision and total size missing for Container Registry.
|
||||
- [FIXED] Fixed milestone issuable assignee link URL.
|
||||
- [FIXED] Fixed breadcrumbs container expanding in side-by-side diff view.
|
||||
- [FIXED] Fixed merge request widget merged & closed date tooltip text.
|
||||
- [FIXED] Prevent creating multiple ApplicationSetting instances.
|
||||
- [FIXED] Fix username and ID not logging in production_json.log for Git activity.
|
||||
- [FIXED] Make Redcarpet Markdown renderer thread-safe.
|
||||
- [FIXED] Two factor auth messages in settings no longer overlap the button. (Jedidiah Broadbent)
|
||||
- [FIXED] Made the "remember me" check boxes have consistent styles and alignment. (Jedidiah Broadbent)
|
||||
- [FIXED] Prevent branches or tags from starting with invalid characters (e.g. -, .).
|
||||
- [DEPRECATED] Removed two legacy config options. (Daniel Voogsgerd)
|
||||
- [CHANGED] Show notes number more user-friendly in the graph. !13949 (Vladislav Kaverin)
|
||||
- [CHANGED] Link SAML users to LDAP by email. !14216
|
||||
- [CHANGED] Display whether branch has been merged when deleting protected branch. !14220
|
||||
- [CHANGED] Make the labels in the Compare form less confusing. !14225
|
||||
- [CHANGED] Confirmation email shows link as text instead of human readable text. !14243 (bitsapien)
|
||||
- [CHANGED] Return only group's members in user dropdowns on issuables list pages. !14249
|
||||
- [CHANGED] Added defaults for protected branches dropdowns on the repository settings. !14278
|
||||
- [CHANGED] Show confirmation modal before deleting account. !14360
|
||||
- [CHANGED] Allow creating merge requests across a fork network. !14422
|
||||
- [CHANGED] Re-arrange <script> tags before <template> tags in .vue files. !14671
|
||||
- [CHANGED] Create idea of read-only database. !14688
|
||||
- [CHANGED] Add active states to nav bar counters.
|
||||
- [CHANGED] Add view replaced file link for image diffs.
|
||||
- [CHANGED] Adjust tooltips to adhere to 8px grid and make them more readable.
|
||||
- [CHANGED] breadcrumbs receives padding when double lined.
|
||||
- [CHANGED] Allow developer role to admin milestones.
|
||||
- [CHANGED] Stop using Sidekiq for updating Key#last_used_at.
|
||||
- [CHANGED] Include GitLab full name in Slack messages.
|
||||
- [ADDED] Expose last pipeline details in API response when getting a single commit. !13521 (Mehdi Lahmam (@mehlah))
|
||||
- [ADDED] Allow to use same periods for different housekeeping tasks (effectively skipping the lesser task). !13711 (cernvcs)
|
||||
- [ADDED] Add GitLab-Pages version to Admin Dashboard. !14040 (travismiller)
|
||||
- [ADDED] Commenting on image diffs. !14061
|
||||
- [ADDED] Script to migrate project's repositories to new Hashed Storage. !14067
|
||||
- [ADDED] Hide close MR button after merge without reloading page. !14122 (Jacopo Beschi @jacopo-beschi)
|
||||
- [ADDED] Add Gitaly version to Admin Dashboard. !14313 (Jacopo Beschi @jacopo-beschi)
|
||||
- [ADDED] Add 'closed_at' attribute to Issues API. !14316 (Vitaliy @blackst0ne Klachkov)
|
||||
- [ADDED] Add tooltip for milestone due date to issue and merge request lists. !14318 (Vitaliy @blackst0ne Klachkov)
|
||||
- [ADDED] Improve list of sorting options. !14320 (Vitaliy @blackst0ne Klachkov)
|
||||
- [ADDED] Add client and call site metadata to Gitaly calls for better traceability. !14332
|
||||
- [ADDED] Strip gitlab-runner section markers in build trace HTML view. !14393
|
||||
- [ADDED] Add online view of HTML artifacts for public projects. !14399
|
||||
- [ADDED] Create Kubernetes cluster on GKE from k8s service. !14470
|
||||
- [ADDED] Add support for GPG subkeys in signature verification. !14517
|
||||
- [ADDED] Parse and store gitlab-runner timestamped section markers. !14551
|
||||
- [ADDED] Add "implements" to the default issue closing message regex. !14612 (Guilherme Vieira)
|
||||
- [ADDED] Replace `tag: true` into `:tag` in the specs. !14653 (Jacopo Beschi @jacopo-beschi)
|
||||
- [ADDED] Discussion lock for issues and merge requests.
|
||||
- [ADDED] Add an API endpoint to determine the forks of a project.
|
||||
- [ADDED] Add help text to runner edit: tags should be separated by commas. (Brendan O'Leary)
|
||||
- [ADDED] Only copy old/new code when selecting left/right side of parallel diff.
|
||||
- [ADDED] Expose avatar_url when requesting list of projects from API with simple=true.
|
||||
- [ADDED] A confirmation email is now sent when adding a secondary email address. (digitalmoksha)
|
||||
- [ADDED] Move Custom merge methods from EE.
|
||||
- [ADDED] Makes @mentions links have a different styling for better separation.
|
||||
- [ADDED] Added tabs to dashboard/projects to easily switch to personal projects.
|
||||
- [OTHER] Extract AutocompleteController#users into finder. !13778 (Maxim Rydkin, Mayra Cabrera)
|
||||
- [OTHER] Replace 'project/wiki.feature' spinach test with an rspec analog. !13856 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Expand docs for changing username or group path. !13914
|
||||
- [OTHER] Move `lib/ci` to `lib/gitlab/ci`. !14078 (Maxim Rydkin)
|
||||
- [OTHER] Decrease Cyclomatic Complexity threshold to 13. !14152 (Maxim Rydkin)
|
||||
- [OTHER] Decrease Perceived Complexity threshold to 15. !14160 (Maxim Rydkin)
|
||||
- [OTHER] Replace project/group_links.feature spinach test with an rspec analog. !14169 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the project/milestone.feature spinach test with an rspec analog. !14171 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the profile/emails.feature spinach test with an rspec analog. !14172 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the project/team_management.feature spinach test with an rspec analog. !14173 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'project/merge_requests/accept.feature' spinach test with an rspec analog. !14176 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'project/builds/summary.feature' spinach test with an rspec analog. !14177 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Optimize the boards' issues fetching. !14198
|
||||
- [OTHER] Replace the 'project/merge_requests/revert.feature' spinach test with an rspec analog. !14201 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'project/issues/award_emoji.feature' spinach test with an rspec analog. !14202 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'profile/active_tab.feature' spinach test with an rspec analog. !14239 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'search.feature' spinach test with an rspec analog. !14248 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Load sidebar participants avatars only when visible. !14270
|
||||
- [OTHER] Adds gitlab features and components to usage ping data. !14305
|
||||
- [OTHER] Replace the 'project/archived.feature' spinach test with an rspec analog. !14322 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'project/commits/revert.feature' spinach test with an rspec analog. !14325 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'project/snippets.feature' spinach test with an rspec analog. !14326 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Add link to OpenID Connect documentation. !14368 (Markus Koller)
|
||||
- [OTHER] Upgrade doorkeeper-openid_connect. !14372 (Markus Koller)
|
||||
- [OTHER] Upgrade gitlab-markup gem. !14395 (Markus Koller)
|
||||
- [OTHER] Index projects on repository storage. !14414
|
||||
- [OTHER] Replace the 'project/shortcuts.feature' spinach test with an rspec analog. !14431 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Replace the 'project/service.feature' spinach test with an rspec analog. !14432 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Improve GitHub import performance. !14445
|
||||
- [OTHER] Add basic sprintf implementation to JavaScript. !14506
|
||||
- [OTHER] Replace the 'project/merge_requests.feature' spinach test with an rspec analog. !14621 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Update GitLab Pages to v0.6.0. !14630
|
||||
- [OTHER] Add documentation to summarise project archiving. !14650
|
||||
- [OTHER] Remove 'Repo' prefix from API entites. !14694 (Vitaliy @blackst0ne Klachkov)
|
||||
- [OTHER] Removes cycle analytics service and store from global namespace.
|
||||
- [OTHER] Improves i18n for Auto Devops callout.
|
||||
- [OTHER] Exports common_utils utility functions as modules.
|
||||
- [OTHER] Use `simple=true` for projects API in Projects dropdown for better search performance.
|
||||
- [OTHER] Change index on ci_builds to optimize Jobs Controller.
|
||||
- [OTHER] Add index for merge_requests.merge_commit_sha.
|
||||
- [OTHER] Add (partial) index on Labels.template.
|
||||
- [OTHER] Cache issue and MR template names in Redis.
|
||||
- [OTHER] changed dashed border button color to be darker.
|
||||
- [OTHER] Speed up permission checks.
|
||||
- [OTHER] Fix docs for lightweight tag creation via API.
|
||||
- [OTHER] Clarify artifact download via the API only accepts branch or tag name for ref.
|
||||
- [OTHER] Change recommended MySQL version to 5.6.
|
||||
- [OTHER] Bump google-api-client Gem from 0.8.6 to 0.13.6.
|
||||
- [OTHER] Detect when changelog entries are invalid.
|
||||
- [OTHER] Use a UNION ALL for getting merge request notes.
|
||||
- [OTHER] Remove an index on ci_builds meant to be only temporary.
|
||||
- [OTHER] Remove a SQL query from the todos index page.
|
||||
- Support custom attributes on users. !13038 (Markus Koller)
|
||||
- made read-only APIs for public merge requests available without authentication. !13291 (haseebeqx)
|
||||
- Hide read_registry scope when registry is disabled on instance. !13314 (Robin Bobbitt)
|
||||
- creation of keys moved to services. !13331 (haseebeqx)
|
||||
- Add username as GL_USERNAME in hooks.
|
||||
|
||||
## 10.0.4 (2017-10-16)
|
||||
|
||||
- [SECURITY] Move project repositories between namespaces when renaming users.
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
0.48.0
|
||||
0.49.0
|
||||
4
Gemfile
4
Gemfile
|
|
@ -102,7 +102,7 @@ gem 'fog-google', '~> 0.5'
|
|||
gem 'fog-local', '~> 0.3'
|
||||
gem 'fog-openstack', '~> 0.1'
|
||||
gem 'fog-rackspace', '~> 0.1.1'
|
||||
gem 'fog-aliyun', '~> 0.1.0'
|
||||
gem 'fog-aliyun', '~> 0.2.0'
|
||||
|
||||
# for Google storage
|
||||
gem 'google-api-client', '~> 0.13.6'
|
||||
|
|
@ -281,7 +281,7 @@ group :metrics do
|
|||
gem 'influxdb', '~> 0.2', require: false
|
||||
|
||||
# Prometheus
|
||||
gem 'prometheus-client-mmap', '~>0.7.0.beta14'
|
||||
gem 'prometheus-client-mmap', '~>0.7.0.beta17'
|
||||
gem 'raindrops', '~> 0.18'
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ GEM
|
|||
flowdock (0.7.1)
|
||||
httparty (~> 0.7)
|
||||
multi_json
|
||||
fog-aliyun (0.1.0)
|
||||
fog-aliyun (0.2.0)
|
||||
fog-core (~> 1.27)
|
||||
fog-json (~> 1.0)
|
||||
ipaddress (~> 0.8)
|
||||
|
|
@ -623,7 +623,7 @@ GEM
|
|||
parser
|
||||
unparser
|
||||
procto (0.0.3)
|
||||
prometheus-client-mmap (0.7.0.beta14)
|
||||
prometheus-client-mmap (0.7.0.beta17)
|
||||
mmap2 (~> 2.2, >= 2.2.7)
|
||||
pry (0.10.4)
|
||||
coderay (~> 1.1.0)
|
||||
|
|
@ -1015,7 +1015,7 @@ DEPENDENCIES
|
|||
flay (~> 2.8.0)
|
||||
flipper (~> 0.10.2)
|
||||
flipper-active_record (~> 0.10.2)
|
||||
fog-aliyun (~> 0.1.0)
|
||||
fog-aliyun (~> 0.2.0)
|
||||
fog-aws (~> 1.4)
|
||||
fog-core (~> 1.44)
|
||||
fog-google (~> 0.5)
|
||||
|
|
@ -1106,7 +1106,7 @@ DEPENDENCIES
|
|||
pg (~> 0.18.2)
|
||||
poltergeist (~> 1.9.0)
|
||||
premailer-rails (~> 1.9.7)
|
||||
prometheus-client-mmap (~> 0.7.0.beta14)
|
||||
prometheus-client-mmap (~> 0.7.0.beta17)
|
||||
pry-byebug (~> 3.4.1)
|
||||
pry-rails (~> 0.3.4)
|
||||
rack-attack (~> 4.4.1)
|
||||
|
|
|
|||
|
|
@ -1,35 +1,3 @@
|
|||
# GitLab Maintenance Policy
|
||||
|
||||
GitLab follows the [Semantic Versioning](http://semver.org/) for its releases:
|
||||
`(Major).(Minor).(Patch)` in a [pragmatic way].
|
||||
|
||||
- **Major version**: Whenever there is something significant or any backwards
|
||||
incompatible changes are introduced to the public API.
|
||||
- **Minor version**: When new, backwards compatible functionality is introduced
|
||||
to the public API or a minor feature is introduced, or when a set of smaller
|
||||
features is rolled out.
|
||||
- **Patch number**: When backwards compatible bug fixes are introduced that fix
|
||||
incorrect behavior.
|
||||
|
||||
The current stable release will receive security patches and bug fixes
|
||||
(eg. `8.9.0` -> `8.9.1`). Feature releases will mark the next supported stable
|
||||
release where the minor version is increased numerically by increments of one
|
||||
(eg. `8.9 -> 8.10`).
|
||||
|
||||
Our current policy is to support one stable release at any given time, but for
|
||||
medium-level security issues, we may consider [backporting to the previous two
|
||||
monthly releases][rel-sec].
|
||||
|
||||
We encourage everyone to run the latest stable release to ensure that you can
|
||||
easily upgrade to the most secure and feature-rich GitLab experience. In order
|
||||
to make sure you can easily run the most recent stable release, we are working
|
||||
hard to keep the update process simple and reliable.
|
||||
|
||||
More information about the release procedures can be found in our
|
||||
[release-tools documentation][rel]. You may also want to read our
|
||||
[Responsible Disclosure Policy][disclosure].
|
||||
|
||||
[rel-sec]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/security.md#backporting
|
||||
[rel]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/
|
||||
[disclosure]: https://about.gitlab.com/disclosure/
|
||||
[pragmatic way]: https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e
|
||||
See [doc/policy/maintenance.md](doc/policy/maintenance.md)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* eslint-disable func-names, object-shorthand, prefer-arrow-callback */
|
||||
/* global Dropzone */
|
||||
|
||||
import Dropzone from 'dropzone';
|
||||
import '../lib/utils/url_utility';
|
||||
import { HIDDEN_CLASS } from '../lib/utils/constants';
|
||||
import csrf from '../lib/utils/csrf';
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
/* eslint-disable class-methods-use-this */
|
||||
|
||||
import './lib/utils/url_utility';
|
||||
import FilesCommentButton from './files_comment_button';
|
||||
import SingleFileDiff from './single_file_diff';
|
||||
|
|
@ -8,7 +6,7 @@ import imageDiffHelper from './image_diff/helpers/index';
|
|||
const UNFOLD_COUNT = 20;
|
||||
let isBound = false;
|
||||
|
||||
class Diff {
|
||||
export default class Diff {
|
||||
constructor() {
|
||||
const $diffFile = $('.files .diff-file');
|
||||
|
||||
|
|
@ -104,7 +102,7 @@ class Diff {
|
|||
}
|
||||
this.highlightSelectedLine();
|
||||
}
|
||||
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
handleParallelLineDown(e) {
|
||||
const line = $(e.currentTarget);
|
||||
const table = line.closest('table');
|
||||
|
|
@ -116,11 +114,11 @@ class Diff {
|
|||
table.addClass(`${lineClass}-selected`);
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
diffViewType() {
|
||||
return $('.inline-parallel-buttons a.active').data('view-type');
|
||||
}
|
||||
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
lineNumbers(line) {
|
||||
const children = line.find('.diff-line-num').toArray();
|
||||
if (children.length !== 2) {
|
||||
|
|
@ -128,7 +126,7 @@ class Diff {
|
|||
}
|
||||
return children.map(elm => parseInt($(elm).data('linenumber'), 10) || 0);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
highlightSelectedLine() {
|
||||
const hash = gl.utils.getLocationHash();
|
||||
const $diffFiles = $('.diff-file');
|
||||
|
|
@ -141,6 +139,3 @@ class Diff {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.gl = window.gl || {};
|
||||
window.gl.Diff = Diff;
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ import U2FAuthenticate from './u2f/authenticate';
|
|||
import Members from './members';
|
||||
import memberExpirationDate from './member_expiration_date';
|
||||
import DueDateSelectors from './due_date_select';
|
||||
import Diff from './diff';
|
||||
|
||||
(function() {
|
||||
var Dispatcher;
|
||||
|
|
@ -237,7 +238,7 @@ import DueDateSelectors from './due_date_select';
|
|||
new GLForm($('.milestone-form'), true);
|
||||
break;
|
||||
case 'projects:compare:show':
|
||||
new gl.Diff();
|
||||
new Diff();
|
||||
initChangesDropdown();
|
||||
break;
|
||||
case 'projects:branches:new':
|
||||
|
|
@ -273,7 +274,7 @@ import DueDateSelectors from './due_date_select';
|
|||
}
|
||||
case 'projects:merge_requests:creations:diffs':
|
||||
case 'projects:merge_requests:edit':
|
||||
new gl.Diff();
|
||||
new Diff();
|
||||
shortcut_handler = new ShortcutsNavigation();
|
||||
new GLForm($('.merge-request-form'), true);
|
||||
new IssuableForm($('.merge-request-form'));
|
||||
|
|
@ -307,7 +308,7 @@ import DueDateSelectors from './due_date_select';
|
|||
new GLForm($('.release-form'), true);
|
||||
break;
|
||||
case 'projects:merge_requests:show':
|
||||
new gl.Diff();
|
||||
new Diff();
|
||||
shortcut_handler = new ShortcutsIssuable(true);
|
||||
new ZenMode();
|
||||
|
||||
|
|
@ -323,7 +324,7 @@ import DueDateSelectors from './due_date_select';
|
|||
new gl.Activities();
|
||||
break;
|
||||
case 'projects:commit:show':
|
||||
new gl.Diff();
|
||||
new Diff();
|
||||
new ZenMode();
|
||||
shortcut_handler = new ShortcutsNavigation();
|
||||
new MiniPipelineGraph({
|
||||
|
|
|
|||
|
|
@ -1,308 +1,276 @@
|
|||
/* eslint-disable func-names, space-before-function-paren, wrap-iife, max-len, one-var, no-var, one-var-declaration-per-line, no-unused-vars, camelcase, quotes, no-useless-concat, prefer-template, quote-props, comma-dangle, object-shorthand, consistent-return, prefer-arrow-callback */
|
||||
/* global Dropzone */
|
||||
import Dropzone from 'dropzone';
|
||||
import _ from 'underscore';
|
||||
import './preview_markdown';
|
||||
import csrf from './lib/utils/csrf';
|
||||
|
||||
window.DropzoneInput = (function() {
|
||||
function DropzoneInput(form) {
|
||||
const divHover = '<div class="div-dropzone-hover"></div>';
|
||||
const iconPaperclip = '<i class="fa fa-paperclip div-dropzone-icon"></i>';
|
||||
const $attachButton = form.find('.button-attach-file');
|
||||
const $attachingFileMessage = form.find('.attaching-file-message');
|
||||
const $cancelButton = form.find('.button-cancel-uploading-files');
|
||||
const $retryLink = form.find('.retry-uploading-link');
|
||||
const $uploadProgress = form.find('.uploading-progress');
|
||||
const $uploadingErrorContainer = form.find('.uploading-error-container');
|
||||
const $uploadingErrorMessage = form.find('.uploading-error-message');
|
||||
const $uploadingProgressContainer = form.find('.uploading-progress-container');
|
||||
const uploadsPath = window.uploads_path || null;
|
||||
const maxFileSize = gon.max_file_size || 10;
|
||||
const formTextarea = form.find('.js-gfm-input');
|
||||
let handlePaste;
|
||||
let pasteText;
|
||||
let addFileToForm;
|
||||
let updateAttachingMessage;
|
||||
let isImage;
|
||||
let getFilename;
|
||||
let uploadFile;
|
||||
export default function dropzoneInput(form) {
|
||||
const divHover = '<div class="div-dropzone-hover"></div>';
|
||||
const iconPaperclip = '<i class="fa fa-paperclip div-dropzone-icon"></i>';
|
||||
const $attachButton = form.find('.button-attach-file');
|
||||
const $attachingFileMessage = form.find('.attaching-file-message');
|
||||
const $cancelButton = form.find('.button-cancel-uploading-files');
|
||||
const $retryLink = form.find('.retry-uploading-link');
|
||||
const $uploadProgress = form.find('.uploading-progress');
|
||||
const $uploadingErrorContainer = form.find('.uploading-error-container');
|
||||
const $uploadingErrorMessage = form.find('.uploading-error-message');
|
||||
const $uploadingProgressContainer = form.find('.uploading-progress-container');
|
||||
const uploadsPath = window.uploads_path || null;
|
||||
const maxFileSize = gon.max_file_size || 10;
|
||||
const formTextarea = form.find('.js-gfm-input');
|
||||
let handlePaste;
|
||||
let pasteText;
|
||||
let addFileToForm;
|
||||
let updateAttachingMessage;
|
||||
let isImage;
|
||||
let getFilename;
|
||||
let uploadFile;
|
||||
|
||||
formTextarea.wrap('<div class="div-dropzone"></div>');
|
||||
formTextarea.on('paste', (function(_this) {
|
||||
return function(event) {
|
||||
return handlePaste(event);
|
||||
};
|
||||
})(this));
|
||||
formTextarea.wrap('<div class="div-dropzone"></div>');
|
||||
formTextarea.on('paste', event => handlePaste(event));
|
||||
|
||||
// Add dropzone area to the form.
|
||||
const $mdArea = formTextarea.closest('.md-area');
|
||||
form.setupMarkdownPreview();
|
||||
const $formDropzone = form.find('.div-dropzone');
|
||||
$formDropzone.parent().addClass('div-dropzone-wrapper');
|
||||
$formDropzone.append(divHover);
|
||||
$formDropzone.find('.div-dropzone-hover').append(iconPaperclip);
|
||||
// Add dropzone area to the form.
|
||||
const $mdArea = formTextarea.closest('.md-area');
|
||||
form.setupMarkdownPreview();
|
||||
const $formDropzone = form.find('.div-dropzone');
|
||||
$formDropzone.parent().addClass('div-dropzone-wrapper');
|
||||
$formDropzone.append(divHover);
|
||||
$formDropzone.find('.div-dropzone-hover').append(iconPaperclip);
|
||||
|
||||
if (!uploadsPath) return;
|
||||
if (!uploadsPath) return;
|
||||
|
||||
const dropzone = $formDropzone.dropzone({
|
||||
url: uploadsPath,
|
||||
dictDefaultMessage: '',
|
||||
clickable: true,
|
||||
paramName: 'file',
|
||||
maxFilesize: maxFileSize,
|
||||
uploadMultiple: false,
|
||||
headers: csrf.headers,
|
||||
previewContainer: false,
|
||||
processing: function() {
|
||||
return $('.div-dropzone-alert').alert('close');
|
||||
},
|
||||
dragover: function() {
|
||||
$mdArea.addClass('is-dropzone-hover');
|
||||
form.find('.div-dropzone-hover').css('opacity', 0.7);
|
||||
},
|
||||
dragleave: function() {
|
||||
$mdArea.removeClass('is-dropzone-hover');
|
||||
form.find('.div-dropzone-hover').css('opacity', 0);
|
||||
},
|
||||
drop: function() {
|
||||
$mdArea.removeClass('is-dropzone-hover');
|
||||
form.find('.div-dropzone-hover').css('opacity', 0);
|
||||
formTextarea.focus();
|
||||
},
|
||||
success: function(header, response) {
|
||||
const processingFileCount = this.getQueuedFiles().length + this.getUploadingFiles().length;
|
||||
const shouldPad = processingFileCount >= 1;
|
||||
const dropzone = $formDropzone.dropzone({
|
||||
url: uploadsPath,
|
||||
dictDefaultMessage: '',
|
||||
clickable: true,
|
||||
paramName: 'file',
|
||||
maxFilesize: maxFileSize,
|
||||
uploadMultiple: false,
|
||||
headers: csrf.headers,
|
||||
previewContainer: false,
|
||||
processing: () => $('.div-dropzone-alert').alert('close'),
|
||||
dragover: () => {
|
||||
$mdArea.addClass('is-dropzone-hover');
|
||||
form.find('.div-dropzone-hover').css('opacity', 0.7);
|
||||
},
|
||||
dragleave: () => {
|
||||
$mdArea.removeClass('is-dropzone-hover');
|
||||
form.find('.div-dropzone-hover').css('opacity', 0);
|
||||
},
|
||||
drop: () => {
|
||||
$mdArea.removeClass('is-dropzone-hover');
|
||||
form.find('.div-dropzone-hover').css('opacity', 0);
|
||||
formTextarea.focus();
|
||||
},
|
||||
success(header, response) {
|
||||
const processingFileCount = this.getQueuedFiles().length + this.getUploadingFiles().length;
|
||||
const shouldPad = processingFileCount >= 1;
|
||||
|
||||
pasteText(response.link.markdown, shouldPad);
|
||||
// Show 'Attach a file' link only when all files have been uploaded.
|
||||
if (!processingFileCount) $attachButton.removeClass('hide');
|
||||
addFileToForm(response.link.url);
|
||||
},
|
||||
error: function(file, errorMessage = 'Attaching the file failed.', xhr) {
|
||||
// If 'error' event is fired by dropzone, the second parameter is error message.
|
||||
// If the 'errorMessage' parameter is empty, the default error message is set.
|
||||
// If the 'error' event is fired by backend (xhr) error response, the third parameter is
|
||||
// xhr object (xhr.responseText is error message).
|
||||
// On error we hide the 'Attach' and 'Cancel' buttons
|
||||
// and show an error.
|
||||
pasteText(response.link.markdown, shouldPad);
|
||||
// Show 'Attach a file' link only when all files have been uploaded.
|
||||
if (!processingFileCount) $attachButton.removeClass('hide');
|
||||
addFileToForm(response.link.url);
|
||||
},
|
||||
error: (file, errorMessage = 'Attaching the file failed.', xhr) => {
|
||||
// If 'error' event is fired by dropzone, the second parameter is error message.
|
||||
// If the 'errorMessage' parameter is empty, the default error message is set.
|
||||
// If the 'error' event is fired by backend (xhr) error response, the third parameter is
|
||||
// xhr object (xhr.responseText is error message).
|
||||
// On error we hide the 'Attach' and 'Cancel' buttons
|
||||
// and show an error.
|
||||
|
||||
// If there's xhr error message, let's show it instead of dropzone's one.
|
||||
const message = xhr ? xhr.responseText : errorMessage;
|
||||
// If there's xhr error message, let's show it instead of dropzone's one.
|
||||
const message = xhr ? xhr.responseText : errorMessage;
|
||||
|
||||
$uploadingErrorContainer.removeClass('hide');
|
||||
$uploadingErrorMessage.html(message);
|
||||
$attachButton.addClass('hide');
|
||||
$cancelButton.addClass('hide');
|
||||
},
|
||||
totaluploadprogress: function(totalUploadProgress) {
|
||||
updateAttachingMessage(this.files, $attachingFileMessage);
|
||||
$uploadProgress.text(Math.round(totalUploadProgress) + '%');
|
||||
},
|
||||
sending: function(file) {
|
||||
// DOM elements already exist.
|
||||
// Instead of dynamically generating them,
|
||||
// we just either hide or show them.
|
||||
$attachButton.addClass('hide');
|
||||
$uploadingErrorContainer.addClass('hide');
|
||||
$uploadingProgressContainer.removeClass('hide');
|
||||
$cancelButton.removeClass('hide');
|
||||
},
|
||||
removedfile: function() {
|
||||
$attachButton.removeClass('hide');
|
||||
$cancelButton.addClass('hide');
|
||||
$uploadingProgressContainer.addClass('hide');
|
||||
$uploadingErrorContainer.addClass('hide');
|
||||
},
|
||||
queuecomplete: function() {
|
||||
$('.dz-preview').remove();
|
||||
$('.markdown-area').trigger('input');
|
||||
|
||||
$uploadingProgressContainer.addClass('hide');
|
||||
$cancelButton.addClass('hide');
|
||||
}
|
||||
});
|
||||
|
||||
const child = $(dropzone[0]).children('textarea');
|
||||
|
||||
// removeAllFiles(true) stops uploading files (if any)
|
||||
// and remove them from dropzone files queue.
|
||||
$cancelButton.on('click', (e) => {
|
||||
const target = e.target.closest('.js-main-target-form').querySelector('.div-dropzone');
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
Dropzone.forElement(target).removeAllFiles(true);
|
||||
});
|
||||
|
||||
// If 'error' event is fired, we store a failed files,
|
||||
// clear dropzone files queue, change status of failed files to undefined,
|
||||
// and add that files to the dropzone files queue again.
|
||||
// addFile() adds file to dropzone files queue and upload it.
|
||||
$retryLink.on('click', (e) => {
|
||||
const dropzoneInstance = Dropzone.forElement(e.target.closest('.js-main-target-form').querySelector('.div-dropzone'));
|
||||
const failedFiles = dropzoneInstance.files;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
// 'true' parameter of removeAllFiles() cancels uploading of files that are being uploaded at the moment.
|
||||
dropzoneInstance.removeAllFiles(true);
|
||||
|
||||
failedFiles.map((failedFile, i) => {
|
||||
const file = failedFile;
|
||||
|
||||
if (file.status === Dropzone.ERROR) {
|
||||
file.status = undefined;
|
||||
file.accepted = undefined;
|
||||
}
|
||||
|
||||
return dropzoneInstance.addFile(file);
|
||||
});
|
||||
});
|
||||
|
||||
handlePaste = function(event) {
|
||||
var filename, image, pasteEvent, text;
|
||||
pasteEvent = event.originalEvent;
|
||||
if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
|
||||
image = isImage(pasteEvent);
|
||||
if (image) {
|
||||
event.preventDefault();
|
||||
filename = getFilename(pasteEvent) || 'image.png';
|
||||
text = `{{${filename}}}`;
|
||||
pasteText(text);
|
||||
return uploadFile(image.getAsFile(), filename);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
isImage = function(data) {
|
||||
var i, item;
|
||||
i = 0;
|
||||
while (i < data.clipboardData.items.length) {
|
||||
item = data.clipboardData.items[i];
|
||||
if (item.type.indexOf('image') !== -1) {
|
||||
return item;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
pasteText = function(text, shouldPad) {
|
||||
var afterSelection, beforeSelection, caretEnd, caretStart, textEnd;
|
||||
var formattedText = text;
|
||||
if (shouldPad) formattedText += "\n\n";
|
||||
const textarea = child.get(0);
|
||||
caretStart = textarea.selectionStart;
|
||||
caretEnd = textarea.selectionEnd;
|
||||
textEnd = $(child).val().length;
|
||||
beforeSelection = $(child).val().substring(0, caretStart);
|
||||
afterSelection = $(child).val().substring(caretEnd, textEnd);
|
||||
$(child).val(beforeSelection + formattedText + afterSelection);
|
||||
textarea.setSelectionRange(caretStart + formattedText.length, caretEnd + formattedText.length);
|
||||
textarea.style.height = `${textarea.scrollHeight}px`;
|
||||
formTextarea.get(0).dispatchEvent(new Event('input'));
|
||||
return formTextarea.trigger('input');
|
||||
};
|
||||
|
||||
addFileToForm = function(path) {
|
||||
$(form).append('<input type="hidden" name="files[]" value="' + _.escape(path) + '">');
|
||||
};
|
||||
|
||||
getFilename = function(e) {
|
||||
var value;
|
||||
if (window.clipboardData && window.clipboardData.getData) {
|
||||
value = window.clipboardData.getData('Text');
|
||||
} else if (e.clipboardData && e.clipboardData.getData) {
|
||||
value = e.clipboardData.getData('text/plain');
|
||||
}
|
||||
value = value.split("\r");
|
||||
return value[0];
|
||||
};
|
||||
|
||||
const showSpinner = function(e) {
|
||||
return $uploadingProgressContainer.removeClass('hide');
|
||||
};
|
||||
|
||||
const closeSpinner = function() {
|
||||
return $uploadingProgressContainer.addClass('hide');
|
||||
};
|
||||
|
||||
const showError = function(message) {
|
||||
$uploadingErrorContainer.removeClass('hide');
|
||||
$uploadingErrorMessage.html(message);
|
||||
};
|
||||
$attachButton.addClass('hide');
|
||||
$cancelButton.addClass('hide');
|
||||
},
|
||||
totaluploadprogress(totalUploadProgress) {
|
||||
updateAttachingMessage(this.files, $attachingFileMessage);
|
||||
$uploadProgress.text(`${Math.round(totalUploadProgress)}%`);
|
||||
},
|
||||
sending: () => {
|
||||
// DOM elements already exist.
|
||||
// Instead of dynamically generating them,
|
||||
// we just either hide or show them.
|
||||
$attachButton.addClass('hide');
|
||||
$uploadingErrorContainer.addClass('hide');
|
||||
$uploadingProgressContainer.removeClass('hide');
|
||||
$cancelButton.removeClass('hide');
|
||||
},
|
||||
removedfile: () => {
|
||||
$attachButton.removeClass('hide');
|
||||
$cancelButton.addClass('hide');
|
||||
$uploadingProgressContainer.addClass('hide');
|
||||
$uploadingErrorContainer.addClass('hide');
|
||||
},
|
||||
queuecomplete: () => {
|
||||
$('.dz-preview').remove();
|
||||
$('.markdown-area').trigger('input');
|
||||
|
||||
const closeAlertMessage = function() {
|
||||
return form.find('.div-dropzone-alert').alert('close');
|
||||
};
|
||||
$uploadingProgressContainer.addClass('hide');
|
||||
$cancelButton.addClass('hide');
|
||||
},
|
||||
});
|
||||
|
||||
const insertToTextArea = function(filename, url) {
|
||||
const $child = $(child);
|
||||
$child.val(function(index, val) {
|
||||
return val.replace(`{{${filename}}}`, url);
|
||||
});
|
||||
const child = $(dropzone[0]).children('textarea');
|
||||
|
||||
$child.trigger('change');
|
||||
};
|
||||
// removeAllFiles(true) stops uploading files (if any)
|
||||
// and remove them from dropzone files queue.
|
||||
$cancelButton.on('click', (e) => {
|
||||
const target = e.target.closest('.js-main-target-form').querySelector('.div-dropzone');
|
||||
|
||||
const appendToTextArea = function(url) {
|
||||
return $(child).val(function(index, val) {
|
||||
return val + url + "\n";
|
||||
});
|
||||
};
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
Dropzone.forElement(target).removeAllFiles(true);
|
||||
});
|
||||
|
||||
uploadFile = function(item, filename) {
|
||||
var formData;
|
||||
formData = new FormData();
|
||||
formData.append('file', item, filename);
|
||||
return $.ajax({
|
||||
url: uploadsPath,
|
||||
type: 'POST',
|
||||
data: formData,
|
||||
dataType: 'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
headers: csrf.headers,
|
||||
beforeSend: function() {
|
||||
showSpinner();
|
||||
return closeAlertMessage();
|
||||
},
|
||||
success: function(e, textStatus, response) {
|
||||
return insertToTextArea(filename, response.responseJSON.link.markdown);
|
||||
},
|
||||
error: function(response) {
|
||||
return showError(response.responseJSON.message);
|
||||
},
|
||||
complete: function() {
|
||||
return closeSpinner();
|
||||
}
|
||||
});
|
||||
};
|
||||
// If 'error' event is fired, we store a failed files,
|
||||
// clear dropzone files queue, change status of failed files to undefined,
|
||||
// and add that files to the dropzone files queue again.
|
||||
// addFile() adds file to dropzone files queue and upload it.
|
||||
$retryLink.on('click', (e) => {
|
||||
const dropzoneInstance = Dropzone.forElement(e.target.closest('.js-main-target-form').querySelector('.div-dropzone'));
|
||||
const failedFiles = dropzoneInstance.files;
|
||||
|
||||
updateAttachingMessage = (files, messageContainer) => {
|
||||
let attachingMessage;
|
||||
const filesCount = files.filter(function(file) {
|
||||
return file.status === 'uploading' ||
|
||||
file.status === 'queued';
|
||||
}).length;
|
||||
e.preventDefault();
|
||||
|
||||
// Dinamycally change uploading files text depending on files number in
|
||||
// dropzone files queue.
|
||||
if (filesCount > 1) {
|
||||
attachingMessage = 'Attaching ' + filesCount + ' files -';
|
||||
} else {
|
||||
attachingMessage = 'Attaching a file -';
|
||||
// 'true' parameter of removeAllFiles() cancels
|
||||
// uploading of files that are being uploaded at the moment.
|
||||
dropzoneInstance.removeAllFiles(true);
|
||||
|
||||
failedFiles.map((failedFile) => {
|
||||
const file = failedFile;
|
||||
|
||||
if (file.status === Dropzone.ERROR) {
|
||||
file.status = undefined;
|
||||
file.accepted = undefined;
|
||||
}
|
||||
|
||||
messageContainer.text(attachingMessage);
|
||||
};
|
||||
|
||||
form.find('.markdown-selector').click(function(e) {
|
||||
e.preventDefault();
|
||||
$(this).closest('.gfm-form').find('.div-dropzone').click();
|
||||
formTextarea.focus();
|
||||
return dropzoneInstance.addFile(file);
|
||||
});
|
||||
}
|
||||
});
|
||||
// eslint-disable-next-line consistent-return
|
||||
handlePaste = (event) => {
|
||||
const pasteEvent = event.originalEvent;
|
||||
if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
|
||||
const image = isImage(pasteEvent);
|
||||
if (image) {
|
||||
event.preventDefault();
|
||||
const filename = getFilename(pasteEvent) || 'image.png';
|
||||
const text = `{{${filename}}}`;
|
||||
pasteText(text);
|
||||
return uploadFile(image.getAsFile(), filename);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return DropzoneInput;
|
||||
})();
|
||||
isImage = (data) => {
|
||||
let i = 0;
|
||||
while (i < data.clipboardData.items.length) {
|
||||
const item = data.clipboardData.items[i];
|
||||
if (item.type.indexOf('image') !== -1) {
|
||||
return item;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
pasteText = (text, shouldPad) => {
|
||||
let formattedText = text;
|
||||
if (shouldPad) {
|
||||
formattedText += '\n\n';
|
||||
}
|
||||
const textarea = child.get(0);
|
||||
const caretStart = textarea.selectionStart;
|
||||
const caretEnd = textarea.selectionEnd;
|
||||
const textEnd = $(child).val().length;
|
||||
const beforeSelection = $(child).val().substring(0, caretStart);
|
||||
const afterSelection = $(child).val().substring(caretEnd, textEnd);
|
||||
$(child).val(beforeSelection + formattedText + afterSelection);
|
||||
textarea.setSelectionRange(caretStart + formattedText.length, caretEnd + formattedText.length);
|
||||
textarea.style.height = `${textarea.scrollHeight}px`;
|
||||
formTextarea.get(0).dispatchEvent(new Event('input'));
|
||||
return formTextarea.trigger('input');
|
||||
};
|
||||
|
||||
addFileToForm = (path) => {
|
||||
$(form).append(`<input type="hidden" name="files[]" value="${_.escape(path)}">`);
|
||||
};
|
||||
|
||||
getFilename = (e) => {
|
||||
let value;
|
||||
if (window.clipboardData && window.clipboardData.getData) {
|
||||
value = window.clipboardData.getData('Text');
|
||||
} else if (e.clipboardData && e.clipboardData.getData) {
|
||||
value = e.clipboardData.getData('text/plain');
|
||||
}
|
||||
value = value.split('\r');
|
||||
return value[0];
|
||||
};
|
||||
|
||||
const showSpinner = () => $uploadingProgressContainer.removeClass('hide');
|
||||
|
||||
const closeSpinner = () => $uploadingProgressContainer.addClass('hide');
|
||||
|
||||
const showError = (message) => {
|
||||
$uploadingErrorContainer.removeClass('hide');
|
||||
$uploadingErrorMessage.html(message);
|
||||
};
|
||||
|
||||
const closeAlertMessage = () => form.find('.div-dropzone-alert').alert('close');
|
||||
|
||||
const insertToTextArea = (filename, url) => {
|
||||
const $child = $(child);
|
||||
$child.val((index, val) => val.replace(`{{${filename}}}`, url));
|
||||
|
||||
$child.trigger('change');
|
||||
};
|
||||
|
||||
uploadFile = (item, filename) => {
|
||||
const formData = new FormData();
|
||||
formData.append('file', item, filename);
|
||||
return $.ajax({
|
||||
url: uploadsPath,
|
||||
type: 'POST',
|
||||
data: formData,
|
||||
dataType: 'json',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
headers: csrf.headers,
|
||||
beforeSend: () => {
|
||||
showSpinner();
|
||||
return closeAlertMessage();
|
||||
},
|
||||
success: (e, text, response) => {
|
||||
const md = response.responseJSON.link.markdown;
|
||||
insertToTextArea(filename, md);
|
||||
},
|
||||
error: response => showError(response.responseJSON.message),
|
||||
complete: () => closeSpinner(),
|
||||
});
|
||||
};
|
||||
|
||||
updateAttachingMessage = (files, messageContainer) => {
|
||||
let attachingMessage;
|
||||
const filesCount = files.filter(file => file.status === 'uploading' || file.status === 'queued').length;
|
||||
|
||||
// Dinamycally change uploading files text depending on files number in
|
||||
// dropzone files queue.
|
||||
if (filesCount > 1) {
|
||||
attachingMessage = `Attaching ${filesCount} files -`;
|
||||
} else {
|
||||
attachingMessage = 'Attaching a file -';
|
||||
}
|
||||
|
||||
messageContainer.text(attachingMessage);
|
||||
};
|
||||
|
||||
form.find('.markdown-selector').click(function onMarkdownClick(e) {
|
||||
e.preventDefault();
|
||||
$(this).closest('.gfm-form').find('.div-dropzone').click();
|
||||
formTextarea.focus();
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,3 @@
|
|||
/* eslint-disable func-names, space-before-function-paren, no-var, prefer-rest-params, wrap-iife, max-len, one-var, one-var-declaration-per-line, quotes, prefer-template, newline-per-chained-call, comma-dangle, new-cap, no-else-return, consistent-return */
|
||||
/* global notes */
|
||||
|
||||
/* Developer beware! Do not add logic to showButton or hideButton
|
||||
* that will force a reflow. Doing so will create a signficant performance
|
||||
* bottleneck for pages with large diffs. For a comprehensive list of what
|
||||
|
|
@ -20,8 +17,10 @@ const DIFF_EXPANDED_CLASS = 'diff-expanded';
|
|||
|
||||
export default {
|
||||
init($diffFile) {
|
||||
/* Caching is used only when the following members are *true*. This is because there are likely to be
|
||||
* differently configured versions of diffs in the same session. However if these values are true, they
|
||||
/* Caching is used only when the following members are *true*.
|
||||
* This is because there are likely to be
|
||||
* differently configured versions of diffs in the same session.
|
||||
* However if these values are true, they
|
||||
* will be true in all cases */
|
||||
|
||||
if (!this.userCanCreateNote) {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* global DropzoneInput */
|
||||
/* global autosize */
|
||||
|
||||
import GfmAutoComplete from './gfm_auto_complete';
|
||||
import dropzoneInput from './dropzone_input';
|
||||
|
||||
export default class GLForm {
|
||||
constructor(form, enableGFM = false) {
|
||||
|
|
@ -41,7 +41,7 @@ export default class GLForm {
|
|||
mergeRequests: this.enableGFM,
|
||||
labels: this.enableGFM,
|
||||
});
|
||||
new DropzoneInput(this.form); // eslint-disable-line no-new
|
||||
dropzoneInput(this.form);
|
||||
autosize(this.textarea);
|
||||
}
|
||||
// form and textarea event listeners
|
||||
|
|
|
|||
|
|
@ -16,15 +16,15 @@
|
|||
<fieldset>
|
||||
<label
|
||||
class="sr-only"
|
||||
for="issue-title">
|
||||
for="issuable-title">
|
||||
Title
|
||||
</label>
|
||||
<input
|
||||
id="issue-title"
|
||||
id="issuable-title"
|
||||
class="form-control"
|
||||
type="text"
|
||||
placeholder="Issue title"
|
||||
aria-label="Issue title"
|
||||
placeholder="Title"
|
||||
aria-label="Title"
|
||||
v-model="formState.title"
|
||||
@keydown.meta.enter="updateIssuable"
|
||||
@keydown.ctrl.enter="updateIssuable" />
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@ import './compare_autocomplete';
|
|||
import './confirm_danger_modal';
|
||||
import './copy_as_gfm';
|
||||
import './copy_to_clipboard';
|
||||
import './diff';
|
||||
import './files_comment_button';
|
||||
import Flash, { removeFlashClickListener } from './flash';
|
||||
import './gl_dropdown';
|
||||
import './gl_field_error';
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ import {
|
|||
handleLocationHash,
|
||||
isMetaClick,
|
||||
} from './lib/utils/common_utils';
|
||||
|
||||
import initDiscussionTab from './image_diff/init_discussion_tab';
|
||||
import Diff from './diff';
|
||||
|
||||
/* eslint-disable max-len */
|
||||
// MergeRequestTabs
|
||||
|
|
@ -292,7 +292,7 @@ import initDiscussionTab from './image_diff/init_discussion_tab';
|
|||
}
|
||||
this.diffsLoaded = true;
|
||||
|
||||
new gl.Diff();
|
||||
new Diff();
|
||||
this.scrollToElement('#diffs');
|
||||
|
||||
$('.diff-file').each((i, el) => {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import $ from 'jquery';
|
|||
import _ from 'underscore';
|
||||
import Cookies from 'js-cookie';
|
||||
import autosize from 'vendor/autosize';
|
||||
import Dropzone from 'dropzone';
|
||||
import 'vendor/jquery.caret'; // required by jquery.atwho
|
||||
import 'vendor/jquery.atwho';
|
||||
import AjaxCache from '~/lib/utils/ajax_cache';
|
||||
|
|
@ -22,13 +21,11 @@ import CommentTypeToggle from './comment_type_toggle';
|
|||
import GLForm from './gl_form';
|
||||
import loadAwardsHandler from './awards_handler';
|
||||
import './autosave';
|
||||
import './dropzone_input';
|
||||
import TaskList from './task_list';
|
||||
import { ajaxPost, isInViewport, getPagePath, scrollToElement, isMetaKey } from './lib/utils/common_utils';
|
||||
import imageDiffHelper from './image_diff/helpers/index';
|
||||
|
||||
window.autosize = autosize;
|
||||
window.Dropzone = Dropzone;
|
||||
|
||||
function normalizeNewlines(str) {
|
||||
return str.replace(/\r\n/g, '\n');
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@
|
|||
},
|
||||
|
||||
showError(message) {
|
||||
Flash((errorMessages[message]));
|
||||
Flash(errorMessages[message]);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@
|
|||
},
|
||||
|
||||
showError(message) {
|
||||
Flash((errorMessages[message]));
|
||||
Flash(errorMessages[message]);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -29,11 +29,9 @@ export const fetchList = ({ commit }, { repo, page }) => {
|
|||
});
|
||||
};
|
||||
|
||||
export const deleteRepo = ({ commit }, repo) => Vue.http.delete(repo.destroyPath)
|
||||
.then(res => res.json());
|
||||
export const deleteRepo = ({ commit }, repo) => Vue.http.delete(repo.destroyPath);
|
||||
|
||||
export const deleteRegistry = ({ commit }, image) => Vue.http.delete(image.destroyPath)
|
||||
.then(res => res.json());
|
||||
export const deleteRegistry = ({ commit }, image) => Vue.http.delete(image.destroyPath);
|
||||
|
||||
export const setMainEndpoint = ({ commit }, data) => commit(types.SET_MAIN_ENDPOINT, data);
|
||||
export const toggleLoading = ({ commit }) => commit(types.TOGGLE_MAIN_LOADING);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,9 @@
|
|||
marginLeft: `${this.file.level * 16}px`,
|
||||
};
|
||||
},
|
||||
shortId() {
|
||||
return this.file.id.substr(0, 8);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
linkClicked(file) {
|
||||
|
|
@ -55,6 +58,17 @@
|
|||
>
|
||||
{{ file.name }}
|
||||
</a>
|
||||
<template v-if="file.type === 'submodule' && file.id">
|
||||
@
|
||||
<span class="commit-sha">
|
||||
<a
|
||||
@click.stop
|
||||
:href="file.tree_url"
|
||||
>
|
||||
{{ shortId }}
|
||||
</a>
|
||||
</span>
|
||||
</template>
|
||||
</td>
|
||||
|
||||
<template v-if="!isMini">
|
||||
|
|
@ -69,7 +83,10 @@
|
|||
</td>
|
||||
|
||||
<td class="commit-update hidden-xs text-right">
|
||||
<span :title="tooltipTitle(file.lastCommit.updatedAt)">
|
||||
<span
|
||||
v-if="file.lastCommit.updatedAt"
|
||||
:title="tooltipTitle(file.lastCommit.updatedAt)"
|
||||
>
|
||||
{{ timeFormated(file.lastCommit.updatedAt) }}
|
||||
</span>
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -74,6 +74,10 @@ export default {
|
|||
if (file.type === 'tree' && file.opened) {
|
||||
Helper.setDirectoryToClosed(file);
|
||||
Store.setActiveLine(lineNumber);
|
||||
} else if (file.type === 'submodule') {
|
||||
file.loading = true;
|
||||
|
||||
gl.utils.visitUrl(file.url);
|
||||
} else {
|
||||
const openFile = Helper.getFileFromPath(file.url);
|
||||
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ const RepoHelper = {
|
|||
return Service.getContent()
|
||||
.then((response) => {
|
||||
const data = response.data;
|
||||
if (response.headers && response.headers['page-title']) data.pageTitle = response.headers['page-title'];
|
||||
if (response.headers && response.headers['page-title']) data.pageTitle = decodeURI(response.headers['page-title']);
|
||||
if (response.headers && response.headers['is-root'] && !Store.isInitialRoot) {
|
||||
Store.isRoot = convertPermissionToBoolean(response.headers['is-root']);
|
||||
Store.isInitialRoot = Store.isRoot;
|
||||
|
|
@ -157,12 +157,14 @@ const RepoHelper = {
|
|||
},
|
||||
|
||||
serializeRepoEntity(type, entity, level = 0) {
|
||||
const { url, name, icon, last_commit } = entity;
|
||||
const { id, url, name, icon, last_commit, tree_url } = entity;
|
||||
|
||||
return {
|
||||
id,
|
||||
type,
|
||||
name,
|
||||
url,
|
||||
tree_url,
|
||||
level,
|
||||
icon: `fa-${icon}`,
|
||||
files: [],
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@ import Dropzone from 'dropzone';
|
|||
import 'mousetrap';
|
||||
import 'mousetrap/plugins/pause/mousetrap-pause';
|
||||
|
||||
window.Dropzone = Dropzone;
|
||||
|
||||
//
|
||||
// ### Events
|
||||
//
|
||||
|
|
|
|||
|
|
@ -23,6 +23,11 @@
|
|||
@include webkit-prefix(animation-duration, 2s);
|
||||
}
|
||||
|
||||
&.spin {
|
||||
transform-origin: center;
|
||||
animation: spin 4s linear infinite;
|
||||
}
|
||||
|
||||
&.flipOutX,
|
||||
&.flipOutY,
|
||||
&.bounceIn,
|
||||
|
|
@ -271,3 +276,9 @@ a {
|
|||
transform: translateX(468px);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ $active-background: rgba(0, 0, 0, .04);
|
|||
$active-hover-background: $active-background;
|
||||
$active-hover-color: $gl-text-color;
|
||||
$inactive-badge-background: rgba(0, 0, 0, .08);
|
||||
$hover-background: $white-light;
|
||||
$hover-background: rgba(0, 0, 0, .06);
|
||||
$hover-color: $gl-text-color;
|
||||
$inactive-color: $gl-text-color-secondary;
|
||||
$new-sidebar-width: 220px;
|
||||
|
|
@ -330,7 +330,7 @@ $new-sidebar-collapsed-width: 50px;
|
|||
|
||||
&.active > a:hover,
|
||||
&.is-over > a {
|
||||
background-color: $white-light;
|
||||
background-color: $hover-background;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -344,7 +344,7 @@ $new-sidebar-collapsed-width: 50px;
|
|||
position: fixed;
|
||||
bottom: 0;
|
||||
padding: 16px;
|
||||
background-color: $gray-normal;
|
||||
background-color: $gray-light;
|
||||
border: 0;
|
||||
border-top: 2px solid $border-color;
|
||||
color: $gl-text-color-secondary;
|
||||
|
|
|
|||
|
|
@ -61,6 +61,11 @@
|
|||
border: 1px solid $dropdown-border-color;
|
||||
min-width: 175px;
|
||||
color: $gl-text-color;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.select2-drop-mask {
|
||||
z-index: 998;
|
||||
}
|
||||
|
||||
.select2-drop.select2-drop-above.select2-drop-active {
|
||||
|
|
|
|||
|
|
@ -3,5 +3,5 @@
|
|||
border-radius: $border-radius-default;
|
||||
line-height: 16px;
|
||||
font-weight: $gl-font-weight-normal;
|
||||
padding: $gl-btn-padding;
|
||||
padding: 8px;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -349,6 +349,6 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
def set_page_title_header
|
||||
# Per https://tools.ietf.org/html/rfc5987, headers need to be ISO-8859-1, not UTF-8
|
||||
response.headers['Page-Title'] = page_title('GitLab').encode('ISO-8859-1')
|
||||
response.headers['Page-Title'] = URI.escape(page_title('GitLab'))
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -141,6 +141,17 @@ class GroupsController < Groups::ApplicationController
|
|||
end
|
||||
|
||||
def load_events
|
||||
params[:sort] ||= 'latest_activity_desc'
|
||||
|
||||
options = {}
|
||||
options[:only_owned] = true if params[:shared] == '0'
|
||||
options[:only_shared] = true if params[:shared] == '1'
|
||||
|
||||
@projects = GroupProjectsFinder.new(params: params, group: group, options: options, current_user: current_user)
|
||||
.execute
|
||||
.includes(:namespace)
|
||||
.page(params[:page])
|
||||
|
||||
@events = EventCollection
|
||||
.new(@projects, offset: params[:offset].to_i, filter: event_filter)
|
||||
.to_a
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@ class Projects::CommitsController < Projects::ApplicationController
|
|||
private
|
||||
|
||||
def set_commits
|
||||
render_404 unless request.format == :atom || @repository.blob_at(@commit.id, @path) || @repository.tree(@commit.id, @path).entries.present?
|
||||
|
||||
@limit, @offset = (params[:limit] || 40).to_i, (params[:offset] || 0).to_i
|
||||
search = params[:search]
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ module ProjectsHelper
|
|||
end
|
||||
|
||||
def link_to_member_avatar(author, opts = {})
|
||||
default_opts = { size: 16 }
|
||||
default_opts = { size: 16, lazy_load: false }
|
||||
opts = default_opts.merge(opts)
|
||||
|
||||
classes = %W[avatar avatar-inline s#{opts[:size]}]
|
||||
|
|
@ -27,8 +27,26 @@ module ProjectsHelper
|
|||
image_tag(src, width: opts[:size], class: classes, alt: '', "data-src" => avatar)
|
||||
end
|
||||
|
||||
def author_content_tag(author, opts = {})
|
||||
default_opts = { author_class: 'author', tooltip: false, by_username: false }
|
||||
opts = default_opts.merge(opts)
|
||||
|
||||
has_tooltip = !opts[:by_username] && opts[:tooltip]
|
||||
|
||||
username = opts[:by_username] ? author.to_reference : author.name
|
||||
name_tag_options = { class: [opts[:author_class]] }
|
||||
|
||||
if has_tooltip
|
||||
name_tag_options[:title] = author.to_reference
|
||||
name_tag_options[:data] = { placement: 'top' }
|
||||
name_tag_options[:class] << 'has-tooltip'
|
||||
end
|
||||
|
||||
content_tag(:span, sanitize(username), name_tag_options)
|
||||
end
|
||||
|
||||
def link_to_member(project, author, opts = {}, &block)
|
||||
default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name", tooltip: false, lazy_load: false }
|
||||
default_opts = { avatar: true, name: true, title: ":name" }
|
||||
opts = default_opts.merge(opts)
|
||||
|
||||
return "(deleted)" unless author
|
||||
|
|
@ -39,12 +57,7 @@ module ProjectsHelper
|
|||
author_html << link_to_member_avatar(author, opts) if opts[:avatar]
|
||||
|
||||
# Build name span tag
|
||||
if opts[:by_username]
|
||||
author_html << content_tag(:span, sanitize("@#{author.username}"), class: opts[:author_class]) if opts[:name]
|
||||
else
|
||||
tooltip_data = { placement: 'top' }
|
||||
author_html << content_tag(:span, sanitize(author.name), class: [opts[:author_class], ('has-tooltip' if opts[:tooltip])], title: (author.to_reference if opts[:tooltip]), data: (tooltip_data if opts[:tooltip])) if opts[:name]
|
||||
end
|
||||
author_html << author_content_tag(author, opts) if opts[:name]
|
||||
|
||||
author_html << capture(&block) if block
|
||||
|
||||
|
|
|
|||
|
|
@ -203,7 +203,10 @@ class ApplicationSetting < ActiveRecord::Base
|
|||
ensure_cache_setup
|
||||
|
||||
Rails.cache.fetch(CACHE_KEY) do
|
||||
ApplicationSetting.last
|
||||
ApplicationSetting.last.tap do |settings|
|
||||
# do not cache nils
|
||||
raise 'missing settings' unless settings
|
||||
end
|
||||
end
|
||||
rescue
|
||||
# Fall back to an uncached value if there are any problems (e.g. redis down)
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ module Ci
|
|||
class ArtifactBlob
|
||||
include BlobLike
|
||||
|
||||
EXTENTIONS_SERVED_BY_PAGES = %w[.html .htm .txt .json].freeze
|
||||
EXTENSIONS_SERVED_BY_PAGES = %w[.html .htm .txt .json].freeze
|
||||
|
||||
attr_reader :entry
|
||||
|
||||
|
|
@ -36,17 +36,22 @@ module Ci
|
|||
def external_url(project, job)
|
||||
return unless external_link?(job)
|
||||
|
||||
components = project.full_path_components
|
||||
components << "-/jobs/#{job.id}/artifacts/file/#{path}"
|
||||
artifact_path = components[1..-1].join('/')
|
||||
full_path_parts = project.full_path_components
|
||||
top_level_group = full_path_parts.shift
|
||||
|
||||
"#{pages_config.protocol}://#{components[0]}.#{pages_config.host}/#{artifact_path}"
|
||||
artifact_path = [
|
||||
'-', *full_path_parts, '-',
|
||||
'jobs', job.id,
|
||||
'artifacts', path
|
||||
].join('/')
|
||||
|
||||
"#{pages_config.protocol}://#{top_level_group}.#{pages_config.host}/#{artifact_path}"
|
||||
end
|
||||
|
||||
def external_link?(job)
|
||||
pages_config.enabled &&
|
||||
pages_config.artifacts_server &&
|
||||
EXTENTIONS_SERVED_BY_PAGES.include?(File.extname(name)) &&
|
||||
EXTENSIONS_SERVED_BY_PAGES.include?(File.extname(name)) &&
|
||||
job.project.public?
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ class ContainerTagEntity < Grape::Entity
|
|||
expose :name, :location, :revision, :short_revision, :total_size, :created_at
|
||||
|
||||
expose :destroy_path, if: -> (*) { can_destroy? } do |tag|
|
||||
project_registry_repository_tag_path(project, tag.repository, tag.name, format: :json)
|
||||
project_registry_repository_tag_path(project, tag.repository, tag.name)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ class SubmoduleEntity < Grape::Entity
|
|||
'archive'
|
||||
end
|
||||
|
||||
expose :project_url do |blob|
|
||||
expose :url do |blob|
|
||||
submodule_links(blob, request).first
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ module Projects
|
|||
end
|
||||
|
||||
def wiki_path
|
||||
repo_path + '.wiki'
|
||||
project.wiki.disk_path
|
||||
end
|
||||
|
||||
def trash_repositories!
|
||||
|
|
|
|||
|
|
@ -44,4 +44,4 @@
|
|||
= render "discussions/diff_with_notes", discussion: discussion
|
||||
- else
|
||||
.panel.panel-default
|
||||
= render "discussions/notes", discussion: discussion
|
||||
= render partial: "discussions/notes", locals: { discussion: discussion, disable_collapse_class: true }
|
||||
|
|
|
|||
|
|
@ -19,13 +19,6 @@
|
|||
|
||||
= render 'shared/issuable/search_bar', type: :issues
|
||||
|
||||
.row-content-block.second-block
|
||||
Only issues from the
|
||||
%strong= @group.name
|
||||
group are listed here.
|
||||
- if current_user
|
||||
To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page.
|
||||
|
||||
= render 'shared/issues'
|
||||
- else
|
||||
= render 'shared/empty_states/issues', project_select_button: true
|
||||
|
|
|
|||
|
|
@ -15,11 +15,4 @@
|
|||
|
||||
= render 'shared/issuable/search_bar', type: :merge_requests
|
||||
|
||||
.row-content-block.second-block
|
||||
Only merge requests from
|
||||
%strong= @group.name
|
||||
group are listed here.
|
||||
- if current_user
|
||||
To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page.
|
||||
|
||||
= render 'shared/merge_requests'
|
||||
|
|
|
|||
|
|
@ -272,6 +272,11 @@
|
|||
= sprite_icon('users')
|
||||
%span.nav-item-name
|
||||
Members
|
||||
%ul.sidebar-sub-level-items.is-fly-out-only
|
||||
= nav_link(path: %w[members#show], html_options: { class: "fly-out-top-item" } ) do
|
||||
= link_to project_settings_members_path(@project) do
|
||||
%strong.fly-out-top-item-name
|
||||
#{ _('Members') }
|
||||
|
||||
= render 'shared/sidebar_toggle_button'
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Confirmation email shows link as text instead of human readable text
|
||||
merge_request: 14243
|
||||
author: bitsapien
|
||||
type: changed
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
title: Allow to use same periods for different housekeeping tasks (effectively
|
||||
skipping the lesser task)
|
||||
merge_request: 13711
|
||||
author: cernvcs
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Upgrade gitlab-markup gem
|
||||
merge_request: 14395
|
||||
author: Markus Koller
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: "Add missing space in Sidekiq memory killer log message"
|
||||
merge_request: 14553
|
||||
author: Benjamin Drung
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Escape quotes in git username
|
||||
merge_request: 14020
|
||||
author: Brandon Everett
|
||||
type: fixed
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
title: Discussion lock for issues and merge requests
|
||||
merge_request:
|
||||
author:
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Add an API endpoint to determine the forks of a project
|
||||
merge_request:
|
||||
author:
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Return only group's members in user dropdowns on issuables list pages
|
||||
merge_request: 14249
|
||||
author:
|
||||
type: changed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Make the labels in the Compare form less confusing
|
||||
merge_request: 14225
|
||||
author:
|
||||
type: changed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Don't show an "Unsubscribe" link in snippet comment notifications
|
||||
merge_request: 14764
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Extract AutocompleteController#users into finder
|
||||
merge_request: 13778
|
||||
author: Maxim Rydkin, Mayra Cabrera
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fix the default branches sorting to actually be 'Last updated'
|
||||
merge_request: 14295
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Decrease ABC threshold to 54.28
|
||||
merge_request: 14920
|
||||
author: Maxim Rydkin
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Decrease Perceived Complexity threshold to 15
|
||||
merge_request: 14160
|
||||
author: Maxim Rydkin
|
||||
type: other
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Decrease Perceived Complexity threshold to 14
|
||||
merge_request: 14231
|
||||
author: Maxim Rydkin
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Decrease Cyclomatic Complexity threshold to 13
|
||||
merge_request: 14152
|
||||
author: Maxim Rydkin
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Added defaults for protected branches dropdowns on the repository settings
|
||||
merge_request: 14278
|
||||
author:
|
||||
type: changed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Adds gitlab features and components to usage ping data.
|
||||
merge_request: 14305
|
||||
author:
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Link SAML users to LDAP by email.
|
||||
merge_request: 14216
|
||||
author:
|
||||
type: changed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Add online view of HTML artifacts for public projects
|
||||
merge_request: 14399
|
||||
author:
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fixes project denial of service via gitmodules using Extended ASCII.
|
||||
merge_request: 14301
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Load sidebar participants avatars only when visible
|
||||
merge_request: 14270
|
||||
author:
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Removes cycle analytics service and store from global namespace
|
||||
merge_request:
|
||||
author:
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Optimize the boards' issues fetching.
|
||||
merge_request: 14198
|
||||
author:
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Improves i18n for Auto Devops callout
|
||||
merge_request:
|
||||
author:
|
||||
type: other
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
---
|
||||
title: made read-only APIs for public merge requests available without authentication
|
||||
merge_request: 13291
|
||||
author: haseebeqx
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fix the project import with issues and milestones
|
||||
merge_request: 14657
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
---
|
||||
title: creation of keys moved to services
|
||||
merge_request: 13331
|
||||
author: haseebeqx
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Re-arrange <script> tags before <template> tags in .vue files
|
||||
merge_request: 14671
|
||||
author:
|
||||
type: changed
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Decreases z-index of select2 to a lower number of our navigation bar
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Allow prometheus graphs to correctly handle NaN values
|
||||
merge_request: 14741
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Allow the git circuit breaker to correctly handle missing repository storages
|
||||
merge_request: 14417
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
title: Reschedule merge request diff background migrations to catch failures from
|
||||
9.5 run
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Remove the ability to visit the issue edit form directly
|
||||
merge_request: 14523
|
||||
author:
|
||||
type: removed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Hide close MR button after merge without reloading page
|
||||
merge_request: 14122
|
||||
author: Jacopo Beschi @jacopo-beschi
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Add support for GPG subkeys in signature verification
|
||||
merge_request: 14517
|
||||
author:
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Add Gitaly version to Admin Dashboard
|
||||
merge_request: 14313
|
||||
author: Jacopo Beschi @jacopo-beschi
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Add GitLab-Pages version to Admin Dashboard
|
||||
merge_request: 14040
|
||||
author: travismiller
|
||||
type: added
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
---
|
||||
title: Fixed non-UTF-8 valid branch names from causing an error.
|
||||
merge_request: 14090
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fix incorrect X-axis labels in Prometheus graphs
|
||||
merge_request: 14258
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Exports common_utils utility functions as modules
|
||||
merge_request:
|
||||
author:
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: fix merge request widget status icon for failed CI
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Add active states to nav bar counters
|
||||
merge_request:
|
||||
author:
|
||||
type: changed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: 'Add help text to runner edit: tags should be separated by commas.'
|
||||
merge_request:
|
||||
author: Brendan O'Leary
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fix the number representing the amount of commits related to a push event
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: 'Replace `tag: true` into `:tag` in the specs'
|
||||
merge_request: 14653
|
||||
author: Jacopo Beschi @jacopo-beschi
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fixed duplicate notifications when added multiple labels on an issue
|
||||
merge_request: 14798
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Parse and store gitlab-runner timestamped section markers
|
||||
merge_request: 14551
|
||||
author:
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Strip gitlab-runner section markers in build trace HTML view
|
||||
merge_request: 14393
|
||||
author:
|
||||
type: added
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fix the filesystem shard health check to check all configured shards
|
||||
merge_request: 14341
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
title: Move the deployment flag content to the left when deployment marker is near
|
||||
the end
|
||||
merge_request: 14514
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Sync up hover and legend data across all graphs for the prometheus dashboard
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Use `simple=true` for projects API in Projects dropdown for better search performance
|
||||
merge_request:
|
||||
author:
|
||||
type: other
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fix bottom spacing for dropdowns that open upwards
|
||||
merge_request: 14535
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Fix `rake gitlab:incoming_email:check` and make it report the actual error
|
||||
merge_request: 14423
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
title: Does not check if an invariant hashed storage path exists on disk when renaming
|
||||
projects.
|
||||
merge_request: 14428
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: Also reserve refs/replace after importing a project
|
||||
merge_request: 14436
|
||||
author:
|
||||
type: fixed
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue