jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/391283 )

Change subject: Chore: replace clean script with Webpack plugin
......................................................................


Chore: replace clean script with Webpack plugin

Remove the clean package script and add the clean plugin to the Webpack
config. The build process will be entirely owned by Webpack for server
and client builds so cleaning can now be part of the config.*  The
tradeoff is that Webpack will be able to more fully own the build
process and run as a single command instead of clean then build but at
the expense of an added NPM dependency.

*Note: this patch will temporarily allow a dirty server build directory
but it will be fixed when the server uses Webpack for building.

Bug: T177235
Change-Id: I4b91c492e52bac35834a8160791bdfc0ac2f1822
---
M package-lock.json
M package.json
M webpack.config.ts
3 files changed, 204 insertions(+), 119 deletions(-)

Approvals:
  Jhernandez: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/package-lock.json b/package-lock.json
index dddeb49..b4d2d8e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,6 +23,15 @@
         "@types/node": "8.0.47"
       }
     },
+    "@types/clean-webpack-plugin": {
+      "version": "0.1.0",
+      "resolved": 
"https://registry.npmjs.org/@types/clean-webpack-plugin/-/clean-webpack-plugin-0.1.0.tgz";,
+      "integrity": 
"sha512-IRBc1bH7owKMcuxb0B7pFYEAp7uqWzBjmjO0m8Feh7qiXY7ezzLL3cFOC8KWPxPOP81qyB4yoVJA1EvZ9kiLVg==",
+      "dev": true,
+      "requires": {
+        "@types/webpack": "3.0.9"
+      }
+    },
     "@types/compression": {
       "version": "0.0.34",
       "resolved": 
"https://registry.npmjs.org/@types/compression/-/compression-0.0.34.tgz";,
@@ -543,14 +552,14 @@
       }
     },
     "boxen": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz";,
-      "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz";,
+      "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=",
       "dev": true,
       "requires": {
         "ansi-align": "2.0.0",
         "camelcase": "4.1.0",
-        "chalk": "2.1.0",
+        "chalk": "2.3.0",
         "cli-boxes": "1.0.0",
         "string-width": "2.1.1",
         "term-size": "1.2.0",
@@ -573,14 +582,14 @@
           "dev": true
         },
         "chalk": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz";,
-          "integrity": 
"sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz";,
+          "integrity": 
"sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
           "dev": true,
           "requires": {
             "ansi-styles": "3.2.0",
             "escape-string-regexp": "1.0.5",
-            "supports-color": "4.4.0"
+            "supports-color": "4.5.0"
           }
         },
         "has-flag": {
@@ -590,9 +599,9 @@
           "dev": true
         },
         "supports-color": {
-          "version": "4.4.0",
-          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz";,
-          "integrity": 
"sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
+          "version": "4.5.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz";,
+          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
           "dev": true,
           "requires": {
             "has-flag": "2.0.0"
@@ -894,6 +903,15 @@
         "chalk": "1.1.3"
       }
     },
+    "clean-webpack-plugin": {
+      "version": "0.1.17",
+      "resolved": 
"https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-0.1.17.tgz";,
+      "integrity": 
"sha512-Bts/V725v8Ijosp4K1cqppQXgXcrohxoMsg0CV2xL4y/vua1G5pAfHEW/eJIiKF+GNNG72mdjbipxMRFEms7yg==",
+      "dev": true,
+      "requires": {
+        "rimraf": "2.6.2"
+      }
+    },
     "cli": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz";,
@@ -1085,6 +1103,20 @@
         "inherits": "2.0.3",
         "readable-stream": "2.3.3",
         "typedarray": "0.0.6"
+      }
+    },
+    "configstore": {
+      "version": "3.1.1",
+      "resolved": 
"https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz";,
+      "integrity": 
"sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
+      "dev": true,
+      "requires": {
+        "dot-prop": "4.2.0",
+        "graceful-fs": "4.1.11",
+        "make-dir": "1.1.0",
+        "unique-string": "1.0.0",
+        "write-file-atomic": "2.3.0",
+        "xdg-basedir": "3.0.0"
       }
     },
     "connect-history-api-fallback": {
@@ -2480,6 +2512,15 @@
         "is-glob": "2.0.1"
       }
     },
+    "global-dirs": {
+      "version": "0.1.0",
+      "resolved": 
"https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz";,
+      "integrity": "sha1-ENNAOeDfBCcuJizyQiT3IJQ0308=",
+      "dev": true,
+      "requires": {
+        "ini": "1.3.4"
+      }
+    },
     "globals": {
       "version": "9.18.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz";,
@@ -2498,6 +2539,25 @@
         "object-assign": "4.1.1",
         "pify": "2.3.0",
         "pinkie-promise": "2.0.1"
+      }
+    },
+    "got": {
+      "version": "6.7.1",
+      "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz";,
+      "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+      "dev": true,
+      "requires": {
+        "create-error-class": "3.0.2",
+        "duplexer3": "0.1.4",
+        "get-stream": "3.0.0",
+        "is-redirect": "1.0.0",
+        "is-retry-allowed": "1.1.0",
+        "is-stream": "1.1.0",
+        "lowercase-keys": "1.0.0",
+        "safe-buffer": "5.1.1",
+        "timed-out": "4.0.1",
+        "unzip-response": "2.0.1",
+        "url-parse-lax": "1.0.0"
       }
     },
     "graceful-fs": {
@@ -3121,6 +3181,16 @@
         "is-extglob": "1.0.0"
       }
     },
+    "is-installed-globally": {
+      "version": "0.1.0",
+      "resolved": 
"https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz";,
+      "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+      "dev": true,
+      "requires": {
+        "global-dirs": "0.1.0",
+        "is-path-inside": "1.0.0"
+      }
+    },
     "is-npm": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz";,
@@ -3398,6 +3468,15 @@
       "dev": true,
       "requires": {
         "is-buffer": "1.1.5"
+      }
+    },
+    "latest-version": {
+      "version": "3.1.0",
+      "resolved": 
"https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz";,
+      "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+      "dev": true,
+      "requires": {
+        "package-json": "4.0.1"
       }
     },
     "lazy-cache": {
@@ -3741,12 +3820,20 @@
       "dev": true
     },
     "make-dir": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz";,
-      "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz";,
+      "integrity": 
"sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==",
       "dev": true,
       "requires": {
-        "pify": "2.3.0"
+        "pify": "3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz";,
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
       }
     },
     "make-error": {
@@ -4222,102 +4309,7 @@
         "ps-tree": "1.1.0",
         "touch": "3.1.0",
         "undefsafe": "0.0.3",
-        "update-notifier": "2.2.0"
-      },
-      "dependencies": {
-        "configstore": {
-          "version": "3.1.1",
-          "resolved": 
"https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz";,
-          "integrity": 
"sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==",
-          "dev": true,
-          "requires": {
-            "dot-prop": "4.2.0",
-            "graceful-fs": "4.1.11",
-            "make-dir": "1.0.0",
-            "unique-string": "1.0.0",
-            "write-file-atomic": "2.3.0",
-            "xdg-basedir": "3.0.0"
-          }
-        },
-        "got": {
-          "version": "6.7.1",
-          "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz";,
-          "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
-          "dev": true,
-          "requires": {
-            "create-error-class": "3.0.2",
-            "duplexer3": "0.1.4",
-            "get-stream": "3.0.0",
-            "is-redirect": "1.0.0",
-            "is-retry-allowed": "1.1.0",
-            "is-stream": "1.1.0",
-            "lowercase-keys": "1.0.0",
-            "safe-buffer": "5.1.1",
-            "timed-out": "4.0.1",
-            "unzip-response": "2.0.1",
-            "url-parse-lax": "1.0.0"
-          }
-        },
-        "latest-version": {
-          "version": "3.1.0",
-          "resolved": 
"https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz";,
-          "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
-          "dev": true,
-          "requires": {
-            "package-json": "4.0.1"
-          }
-        },
-        "package-json": {
-          "version": "4.0.1",
-          "resolved": 
"https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz";,
-          "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
-          "dev": true,
-          "requires": {
-            "got": "6.7.1",
-            "registry-auth-token": "3.3.1",
-            "registry-url": "3.1.0",
-            "semver": "5.4.1"
-          }
-        },
-        "timed-out": {
-          "version": "4.0.1",
-          "resolved": 
"https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz";,
-          "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
-          "dev": true
-        },
-        "update-notifier": {
-          "version": "2.2.0",
-          "resolved": 
"https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz";,
-          "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=",
-          "dev": true,
-          "requires": {
-            "boxen": "1.2.1",
-            "chalk": "1.1.3",
-            "configstore": "3.1.1",
-            "import-lazy": "2.1.0",
-            "is-npm": "1.0.0",
-            "latest-version": "3.1.0",
-            "semver-diff": "2.1.0",
-            "xdg-basedir": "3.0.0"
-          }
-        },
-        "write-file-atomic": {
-          "version": "2.3.0",
-          "resolved": 
"https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz";,
-          "integrity": 
"sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "4.1.11",
-            "imurmurhash": "0.1.4",
-            "signal-exit": "3.0.2"
-          }
-        },
-        "xdg-basedir": {
-          "version": "3.0.0",
-          "resolved": 
"https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz";,
-          "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
-          "dev": true
-        }
+        "update-notifier": "2.3.0"
       }
     },
     "noms": {
@@ -4628,6 +4620,18 @@
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz";,
       "integrity": 
"sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
       "dev": true
+    },
+    "package-json": {
+      "version": "4.0.1",
+      "resolved": 
"https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz";,
+      "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+      "dev": true,
+      "requires": {
+        "got": "6.7.1",
+        "registry-auth-token": "3.3.1",
+        "registry-url": "3.1.0",
+        "semver": "5.4.1"
+      }
     },
     "pako": {
       "version": "0.2.9",
@@ -5606,9 +5610,9 @@
       }
     },
     "rc": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz";,
-      "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz";,
+      "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=",
       "dev": true,
       "requires": {
         "deep-extend": "0.4.2",
@@ -5753,7 +5757,7 @@
       "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=",
       "dev": true,
       "requires": {
-        "rc": "1.2.1",
+        "rc": "1.2.2",
         "safe-buffer": "5.1.1"
       }
     },
@@ -5763,7 +5767,7 @@
       "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
       "dev": true,
       "requires": {
-        "rc": "1.2.1"
+        "rc": "1.2.2"
       }
     },
     "regjsgen": {
@@ -6630,6 +6634,12 @@
       "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=",
       "dev": true
     },
+    "timed-out": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz";,
+      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+      "dev": true
+    },
     "timers-browserify": {
       "version": "2.0.4",
       "resolved": 
"https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz";,
@@ -6941,6 +6951,60 @@
       "resolved": 
"https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz";,
       "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
       "dev": true
+    },
+    "update-notifier": {
+      "version": "2.3.0",
+      "resolved": 
"https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz";,
+      "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=",
+      "dev": true,
+      "requires": {
+        "boxen": "1.2.2",
+        "chalk": "2.3.0",
+        "configstore": "3.1.1",
+        "import-lazy": "2.1.0",
+        "is-installed-globally": "0.1.0",
+        "is-npm": "1.0.0",
+        "latest-version": "3.1.0",
+        "semver-diff": "2.1.0",
+        "xdg-basedir": "3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.0",
+          "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz";,
+          "integrity": 
"sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+          "dev": true,
+          "requires": {
+            "color-convert": "1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz";,
+          "integrity": 
"sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "3.2.0",
+            "escape-string-regexp": "1.0.5",
+            "supports-color": "4.5.0"
+          }
+        },
+        "has-flag": {
+          "version": "2.0.0",
+          "resolved": 
"https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz";,
+          "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "4.5.0",
+          "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz";,
+          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+          "dev": true,
+          "requires": {
+            "has-flag": "2.0.0"
+          }
+        }
+      }
     },
     "url": {
       "version": "0.11.0",
@@ -7565,6 +7629,23 @@
         "mkdirp": "0.5.1"
       }
     },
+    "write-file-atomic": {
+      "version": "2.3.0",
+      "resolved": 
"https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz";,
+      "integrity": 
"sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "imurmurhash": "0.1.4",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "xdg-basedir": {
+      "version": "3.0.0",
+      "resolved": 
"https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz";,
+      "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+      "dev": true
+    },
     "xtend": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz";,
diff --git a/package.json b/package.json
index e439793..154659f 100644
--- a/package.json
+++ b/package.json
@@ -4,16 +4,15 @@
   "description": "An API driven skin for MediaWiki",
   "scripts": {
     "--- PRIMARY ---": "# Frequent user scripts.",
-    "start": "npm-run-all --silent clean --parallel start:\\*",
+    "start": "run-p -s start:\\*",
     "watch": "run-p -s start:\\* test:watch",
-    "build": "NODE_ENV=production npm-run-all --silent clean --parallel 
build:\\*",
+    "build": "NODE_ENV=production run-p -s build:\\*",
     "format": "npm run -s lint -- --fix",
     "lint": "eslint --cache --max-warnings 0 
--report-unused-disable-directives --ext ts,tsx,js,json .",
     "test": "run-p -s lint build mocha",
     "test:watch": "nodemon -i dist -e js,json,ts,tsx ${VERBOSE:--q} -x 'npm 
test -s'",
     "--- SECONDARY ---": "# Useful but rarely used scripts.",
     "mocha": "TS_NODE_PROJECT=src/server mocha '{src,test}/**/*.test.{ts,js}'",
-    "clean": "rm -rf dist/",
     "--- HOOKS ---": "# Triggered scripts.",
     "precommit": "npm test -s",
     "--- INTERNAL ---": "# Private scripts.",
@@ -54,6 +53,7 @@
   },
   "devDependencies": {
     "@types/assets-webpack-plugin": "3.5.0",
+    "@types/clean-webpack-plugin": "0.1.0",
     "@types/compression": "0.0.34",
     "@types/express": "4.0.39",
     "@types/extract-text-webpack-plugin": "3.0.0",
@@ -63,6 +63,7 @@
     "@types/node-fetch": "1.6.7",
     "@types/touch": "3.1.0",
     "assets-webpack-plugin": "3.5.1",
+    "clean-webpack-plugin": "0.1.17",
     "copyfiles": "1.2.0",
     "css-loader": "0.28.7",
     "eslint": "4.10.0",
diff --git a/webpack.config.ts b/webpack.config.ts
index 11c6235..c8dc39e 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -2,6 +2,7 @@
 import * as AssetsPlugin from "assets-webpack-plugin";
 import * as ExtractTextPlugin from "extract-text-webpack-plugin";
 import * as webpack from "webpack";
+import * as CleanPlugin from "clean-webpack-plugin";
 import {
   PRODUCTION,
   VERBOSE,
@@ -194,6 +195,8 @@
 // See also
 // 
https://medium.com/webpack/predictable-long-term-caching-with-webpack-d3eee1d3fa31.
 config.plugins = [
+  new CleanPlugin(["dist"], { verbose: VERBOSE }),
+
   new webpack.IgnorePlugin(/domino/),
 
   // Embed values of process.env.NODE_ENV and other variables in the code.

-- 
To view, visit https://gerrit.wikimedia.org/r/391283
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I4b91c492e52bac35834a8160791bdfc0ac2f1822
Gerrit-PatchSet: 1
Gerrit-Project: marvin
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: Jhernandez <[email protected]>
Gerrit-Reviewer: Sniedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to