Commit 41aba3c6 authored by GitLab Bot's avatar GitLab Bot

Add latest changes from gitlab-org/gitlab@master

parent 43099925
...@@ -11,7 +11,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin'); ...@@ -11,7 +11,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin');
const ROOT_PATH = path.resolve(__dirname, '..'); const ROOT_PATH = path.resolve(__dirname, '..');
const CACHE_PATH = process.env.WEBPACK_CACHE_PATH || path.join(ROOT_PATH, 'tmp/cache'); const CACHE_PATH = process.env.WEBPACK_CACHE_PATH || path.join(ROOT_PATH, 'tmp/cache');
const IS_PRODUCTION = process.env.NODE_ENV === 'production'; const IS_PRODUCTION = process.env.NODE_ENV === 'production';
const IS_DEV_SERVER = process.argv.join(' ').indexOf('webpack-dev-server') !== -1; const IS_DEV_SERVER = process.env.WEBPACK_DEV_SERVER === 'true';
const IS_EE = require('./helpers/is_ee_env'); const IS_EE = require('./helpers/is_ee_env');
const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost'; const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost';
const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808; const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808;
...@@ -209,7 +209,9 @@ module.exports = { ...@@ -209,7 +209,9 @@ module.exports = {
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
name: '[name].[hash:8].[ext]', modules: {
localIdentName: '[name]__[local].[hash:8].[ext]',
},
}, },
}, },
], ],
...@@ -373,6 +375,9 @@ module.exports = { ...@@ -373,6 +375,9 @@ module.exports = {
openAnalyzer: false, openAnalyzer: false,
reportFilename: path.join(ROOT_PATH, 'webpack-report/index.html'), reportFilename: path.join(ROOT_PATH, 'webpack-report/index.html'),
statsFilename: path.join(ROOT_PATH, 'webpack-report/stats.json'), statsFilename: path.join(ROOT_PATH, 'webpack-report/stats.json'),
statsOptions: {
source: false,
},
}), }),
new webpack.DefinePlugin({ new webpack.DefinePlugin({
......
...@@ -44,6 +44,10 @@ autoloaded with Rails. Example: ...@@ -44,6 +44,10 @@ autoloaded with Rails. Example:
require Rails.root.join('db', 'post_migrate', '20170526185842_migrate_pipeline_stages.rb') require Rails.root.join('db', 'post_migrate', '20170526185842_migrate_pipeline_stages.rb')
``` ```
### Test helpers
#### `table`
Use the `table` helper to create a temporary `ActiveRecord::Base`-derived model Use the `table` helper to create a temporary `ActiveRecord::Base`-derived model
for a table. [FactoryBot](https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#factories) for a table. [FactoryBot](https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#factories)
**should not** be used to create data for migration specs. For example, to **should not** be used to create data for migration specs. For example, to
...@@ -53,6 +57,8 @@ create a record in the `projects` table: ...@@ -53,6 +57,8 @@ create a record in the `projects` table:
project = table(:projects).create!(id: 1, name: 'gitlab1', path: 'gitlab1') project = table(:projects).create!(id: 1, name: 'gitlab1', path: 'gitlab1')
``` ```
#### `migrate!`
Use the `migrate!` helper to run the migration that is under test. It will not only Use the `migrate!` helper to run the migration that is under test. It will not only
run the migration, but will also bump the schema version in the `schema_migrations` run the migration, but will also bump the schema version in the `schema_migrations`
table. It is necessary because in the `after` hook we trigger the rest of table. It is necessary because in the `after` hook we trigger the rest of
...@@ -68,6 +74,33 @@ it 'migrates successfully' do ...@@ -68,6 +74,33 @@ it 'migrates successfully' do
end end
``` ```
#### `reversible_migration`
Use the `reversible_migration` helper to test migrations with either a
`change` or both `up` and `down` hooks. This will test that the state of
the application and its data after the migration becomes reversed is the
same as it was before the migration ran in the first place. The helper:
1. Runs the `before` expectations before the **up** migration.
1. Migrates **up**.
1. Runs the `after` expectations.
1. Migrates **down**.
1. Runs the `before` expectations a second time.
Example:
```ruby
reversible_migration do |migration|
migration.before -> {
# ... pre-migration expectations
}
migration.after -> {
# ... post-migration expectations
}
end
```
### Example database migration test ### Example database migration test
This spec tests the This spec tests the
...@@ -93,7 +126,7 @@ describe MigratePipelineStages, :migration do ...@@ -93,7 +126,7 @@ describe MigratePipelineStages, :migration do
jobs.create!(id: 2, commit_id: 1, project_id: 123, stage_idx: 1, stage: 'test') jobs.create!(id: 2, commit_id: 1, project_id: 123, stage_idx: 1, stage: 'test')
end end
# Test the up migration. # Test just the up migration.
it 'correctly migrates pipeline stages' do it 'correctly migrates pipeline stages' do
expect(stages.count).to be_zero expect(stages.count).to be_zero
...@@ -102,6 +135,22 @@ describe MigratePipelineStages, :migration do ...@@ -102,6 +135,22 @@ describe MigratePipelineStages, :migration do
expect(stages.count).to eq 2 expect(stages.count).to eq 2
expect(stages.all.pluck(:name)).to match_array %w[test build] expect(stages.all.pluck(:name)).to match_array %w[test build]
end end
# Test a reversible migration.
it 'correctly migrates up and down pipeline stages' do
reversible_migration do |migration|
# Expectations will run before the up migration,
# and then again after the down migration
migration.before -> {
expect(stages.count).to be_zero
}
# Expectations will run after the up migration.
migration.after -> {
expect(stages.count).to eq 2
expect(stages.all.pluck(:name)).to match_array %w[test build]
}
end
end end
``` ```
......
...@@ -192,13 +192,15 @@ account: ...@@ -192,13 +192,15 @@ account:
#### Change associated namespace #### Change associated namespace
With a linked GitLab.com account, go to the With a linked GitLab.com account:
[**Subscriptions**](https://customers.gitlab.com/subscriptions) page to choose
or change the namespace your subscription applies to.
NOTE: **Note:** 1. Log in to the [GitLab Subscription Manager](https://customers.gitlab.com/customers/sign_in).
Please note that you need to be a group owner to associate a group to your 1. Navigate to the **Manage Purchases** page.
subscription. 1. Click **Change linked group**.
1. Select the desired group from the **This subscription is for** dropdown.
1. Click **Proceed to checkout**.
Subscription charges are calculated based on the total number of users in a group, including its subgroups and nested projects. If the total number of users exceeds the number of seats in your subscription, you will be charged for the additional users.
### Confirm or upgrade your subscription ### Confirm or upgrade your subscription
......
...@@ -28,7 +28,7 @@ Among numerous use cases for exporting issues for CSV, we can name a few: ...@@ -28,7 +28,7 @@ Among numerous use cases for exporting issues for CSV, we can name a few:
## Choosing which issues to include ## Choosing which issues to include
From the issues page you can narrow down which issues to export using the search bar, along with the All/Open/Closed tabs. All issues returned will be exported, including those not shown on the first page. After selecting a project, from the issues page you can narrow down which issues to export using the search bar, along with the All/Open/Closed tabs. All issues returned will be exported, including those not shown on the first page.
![CSV export button](img/csv_export_button.png) ![CSV export button](img/csv_export_button.png)
...@@ -72,4 +72,5 @@ Data will be encoded with a comma as the column delimiter, with `"` used to quot ...@@ -72,4 +72,5 @@ Data will be encoded with a comma as the column delimiter, with `"` used to quot
## Limitations ## Limitations
As the issues will be sent as an email attachment, there is a limit on how much data can be exported. Currently this limit is 15MB to ensure successful delivery across a range of email providers. If this limit is reached we suggest narrowing the search before export, perhaps by exporting open and closed issues separately. - Export Issues to CSV is not available at the Group's Issues List.
- As the issues will be sent as an email attachment, there is a limit on how much data can be exported. Currently this limit is 15MB to ensure successful delivery across a range of email providers. If this limit is reached we suggest narrowing the search before export, perhaps by exporting open and closed issues separately.
...@@ -56,8 +56,9 @@ module Gitlab ...@@ -56,8 +56,9 @@ module Gitlab
end end
def error(error) def error(error)
log_error(message: error.message, caller: caller[0].dup) error_payload = { message: error.message }
log_debug(backtrace: error.backtrace&.join("\n")) error_payload[:error_backtrace] = Gitlab::Profiler.clean_backtrace(error.backtrace) if error.backtrace
log_error(error_payload)
Gitlab::Sentry.track_acceptable_exception(error, extra: log_base_data) Gitlab::Sentry.track_acceptable_exception(error, extra: log_base_data)
......
...@@ -30,13 +30,13 @@ ...@@ -30,13 +30,13 @@
"webpack-prod": "NODE_OPTIONS=\"--max-old-space-size=3584\" NODE_ENV=production webpack --config config/webpack.config.js" "webpack-prod": "NODE_OPTIONS=\"--max-old-space-size=3584\" NODE_ENV=production webpack --config config/webpack.config.js"
}, },
"dependencies": { "dependencies": {
"@babel/core": "^7.5.5", "@babel/core": "^7.6.2",
"@babel/plugin-proposal-class-properties": "^7.5.5", "@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/plugin-proposal-json-strings": "^7.2.0", "@babel/plugin-proposal-json-strings": "^7.2.0",
"@babel/plugin-proposal-private-methods": "^7.4.4", "@babel/plugin-proposal-private-methods": "^7.6.0",
"@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-syntax-import-meta": "^7.2.0", "@babel/plugin-syntax-import-meta": "^7.2.0",
"@babel/preset-env": "^7.5.5", "@babel/preset-env": "^7.6.2",
"@gitlab/svgs": "^1.74.0", "@gitlab/svgs": "^1.74.0",
"@gitlab/ui": "5.26.0", "@gitlab/ui": "5.26.0",
"@gitlab/visual-review-tools": "1.0.3", "@gitlab/visual-review-tools": "1.0.3",
...@@ -49,19 +49,19 @@ ...@@ -49,19 +49,19 @@
"autosize": "^4.0.0", "autosize": "^4.0.0",
"aws-sdk": "^2.526.0", "aws-sdk": "^2.526.0",
"axios": "^0.19.0", "axios": "^0.19.0",
"babel-loader": "^8.0.5", "babel-loader": "^8.0.6",
"bootstrap": "4.3.1", "bootstrap": "4.3.1",
"brace-expansion": "^1.1.8", "brace-expansion": "^1.1.8",
"cache-loader": "^2.0.1", "cache-loader": "^4.1.0",
"chart.js": "2.7.2", "chart.js": "2.7.2",
"classlist-polyfill": "^1.2.0", "classlist-polyfill": "^1.2.0",
"clipboard": "^1.7.1", "clipboard": "^1.7.1",
"codesandbox-api": "^0.0.20", "codesandbox-api": "^0.0.20",
"compression-webpack-plugin": "^2.0.0", "compression-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.0.4", "copy-webpack-plugin": "^5.0.4",
"core-js": "^3.1.3", "core-js": "^3.2.1",
"cropper": "^2.3.0", "cropper": "^2.3.0",
"css-loader": "^1.0.0", "css-loader": "^3.2.0",
"d3": "^4.13.0", "d3": "^4.13.0",
"d3-array": "^1.2.1", "d3-array": "^1.2.1",
"d3-axis": "^1.0.8", "d3-axis": "^1.0.8",
...@@ -81,7 +81,7 @@ ...@@ -81,7 +81,7 @@
"emoji-regex": "^7.0.3", "emoji-regex": "^7.0.3",
"emoji-unicode-version": "^0.2.1", "emoji-unicode-version": "^0.2.1",
"exports-loader": "^0.7.0", "exports-loader": "^0.7.0",
"file-loader": "^3.0.1", "file-loader": "^4.2.0",
"formdata-polyfill": "^3.0.11", "formdata-polyfill": "^3.0.11",
"fuzzaldrin-plus": "^0.5.0", "fuzzaldrin-plus": "^0.5.0",
"glob": "^7.1.2", "glob": "^7.1.2",
...@@ -110,7 +110,7 @@ ...@@ -110,7 +110,7 @@
"prosemirror-model": "^1.6.4", "prosemirror-model": "^1.6.4",
"raphael": "^2.2.7", "raphael": "^2.2.7",
"raven-js": "^3.22.1", "raven-js": "^3.22.1",
"raw-loader": "^1.0.0", "raw-loader": "^3.1.0",
"sanitize-html": "^1.16.1", "sanitize-html": "^1.16.1",
"select2": "3.5.2-browserify", "select2": "3.5.2-browserify",
"sha1": "^1.1.1", "sha1": "^1.1.1",
...@@ -118,7 +118,7 @@ ...@@ -118,7 +118,7 @@
"sortablejs": "^1.10.0", "sortablejs": "^1.10.0",
"sql.js": "^0.4.0", "sql.js": "^0.4.0",
"stickyfilljs": "^2.0.5", "stickyfilljs": "^2.0.5",
"style-loader": "^0.23.1", "style-loader": "^1.0.0",
"svg4everybody": "2.1.9", "svg4everybody": "2.1.9",
"three": "^0.84.0", "three": "^0.84.0",
"three-orbit-controls": "^82.1.0", "three-orbit-controls": "^82.1.0",
...@@ -128,20 +128,20 @@ ...@@ -128,20 +128,20 @@
"tiptap-commands": "^1.4.0", "tiptap-commands": "^1.4.0",
"tiptap-extensions": "^1.8.0", "tiptap-extensions": "^1.8.0",
"underscore": "^1.9.0", "underscore": "^1.9.0",
"url-loader": "^1.1.2", "url-loader": "^2.1.0",
"visibilityjs": "^1.2.4", "visibilityjs": "^1.2.4",
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-apollo": "^3.0.0-beta.28", "vue-apollo": "^3.0.0-beta.28",
"vue-loader": "^15.7.0", "vue-loader": "^15.7.1",
"vue-router": "^3.0.2", "vue-router": "^3.0.2",
"vue-template-compiler": "^2.6.10", "vue-template-compiler": "^2.6.10",
"vue-virtual-scroll-list": "^1.3.1", "vue-virtual-scroll-list": "^1.3.1",
"vuedraggable": "^2.23.0", "vuedraggable": "^2.23.0",
"vuex": "^3.1.0", "vuex": "^3.1.0",
"webpack": "^4.29.0", "webpack": "^4.40.2",
"webpack-bundle-analyzer": "^3.3.2", "webpack-bundle-analyzer": "^3.5.1",
"webpack-cli": "^3.2.1", "webpack-cli": "^3.3.9",
"webpack-stats-plugin": "^0.2.1", "webpack-stats-plugin": "^0.3.0",
"worker-loader": "^2.0.0", "worker-loader": "^2.0.0",
"xterm": "^3.5.0" "xterm": "^3.5.0"
}, },
...@@ -200,7 +200,7 @@ ...@@ -200,7 +200,7 @@
"stylelint-scss": "^3.9.2", "stylelint-scss": "^3.9.2",
"timezone-mock": "^1.0.8", "timezone-mock": "^1.0.8",
"vue-jest": "^4.0.0-beta.2", "vue-jest": "^4.0.0-beta.2",
"webpack-dev-server": "^3.1.14", "webpack-dev-server": "^3.8.1",
"yarn-deduplicate": "^1.1.1" "yarn-deduplicate": "^1.1.1"
}, },
"resolutions": { "resolutions": {
......
...@@ -53,16 +53,17 @@ describe Gitlab::ImportExport::Shared do ...@@ -53,16 +53,17 @@ describe Gitlab::ImportExport::Shared do
subject.error(error) subject.error(error)
end end
it 'calls the error logger with the full message' do it 'calls the error logger without a backtrace' do
expect(subject).to receive(:log_error).with(hash_including(message: error.message)) expect(subject).to receive(:log_error).with(message: error.message)
subject.error(error) subject.error(error)
end end
it 'calls the debug logger with a backtrace' do it 'calls the error logger with the full message' do
error.set_backtrace('backtrace') backtrace = caller
allow(error).to receive(:backtrace).and_return(caller)
expect(subject).to receive(:log_debug).with(hash_including(backtrace: 'backtrace')) expect(subject).to receive(:log_error).with(message: error.message, error_backtrace: Gitlab::Profiler.clean_backtrace(backtrace))
subject.error(error) subject.error(error)
end end
......
...@@ -132,6 +132,41 @@ module MigrationsHelpers ...@@ -132,6 +132,41 @@ module MigrationsHelpers
migration.name == described_class.name migration.name == described_class.name
end end
end end
class ReversibleMigrationTest
attr_reader :before_up, :after_up
def initialize
@before_up = -> {}
@after_up = -> {}
end
def before(expectations)
@before_up = expectations
self
end
def after(expectations)
@after_up = expectations
self
end
end
def reversible_migration(&block)
tests = yield(ReversibleMigrationTest.new)
tests.before_up.call
migrate!
tests.after_up.call
schema_migrate_down!
tests.before_up.call
end
end end
MigrationsHelpers.prepend_if_ee('EE::MigrationsHelpers') MigrationsHelpers.prepend_if_ee('EE::MigrationsHelpers')
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment