Page MenuHomePhabricator

libup run should remove reportUnusedDisableDirectives before final "npm test"
Closed, ResolvedPublic

Description

libup sometimes fails to build the exclude list for eslint, because the severity changed for a rule between eslint fix and grunt test.

only warnings, because reportUnusedDisableDirectives is in config for eslint

$ ./node_modules/.bin/eslint resources/js/Comment.js Gruntfile.js --fix

/src/repo/resources/js/Comment.js
   49:4  warning  Unused eslint-disable directive (no problems were reported from 'no-alert')
   71:4  warning  Unused eslint-disable directive (no problems were reported from 'no-alert')
  156:1  warning  This line has a length of 124. Maximum allowed is 100                        max-len
  158:7  warning  Unused eslint-disable directive (no problems were reported from 'no-alert')
  218:1  warning  This line has a length of 122. Maximum allowed is 100                        max-len

✖ 5 problems (0 errors, 5 warnings)

over grunt there are errors, because reportUnusedDisableDirectives is in GruntFile.js

$ npm test

> @ test /src/repo
> grunt test

Running "eslint:all" (eslint) task

/src/repo/resources/js/Comment.js
   49:4  error    Unused eslint-disable directive (no problems were reported from 'no-alert')
   71:4  error    Unused eslint-disable directive (no problems were reported from 'no-alert')
  156:1  warning  This line has a length of 124. Maximum allowed is 100                        max-len
  158:7  error    Unused eslint-disable directive (no problems were reported from 'no-alert')
  218:1  warning  This line has a length of 122. Maximum allowed is 100                        max-len

✖ 5 problems (3 errors, 2 warnings)

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

I am not 100% sure if that the case, but at least the warnings gots errors and libup fatals and does not commit a patch set

https://libraryupgrader2.wmflabs.org/r/mediawiki/extensions/Comments
full log:

$ git clone https://gerrit-replica.wikimedia.org/r/mediawiki/extensions/Comments.git repo --depth=1
Cloning into 'repo'...

$ git config user.name libraryupgrader

$ git config user.email tools.libraryupgrader@tools.wmflabs.org

$ git submodule update --init

$ git show-ref HEAD
f4c37f36a9f3997f03a54b386228698e5310a3d0 refs/remotes/origin/HEAD

Running tests to verify repository integrity
$ npm ci
added 207 packages in 2.402s

$ npm test

> @ test /src/repo
> grunt test

Running "eslint:all" (eslint) task

Running "jsonlint:all" (jsonlint) task
>> 121 files lint free.

Running "banana:Comments" (banana) task
>> 1 message directory checked.

Done.

$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 13 installs, 0 updates, 0 removals
  - Installing jakub-onderka/php-parallel-lint (v1.0.0): Loading from cache
  - Installing jakub-onderka/php-console-color (v0.2): Loading from cache
  - Installing jakub-onderka/php-console-highlighter (v0.3.2): Loading from cache
  - Installing psr/container (1.0.0): Loading from cache
  - Installing symfony/service-contracts (v2.0.1): Loading from cache
  - Installing symfony/polyfill-php73 (v1.13.1): Loading from cache
  - Installing symfony/polyfill-mbstring (v1.13.1): Loading from cache
  - Installing symfony/console (v4.4.2): Loading from cache
  - Installing mediawiki/minus-x (0.3.2): Loading from cache
  - Installing squizlabs/php_codesniffer (3.5.0): Loading from cache
  - Installing composer/spdx-licenses (1.5.1): Loading from cache
  - Installing composer/semver (1.5.0): Loading from cache
  - Installing mediawiki/mediawiki-codesniffer (v28.0.0): Loading from cache
symfony/service-contracts suggests installing symfony/service-implementation ()
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/lock ()
symfony/console suggests installing symfony/process ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files

$ composer test
> parallel-lint . --exclude vendor --exclude node_modules
PHP 7.3.11 | 10 parallel jobs
.................                                            17/17 (100 %)


Checked 17 files in 0.1 seconds
No syntax error found
> minus-x check .
MinusX
======
Processing /src/repo...
.............................................................
.............................................................
.............................................
All good!
> phpcs -sp
................. 17 / 17 (100%)


Time: 430ms; Memory: 14MB


Upgrading n:eslint-config-wikimedia from 0.5.0 -> 0.15.0
Upgrading n:grunt-eslint from 20.1.0 -> 22.0.0
$ npm install
added 37 packages from 34 contributors, removed 33 packages, updated 44 packages and audited 567 packages in 4.166s
found 0 vulnerabilities


$ ./node_modules/.bin/eslint resources/js/Comment.js Gruntfile.js --fix

/src/repo/resources/js/Comment.js
   49:4  warning  Unused eslint-disable directive (no problems were reported from 'no-alert')
   71:4  warning  Unused eslint-disable directive (no problems were reported from 'no-alert')
  156:1  warning  This line has a length of 124. Maximum allowed is 100                        max-len
  158:7  warning  Unused eslint-disable directive (no problems were reported from 'no-alert')
  218:1  warning  This line has a length of 122. Maximum allowed is 100                        max-len

✖ 5 problems (0 errors, 5 warnings)


$ ./node_modules/.bin/eslint resources/js/Comment.js Gruntfile.js -f json
[{"filePath":"/src/repo/resources/js/Comment.js","messages":[{"ruleId":null,"message":"Unused eslint-disable directive (no problems were reported from 'no-alert').","line":49,"column":4,"severity":1,"nodeType":null},{"ruleId":null,"message":"Unused eslint-disable directive (no problems were reported from 'no-alert').","line":71,"column":4,"severity":1,"nodeType":null},{"ruleId":"max-len","severity":1,"message":"This line has a length of 124. Maximum allowed is 100.","line":156,"column":1,"nodeType":"Program","messageId":"max"},{"ruleId":null,"message":"Unused eslint-disable directive (no problems were reported from 'no-alert').","line":158,"column":7,"severity":1,"nodeType":null},{"ruleId":"max-len","severity":1,"message":"This line has a length of 122. Maximum allowed is 100.","line":218,"column":1,"nodeType":"Program","messageId":"max"}],"errorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * JavaScript for the Comments extension.\n *\n * @file\n */\n( function ( $, mw ) {\n\tvar Comment = {\n\t\tsubmitted: 0,\n\t\tisBusy: false,\n\t\ttimer: '', // has to have an initial value...\n\t\tupdateDelay: 7000,\n\t\tLatestCommentID: '',\n\t\tCurLatestCommentID: '',\n\t\tpause: 0,\n\n\t\t/**\n\t\t * When a comment's author is ignored, \"Show Comment\" link will be\n\t\t * presented to the user.\n\t\t * If the user clicks on it, this function is called to show the hidden\n\t\t * comment.\n\t\t *\n\t\t * @param {string} id\n\t\t */\n\t\tshow: function ( id ) {\n\t\t\t$( '#ignore-' + id ).hide( 300 );\n\t\t\t$( '#comment-' + id ).show( 300 );\n\t\t},\n\n\t\t/**\n\t\t * This function is called whenever a user clicks on the \"block\" image to\n\t\t * block another user's comments.\n\t\t *\n\t\t * @param {string} username Name of the user whose comments we want to block\n\t\t * @param {number} userID User ID number of the user whose comments we\n\t\t *                         want to block (or 0 for anonymous users)\n\t\t * @param {number} commentID Comment ID number\n\t\t */\n\t\tblockUser: function ( username, userID, commentID ) {\n\t\t\tvar message;\n\n\t\t\t// Display a different message depending on whether we're blocking an\n\t\t\t// anonymous user or a registered one.\n\t\t\tif ( !userID || userID === 0 ) {\n\t\t\t\tmessage = mw.msg( 'comments-block-warning-anon' );\n\t\t\t} else {\n\t\t\t\tmessage = mw.msg( 'comments-block-warning-user', username );\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line no-alert\n\t\t\tif ( window.confirm( message ) ) {\n\t\t\t\t( new mw.Api() ).postWithToken( 'csrf', {\n\t\t\t\t\taction: 'commentblock',\n\t\t\t\t\tcommentID: commentID\n\t\t\t\t} ).done( function ( response ) {\n\t\t\t\t\tif ( response.commentblock.ok ) {\n\t\t\t\t\t\t$( 'a.comments-block-user[data-comments-user-id=' + userID + ']' )\n\t\t\t\t\t\t\t.parents( '.c-item' ).hide( 300 )\n\t\t\t\t\t\t\t.prev().show( 300 );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * This function is called whenever a user clicks on the \"Delete Comment\"\n\t\t * link to delete a comment.\n\t\t *\n\t\t * @param {number} commentID Comment ID number\n\t\t */\n\t\tdeleteComment: function ( commentID ) {\n\t\t\t// eslint-disable-next-line no-alert\n\t\t\tif ( window.confirm( mw.msg( 'comments-delete-warning' ) ) ) {\n\t\t\t\t( new mw.Api() ).postWithToken( 'csrf', {\n\t\t\t\t\taction: 'commentdelete',\n\t\t\t\t\tcommentID: commentID\n\t\t\t\t} ).done( function ( response ) {\n\t\t\t\t\tif ( response.commentdelete.ok ) {\n\t\t\t\t\t\t$( '#comment-' + commentID ).hide( 2000 );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Vote for a comment.\n\t\t *\n\t\t * @param {number} commentID Comment ID number\n\t\t * @param {number} voteValue Vote value\n\t\t */\n\t\tvote: function ( commentID, voteValue ) {\n\t\t\t( new mw.Api() ).postWithToken( 'csrf', {\n\t\t\t\taction: 'commentvote',\n\t\t\t\tcommentID: commentID,\n\t\t\t\tvoteValue: voteValue\n\t\t\t} ).done( function ( response ) {\n\t\t\t\t$( '#comment-' + commentID + ' .c-score' )\n\t\t\t\t\t.html( response.commentvote.html ) // this will still be escaped\n\t\t\t\t\t.html( $( '#comment-' + commentID + ' .c-score' ).text() ); // unescape\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * @param {number} pageID Page ID\n\t\t * @param {string} order Sorting order\n\t\t * @param {boolean} end Scroll to bottom after?\n\t\t * @param {number} cpage Comment page number (used for pagination)\n\t\t */\n\t\tviewComments: function ( pageID, order, end, cpage ) {\n\t\t\tdocument.commentForm.cpage.value = cpage;\n\t\t\tdocument.getElementById( 'allcomments' ).innerHTML = mw.msg( 'comments-loading' ) + '<br /><br />';\n\n\t\t\t$.ajax( {\n\t\t\t\turl: mw.config.get( 'wgScriptPath' ) + '/api.php',\n\t\t\t\tdata: { action: 'commentlist', format: 'json', pageID: pageID, order: order, pagerPage: cpage },\n\t\t\t\tcache: false\n\t\t\t} ).done( function ( response ) {\n\t\t\t\tdocument.getElementById( 'allcomments' ).innerHTML = response.commentlist.html;\n\t\t\t\tComment.submitted = 0;\n\t\t\t\tif ( end ) {\n\t\t\t\t\twindow.location.hash = 'end';\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Submit a new comment.\n\t\t */\n\t\tsubmit: function () {\n\t\t\tvar pageID, parentID, commentText;\n\n\t\t\tif ( Comment.submitted === 0 ) {\n\t\t\t\tComment.submitted = 1;\n\n\t\t\t\tpageID = document.commentForm.pageId.value;\n\t\t\t\tif ( !document.commentForm.commentParentId.value ) {\n\t\t\t\t\tparentID = 0;\n\t\t\t\t} else {\n\t\t\t\t\tparentID = document.commentForm.commentParentId.value;\n\t\t\t\t}\n\t\t\t\tcommentText = document.commentForm.commentText.value;\n\n\t\t\t\t( new mw.Api() ).postWithToken( 'csrf', {\n\t\t\t\t\taction: 'commentsubmit',\n\t\t\t\t\tpageID: pageID,\n\t\t\t\t\tparentID: parentID,\n\t\t\t\t\tcommentText: commentText\n\t\t\t\t} ).done( function ( response ) {\n\t\t\t\t\tvar end;\n\n\t\t\t\t\tif ( response.commentsubmit && response.commentsubmit.ok ) {\n\t\t\t\t\t\tdocument.commentForm.commentText.value = '';\n\t\t\t\t\t\tend = 1;\n\t\t\t\t\t\tif ( mw.config.get( 'wgCommentsSortDescending' ) ) {\n\t\t\t\t\t\t\tend = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tComment.viewComments( document.commentForm.pageId.value, 0, end, document.commentForm.cpage.value );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t\t\twindow.alert( response.error.info );\n\t\t\t\t\t\tComment.submitted = 0;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tComment.cancelReply();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Toggle comment auto-refreshing on or off\n\t\t *\n\t\t * @param {boolean} status\n\t\t */\n\t\ttoggleLiveComments: function ( status ) {\n\t\t\tvar msg;\n\n\t\t\tif ( status ) {\n\t\t\t\tComment.pause = 0;\n\t\t\t} else {\n\t\t\t\tComment.pause = 1;\n\t\t\t}\n\t\t\tif ( status ) {\n\t\t\t\tmsg = mw.msg( 'comments-auto-refresher-pause' );\n\t\t\t} else {\n\t\t\t\tmsg = mw.msg( 'comments-auto-refresher-enable' );\n\t\t\t}\n\n\t\t\t$( 'body' ).on( 'click', 'div#spy a', function () {\n\t\t\t\tComment.toggleLiveComments( ( status ) ? 0 : 1 );\n\t\t\t} );\n\t\t\t$( 'div#spy a' ).css( 'font-size', '10px' ).text( msg );\n\n\t\t\tif ( !Comment.pause ) {\n\t\t\t\tComment.LatestCommentID = document.commentForm.lastCommentId.value;\n\t\t\t\tComment.timer = setTimeout(\n\t\t\t\t\tfunction () { Comment.checkUpdate(); },\n\t\t\t\t\tComment.updateDelay\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tcheckUpdate: function () {\n\t\t\tvar pageID;\n\n\t\t\tif ( Comment.isBusy ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpageID = document.commentForm.pageId.value;\n\n\t\t\t$.ajax( {\n\t\t\t\turl: mw.config.get( 'wgScriptPath' ) + '/api.php',\n\t\t\t\tdata: { action: 'commentlatestid', format: 'json', pageID: pageID },\n\t\t\t\tcache: false\n\t\t\t} ).done( function ( response ) {\n\t\t\t\tif ( response.commentlatestid.id ) {\n\t\t\t\t\t// Get last new ID\n\t\t\t\t\tComment.CurLatestCommentID = response.commentlatestid.id;\n\t\t\t\t\tif ( Comment.CurLatestCommentID !== Comment.LatestCommentID ) {\n\t\t\t\t\t\tComment.viewComments( document.commentForm.pageId.value, 0, 1, document.commentForm.cpage.value );\n\t\t\t\t\t\tComment.LatestCommentID = Comment.CurLatestCommentID;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tComment.isBusy = false;\n\t\t\t\tif ( !Comment.pause ) {\n\t\t\t\t\tclearTimeout( Comment.timer );\n\t\t\t\t\tComment.timer = setTimeout(\n\t\t\t\t\t\tfunction () { Comment.checkUpdate(); },\n\t\t\t\t\t\tComment.updateDelay\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tComment.isBusy = true;\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * Show the \"reply to user X\" form\n\t\t *\n\t\t * @param {number} parentId Parent comment (the one we're replying to) ID\n\t\t * @param {string} poster Name of the person whom we're replying to\n\t\t * @param {string} posterGender Gender of the person whom we're replying to\n\t\t */\n\t\treply: function ( parentId, poster, posterGender ) {\n\t\t\t$( '#replyto' ).text(\n\t\t\t\tmw.msg( 'comments-reply-to', poster, posterGender ) + ' ('\n\t\t\t);\n\t\t\t$( '<a>', {\n\t\t\t\tclass: 'comments-cancel-reply-link',\n\t\t\t\tstyle: 'cursor:pointer',\n\t\t\t\ttext: mw.msg( 'comments-cancel-reply' )\n\t\t\t} ).appendTo( '#replyto' );\n\t\t\t$( '#replyto' ).append( ') <br />' );\n\n\t\t\tdocument.commentForm.commentParentId.value = parentId;\n\t\t},\n\n\t\tcancelReply: function () {\n\t\t\tdocument.getElementById( 'replyto' ).innerHTML = '';\n\t\t\tdocument.commentForm.commentParentId.value = '';\n\t\t}\n\t};\n\n\t$( function () {\n\t\t// Important note: these are all using $( 'body' ) as the selector\n\t\t// instead of the class/ID/whatever so that they work after viewComments()\n\t\t// has been called (i.e. so that \"Delete comment\", reply, etc. links\n\t\t// continue working after you've submitted a comment yourself)\n\n\t\t// \"Sort by X\" feature\n\t\t$( 'body' )\n\t\t\t.on( 'change', 'select[name=\"TheOrder\"]', function () {\n\t\t\t\tComment.viewComments(\n\t\t\t\t\tmw.config.get( 'wgArticleId' ), // or we could use $( 'input[name=\"pid\"]' ).val(), too\n\t\t\t\t\t$( this ).val(),\n\t\t\t\t\t0,\n\t\t\t\t\tdocument.commentForm.cpage.value\n\t\t\t\t);\n\t\t\t} )\n\n\t\t\t// Comment auto-refresher\n\t\t\t.on( 'click', 'div#spy a', function () {\n\t\t\t\tComment.toggleLiveComments( 1 );\n\t\t\t} )\n\n\t\t\t// Voting links\n\t\t\t.on( 'click', 'a#comment-vote-link', function () {\n\t\t\t\tvar that = $( this );\n\t\t\t\tComment.vote(\n\t\t\t\t\tthat.data( 'comment-id' ),\n\t\t\t\t\tthat.data( 'vote-type' )\n\t\t\t\t);\n\t\t\t} )\n\n\t\t\t// \"Block this user\" links\n\t\t\t.on( 'click', 'a.comments-block-user', function () {\n\t\t\t\tvar that = $( this );\n\t\t\t\tComment.blockUser(\n\t\t\t\t\tthat.data( 'comments-safe-username' ),\n\t\t\t\t\tthat.data( 'comments-user-id' ),\n\t\t\t\t\tthat.data( 'comments-comment-id' )\n\t\t\t\t);\n\t\t\t} )\n\n\t\t\t// \"Delete Comment\" links\n\t\t\t.on( 'click', 'a.comment-delete-link', function () {\n\t\t\t\tComment.deleteComment( $( this ).data( 'comment-id' ) );\n\t\t\t} )\n\n\t\t\t// \"Show this hidden comment\" -- comments made by people on the user's\n\t\t\t// personal block list\n\t\t\t.on( 'click', 'div.c-ignored-links a', function () {\n\t\t\t\tComment.show( $( this ).data( 'comment-id' ) );\n\t\t\t} )\n\n\t\t\t// Reply links\n\t\t\t.on( 'click', 'a.comments-reply-to', function () {\n\t\t\t\tComment.reply(\n\t\t\t\t\t$( this ).data( 'comment-id' ),\n\t\t\t\t\t$( this ).data( 'comments-safe-username' ),\n\t\t\t\t\t$( this ).data( 'comments-user-gender' )\n\t\t\t\t);\n\t\t\t} )\n\n\t\t\t// \"Reply to <username>\" links\n\t\t\t.on( 'click', 'a.comments-cancel-reply-link', function () {\n\t\t\t\tComment.cancelReply();\n\t\t\t} )\n\n\t\t\t// Handle clicks on the submit button (previously this was an onclick attr)\n\t\t\t.on( 'click', 'div.c-form-button input[type=\"button\"]', function () {\n\t\t\t\tComment.submit();\n\t\t\t} )\n\n\t\t\t// Change page\n\t\t\t.on( 'click', 'li.c-pager-item a.c-pager-link', function () {\n\t\t\t\tvar ordCrtl, ord = 0,\n\t\t\t\t\tcommentsBody = $( this ).parents( 'div.comments-body:first' );\n\n\t\t\t\tif ( commentsBody.length > 0 ) {\n\t\t\t\t\tordCrtl = commentsBody.first().find( 'select[name=\"TheOrder\"]:first' );\n\t\t\t\t\tif ( ordCrtl.length > 0 ) {\n\t\t\t\t\t\tord = ordCrtl.val();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tComment.viewComments(\n\t\t\t\t\tmw.config.get( 'wgArticleId' ), // or we could use $( 'input[name=\"pid\"]' ).val(), too\n\t\t\t\t\tord,\n\t\t\t\t\t0,\n\t\t\t\t\t$( this ).data( 'cpage' )\n\t\t\t\t);\n\t\t\t} );\n\t} );\n\n}( jQuery, mediaWiki ) );\n"},{"filePath":"/src/repo/Gruntfile.js","messages":[],"errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0}]

$ npm ci
npm WARN prepare removing existing node_modules/ before installation
added 211 packages in 3.531s

$ npm test

> @ test /src/repo
> grunt test

Running "eslint:all" (eslint) task

/src/repo/resources/js/Comment.js
   49:4  error    Unused eslint-disable directive (no problems were reported from 'no-alert')
   71:4  error    Unused eslint-disable directive (no problems were reported from 'no-alert')
  156:1  warning  This line has a length of 124. Maximum allowed is 100                        max-len
  158:7  error    Unused eslint-disable directive (no problems were reported from 'no-alert')
  218:1  warning  This line has a length of 122. Maximum allowed is 100                        max-len

✖ 5 problems (3 errors, 2 warnings)

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

Aborted due to warnings.
npm ERR! Test failed.  See above for more details.

Traceback (most recent call last):
  File "/src/libup/ng.py", line 832, in main
    libup.run(args.repo, args.output)
  File "/src/libup/ng.py", line 793, in run
    self.npm_upgrade(self.output)
  File "/src/libup/ng.py", line 600, in npm_upgrade
    self.npm_test()
  File "/src/libup/ng.py", line 214, in npm_test
    self.check_call(['npm', 'test'])
  File "/src/libup/shell.py", line 38, in check_call
    res.check_returncode()
  File "/usr/lib/python3.7/subprocess.py", line 428, in check_returncode
    self.stderr)
subprocess.CalledProcessError: Command '['npm', 'test']' returned non-zero exit status 1.

Details

Related Gerrit Patches:

Event Timeline

Restricted Application added a subscriber: Aklapper. · View Herald TranscriptJan 10 2020, 11:48 PM

Or is the problem that there is no rule name to exclude these checks from error list?
It seems that grunt-eslint changes this to error, than it needs manual upgrading

https://libraryupgrader2.wmflabs.org/r/mediawiki/extensions/Comments
https://libraryupgrader2.wmflabs.org/r/mediawiki/extensions/PageTriage
https://libraryupgrader2.wmflabs.org/r/mediawiki/extensions/RelatedArticles
https://libraryupgrader2.wmflabs.org/r/mediawiki/extensions/TemplateWizard

But this can happen on each new version, when suppressed false positive gets fixed

Change 563765 had a related patch set uploaded (by Legoktm; owner: Legoktm):
[labs/libraryupgrader@master] Automatically remove unnecessary eslint-disable-line comments

https://gerrit.wikimedia.org/r/563765

https://gerrit.wikimedia.org/r/#/c/labs/libraryupgrader/+/563765/ merged
and a small fix https://gerrit.wikimedia.org/r/#/c/labs/libraryupgrader/+/564845/

That is very nice to remove these lines!

It seems libup fails now on PageTriage, the other 3 mention extensions are now updated.
But I am not sure if that is related the patch sets here

Traceback (most recent call last):
  File "/src/libup/ng.py", line 916, in main
    libup.run(args.repo, args.output)
  File "/src/libup/ng.py", line 875, in run
    self.npm_upgrade(self.output)
  File "/src/libup/ng.py", line 597, in npm_upgrade
    if lib.is_newer() and lib.is_latest_safe() and \
  File "/src/libup/library.py", line 84, in is_newer
    return is_greater_than(self.version, self.latest_version())
  File "/src/libup/library.py", line 91, in is_greater_than
    if any(True for x in '^><=|' if x in first):
  File "/src/libup/library.py", line 91, in <genexpr>
    if any(True for x in '^><=|' if x in first):
TypeError: argument of type 'NoneType' is not iterable
Umherirrender closed this task as Resolved.Jan 15 2020, 6:00 PM
Umherirrender assigned this task to Legoktm.

The stacktrace is handled with T242845, so this bug is fixed