Esanders has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/327199 )
Change subject: eslint: Enable valid-jsdoc
......................................................................
eslint: Enable valid-jsdoc
Change-Id: I038583d93ff75551f2936d0caf8ed52b33ea6b56
---
M .eslintrc.json
M resources/controller/uw.controller.Deed.js
M resources/controller/uw.controller.Details.js
M resources/controller/uw.controller.Upload.js
M resources/details/uw.DeedChooserDetailsWidget.js
M resources/details/uw.DescriptionsDetailsWidget.js
M resources/details/uw.TitleDetailsWidget.js
M resources/handlers/mw.ApiUploadFormDataHandler.js
M resources/jquery/jquery.morphCrossfade.js
M resources/mw.DestinationChecker.js
M resources/mw.Firefogg.js
M resources/mw.FlickrChecker.js
M resources/mw.GroupProgressBar.js
M resources/mw.UploadWizard.js
M resources/mw.UploadWizardDeed.js
M resources/mw.UploadWizardDeedChooser.js
M resources/mw.UploadWizardDeedOwnWork.js
M resources/mw.UploadWizardDeedThirdParty.js
M resources/mw.UploadWizardDetails.js
M resources/mw.UploadWizardLicenseInput.js
M resources/mw.UploadWizardUpload.js
M resources/transports/mw.FirefoggTransport.js
M resources/ui/steps/uw.ui.Thanks.js
M resources/ui/steps/uw.ui.Tutorial.js
M resources/ui/steps/uw.ui.Upload.js
M resources/ui/uw.ui.Wizard.js
M resources/uw.ConcurrentQueue.js
M resources/uw.EventFlowLogger.js
28 files changed, 113 insertions(+), 22 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UploadWizard
refs/changes/99/327199/1
diff --git a/.eslintrc.json b/.eslintrc.json
index b0df7c7..71656d0 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -11,7 +11,6 @@
"sinon": false
},
"rules": {
- "dot-notation": [ "error", { "allowKeywords": true } ],
- "valid-jsdoc": 0
+ "dot-notation": [ "error", { "allowKeywords": true } ]
}
}
diff --git a/resources/controller/uw.controller.Deed.js
b/resources/controller/uw.controller.Deed.js
index dd73ccc..f5149df 100644
--- a/resources/controller/uw.controller.Deed.js
+++ b/resources/controller/uw.controller.Deed.js
@@ -77,6 +77,8 @@
/**
* Move to this step.
+ *
+ * @param {mw.UploadWizardUpload[]} uploads
*/
uw.controller.Deed.prototype.load = function ( uploads ) {
var customDeed, previousDeed, fromStepName,
@@ -155,6 +157,8 @@
* individual files on the details step.
*
* @private
+ * @param {Object} config
+ * @return {boolean}
*/
uw.controller.Deed.prototype.shouldShowIndividualDeed = function (
config ) {
var ownWork;
diff --git a/resources/controller/uw.controller.Details.js
b/resources/controller/uw.controller.Details.js
index b4f53c0..883efcb 100644
--- a/resources/controller/uw.controller.Details.js
+++ b/resources/controller/uw.controller.Details.js
@@ -316,6 +316,7 @@
/**
* Perform this step's changes on one upload.
*
+ * @param {mw.UploadWizardUpload} upload
* @return {jQuery.Promise}
*/
uw.controller.Details.prototype.transitionOne = function ( upload ) {
diff --git a/resources/controller/uw.controller.Upload.js
b/resources/controller/uw.controller.Upload.js
index b57eec8..ba181e1 100644
--- a/resources/controller/uw.controller.Upload.js
+++ b/resources/controller/uw.controller.Upload.js
@@ -135,6 +135,8 @@
/**
* Check if there is a vacancy for a new progress bar.
+ *
+ * @return {boolean}
*/
uw.controller.Upload.prototype.progressBarEmptyOrFinished = function ()
{
return !this.progressBar || this.progressBar.finished === true;
@@ -142,6 +144,8 @@
/**
* Update success count on the progress bar.
+ *
+ * @param {number} okCount
*/
uw.controller.Upload.prototype.updateProgressBarCount = function (
okCount ) {
if ( this.progressBar ) {
@@ -159,6 +163,7 @@
/**
* Perform this step's changes on one upload.
*
+ * @param {mw.UploadWizardUpload} upload
* @return {jQuery.Promise}
*/
uw.controller.Upload.prototype.transitionOne = function ( upload ) {
diff --git a/resources/details/uw.DeedChooserDetailsWidget.js
b/resources/details/uw.DeedChooserDetailsWidget.js
index 6370bb7..966d720 100644
--- a/resources/details/uw.DeedChooserDetailsWidget.js
+++ b/resources/details/uw.DeedChooserDetailsWidget.js
@@ -14,7 +14,9 @@
OO.inheritClass( uw.DeedChooserDetailsWidget, uw.DetailsWidget );
/**
- * toggles whether we use the 'macro' deed or our own
+ * Toggles whether we use the 'macro' deed or our own
+ *
+ * @param {mw.UploadWizardUpload} upload
*/
uw.DeedChooserDetailsWidget.prototype.useCustomDeedChooser = function (
upload ) {
var config, deed, deedDiv;
diff --git a/resources/details/uw.DescriptionsDetailsWidget.js
b/resources/details/uw.DescriptionsDetailsWidget.js
index 08a65c9..59bd25a 100644
--- a/resources/details/uw.DescriptionsDetailsWidget.js
+++ b/resources/details/uw.DescriptionsDetailsWidget.js
@@ -3,8 +3,11 @@
/**
* A descriptions field in UploadWizard's "Details" step form.
*
+ * @class uw.DescriptionsDetailsWidgets
* @extends uw.DetailsWidget
* @mixins OO.ui.mixin.GroupElement
+ * @constructor
+ * @param {Object} [config]
*/
uw.DescriptionsDetailsWidget = function UWDescriptionsDetailsWidget(
config ) {
config = $.extend( { required: true }, config );
diff --git a/resources/details/uw.TitleDetailsWidget.js
b/resources/details/uw.TitleDetailsWidget.js
index 59d7f20..99a8dc6 100644
--- a/resources/details/uw.TitleDetailsWidget.js
+++ b/resources/details/uw.TitleDetailsWidget.js
@@ -5,7 +5,10 @@
/**
* A title field in UploadWizard's "Details" step form.
*
+ * @class uw.TitleDetailsWidget
* @extends uw.DetailsWidget
+ * @constructor
+ * @param {Object} [config]
*/
uw.TitleDetailsWidget = function UWTitleDetailsWidget( config ) {
config = config || {};
diff --git a/resources/handlers/mw.ApiUploadFormDataHandler.js
b/resources/handlers/mw.ApiUploadFormDataHandler.js
index 57a30df..3d88797 100644
--- a/resources/handlers/mw.ApiUploadFormDataHandler.js
+++ b/resources/handlers/mw.ApiUploadFormDataHandler.js
@@ -4,6 +4,7 @@
* Large files are uploaded in chunks.
*
* @param {mw.UploadWizardUpload} upload
+ * @param {mw.Api} api
*/
mw.ApiUploadFormDataHandler = function ( upload, api ) {
var handler = this;
diff --git a/resources/jquery/jquery.morphCrossfade.js
b/resources/jquery/jquery.morphCrossfade.js
index 5a778f5..0ec37e3 100644
--- a/resources/jquery/jquery.morphCrossfade.js
+++ b/resources/jquery/jquery.morphCrossfade.js
@@ -42,6 +42,8 @@
( function ( $ ) {
/**
* Initialize crossfading of the children of an element
+ *
+ * @return {jQuery}
*/
$.fn.morphCrossfader = function () {
// the elements that are immediate children are the
crossfadables
@@ -69,8 +71,10 @@
/**
* Initialize crossfading of the children of an element
- * @param selector of new thing to show; should be an immediate child
of the crossfader element
- * @param speed (optional) how fast to crossfade, in milliseconds
+ *
+ * @param {string} newPanelSelector Selector of new thing to show;
should be an immediate child of the crossfader element
+ * @param {number} [speed] How fast to crossfade, in milliseconds
+ * @return {jQuery}
*/
$.fn.morphCrossfade = function ( newPanelSelector, speed ) {
if ( typeof speed === 'undefined' ) {
diff --git a/resources/mw.DestinationChecker.js
b/resources/mw.DestinationChecker.js
index c13a9e0..053643b 100644
--- a/resources/mw.DestinationChecker.js
+++ b/resources/mw.DestinationChecker.js
@@ -49,6 +49,7 @@
* Processes result of a TitleBlacklist api call
*
* @param {Object|boolean} blacklistResult `false` if
not blacklisted, object if blacklisted
+ * @return {Object}
*/
function blacklistResultProcessor( blacklistResult ) {
var result;
diff --git a/resources/mw.Firefogg.js b/resources/mw.Firefogg.js
index 78c9488..a92fee2 100644
--- a/resources/mw.Firefogg.js
+++ b/resources/mw.Firefogg.js
@@ -10,9 +10,11 @@
/**
* Get the URL for installing firefogg on the client OS
+ *
+ * @return {string}
*/
getFirefoggInstallUrl: function () {
- var osLink = false;
+ var osLink = '';
if ( $.client.profile().name !== 'firefox' ) {
return 'http://firefogg.org/';
}
diff --git a/resources/mw.FlickrChecker.js b/resources/mw.FlickrChecker.js
index 04cc8a5..9b37c13 100644
--- a/resources/mw.FlickrChecker.js
+++ b/resources/mw.FlickrChecker.js
@@ -225,16 +225,17 @@
* Constructs an unordered list of sets in the collection.
*
* @param {boolean} appendId True if you want to append
- * id="mwe-upwiz-files-collection-chooser"; false otherwise
+ * id="mwe-upwiz-files-collection-chooser"; false otherwise
* @param {Object} data The retrieved data
* @see {@link getCollection}
+ * @return {jQuery}
*/
buildCollectionLinks: function ( appendId, data ) {
- var elem = $( '<ul>' ),
+ var $elem = $( '<ul>' ),
that = this,
li, ul;
if ( appendId ) {
- elem.attr( 'id',
'mwe-upwiz-files-collection-chooser' );
+ $elem.attr( 'id',
'mwe-upwiz-files-collection-chooser' );
}
$.each( data.collection, function ( index, value ) {
li = $( '<li>' );
@@ -258,9 +259,9 @@
} );
li.append( ul );
}
- elem.append( li );
+ $elem.append( li );
} );
- return elem;
+ return $elem;
},
/**
@@ -656,6 +657,8 @@
},
/**
+ * @param {Object} upload
+ * @param {string} description
* @return {jQuery.Promise}
*/
setUploadDescription: function ( upload, description ) {
@@ -670,6 +673,7 @@
},
/**
+ * @param {Object} upload
* @return {jQuery.Promise}
*/
setImageDescription: function ( upload ) {
@@ -689,6 +693,7 @@
* as the upload URL.
*
* @param {number} index Index of the image for which we need
to set the URL
+ * @return {jQuery.Promise}
*/
setImageURL: function ( index ) {
var largestSize,
diff --git a/resources/mw.GroupProgressBar.js b/resources/mw.GroupProgressBar.js
index 1718129..82ffe19 100644
--- a/resources/mw.GroupProgressBar.js
+++ b/resources/mw.GroupProgressBar.js
@@ -1,7 +1,16 @@
/* global moment */
( function ( mw, $, moment ) {
/**
- * this is a progress bar for monitoring multiple objects, giving
summary view
+ * This is a progress bar for monitoring multiple objects, giving
summary view
+ *
+ * @class mw.GroupProgressbar
+ * @constructor
+ * @param {string} selector
+ * @param {Array} uploads
+ * @param {string[]} successStates
+ * @param {string[]} errorStates
+ * @param {string} progressProperty
+ * @param {string} weightProperty
*/
mw.GroupProgressBar = function ( selector, uploads, successStates,
errorStates, progressProperty, weightProperty ) {
this.$selector = $( selector );
diff --git a/resources/mw.UploadWizard.js b/resources/mw.UploadWizard.js
index a76abfb..d1ad443 100644
--- a/resources/mw.UploadWizard.js
+++ b/resources/mw.UploadWizard.js
@@ -56,6 +56,8 @@
/**
* Create the basic interface to make an upload in this div
+ *
+ * @param {string} selector
*/
createInterface: function ( selector ) {
this.ui = new uw.ui.Wizard( selector );
@@ -96,6 +98,8 @@
/**
* Helper function to check whether the upload process is
totally
* complete and we can safely leave the window.
+ *
+ * @return {boolean}
*/
isComplete: function () {
var complete = true;
diff --git a/resources/mw.UploadWizardDeed.js b/resources/mw.UploadWizardDeed.js
index 8d6b08d..5c3ffa1 100644
--- a/resources/mw.UploadWizardDeed.js
+++ b/resources/mw.UploadWizardDeed.js
@@ -2,12 +2,12 @@
/**
* Sort of an abstract class for deeds
+ *
+ * @class mw.UploadWizardDeed
+ * @abstract
*/
mw.UploadWizardDeed = function () {
mw.UploadWizardDeed.prototype.instanceCount++;
-
- // prevent from instantiating directly?
- return false;
};
mw.UploadWizardDeed.prototype = {
diff --git a/resources/mw.UploadWizardDeedChooser.js
b/resources/mw.UploadWizardDeedChooser.js
index d024a39..fd6fe18 100644
--- a/resources/mw.UploadWizardDeedChooser.js
+++ b/resources/mw.UploadWizardDeedChooser.js
@@ -100,6 +100,8 @@
/**
* From the deed choices, make a choice fade to the background
a bit, hide the extended form
+ *
+ * @param {jQuery} $deedSelector
*/
deselectDeedInterface: function ( $deedSelector ) {
$deedSelector.removeClass( 'selected' );
@@ -117,6 +119,8 @@
/**
* From the deed choice page, show a particular deed
+ *
+ * @param {jQuery} $deedSelector
*/
selectDeedInterface: function ( $deedSelector ) {
var $otherDeeds = $deedSelector.siblings().filter(
'.mwe-upwiz-deed' );
diff --git a/resources/mw.UploadWizardDeedOwnWork.js
b/resources/mw.UploadWizardDeedOwnWork.js
index aee90c1..95819d3 100644
--- a/resources/mw.UploadWizardDeedOwnWork.js
+++ b/resources/mw.UploadWizardDeedOwnWork.js
@@ -19,10 +19,10 @@
* @param {number} uploadCount Integer count of uploads that this deed
refers to (useful for message pluralization)
* @param {mw.Api} api API object - useful for doing previews
* @param {Object} config The UW config
+ * @return {mw.UploadWizardDeed}
*/
mw.UploadWizardDeedOwnWork = function ( uploadCount, api, config ) {
- var
- deed = new mw.UploadWizardDeed(),
+ var deed = new mw.UploadWizardDeed(),
ownWork = config.licensing.ownWork;
uploadCount = uploadCount || 1;
diff --git a/resources/mw.UploadWizardDeedThirdParty.js
b/resources/mw.UploadWizardDeedThirdParty.js
index e57ba63..0c3f892 100644
--- a/resources/mw.UploadWizardDeedThirdParty.js
+++ b/resources/mw.UploadWizardDeedThirdParty.js
@@ -31,10 +31,10 @@
* @param {number} uploadCount Integer count of uploads that this deed
refers to (useful for message pluralization)
* @param {mw.Api} api API object - useful for doing previews
* @param {Object} config The UW config
+ * @return {mw.UploadWizrdDeed}
*/
mw.UploadWizardDeedThirdParty = function ( uploadCount, api, config ) {
- var
- deed = new mw.UploadWizardDeed();
+ var deed = new mw.UploadWizardDeed();
deed.uploadCount = uploadCount || 1;
diff --git a/resources/mw.UploadWizardDetails.js
b/resources/mw.UploadWizardDetails.js
index d879893..9c63451 100644
--- a/resources/mw.UploadWizardDetails.js
+++ b/resources/mw.UploadWizardDetails.js
@@ -248,6 +248,7 @@
return this.titleDetails.getTitle();
},
+ // eslint-disable-next-line valid-jsdoc
/**
* Display error message about multiple uploaded files with the
same title specified
*
@@ -261,6 +262,8 @@
/**
* @private
+ *
+ * @return {Array}
*/
getAllFields: function () {
return [].concat(
@@ -306,6 +309,8 @@
/**
* Get a thumbnail caption for this upload (basically, the
first description).
+ *
+ * @return {string}
*/
getThumbnailCaption: function () {
var descriptions =
this.descriptionsDetails.getSerialized().descriptions;
diff --git a/resources/mw.UploadWizardLicenseInput.js
b/resources/mw.UploadWizardLicenseInput.js
index 1777c8f..b832e76 100644
--- a/resources/mw.UploadWizardLicenseInput.js
+++ b/resources/mw.UploadWizardLicenseInput.js
@@ -471,6 +471,9 @@
/**
* Get the value of a particular input
+ *
+ * @param {jQuery} $input
+ * @return {string}
*/
getInputWikiText: function ( $input ) {
return $input.val() + '\n' + this.getInputTextAreaVal(
$input );
@@ -479,6 +482,7 @@
/**
* Get the value of the associated textarea, if any
*
+ * @param {jQuery} $input
* @return {string}
*/
getInputTextAreaVal: function ( $input ) {
@@ -539,6 +543,8 @@
/**
* See uw.DetailsWidget
+ *
+ * @return {jQuery.Promise}
*/
getErrors: function () {
var input = this,
@@ -599,6 +605,8 @@
/**
* See uw.DetailsWidget
+ *
+ * @return {jQuery.Promise}
*/
getWarnings: function () {
return $.Deferred().resolve( [] ).promise();
diff --git a/resources/mw.UploadWizardUpload.js
b/resources/mw.UploadWizardUpload.js
index d08feed..412fb6d 100644
--- a/resources/mw.UploadWizardUpload.js
+++ b/resources/mw.UploadWizardUpload.js
@@ -115,20 +115,26 @@
/**
* Stop the upload -- we have failed for some reason
+ *
+ * @param {string} code Error code from API
+ * @param {string|Object} info Extra info
+ * @param {jQuery} [$additionalStatus]
*/
- mw.UploadWizardUpload.prototype.setError = function ( code, info,
additionalStatus ) {
+ mw.UploadWizardUpload.prototype.setError = function ( code, info,
$additionalStatus ) {
if ( this.state === 'aborted' ) {
// There's no point in reporting an error anymore.
return;
}
this.state = 'error';
this.transportProgress = 0;
- this.ui.showError( code, info, additionalStatus );
+ this.ui.showError( code, info, $additionalStatus );
uw.eventFlowLogger.logError( 'file', { code: code, message:
info } );
};
/**
* Resume the upload, assume that whatever error(s) we got were benign.
+ *
+ * @param {string} code
*/
mw.UploadWizardUpload.prototype.removeErrors = function ( code ) {
this.ignoreWarning[ code ] = true;
@@ -991,6 +997,8 @@
/**
* Make a preview for the file.
+ *
+ * @return {jQuery.Promise}
*/
mw.UploadWizardUpload.prototype.makePreview = function () {
var first, video, url, dataUrlReader,
@@ -1068,6 +1076,9 @@
/**
* Loads an image preview.
+ *
+ * @param {string} url
+ * @param {jQuery.Deferred} deferred
*/
mw.UploadWizardUpload.prototype.loadImage = function ( url, deferred ) {
var image = document.createElement( 'img' );
@@ -1088,6 +1099,8 @@
/**
* Check if the file is previewable.
+ *
+ * @return {boolean}
*/
mw.UploadWizardUpload.prototype.isPreviewable = function () {
return this.file && mw.fileApi.isPreviewableFile( this.file );
@@ -1095,6 +1108,8 @@
/**
* Finds the right URL object to use.
+ *
+ * @return {string}
*/
mw.UploadWizardUpload.prototype.URL = function () {
return window.URL || window.webkitURL || window.mozURL;
@@ -1102,6 +1117,8 @@
/**
* Checks if this upload is a video.
+ *
+ * @return {boolean}
*/
mw.UploadWizardUpload.prototype.isVideo = function () {
return mw.fileApi.isPreviewableVideo( this.file );
diff --git a/resources/transports/mw.FirefoggTransport.js
b/resources/transports/mw.FirefoggTransport.js
index a7a9078..240c1ab 100644
--- a/resources/transports/mw.FirefoggTransport.js
+++ b/resources/transports/mw.FirefoggTransport.js
@@ -67,6 +67,8 @@
/**
* Check if the asset is in a format that can be upload without
encoding.
+ *
+ * @return {boolean}
*/
mw.FirefoggTransport.prototype.isUploadFormat = function () {
// Check if the server supports webm uploads:
@@ -130,6 +132,8 @@
/**
* Get the source file info for the current file selected into this.fogg
+ *
+ * @return {Object}
*/
mw.FirefoggTransport.prototype.getSourceFileInfo = function () {
if ( !this.fogg.sourceInfo ) {
@@ -169,6 +173,8 @@
/**
* Get the encode settings from configuration and the current selected
video type
+ *
+ * @return {Object}
*/
mw.FirefoggTransport.prototype.getEncodeSettings = function () {
var encodeSettings;
diff --git a/resources/ui/steps/uw.ui.Thanks.js
b/resources/ui/steps/uw.ui.Thanks.js
index 40de56c..1bea9b4 100644
--- a/resources/ui/steps/uw.ui.Thanks.js
+++ b/resources/ui/steps/uw.ui.Thanks.js
@@ -22,6 +22,7 @@
* @class uw.ui.Thanks
* @extends uw.ui.Step
* @constructor
+ * @param {Object} config
*/
uw.ui.Thanks = function UWUIThanks( config ) {
var $header,
diff --git a/resources/ui/steps/uw.ui.Tutorial.js
b/resources/ui/steps/uw.ui.Tutorial.js
index f04d4aa..e9df37b 100644
--- a/resources/ui/steps/uw.ui.Tutorial.js
+++ b/resources/ui/steps/uw.ui.Tutorial.js
@@ -18,6 +18,8 @@
( function ( mw, $, uw, OO ) {
/**
* Checkbox with popup information.
+ *
+ * @param {Object} config
*/
function PopupCheckboxInputWidget( config ) {
// Parent constructor
diff --git a/resources/ui/steps/uw.ui.Upload.js
b/resources/ui/steps/uw.ui.Upload.js
index 3545a2c..f3037de 100644
--- a/resources/ui/steps/uw.ui.Upload.js
+++ b/resources/ui/steps/uw.ui.Upload.js
@@ -264,6 +264,8 @@
/**
* Changes the initial centered invitation button to something like
"add another file"
+ *
+ * @param {boolean} more
*/
uw.ui.Upload.prototype.setAddButtonText = function ( more ) {
var msg = 'mwe-upwiz-add-file-',
diff --git a/resources/ui/uw.ui.Wizard.js b/resources/ui/uw.ui.Wizard.js
index e805e74..7f6e7c4 100644
--- a/resources/ui/uw.ui.Wizard.js
+++ b/resources/ui/uw.ui.Wizard.js
@@ -42,6 +42,8 @@
/**
* Initializes the static stuff above the wizard.
+ *
+ * @param {Object} config
*/
uw.ui.Wizard.prototype.initHeader = function ( config ) {
var feedbackLink;
diff --git a/resources/uw.ConcurrentQueue.js b/resources/uw.ConcurrentQueue.js
index a8e94a8..b3dc261 100644
--- a/resources/uw.ConcurrentQueue.js
+++ b/resources/uw.ConcurrentQueue.js
@@ -111,6 +111,7 @@
/**
* @private
+ * @param {Object} item
*/
uw.ConcurrentQueue.prototype.promiseComplete = function ( item ) {
var index;
diff --git a/resources/uw.EventFlowLogger.js b/resources/uw.EventFlowLogger.js
index 8802602..d79751c 100644
--- a/resources/uw.EventFlowLogger.js
+++ b/resources/uw.EventFlowLogger.js
@@ -17,9 +17,9 @@
( function ( mw, uw ) {
/**
- * @class uw.EventFlowLogger
* Event logging helper for funnel analysis. Should be instantiated at
the very beginning; uses internal state
* to link events together.
+ * @class uw.EventFlowLogger
* @constructor
*/
uw.EventFlowLogger = function UWEventFlowLogger() {
--
To view, visit https://gerrit.wikimedia.org/r/327199
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I038583d93ff75551f2936d0caf8ed52b33ea6b56
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/UploadWizard
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits