mediawiki/extensions/Sentry: main (log #969204)

sourcepatches

This run took 28 seconds.

$ date
--- stdout ---
Fri Mar 24 03:32:52 UTC 2023

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-Sentry.git repo --depth=1 -b master
--- stderr ---
Cloning into 'repo'...
--- stdout ---

--- end ---
$ git config user.name libraryupgrader
--- stdout ---

--- end ---
$ git config user.email tools.libraryupgrader@tools.wmflabs.org
--- stdout ---

--- end ---
$ git submodule update --init
--- stdout ---

--- end ---
$ grr init
--- stdout ---
Installed commit-msg hook.

--- end ---
$ git show-ref refs/heads/master
--- stdout ---
ecd260d37d2431d16402dd129b41b8b775491f31 refs/heads/master

--- end ---
$ /usr/bin/npm audit --json --legacy-peer-deps
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 277,
      "optional": 0,
      "peer": 0,
      "peerOptional": 0,
      "total": 277
    }
  }
}

--- end ---
$ /usr/bin/composer install
--- stderr ---
No lock file found. Updating dependencies instead of installing from lock file. Use composer update over composer install if you do not have a lock file.
Loading composer repositories with package information
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies
Lock file operations: 39 installs, 0 updates, 0 removals
  - Locking composer/installers (v2.2.0)
  - Locking composer/pcre (3.1.0)
  - Locking composer/semver (3.3.2)
  - Locking composer/spdx-licenses (1.5.7)
  - Locking composer/xdebug-handler (3.0.3)
  - Locking doctrine/deprecations (v1.0.0)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking mediawiki/mediawiki-codesniffer (v41.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.12.0)
  - Locking mediawiki/minus-x (1.1.1)
  - Locking mediawiki/phan-taint-check-plugin (4.0.0)
  - Locking microsoft/tolerant-php-parser (v0.1.1)
  - Locking monolog/monolog (2.9.1)
  - Locking netresearch/jsonmapper (v4.1.0)
  - Locking phan/phan (5.4.1)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.3.2)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.3.0)
  - Locking phpdocumentor/type-resolver (1.7.0)
  - Locking phpstan/phpdoc-parser (1.16.1)
  - Locking psr/container (1.1.2)
  - Locking psr/log (1.1.4)
  - Locking sabre/event (5.1.4)
  - Locking sentry/sentry (0.20.0)
  - Locking squizlabs/php_codesniffer (3.7.2)
  - Locking symfony/console (v5.4.21)
  - Locking symfony/deprecation-contracts (v2.5.2)
  - Locking symfony/polyfill-ctype (v1.27.0)
  - Locking symfony/polyfill-intl-grapheme (v1.27.0)
  - Locking symfony/polyfill-intl-normalizer (v1.27.0)
  - Locking symfony/polyfill-mbstring (v1.27.0)
  - Locking symfony/polyfill-php73 (v1.27.0)
  - Locking symfony/polyfill-php80 (v1.27.0)
  - Locking symfony/service-contracts (v2.5.2)
  - Locking symfony/string (v5.4.21)
  - Locking tysonandre/var_representation_polyfill (0.1.3)
  - Locking webmozart/assert (1.11.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 39 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]    0 [--->------------------------]  - Installing composer/installers (v2.2.0): Extracting archive
  - Installing composer/pcre (3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.27.0): Extracting archive
  - Installing squizlabs/php_codesniffer (3.7.2): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.27.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.7): Extracting archive
  - Installing composer/semver (3.3.2): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v41.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.27.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.27.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.27.0): Extracting archive
  - Installing symfony/string (v5.4.21): Extracting archive
  - Installing symfony/deprecation-contracts (v2.5.2): Extracting archive
  - Installing psr/container (1.1.2): Extracting archive
  - Installing symfony/service-contracts (v2.5.2): Extracting archive
  - Installing symfony/polyfill-php73 (v1.27.0): Extracting archive
  - Installing symfony/console (v5.4.21): Extracting archive
  - Installing sabre/event (5.1.4): Extracting archive
  - Installing netresearch/jsonmapper (v4.1.0): Extracting archive
  - Installing microsoft/tolerant-php-parser (v0.1.1): Extracting archive
  - Installing webmozart/assert (1.11.0): Extracting archive
  - Installing phpstan/phpdoc-parser (1.16.1): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (v1.0.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.7.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (1.1.4): Extracting archive
  - Installing composer/xdebug-handler (3.0.3): Extracting archive
  - Installing phan/phan (5.4.1): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (4.0.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.12.0): Extracting archive
  - Installing mediawiki/minus-x (1.1.1): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive
  - Installing monolog/monolog (2.9.1): Extracting archive
  - Installing sentry/sentry (0.20.0): Extracting archive
  0/29 [>---------------------------]   0%
 10/29 [=========>------------------]  34%
 19/29 [==================>---------]  65%
 28/29 [===========================>]  96%
 29/29 [============================] 100%14 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---

--- end ---
Upgrading n:eslint-config-wikimedia from 0.20.0 -> 0.24.0
Upgrading n:grunt from 1.5.3 -> 1.6.1
$ /usr/bin/npm install
--- stdout ---

added 280 packages, and audited 281 packages in 5s

43 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ /usr/bin/npm install grunt-eslint@24.0.0 --save-exact
--- stdout ---

up to date, audited 281 packages in 732ms

43 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ ./node_modules/.bin/eslint i18n/fr.json i18n/ar.json i18n/sv.json i18n/pt-br.json i18n/ksh.json i18n/lb.json i18n/pl.json i18n/ja.json resources/init.js i18n/sl.json i18n/es.json i18n/be-tarask.json i18n/roa-tara.json tests/qunit/init.test.js i18n/tr.json i18n/ko.json i18n/qqq.json i18n/nb.json package-lock.json i18n/de.json extension.json i18n/zh-hans.json i18n/gl.json package.json i18n/lij.json i18n/uk.json i18n/fa.json i18n/oc.json i18n/he.json i18n/en.json i18n/ru.json i18n/pt.json i18n/nl.json i18n/zh-hant.json i18n/it.json i18n/mk.json Gruntfile.js i18n/ast.json composer.json i18n/cs.json i18n/ia.json --fix
--- stdout ---

/src/repo/resources/init.js
  63:7   warning  Prefer Array#forEach to $.each                         no-jquery/no-each-util
  73:1   warning  This line has a length of 109. Maximum allowed is 100  max-len
  73:38  warning  Prefer Array#map to $.map                              no-jquery/no-map-util

/src/repo/tests/qunit/init.test.js
  15:4  error  Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual  qunit/no-loose-assertions
  16:4  error  Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual  qunit/no-loose-assertions

✖ 5 problems (2 errors, 3 warnings)


--- end ---
$ ./node_modules/.bin/eslint i18n/fr.json i18n/ar.json i18n/sv.json i18n/pt-br.json i18n/ksh.json i18n/lb.json i18n/pl.json i18n/ja.json resources/init.js i18n/sl.json i18n/es.json i18n/be-tarask.json i18n/roa-tara.json tests/qunit/init.test.js i18n/tr.json i18n/ko.json i18n/qqq.json i18n/nb.json package-lock.json i18n/de.json extension.json i18n/zh-hans.json i18n/gl.json package.json i18n/lij.json i18n/uk.json i18n/fa.json i18n/oc.json i18n/he.json i18n/en.json i18n/ru.json i18n/pt.json i18n/nl.json i18n/zh-hant.json i18n/it.json i18n/mk.json Gruntfile.js i18n/ast.json composer.json i18n/cs.json i18n/ia.json -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ar.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ast.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/be-tarask.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/cs.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/de.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/es.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/fr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/gl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/he.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ia.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/it.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ja.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ko.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ksh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/lb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/lij.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/mk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/nl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/oc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pt-br.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/pt.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/roa-tara.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/ru.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/sv.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/tr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/uk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/zh-hans.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/i18n/zh-hant.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/src/repo/resources/init.js","messages":[{"ruleId":"no-jquery/no-each-util","severity":1,"message":"Prefer Array#forEach to $.each","line":63,"column":7,"nodeType":"CallExpression","endLine":65,"endColumn":10},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":73,"column":1,"nodeType":"Program","messageId":"max","endLine":73,"endColumn":89},{"ruleId":"no-jquery/no-map-util","severity":1,"message":"Prefer Array#map to $.map","line":73,"column":38,"nodeType":"CallExpression","endLine":75,"endColumn":11}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* eslint camelcase: [\"error\", {properties: \"never\"}] */\n( function () {\n\tvar ravenPromise,\n\t\terrorCount = 0,\n\t\tEVENT_GATE_SHELL = {\n\t\t\t$schema: '/client/error/1.0.0',\n\t\t\tmeta: { stream: 'client.error' }\n\t\t};\n\n\t/**\n\t * @return {jQuery.Deferred} a deferred with two values: the Raven.js object and the TraceKit\n\t *   error handler\n\t */\n\tfunction initRaven() {\n\t\tif ( !ravenPromise ) {\n\t\t\travenPromise = mw.loader.using( 'sentry.raven' ).then( function () {\n\t\t\t\tvar config = mw.config.get( 'wgSentry' ),\n\t\t\t\t\toptions = {},\n\t\t\t\t\toldOnError,\n\t\t\t\t\ttraceKitOnError;\n\n\t\t\t\t// If EventGate is configured, this extension will send errors to it.\n\t\t\t\t// However, it needs to configure the sentry dsn to initialize Raven\n\t\t\t\tif ( config.eventGateUri ) {\n\t\t\t\t\tconfig.dsn = config.dsn || 'https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/project';\n\t\t\t\t} else if ( !config.dsn ) {\n\t\t\t\t\tmw.log.error( 'See README for how to configure Sentry server' );\n\t\t\t\t}\n\n\t\t\t\tif ( config.whitelist ) {\n\t\t\t\t\toptions.whitelistUrls = config.whitelist.slice( 0 );\n\t\t\t\t\toptions.whitelistUrls.push( location.host );\n\t\t\t\t}\n\t\t\t\toptions.collectWindowErrors = config.logOnError;\n\t\t\t\toptions.tags = {\n\t\t\t\t\tversion: mw.config.get( 'wgVersion' ),\n\t\t\t\t\tdebug: mw.config.get( 'debug' ),\n\t\t\t\t\tskin: mw.config.get( 'skin' ),\n\t\t\t\t\taction: mw.config.get( 'wgAction' ),\n\t\t\t\t\tns: mw.config.get( 'wgNamespaceNumber' ),\n\t\t\t\t\tpage_name: mw.config.get( 'wgPageName' ),\n\t\t\t\t\tuser_groups: mw.config.get( 'wgUserGroups' ),\n\t\t\t\t\tlanguage: mw.config.get( 'wgUserLanguage' )\n\t\t\t\t};\n\n\t\t\t\toptions.shouldSendCallback = function ( data ) {\n\t\t\t\t\tvar eventGateData;\n\t\t\t\t\t// don't flood the server / freeze the client when something generates\n\t\t\t\t\t// an endless stream of errors\n\t\t\t\t\tif ( errorCount++ >= 5 ) {\n\t\t\t\t\t\tRaven.uninstall();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( config.eventGateUri ) {\n\t\t\t\t\t\t// hijack the actual sending and POST to EventGate\n\t\t\t\t\t\t// TODO: this is for beta testing only, we need to implement it properly as\n\t\t\t\t\t\t//       we work on productionizing\n\t\t\t\t\t\teventGateData = $.extend( {}, EVENT_GATE_SHELL, data );\n\n\t\t\t\t\t\t// use a flatter format, Sentry's tag syntax doesn't play well with Logstash\n\t\t\t\t\t\tdelete eventGateData.tags;\n\t\t\t\t\t\t$.each( data.tags, function ( tagName, tagValue ) {\n\t\t\t\t\t\t\teventGateData[ 'tag_' + tagName ] = tagValue;\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t// Sentry's culprit field is based on script URL, which is not very useful\n\t\t\t\t\t\t// with ResourceLoader. Provide function-based fields for grouping instead.\n\t\t\t\t\t\teventGateData.culprit_function = null;\n\t\t\t\t\t\teventGateData.culprit_stack = '';\n\t\t\t\t\t\tif ( data.stacktrace && data.stacktrace.frames.length ) {\n\t\t\t\t\t\t\teventGateData.culprit_function = data.stacktrace.frames[ 0 ].function;\n\t\t\t\t\t\t\teventGateData.culprit_stack = $.map( data.stacktrace.frames, function ( frame ) {\n\t\t\t\t\t\t\t\treturn frame.function;\n\t\t\t\t\t\t\t} ).join( ' < ' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$.post( config.eventGateUri, eventGateData )\n\t\t\t\t\t\t\t.fail( function ( error ) {\n\t\t\t\t\t\t\t\tmw.log.warn( 'POSTing error to EventGate failed', error );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\n\t\t\t\t// Annoyingly, there is no way to install Raven/TraceKit without it taking over\n\t\t\t\t// the global error handler (and chaining the old handler after itself).\n\t\t\t\toldOnError = window.onerror;\n\t\t\t\twindow.onerror = null;\n\t\t\t\ttry {\n\t\t\t\t\tRaven.config( config.dsn, options ).install();\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\twindow.onerror = oldOnError;\n\t\t\t\t\tmw.log.error( e );\n\t\t\t\t\treturn $.Deferred().reject( e );\n\t\t\t\t}\n\t\t\t\ttraceKitOnError = window.onerror;\n\t\t\t\twindow.onerror = oldOnError;\n\n\t\t\t\treturn $.Deferred().resolve( Raven, traceKitOnError );\n\t\t\t} );\n\t\t}\n\t\treturn ravenPromise;\n\t}\n\n\t/**\n\t * @param {string} topic mw.track() queue name\n\t * @param {Object} data\n\t * @param {Mixed} data.exception The exception which has been caught\n\t * @param {string} data.id An identifier for the exception\n\t * @param {string} data.source Describes what type of function caught the exception\n\t * @param {string} [data.module] Name of the module which threw the exception\n\t * @param {Object} [data.context] Additional key-value pairs to be recorded as Sentry tags\n\t */\n\tfunction report( topic, data ) {\n\t\tmw.sentry.initRaven().done( function ( raven /* , traceKitOnError */ ) {\n\t\t\tvar tags = { source: data.source };\n\n\t\t\tif ( data.module ) {\n\t\t\t\ttags.module = data.module;\n\t\t\t}\n\t\t\t$.extend( tags, data.context );\n\n\t\t\traven.captureException( data.exception, { tags: tags } );\n\t\t} );\n\t}\n\n\t/**\n\t * Handles global.error events.\n\t *\n\t * There is no way to stop Raven from replacing window.onerror (https://github.com/getsentry/raven-js/issues/316)\n\t * and it will pass errors to the old handler after reporting them, so we need a temporary\n\t * handler to avoid double reporting. This handler will load Raven the first time it is called,\n\t * and handle errors until Raven is loaded; once that happens, Raven handles errors on its own\n\t * and this handler needs to be removed.\n\t *\n\t * @param {string} topic mw.track() queue name\n\t * @param {Object} data\n\t */\n\tfunction handleGlobalError( topic, data ) {\n\t\tmw.sentry.initRaven().done( function ( raven, traceKitOnError ) {\n\t\t\ttraceKitOnError.call(\n\t\t\t\twindow,\n\t\t\t\tdata.errorMessage,\n\t\t\t\tdata.url,\n\t\t\t\tdata.lineNumber,\n\t\t\t\tdata.columnNumber,\n\t\t\t\tdata.errorObject\n\t\t\t);\n\t\t} );\n\t}\n\n\t// make these available for unit tests\n\tmw.sentry = { initRaven: initRaven, report: report };\n\n\tmw.trackSubscribe( 'resourceloader.exception', report );\n\n\tmw.trackSubscribe( 'global.error', handleGlobalError );\n\n\tmw.trackSubscribe( 'eventlogging.error', function ( topic, error ) {\n\t\tmw.sentry.initRaven().done( function ( raven /* , traceKitOnError */ ) {\n\t\t\traven.captureMessage( error, { source: 'EventLogging' } );\n\t\t} );\n\t} );\n}() );\n","usedDeprecatedRules":[]},{"filePath":"/src/repo/tests/qunit/init.test.js","messages":[{"ruleId":"qunit/no-loose-assertions","severity":2,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":15,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":15,"endColumn":59},{"ruleId":"qunit/no-loose-assertions","severity":2,"message":"Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual.","line":16,"column":4,"nodeType":"CallExpression","messageId":"unexpectedLocalLooseAssertion","endLine":16,"endColumn":59}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\tQUnit.module( 'sentry', QUnit.newMwEnvironment() );\n\n\tQUnit.test( 'initRaven()', function ( assert ) {\n\t\twindow.Raven = window.Raven || undefined; // sinon.js won't stub nonexistent properties\n\t\tthis.sandbox.stub( window, 'Raven', {\n\t\t\tconfig: this.sandbox.stub().returnsThis(),\n\t\t\tinstall: this.sandbox.stub().returnsThis()\n\t\t} );\n\n\t\tthis.sandbox.stub( mw.loader, 'using' ).returns( $.Deferred().resolve() );\n\n\t\treturn mw.sentry.initRaven().then( function ( raven /* , traceKitOnError */ ) {\n\t\t\tassert.strictEqual( raven, Raven, 'initRaven() returns Raven as a promise' );\n\t\t\tassert.ok( Raven.config.called, 'Raven is configured' );\n\t\t\tassert.ok( Raven.install.called, 'Raven is installed' );\n\n\t\t\tRaven.config.reset();\n\t\t\tRaven.install.reset();\n\n\t\t\treturn mw.sentry.initRaven();\n\t\t} ).then( function ( raven /* , traceKitOnError */ ) {\n\t\t\tassert.strictEqual( raven, Raven, 'initRaven() returns Raven on second invocation' );\n\t\t\tassert.strictEqual( Raven.config.called, false, 'Raven is not configured twice' );\n\t\t\tassert.strictEqual( Raven.install.called, false, 'Raven is not installed twice' );\n\t\t} );\n\t} );\n\n\tQUnit.test( 'report()', function ( assert ) {\n\t\tvar raven = { captureException: this.sandbox.stub() };\n\n\t\tthis.sandbox.stub( mw.sentry, 'initRaven' ).returns( $.Deferred().resolve( raven ) );\n\n\t\tmw.sentry.report( 'some-topic', { exception: 42, source: 'Deep Thought' } );\n\t\tassert.strictEqual( raven.captureException.lastCall.args[ 0 ], 42, 'Exception matches' );\n\t\tassert.strictEqual( raven.captureException.lastCall.args[ 1 ].tags.source, 'Deep Thought', 'Source matches' );\n\n\t\tmw.sentry.report( 'some-topic', { exception: 42, source: 'Deep Thought', module: 'foo' } );\n\t\tassert.strictEqual( raven.captureException.lastCall.args[ 1 ].tags.module, 'foo', 'Module matches' );\n\n\t\tmw.sentry.report( 'some-topic', { exception: 42, source: 'Deep Thought', context: { foo: 'bar' } } );\n\t\tassert.strictEqual( raven.captureException.lastCall.args[ 1 ].tags.foo, 'bar', 'Custom context matches' );\n\t} );\n}() );\n","usedDeprecatedRules":[]}]

--- end ---
$ /usr/bin/npm ci --legacy-peer-deps
--- stdout ---

added 280 packages, and audited 281 packages in 3s

43 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ /usr/bin/npm test
--- stdout ---

> test
> grunt test

Running "eslint:all" (eslint) task

/src/repo/Gruntfile.js
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/composer.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/extension.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/ar.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/ast.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/be-tarask.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/cs.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/de.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/en.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/es.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/fa.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/fr.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/gl.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/he.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/ia.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/it.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/ja.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/ko.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/ksh.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/lb.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/lij.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/mk.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/nb.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/nl.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/oc.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/pl.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/pt-br.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/pt.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/qqq.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/roa-tara.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/ru.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/sl.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/sv.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/tr.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/uk.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/zh-hans.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/i18n/zh-hant.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/package-lock.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/package.json
  1:1  error  Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions

/src/repo/resources/init.js
   1:1   error    Definition for rule 'qunit/no-loose-assertions' was not found  qunit/no-loose-assertions
  63:7   warning  Prefer Array#forEach to $.each                                 no-jquery/no-each-util
  73:1   warning  This line has a length of 109. Maximum allowed is 100          max-len
  73:38  warning  Prefer Array#map to $.map                                      no-jquery/no-map-util

/src/repo/tests/qunit/init.test.js
  15:4  warning  Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual  qunit/no-loose-assertions
  16:4  warning  Unexpected assert.ok. Use assert.strictEqual, assert.notStrictEqual, assert.deepEqual, or assert.propEqual  qunit/no-loose-assertions

✖ 45 problems (40 errors, 5 warnings)

Warning: Task "eslint:all" failed. Use --force to continue.

Aborted due to warnings.

--- end ---
Traceback (most recent call last):
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1400, in main
    libup.run(args.repo, args.output, args.branch)
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1338, in run
    self.npm_upgrade(plan)
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1049, in npm_upgrade
    self.npm_test()
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 287, in npm_test
    self.check_call(['npm', 'test'])
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/shell2.py", line 54, in check_call
    res.check_returncode()
  File "/usr/lib/python3.9/subprocess.py", line 460, in check_returncode
    raise CalledProcessError(self.returncode, self.args, self.stdout,
subprocess.CalledProcessError: Command '['/usr/bin/npm', 'test']' returned non-zero exit status 3.
Source code is licensed under the AGPL.