+# Map author and committer names and email addresses to canonical real names
+# and email addresses.
+#
+# To update the CREDITS file, run maintenance/updateCredits.php
+#
+# Two types of entries are useful here. The first sets a cannonical author
+# name for a given email address:
+#
+# Cannonical Author Name <author email>
+#
+# The second allows collecting alternate email addresses into a single
+# cannonical author name and email address:
+#
+# Cannonical Author Name <author email> <alternate email>
+#
+# Mappings are only needed for authors who have used multiple author names
+# and/or author emails for revisions over time. Author names begenning with
+# "[BOT]" will be omitted from the CREDITS file.
+#
+# See also: https://git-scm.com/docs/git-shortlog#_mapping_authors
+#
+[BOT] Gerrit Code Review <gerrit@wikimedia.org>
[BOT] Gerrit Patch Uploader <gerritpatchuploader@gmail.com>
+[BOT] jenkins-bot <jenkins-bot@gerrit.wikimedia.org>
+[BOT] jenkins-bot <jenkins-bot@gerrit.wikimedia.org> <jenkins-bot@wikimedia.org>
[BOT] Translation updater bot <l10n-bot@translatewiki.net>
Aaron Schulz <aschulz@wikimedia.org>
Aaron Schulz <aschulz@wikimedia.org> <aaron@users.mediawiki.org>
Adam Roses Wight <awight@wikimedia.org>
+Adam Roses Wight <awight@wikimedia.org> <spam@ludd.net>
addshore <addshorewiki@gmail.com>
+Aditya Sastry <ganeshaditya1@gmail.com>
Adrian Heine <adrian.heine@wikimedia.de>
-Alex Monk <krenair@gmail.com>
-Alex Monk <krenair@gmail.com> <krenair@wikimedia.org>
-Alex Z <mrzmanwiki@gmail.com> <mrzman@users.mediawiki.org>
+Alex Z. <mrzmanwiki@gmail.com> <mrzman@users.mediawiki.org>
Alexander Emsenhuber <ialex.wiki@gmail.com>
Alexander Emsenhuber <ialex.wiki@gmail.com> <ialex@users.mediawiki.org>
Alexander Emsenhuber <ialex.wiki@gmail.com> <mediawiki@emsenhuber.ch>
+Alexander Monk <krenair@gmail.com>
+Alexander Monk <krenair@gmail.com> <alex@wikimedia.org>
+Alexander Monk <krenair@gmail.com> <krenair@wikimedia.org>
Alexia E. Smith <washuu@gmail.com>
Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
Amir E. Aharoni <amir.aharoni@mail.huji.ac.il> <amire80@users.mediawiki.org>
+Amir Sarabadani <ladsgroup@gmail.com> <Ladsgroup@gmail.com>
Anders Wegge Jakobsen <awegge@gmail.com> <wegge@users.mediawiki.org>
Andre Engels <andreengels@gmail.com> <a_engels@users.mediawiki.org>
+Andrew Garrett <agarrett@wikimedia.org>
Andrew Garrett <agarrett@wikimedia.org> <werdna@users.mediawiki.org>
Angela Beesley Starling <wiki@nge.la> <angelab@users.mediawiki.org>
Antoine Musso <hashar@free.fr>
Antoine Musso <hashar@free.fr> <hashar@users.mediawiki.org>
Aran Dunkley <aran@organicdesign.co.nz> <nad@users.mediawiki.org>
Ariel Glenn <ariel@wikimedia.org> <ariel@users.mediawiki.org>
+Ariel Glenn <ariel@wikimedia.org> <ariel@wikimedia.org>
Arlo Breault <abreault@wikimedia.org>
+Arthur Richards <arichards@wikimedia.org>
Arthur Richards <arichards@wikimedia.org> <awjrichards@users.mediawiki.org>
Aryeh Gregor <simetrical+mw@gmail.com> <simetrical@users.mediawiki.org>
+Asher Feldman <afeldman@wikimedia.org>
Asher Feldman <afeldman@wikimedia.org> <asher@users.mediawiki.org>
aude <aude.wiki@gmail.com>
Audrey Tang <audreyt@audreyt.org>
ayush_garg <ayush.ce13@iitp.ac.in>
Bahodir Mansurov <bmansurov@wikimedia.org>
Bartosz Dziewoński <matma.rex@gmail.com>
-Bartosz Dziewoński <matma.rex@gmail.com> <matmarex@wikimedia.org>
Bartosz Dziewoński <matma.rex@gmail.com> <bdziewonski@wikimedia.org>
+Bartosz Dziewoński <matma.rex@gmail.com> <matmarex@wikimedia.org>
Ben Hartshorne <bhartshorne@wikimedia.org> <ben@users.mediawiki.org>
Bene <benestar.wikimedia@gmail.com>
-Benjamin Lees <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
+Bene <benestar.wikimedia@gmail.com> <benestar.wikimedia@googlemail.com>
+Benny Situ <bsitu@wikimedia.org>
Benny Situ <bsitu@wikimedia.org> <bsitu@users.mediawiki.org>
Bertrand Grondin <bertrand.grondin@tiscali.fr> <grondin@users.mediawiki.org>
Brad Jorsch <bjorsch@wikimedia.org>
+Brad Jorsch <bjorsch@wikimedia.org> <anomie.wikipedia@gmail.com>
Brandon Harris <bharris@wikimedia.org> <bharris@users.mediawiki.org>
-Brian Wolff <bawolff+svn@gmail.com> <bawolff@users.mediawiki.org>
Brian Wolff <bawolff+wn@gmail.com>
+Brian Wolff <bawolff+wn@gmail.com> <bawolff+svn@gmail.com>
+Brian Wolff <bawolff+wn@gmail.com> <bawolff@users.mediawiki.org>
Brion Vibber <brion@wikimedia.org>
Brion Vibber <brion@wikimedia.org> <brion@pobox.com>
Brion Vibber <brion@wikimedia.org> <brion@users.mediawiki.org>
Bryan Davis <bd808@wikimedia.org>
+Bryan Davis <bd808@wikimedia.org> <bd808@bd808.com>
+Bryan Tong Minh <bryan.tongminh@gmail.com>
Bryan Tong Minh <bryan.tongminh@gmail.com> <btongminh@users.mediawiki.org>
C. Scott Ananian <cscott@cscott.net>
C. Scott Ananian <cscott@cscott.net> <cananian@wikimedia.org>
-cacycle@gerrit.wikimedia.org <cacyclewp@gmail.com>
+Cacycle <cacyclewp@gmail.com>
cenarium <cenarium.sysop@gmail.com>
Chad Horohoe <chadh@wikimedia.org>
Chad Horohoe <chadh@wikimedia.org> <demon@users.mediawiki.org>
Chiefwei <chiefwei1989@gmail.com>
Chris McMahon <cmcmahon@wikimedia.org>
Chris Steipp <csteipp@wikimedia.org>
-Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
Christian Aistleitner <christian@quelltextlich.at>
+Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
Christian Williams <orbit@framezero.com>
Christian Williams <orbit@framezero.com> <christian@localhost>
Christian Williams <orbit@framezero.com> <christian@wikia-inc.com>
+Christopher Johnson <root@bugzilla.wmde.de>
+church of emacs <churchofemacs@users.mediawiki.org>
+Cindy Cicalese <cicalese@mitre.org>
ckoerner <nobelx@gmail.com>
Conrad Irwin <conrad.irwin+wiki@gmail.com> <conrad@users.mediawiki.org>
Dan Duvall <dduvall@wikimedia.org>
dan-nl <d_entous@yahoo.com>
Daniel A. R. Werner <daniel.a.r.werner@gmail.com>
Daniel Cannon <cannon.danielc@gmail.com> <amidaniel@users.mediawiki.org>
+Daniel Friesen <mediawiki@danielfriesen.name>
+Daniel Friesen <mediawiki@danielfriesen.name> <daniel@nadir-seen-fire.com>
Daniel Friesen <mediawiki@danielfriesen.name> <dantman@users.mediawiki.org>
+Daniel Friesen <mediawiki@danielfriesen.name> <pub-github@nadir-seen-fire.com>
Daniel Kinzler <daniel.kinzler@wikimedia.de>
Daniel Kinzler <daniel.kinzler@wikimedia.de> <daniel@users.mediawiki.org>
-Danny B <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
+Danny B. <Wikipedia.Danny.B@email.cz>
+Danny B. <Wikipedia.Danny.B@email.cz> <danny.b@email.cz>
+Danny B. <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
+Danny B. <Wikipedia.Danny.B@email.cz> <wikimedia.danny.b@email.cz>
+Darian Anthony Patrick <dpatrick@wikimedia.org>
+Darkdragon09 <ubuntu@ip-172-31-39-38.us-west-2.compute.internal>
David Chan <david@sheetmusic.org.uk>
+Dereckson <dereckson@espace-win.org>
+Derk-Jan Hartman <hartman@videolan.org>
+Derk-Jan Hartman <hartman@videolan.org> <hartman.wiki@gmail.com>
Derk-Jan Hartman <hartman@videolan.org> <hartman@users.mediawiki.org>
-Derk-Jan Hartman <hartman.wiki@gmail.com>
Diederik van Liere <dvanliere@gmail.com> <diederik@users.mediawiki.org>
Domas Mituzas <domas.mituzas@gmail.com> <midom@users.mediawiki.org>
Douglas Gardner <douglas@chippy.ch>
DPStokesNZ <duncan.stokes@gmail.com>
Ebrahim Byagowi <ebrahim@gnu.org>
Ed Sanders <esanders@wikimedia.org>
-Elliott Eggleston <ejegg@ejegg.com>
+Elliott Eggleston <eeggleston@wikimedia.org>
+Elliott Eggleston <eeggleston@wikimedia.org> <ejegg@ejegg.com>
Emmanuel Engelhart <kelson@kiwix.org> <kelson42@users.mediawiki.org>
-eranroz <eranroz89@gmail.com>
+Emufarmers <emufarmers@gmail.com>
+Emufarmers <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
+Entlinkt <entlinkt@gmx-topmail.de>
+Eranroz <eranroz89@gmail.com>
Erik Bernhardson <ebernhardson@wikimedia.org>
Erik Moeller <erik@wikimedia.org>
Erik Moeller <erik@wikimedia.org> <erik@users.mediawiki.org>
Erwin Dokter <erwin@darcoury.nl>
Evan McIntire <mcintire.evan@gmail.com>
+Evan Prodromou <evanprodromou@users.mediawiki.org> <evan@users.mediawiki.org>
Federico Leva <federicoleva@tiscali.it>
Fenzik Joseph <fenzik@gmail.com> <fenzik@users.mediawiki.org>
-Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> <florian.schmidt.stargatewissen@gmail.com>
-Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> Florian <florian.schmidt.welzow@t-online.de>
-Fomafix <fomafix@googlemail.com>
+Florian Schmidt <florian.schmidt.welzow@t-online.de>
+Florian Schmidt <florian.schmidt.welzow@t-online.de> <florian.schmidt.stargatewissen@gmail.com>
+fomafix <fomafix@googlemail.com>
+Fran Rogers <fran@dumetella.net>
Fran Rogers <fran@dumetella.net> <krimpet@users.mediawiki.org>
+freakolowsky <freak@drajv.si>
FunPika <funpikawiki@gmail.com>
Gabriel Wicke <gwicke@wikimedia.org>
Gabriel Wicke <gwicke@wikimedia.org> <gwicke@users.mediawiki.org>
Greg Sabino Mullane <greg@turnstep.com>
Greg Sabino Mullane <greg@turnstep.com> <greg@endpoint.com>
Greg Sabino Mullane <greg@turnstep.com> <greg@users.mediawiki.org>
+Grunny <mwgrunny@gmail.com>
Guy Van den Broeck <guyvdb@gmail.com> <guyvdb@users.mediawiki.org>
Happy-melon <happy-melon@live.com> <happy-melon@users.mediawiki.org>
Helder <he7d3r@gmail.com>
Helder <he7d3r@gmail.com> <helder.wiki@gmail.com>
Hoo man <hoo@online.de>
+Huji <huji.huji@gmail.com>
Huji <huji.huji@gmail.com> <huji@users.mediawiki.org>
Ian Baker <ibaker@wikimedia.org> <raindrift@users.mediawiki.org>
Ilmari Karonen <nospam@vyznev.net> <vyznev@users.mediawiki.org>
Inez Korczyński <inez@wikia-inc.com>
Inez Korczyński <inez@wikia-inc.com> <inez@users.mediawiki.org>
isarra <s@zaori.org>
+isarra <s@zaori.org> <zhorishna@gmail.com>
Ivan Lanin <ivanlanin@gmail.com> <ivanlanin@users.mediawiki.org>
-Jack Phoenix <jack@countervandalism.net> <ashley@users.mediawiki.org>
Jack Phoenix <jack@countervandalism.net>
+Jack Phoenix <jack@countervandalism.net> <ashley@users.mediawiki.org>
Jackmcbarn <jackmcbarn@gmail.com>
-Jackmcbarn <jackmcbarn@users.noreply.github.com>
+Jackmcbarn <jackmcbarn@gmail.com> <jackmcbarn@users.noreply.github.com>
jagori <jagori79@gmail.com>
-James D. Forrester <jforrester@wikimedia.org>
+James Forrester <jforrester@wikimedia.org>
Jan Gerber <j@thing.net> <j@users.mediawiki.org>
+Jan Luca Naumann <jan@jans-seite.de>
Jan Luca Naumann <jan@jans-seite.de> <jan@users.mediawiki.org>
Jan Paul Posma <jp.posma@gmail.com> <janpaul123@users.mediawiki.org>
Jan Zerebecki <jan.wikimedia@zerebecki.de>
+Jared Flores <jaredflores2000@gmail.com>
Jaroslav Škarvada <jskarvad@redhat.com>
jarrettmunton <jmuntjmunt@gmail.com>
+Jason Richey <jasonr@wikia.com>
Jason Richey <jasonr@wikia.com> <jasonr@users.mediawiki.org>
+Jason Richey <jasonr@wikia.com> <urichj00@users.mediawiki.org>
Jeff Hall <jeffreyehall@gmail.com>
Jeff Hall <jeffreyehall@gmail.com> <jhall@wikimedia.org>
Jeff Janes <jeff.janes@gmail.com>
Juliusz Gonera <jgonera@gmail.com>
Juliusz Gonera <jgonera@gmail.com> <jgonera@wikimedia.org>
JuneHyeon Bae <devunt@gmail.com>
+Jure Kajzer <freak@drajv.si>
Jure Kajzer <freak@drajv.si> <freakolowsky@users.mediawiki.org>
+Karun Dambiec <karun.84@gmx.de>
+Katie Filbert <aude.wiki@gmail.com>
Katie Filbert <aude.wiki@gmail.com> <aude@users.mediawiki.org>
Kevin Israel <pleasestand@live.com>
-Kunal Mehta <legoktm@gmail.com>
-Kunal Mehta <legoktm@gmail.com> <legoktm.wikipedia@gmail.com>
+Kunal Grover <kunalgrover05@gmail.com>
+Kunal Mehta <legoktm@member.fsf.org>
+Kunal Mehta <legoktm@member.fsf.org> <legoktm.wikipedia@gmail.com>
+Kunal Mehta <legoktm@member.fsf.org> <legoktm@gmail.com>
Kwan Ting Chan <ktc@ktchan.info> <ktchan@users.mediawiki.org>
lekshmi <andnlnbn18@gmail.com>
Leo Koppelkamm <diebuche@gmail.com> <diebuche@users.mediawiki.org>
+Leon Liesener <leon.liesener@wikipedia.de>
Leon Weber <leon@vserver152.masterssystems.com> <leon@users.mediawiki.org>
Leonardo Gregianin <leogregianin@googlemail.com> <leogregianin@users.mediawiki.org>
Leons Petrazickis <leons.petrazickis.haveyouconsiderednotincludingthisphrase@gmail.com> <leonsp@users.mediawiki.org>
-Liangent <liangent@gmail.com>
+liangent <liangent@gmail.com>
Lisa Ridley <lhridley@gmail.com> <lhridley@users.mediawiki.org>
Ljudusika <plo2000@i.ua>
Luis Felipe Schenone <schenonef@gmail.com>
+Lupo <lupo.bugzilla@gmail.com>
m4tx <m4tx@m4tx.pl>
+Madman <madman.enwiki@gmail.com>
Magnus Manske <magnusmanske@googlemail.com> <magnusmanske@users.mediawiki.org>
Manuel Schneider <manuel.schneider@wikimedia.ch> <80686@users.mediawiki.org>
+Marc-André Pelletier <marc@uberbox.org>
+Marcin Cieślak <saper@saper.info>
Marcin Cieślak <saper@saper.info> <saper@users.mediawiki.org>
+Marco Falke <maic23@live.de>
+MarcoAurelio <strigiwm@gmail.com>
Marielle Volz <marielle.volz@gmail.com>
Marius Hoch <hoo@online.de>
-Mark A. Hershberger <mah@everybody.org>
-Mark A. Hershberger <mah@everybody.org> <mah@nichework.com>
-Mark A. Hershberger <mah@everybody.org> <mah@users.mediawiki.org>
Mark Clements <mediawiki@kennel17.co.uk> <happydog@users.mediawiki.org>
+Mark Hershberger <mah@everybody.org>
+Mark Hershberger <mah@everybody.org> <mah@nichework.com>
+Mark Hershberger <mah@everybody.org> <mah@users.mediawiki.org>
+Mark Hershberger <mah@everybody.org> <mhershberger@wikimedia.org>
Mark Holmquist <mtraceur@member.fsf.org>
+Mark Holmquist <mtraceur@member.fsf.org> <mholmquist@wikimedia.org>
Marko Obrovac <mobrovac@wikimedia.org>
+Markus Glaser <glaser@hallowelt.biz>
+Markus Glaser <glaser@hallowelt.biz> <mglaser@users.mediawiki.org>
Matt Johnston <mattj@emazestudios.com> <mattj@users.mediawiki.org>
Matthew Britton <hugglegurch@gmail.com> <gurch@users.mediawiki.org>
Matthew Flaschen <mflaschen@wikimedia.org>
Matthias Mullie <git@mullie.eu>
+Matthias Mullie <git@mullie.eu> <mmullie@wikimedia.org>
Matěj Grabovský <mgrabovsky@yahoo.com> <mgrabovsky@users.mediawiki.org>
Max Semenik <maxsem.wiki@gmail.com>
Max Semenik <maxsem.wiki@gmail.com> <maxsem@users.mediawiki.org>
+Max Semenik <maxsem.wiki@gmail.com> <semenik@gmail.com>
mgooley <g0013y@gmail.com>
Michael Dale <mdale@wikimedia.org> <dale@users.mediawiki.org>
mjbmr <mjbmri@gmail.com>
Moriel Schottlender <mschottlender@wikimedia.org>
Moriel Schottlender <mschottlender@wikimedia.org> <moriel@gmail.com>
Mormegil <mormegil@centrum.cz>
+MrBlueSky <mrbluesky@wikipedia.be>
+MrBlueSky <mrbluesky@wikipedia.be> <mrbluesky@localhost>
Mukunda Modell <mmodell@wikimedia.org>
+Mwalker <mwalker@wikimedia.org>
MZMcBride <g@mzmcbride.com>
nadeesha <nadeesha@calcey.com> <nadeesha@users.mediawiki.org>
Namit <namit.ohri@gmail.com>
Nathaniel Herman <redwwjd@yahoo.com> <pinky@users.mediawiki.org>
Neil Kandalgaonkar <neilk@wikimedia.org> <neilk@users.mediawiki.org>
Nemo bis <federicoleva@tiscali.it>
-Nephele <nephele@skyhighway.com> <nephele@users.mediawiki.org>
+nephele <nephele@skyhighway.com> <nephele@users.mediawiki.org>
Nick Jenkins <nickpj@gmail.com> <nickj@users.mediawiki.org>
Nik Everett <neverett@wikimedia.org>
Niklas Laxström <niklas.laxstrom@gmail.com>
Niklas Laxström <niklas.laxstrom@gmail.com> <nikerabbit@users.mediawiki.org>
Nimish Gautam <nimishg@wikimedia.org> <nimishg@users.mediawiki.org>
Nuria Ruiz <nuria@wikimedia.org>
-Ori.livneh <ori@wikimedia.org>
+Ori Livneh <ori@wikimedia.org>
+Ori Livneh <ori@wikimedia.org> <ori.livneh@gmail.com>
OverlordQ <wikipedia@thedarkcitadel.com> <overlordq@users.mediawiki.org>
+Owen Davis <owen@wikia-inc.com>
+Owen Davis <owen@wikia-inc.com> <owen@users.mediawiki.org>
paladox <thomasmulhall410@yahoo.com>
+Patrick Reilly <preilly@wikimedia.org>
Patrick Reilly <preilly@wikimedia.org> <preilly@users.mediawiki.org>
Patrick Westerhoff <PatrickWesterhoff@gmail.com>
Paul Copperman <paul.copperman@gmail.com> <pcopp@users.mediawiki.org>
Prateek Saxena <psaxena@wikimedia.org>
Prateek Saxena <psaxena@wikimedia.org> <prtksxna@gmail.com>
Priyanka Dhanda <pdhanda@wikimedia.org> <pdhanda@users.mediawiki.org>
-Purodha B Blissenbach <purodha@blissenbach.org>
-Purodha B Blissenbach <purodha@blissenbach.org> <purodha@users.mediawiki.org>
-Purodha B Blissenbach <purodha@blissenbach.org> <publi@web.de>
+Purodha Blissenbach <purodha@blissenbach.org>
+Purodha Blissenbach <purodha@blissenbach.org> <publi@web.de>
+Purodha Blissenbach <purodha@blissenbach.org> <purodha@users.mediawiki.org>
Raimond Spekking <raimond.spekking@gmail.com>
Raimond Spekking <raimond.spekking@gmail.com> <raymond@users.mediawiki.org>
Remember the dot <rememberthedot@gmail.com> <rememberthedot@users.mediawiki.org>
Ricordisamoa <ricordisamoa@openmailbox.org>
rillke <rillke@wikipedia.de>
rillke <rillke@wikipedia.de> <rainerrillke@hotmail.com>
-River Tarnell <river@wikimedia.org> <river@users.mediawiki.org>
River Tarnell <river@wikimedia.org> <kateturner@users.mediawiki.org>
+River Tarnell <river@wikimedia.org> <river@users.mediawiki.org>
Roan Kattouw <roan.kattouw@gmail.com>
Roan Kattouw <roan.kattouw@gmail.com> <catrope@users.mediawiki.org>
Roan Kattouw <roan.kattouw@gmail.com> <roan@wikimedia.org>
Rob Church <robchur@gmail.com> <robchurch@users.mediawiki.org>
+Rob Lanphier <robla@robla.net>
Rob Lanphier <robla@robla.net> <robla@users.mediawiki.org>
+Rob Lanphier <robla@robla.net> <robla@wikimedia.org>
Rob Moen <rmoen@mediawiki.org>
Rob Moen <rmoen@mediawiki.org> <rmoen@users.mediawiki.org>
Rob Moen <rmoen@mediawiki.org> <rmoen@wikimedia.org>
Robert Leverington <robert@rhl.me.uk> <roberthl@users.mediawiki.org>
Robert Rohde <rarohde@gmail.com> <rarohde@users.mediawiki.org>
Robert Stojnić <rainmansr@gmail.com> <rainman@users.mediawiki.org>
+Robin Pepermans <robinp.1273@gmail.com>
Robin Pepermans <robinp.1273@gmail.com> <robin@users.mediawiki.org>
robinhood701 <robinhood70@live.ca>
Rohan <rohan1395@yahoo.com>
Rotem Liss <rotemliss@gmail.com> <rotem@users.mediawiki.org>
Rummana Yasmeen <ryasmeen@wikimedia.org>
Russ Nelson <russnelson@gmail.com> <nelson@users.mediawiki.org>
-Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@users.mediawiki.org>
Ryan Kaldari <rkaldari@wikimedia.org>
Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@gmail.com>
+Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@users.mediawiki.org>
+Ryan Lane <rlane32@gmail.com>
Ryan Lane <rlane32@gmail.com> <laner@users.mediawiki.org>
+Ryan Lane <rlane32@gmail.com> <rlane@wikimedia.org>
+Ryan Schmidt <skizzerz@gmail.com>
+Ryan Schmidt <skizzerz@gmail.com> <skizzerz@skizzerz.net>
Ryan Schmidt <skizzerz@gmail.com> <skizzerz@users.mediawiki.org>
S Page <spage@wikimedia.org>
Sam Reed <reedy@wikimedia.org>
+Sam Reed <reedy@wikimedia.org> <Reedy reedy@wikimedia.org>
+Sam Reed <reedy@wikimedia.org> <reedy@formey.wikimedia.org>
Sam Reed <reedy@wikimedia.org> <reedy@users.mediawiki.org>
Sam Smith <git@samsmith.io>
-Santhosh Thottingal <santhosh.thottingal@gmail.com> <santhosh@users.mediawiki.org>
Santhosh Thottingal <santhosh.thottingal@gmail.com>
-saper <saper@saper.info>
+Santhosh Thottingal <santhosh.thottingal@gmail.com> <santhosh@users.mediawiki.org>
Schnark <listenleser@gmail.com>
Scimonster <tehalmightyscimonster@gmail.com>
Sean Colombo <sean.colombo@gmail.com> <sean_colombo@users.mediawiki.org>
Seb35 <seb35wikipedia@gmail.com>
Sergio Santoro <santoro.srg@gmail.com>
Shahyar <shahyar@gmail.com>
+Shinjiman <shinjiman@gmail.com>
Shinjiman <shinjiman@gmail.com> <shinjiman@users.mediawiki.org>
Siebrand Mazeland <s.mazeland@xs4all.nl>
Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@kitano.nl>
Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@users.mediawiki.org>
Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@wikimedia.org>
+Smriti Singh <smritis.31095@gmail.com>
+Sorawee Porncharoenwase <nullzero.free@gmail.com>
Southparkfan <southparkfan223@hotmail.com>
SQL <sxwiki@gmail.com> <sql@users.mediawiki.org>
Stanislav Malyshev <smalyshev@gmail.com>
Subramanya Sastry <ssastry@wikimedia.org>
Sucheta Ghoshal <sghoshal@wikimedia.org>
Sumit Asthana <asthana.sumit23@gmail.com>
+Swalling <swalling@wikimedia.org>
Thalia Chan <thalia@cantorion.org>
-TheDJ <hartman.wiki@gmail.com>
Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de>
+Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de> <mr.heat@gmx.de>
This, that and the other <at.light@live.com.au>
tholam <t.lam@lamsinfosystem.com>
Thomas Bleher <ThomasBleher@gmx.de> <tbleher@users.mediawiki.org>
Timo Tijhof <krinklemail@gmail.com> <timo@wikimedia.org>
Timo Tijhof <krinklemail@gmail.com> <ttijhof@wikimedia.org>
Tina Johnson <tinajohnson.1234@gmail.com>
+Tisane <nathanlarson3141@gmail.com>
+Tjones <tjones@wikimedia.org>
Tom Maaswinkel <tom.maaswinkel@12wiki.eu> <thedevilonline@users.mediawiki.org>
Tomasz Finc <tfinc@wikimedia.org> <tomasz@users.mediawiki.org>
+Tomasz W. Kozlowski <tomasz@twkozlowski.com>
+Tomasz W. Kozlowski <tomasz@twkozlowski.com> <tomasz@twkozlowski.net>
+Tomasz W. Kozlowski <tomasz@twkozlowski.com> <twkozlowski@gmail.com>
Tony Thomas <01tonythomas@gmail.com>
+Tpt <thomaspt@hotmail.fr>
Trevor Parscal <trevorparscal@gmail.com>
Trevor Parscal <trevorparscal@gmail.com> <tparscal@users.mediawiki.org>
Trevor Parscal <trevorparscal@gmail.com> <tparscal@wikimedia.org>
Tyler Cipriani <tcipriani@wikimedia.org>
Tyler Romeo <tylerromeo@gmail.com>
-umherirrender <umherirrender_de.wp@web.de>
+Umherirrender <umherirrender_de.wp@web.de>
+Victor Vasiliev <vasilvv@mit.edu>
Victor Vasiliev <vasilvv@mit.edu> <vasilievvv@users.mediawiki.org>
+Victor Vasiliev <vasilvv@mit.edu> <vasilvv@gmail.com>
Vikas S Yaligar <vikasyaligar.it@gmail.com>
Vivek Ghaisas <v.a.ghaisas@gmail.com>
wctaiwan <wctaiwan@gmail.com>
withoutaname <drevitchi@gmail.com>
X! <soxred93@gmail.com> <soxred93@users.mediawiki.org>
+Yaron Koren <yaron57@gmail.com>
+Yaron Koren <yaron57@gmail.com> <yaron@users.mediawiki.org>
Yaroslav Melnychuk <yaroslavmelnuchuk@gmail.com>
+Yongmin Hong <revi@member.fsf.org>
+Yongmin Hong <revi@member.fsf.org> <revi@pobox.com>
+Yongmin Hong <revi@member.fsf.org> <reviwiki@gmail.com>
Yuri Astrakhan <yurik@wikimedia.org>
+Yuri Astrakhan <yurik@wikimedia.org> <yuriastrakhan@gmail.com>
Yuri Astrakhan <yurik@wikimedia.org> <yurik@users.mediawiki.org>
Yusuke Matsubara <whym@whym.org>
-YuviPanda <yuvipanda@gmail.com>
+Yuvi Panda <yuvipanda@gmail.com>
Zak Greant <zak+mediawiki@fooassociates.com> <zak@users.mediawiki.org>
+Zhengzhu Feng <zhengzhu@gmail.com>
+Zhengzhu Feng <zhengzhu@gmail.com> <zhengzhu@users.mediawiki.org>
+Zppix <support@zppixballee.com>
Ævar Arnfjörð Bjarmason <avarab@gmail.com> <avar@users.mediawiki.org>
+Étienne Beaulé <beauleetienne0@gmail.com>
Željko Filipin <zeljko.filipin@gmail.com>
Željko Filipin <zeljko.filipin@gmail.com> <zfilipin@wikimedia.org>
-Zhengzhu Feng <zhengzhu@gmail.com>
-Zhengzhu Feng <zhengzhu@gmail.com> <zhengzhu@users.mediawiki.org>
-->
<!-- Please notice that the following can be found parsed under Special:Version/Credits -->
-== Developers ==
-* Aaron Schulz
-* Alex Z.
-* Alexander Monk
-* Alexandre Emsenhuber
-* Andrew Garrett
-* Antoine Musso
-* Arthur Richards
-* Aryeh Gregor
-* Bartosz Dziewoński
-* Bertrand Grondin
-* Brad Jorsch
-* Brian Wolff
-* Brion Vibber
-* Bryan Davis
-* Bryan Tong Minh
-* Chad Horohoe
-* Charles Melbye
-* Chris Steipp
-* church of emacs
-* Daniel Friesen
-* Daniel Kinzler
-* Daniel Renfro
-* Danny B.
-* David McCabe
-* Derk-Jan Hartman
-* Domas Mituzas
-* Ed Sanders
-* Emufarmers
-* Fran Rogers
-* Greg Sabino Mullane
-* Guy Van den Broeck
-* Happy-melon
-* Hojjat
-* Ian Baker
-* Ilmari Karonen
-* Jack D. Pond
-* Jack Phoenix
-* Jackmcbarn
-* James Forrester
-* Jan Paul Posma
-* Jason Richey
-* Jeroen De Dauw
-* John Du Hart
-* Jon Harald Søby
-* Juliano F. Ravasi
-* JuneHyeon Bae
-* Leo Koppelkamm
-* Leon Weber
-* Leslie Hoare
-* Marco Schuster
-* Marius Hoch
-* Matěj Grabovský
-* Matt Johnston
-* Matthew Flaschen
-* Max Semenik
-* Meno25
-* MinuteElectron
-* Mohamed Magdy
-* Nathaniel Herman
-* Neil Kandalgaonkar
-* Nicolas Dumazet
-* Niklas Laxström
-* Ori Livneh
-* Patrick Reilly
-* Philip Tzou
-* Platonides
-* Purodha Blissenbach
-* Raimond Spekking
-* Remember the dot
-* Roan Kattouw
-* Robert Stojnić
-* Robin Pepermans
-* Rotem Liss
-* Ryan Kaldari
-* Ryan Lane
-* Ryan Schmidt
-* Sam Reed
-* Shinjiman
-* Siebrand Mazeland
-* Soxred93
-* SQL
-* Szymon Świerkosz
-* This, that and the other
-* Thomas Bleher
-* Thomas Gries
-* Tim Starling
-* Timo Tijhof
-* Trevor Parscal
-* Tyler Anthony Romeo
-* Victor Vasiliev
-* Yesid Carrillo
-* Yuri Astrakhan
-
-== Patch Contributors ==
+== Contributors ==
+<!-- Updates to this list made with maintenance/updateCredits.php -->
+<!-- BEGIN CONTRIBUTOR LIST -->
+* aalekhN
* Aaron Ball
* Aaron Pramana
+* Aaron Schulz
+* Aarti Dwivedi
+* Aashaka Shah
+* abhinand
+* Abhishek Das
+* Adam Miller
+* Adam Roses Wight
+* addshore
+* Aditya Sastry
+* Adrian Heine
+* Adrian Lang
+* Ævar Arnfjörð Bjarmason
* Agbad
* Ahmad Sherif
+* Ajayrahul P
+* Alangi Derick
+* Albert221
* Alejandro Mery
+* AlephNull
+* Alex Ivanov
+* Alex Shih-Han Lin
+* Alex Z.
+* Alexander Emsenhuber
+* Alexander I. Mashin
+* Alexander Lehmann
+* Alexander Monk
+* Alexander Sigachov
+* Alexandre Emsenhuber
+* Alexia E. Smith
* Amalthea
* Amir E. Aharoni
+* Amir Sarabadani
+* ananay
+* Anders Wegge Jakobsen
+* Andre Engels
+* Andrew Bogott
* Andrew Dunbar
+* Andrew Garrett
+* Andrew Green
+* Andrew H
+* Andrew Harris
+* Andrew Otto
+* Andrius R
+* andymw
+* Angela Beesley Starling
+* ankur
+* Antoine Musso
* Antonio Ospite
+* apexkid
+* April King
+* Aran Dunkley
+* Arash Boostani
+* Arcane21
+* Ariel Glenn
+* Arlo Breault
+* Arne Heizmann
+* Arthur Richards
+* Aryeh Gregor
+* Asher Feldman
* Asier Lostalé
+* ayush_garg
* Azliq7
* Bagariavivek
+* Bahodir Mansurov
+* balloonguy
+* Bartosz Dziewoński
* Beau
+* Ben Davis
+* Ben Hartshorne
+* Bene
* Benny Situ
* Bergi
+* Bertrand Grondin
+* Bill Traynor
+* Billinghurst
+* billm
+* blotmandroid
+* Bogdan Stancescu
+* Boris Nagaev
* Borislav Manolov
+* Brad Jorsch
+* Brandon Black
+* Brandon Harris
* Brent G
+* Brent Garber
+* Brian Wolff
* Brianna Laugher
+* Brion Vibber
+* Bryan Davis
+* Bryan Tong Minh
+* burthsceh
+* C. Scott Ananian
+* Cacycle
+* Calak
+* Camille Constans
+* Carl Fürstenberg
* Carlin
* Carsten Nielsen
+* Cblair91
+* cenarium
+* Chad Horohoe
+* Charles Melbye
+* Chiefwei
+* Chris McMahon
+* Chris Seaton
+* Chris Steipp
* Christian Aistleitner
+* Christian List
* Christian Neubauer
+* Christopher Johnson
+* church of emacs
+* Cindy Cicalese
+* ckoerner
* Conrad Irwin
* cryptocoryne
* Dan Barrett
* Dan Collins
+* Dan Duvall
* Dan Nessett
+* Dan Poltawski
+* dan-nl
+* Daniel A. R. Werner
* Daniel Arnold
+* Daniel Cannon
+* Daniel De Marco
+* Daniel Evans
+* Daniel Friesen
+* Daniel Kinzler
+* Daniel Renfro
* Daniel Werner
+* DanielRenfro
+* Danny B.
+* Darian Anthony Patrick
+* Darkdragon09
+* DaSch
* David Baumgarten
+* David Chan
+* David E. Narváez
+* David Lynch
+* David McCabe
+* David Mudrák
+* dcausse
+* dennisroczek
* Denny Vrandecic
+* Dereckson
+* Derk-Jan Hartman
+* Derric Atzrott
+* Derrick Coetzee
* Dévai Tamás
+* Devi Krishnan
+* Diederik van Liere
+* Domas Mituzas
+* Douglas Gardner
+* DPStokesNZ
+* dr0ptp4kt
* Ebrahim Byagowi
+* Ed Sanders
+* Edward Chernenko
* Edward Z. Yang
+* Elisabeth Bauer
+* Elliott Eggleston
* Elvis Stansvik
+* Emil Podlaszewski
+* Emmanuel Engelhart
+* Emmanuel Gil Peyrot
+* Emmet Hikory
+* Emufarmers
+* enigmaeth
+* Entlinkt
* Eranroz
+* Eric Evans
+* Eric Schneider
+* Erich Lerch
+* Erick Guan
+* Erik Bernhardson
+* Erik Moeller
* Erwin Dokter
* Étienne Beaulé
+* Evan McIntire
+* Evan Prodromou
+* ExplosiveHippo
+* Faidon Liambotis
* Federico Leva
+* Fenzik Joseph
+* firebus
* Florian Schmidt
* fomafix
+* Fran Rogers
+* Fred Emmott
* FunPika
* Gabriel Wicke
+* Gary Guo
+* gbt248
* Geoffrey Mon
+* georggi
+* Gergő Tisza
* Gero Scholz
+* gicode
+* Giftpflanze
+* Gilles Dubuc
* Gilles van den Hoven
+* Giuseppe Lavagetto
+* gladoscc
+* glaisher
+* Greg Maxwell
+* Greg Sabino Mullane
+* Gregory Szorc
* Grunny
+* Guillaume Blanchard
+* Guy Van den Broeck
+* Happy-melon
+* haritha28
* Harry Burt
+* Hazard-SJ
+* Hector A Escobedo
+* Helder
+* Henning Snater
+* Hojjat
+* Huji
+* Hydriz
+* Ian Baker
+* Ilmari Karonen
+* Inez Korczyński
+* IoannisKydonis
* Ireas
+* isarra
+* Ivan Lanin
+* Jack D. Pond
+* Jack Phoenix
+* Jackmcbarn
* Jacob Block
+* Jacob Clark
+* jagori
+* Jakub Vrana
+* James Earl Douglas
+* James Forrester
+* Jan Berkel
+* Jan Drewniak
* Jan Gerber
* Jan Luca Naumann
+* Jan Paul Posma
+* Jan Zerebecki
+* Jared Flores
+* Jaroslav Škarvada
+* jarrettmunton
+* jarry1250
* Jaska Zedlik
+* Jason Richey
+* jeblad
+* Jeff Janes
+* jeff303
+* Jens Frank
+* Jens Ohlig
+* Jérémie Roquet
* Jeremy Baron
+* Jeremy Postlethwaite
+* jeremyb
+* Jeroen De Dauw
+* Jerome Jamnicky
+* Jesús Martínez Novo
+* jhobs
+* Jiabao
* Jidanni
+* Jimmy Collins
* Jimmy Xu
+* joakin
+* Joan Creus
+* Joel Natividad
+* Joerg
+* Johan Dahlin
+* John Du Hart
* John N
+* Jon Harald Søby
+* Jon Robson
* Jonathan Wiltshire
+* Jools Wills
+* jsahleen
+* Julian Ostrow
+* Juliano F. Ravasi
+* Juliusz Gonera
+* JuneHyeon Bae
* Jure Kajzer
+* Justin Du
+* Kai_WMDE
+* kaligula
+* Kartik Mistry
* Karun Dambiec
* Katie Filbert
* Kevin Israel
+* Kghbln
+* Kim Eik
* Kim Hyun-Joon
+* kipod
+* kishanio
+* konarak
+* krishna keshav
+* Krzysztof Krzyzaniak
+* Krzysztof Zbudniewek
+* Kunal Grover
+* Kunal Mehta
+* Kwan Ting Chan
+* Laurence Parry
+* Lee Bousfield
+* Lee Daniel Crocker
* Lee Worden
* Lejonel
+* lekshmi
+* Leo Koppelkamm
* Leon Liesener
+* Leon Weber
+* Leonardo Gregianin
+* Leons Petrazickis
+* Leslie Hoare
+* Leszek Manicki
+* lethosor
+* Lewis Cawte
+* Liam Edwards-Playne
* liangent
+* Lisa Ridley
+* Ljudusika
+* Lojjik Braughler
* Louperivois
+* Ltrlg
+* Luc Van Oostenryck
* Lucas Garczewski
* Luigi Corsaro
+* Luis Felipe Schenone
* Luke Faraone
+* Lupin
* Lupo
+* lwelling
+* m4tx
* Madman
+* madurangasiriwardena
+* Magnus Manske
* Manuel Menal
+* Manuel Schneider
+* Marc Ordinas i Llopis
* Marc-André Pelletier
* Marcin Cieślak
+* Marco Falke
+* Marco Schuster
+* MarcoAurelio
* Marcus Buck
+* Marius Hoch
+* Mark Bergsma
+* Mark Clements
* Mark Hershberger
* Mark Holmquist
+* Marko Obrovac
+* Markus Glaser
+* Markus Krötzsch
* Marooned
+* Martin Urbanec
+* Massaf
+* Matěj Grabovský
+* matejsuchanek
* Mathias Ertl
* mati
+* Matt Fitzpatrick
+* Matt Johnston
+* Matt Russell
+* Matthew Bowker
* Matthew Britton
+* Matthew Flaschen
+* Matthias Jordan
* Matthias Mullie
+* MatthiasDD
* Max
+* Max Semenik
* Max Sikström
+* mayankmadan
+* Meno25
* merl
+* Merlijn S. van Deen
+* MGChecker
+* mgooley
+* mhutti1
* Michael Dale
* Michael De La Rue
+* Michael Holloway
* Michael M.
* Michael Newton
* Michael Walsh
+* Michał Łazowik
+* Michał Roszka
+* Michał Zieliński
* Mike Horvath
+* Minh Nguyễn
+* MinuteElectron
+* Misza13
+* mjbmr
* moejoe0000
+* Mohamed Magdy
+* Molly White
+* Moriel Schottlender
* Mormegil
+* Mr. E23
* MrBlueSky
* MrPete
+* Mukunda Modell
+* Mwalker
+* mwjames
* mybugs.mail
* MZMcBride
+* nadeesha
* Nakon
+* Namit
* Nathan Larson
+* Nathaniel Herman
+* Neil Kandalgaonkar
+* Nemo bis
* nephele
+* Nicholas Pisarro, Jr
+* Nick Jenkins
+* nicoco007
+* Nicolas Dumazet
+* Nicolas Weeger
* Nik
+* Nik Everett
+* Niklas Laxström
* Nikola Kovacs
+* Nikola Smolenski
* Nikolaos S. Karastathis
+* Nimish Gautam
* Nischay Nahata
+* nischayn22
+* nomoa
+* nullspoon
+* Nuria Ruiz
* Nx.devnull
+* Ocean behind ears
* Olaf Lenz
* Olivier Finlay Beaton
+* onei
+* opatel99
+* Oren Held
+* Ori Livneh
+* oskar.jauch@gmail.com
+* OverlordQ
+* Owen Davis
+* Paa Kwesi Imbeah
+* paladox
* Patricio Molina
+* Patrick Reilly
+* Patrick Westerhoff
+* Pau Giner
* Paul Copperman
* Paul Oranje
+* Pavel Astakhov
+* Pavel Selitskas
+* Pcoombe
+* Perside Rosalie
* Peter Gehres
+* Peter Hedenskog
+* Peter Potrowl
+* Petr Bena
+* Petr Kadlec
* Petr Onderka
+* Petr Pchelko
+* Philip Tzou
+* physikerwelt (Moritz Schubotz)
* PieRRoMaN
+* Pikne
+* PiRSquared17
+* Platonides
+* Pmlineditor
+* pmolina
+* prageck
+* Pranav Ravichandran
+* PranavK
+* Prateek Saxena
+* Priyanka Dhanda
+* Prod
+* ptarjan
+* pubudu538
+* Purodha Blissenbach
+* quiddity
* quietust
+* Quim Gil
+* rahul21
+* Raimond Spekking
+* Ramunas Geciauskas
+* Remember the dot
* René Kijewski
+* Reza
* rgcjonas
+* Ricordisamoa
+* rillke
+* River Tarnell
+* Roan Kattouw
+* Rob Church
+* Rob Lanphier
* Rob Moen
+* Robert Hoenig
+* Robert Leverington
+* Robert Rohde
+* Robert Stojnić
* Robert Treat
+* Robert Vogel
+* Robin Pepermans
+* robinhood701
* RockMFR
+* Rohan
+* Roman Nosov
+* Roman Tsukanov
+* Rotem Liss
+* Rowan Collins
+* Russ Nelson
* Russell Blau
* Rusty Burchfield
+* Ruud Koot
+* Ryan Bies
+* Ryan Finnie
+* Ryan Kaldari
+* Ryan Lane
+* Ryan Schmidt
* S Page
* Salvatore Ingala
+* Sam Reed
+* Sam Smith
* Santhosh Thottingal
+* Schnark
+* Scimonster
+* scnd
* Scott Colcord
* se4598
+* Sean Colombo
+* Sean Pringle
+* Seb35
+* Sebastian Brückner
* Sébastien Santoro
+* Sergio Santoro
+* Sethakill
+* Shahyar
+* Shane Gibbons
+* Shane King
+* Shinjiman
+* shirayuki
+* Sidhant Gupta
+* Siebrand Mazeland
* Simon Walker
+* Smriti Singh
* Solitarius
+* Sorawee Porncharoenwase
* Søren Løvborg
* Southparkfan
+* Soxred93
+* SQL
* Srikanth Lakshmanan
+* Stanislav Malyshev
* Stefano Codari
+* Steinsplitter
+* Stephan Gambke
+* Stephan Muggli
+* Stephane Bisson
+* Stephen Liang
+* Steve Sanbeg
+* Steven Roddis
* Str4nd
* Subramanya Sastry
+* Sumit Asthana
* svip
+* Swalling
+* Szymon Świerkosz
+* T.D. Corell
+* Tarquin
+* The Discoverer
* The Evil IP address
+* theopolisme
+* Thiemo Mättig (WMDE)
+* This, that and the other
+* tholam
+* Thomas Arrow
+* Thomas Bleher
+* Thomas Dalton
+* Thomas Gries
+* ThomasV
+* Tim Hollmann
* Tim Landscheidt
+* Tim Laqua
+* Tim Starling
+* Timo Tijhof
+* Tina Johnson
* Tisane
+* tjlsangria
+* Tjones
+* TK-999
+* Tobias Gritschacher
+* Tom Arrow
+* Tom Gilder
+* Tom Maaswinkel
+* Tomasz Finc
+* Tomasz W. Kozlowski
+* Tomasz Wegrzanowski
+* tomek
+* Tony Thomas
+* Tpt
+* Trevor Parscal
+* TyA
+* Tychay
+* Tyler Anthony Romeo
+* Tyler Cipriani
+* Tyler Romeo
+* U-REDMOND\emadelw
+* UltrasonicNXT
* Umherirrender
+* utkarsh95
* Van de Bugger
+* Viačeslav
+* Victor Porton
+* Victor Vasiliev
+* victorbarbu
* Ville Stadista
+* vishnu
* Vitaliy Filippov
* Vivek Ghaisas
+* vlakoff
+* Volker E
* Waldir Pimenta
+* wctaiwan
+* Wikinaut
+* Wil Mahan
* William Demchick
+* withoutaname
+* WMDE-Fisch
+* X!
+* XP1
+* Yaron Koren
+* Yaroslav Melnychuk
+* Yesid Carrillo
+* Yogesh K S
+* Yongmin Hong
+* yoonghm
+* Yuri Astrakhan
* Yusuke Matsubara
* Yuvi Panda
* Zachary Hauri
+* Zak Greant
+* Željko Filipin
+* Zhaofeng Li
+* Zhengzhu Feng
+* Zppix
+* محمد شعیب
+<!-- END CONTRIBUTOR LIST -->
== Translators ==
&$archive: PageArchive object
$title: Title object of the page that we're viewing
-'UndeleteForm::undelete': Called un UndeleteForm::undelete, after checking that
+'UndeleteForm::undelete': Called in UndeleteForm::undelete, after checking that
the site is not in read-only mode, that the Title object is not null and after
a PageArchive object has been constructed but before performing any further
processing.
}
/**
- * @param OutputPage &$out
+ * @param OutputPage $out
* @since 1.29
*/
- protected function addExplainConflictHeader( OutputPage &$out ) {
+ protected function addExplainConflictHeader( OutputPage $out ) {
$out->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
}
/**
* @param string $name
* @param mixed[] $customAttribs
- * @param User $wgUser
+ * @param User $user
* @return mixed[]
* @since 1.29
*/
- protected function buildTextboxAttribs( $name, array $customAttribs, User $wgUser ) {
+ protected function buildTextboxAttribs( $name, array $customAttribs, User $user ) {
$attribs = $customAttribs + [
'accesskey' => ',',
'id' => $name,
- 'cols' => $wgUser->getIntOption( 'cols' ),
- 'rows' => $wgUser->getIntOption( 'rows' ),
+ 'cols' => $user->getIntOption( 'cols' ),
+ 'rows' => $user->getIntOption( 'rows' ),
// Avoid PHP notices when appending preferences
// (appending allows customAttribs['style'] to still work).
'style' => ''
// * mw-editfont-monospace
// * mw-editfont-sans-serif
// * mw-editfont-serif
- $class = 'mw-editfont-' . $wgUser->getOption( 'editfont' );
+ $class = 'mw-editfont-' . $user->getOption( 'editfont' );
if ( isset( $attribs['class'] ) ) {
if ( is_string( $attribs['class'] ) ) {
* @since 1.17
*/
class Message implements MessageSpecifier, Serializable {
+ /** Use message text as-is */
+ const FORMAT_PLAIN = 'plain';
+ /** Use normal wikitext -> HTML parsing (the result will be wrapped in a block-level HTML tag) */
+ const FORMAT_BLOCK_PARSE = 'block-parse';
+ /** Use normal wikitext -> HTML parsing but strip the block-level wrapper */
+ const FORMAT_PARSE = 'parse';
+ /** Transform {{..}} constructs but don't transform to HTML */
+ const FORMAT_TEXT = 'text';
+ /** Transform {{..}} constructs, HTML-escape the result */
+ const FORMAT_ESCAPED = 'escaped';
/**
* In which language to get this message. True, which is the default,
protected $parameters = [];
/**
- * Format for the message.
- * Supported formats are:
- * * text (transform)
- * * escaped (transform+htmlspecialchars)
- * * block-parse
- * * parse (default)
- * * plain
- *
* @var string
+ * @deprecated
*/
protected $format = 'parse';
* @since 1.21
*
* @return string
+ * @deprecated since 1.29 formatting is not stateful
*/
public function getFormat() {
+ wfDeprecated( __METHOD__, '1.29' );
return $this->format;
}
*
* @since 1.17
*
+ * @param string|null $format One of the FORMAT_* constants. Null means use whatever was used
+ * the last time (this is for B/C and should be avoided).
+ *
* @return string HTML
*/
- public function toString() {
+ public function toString( $format = null ) {
+ if ( $format === null ) {
+ $ex = new LogicException( __METHOD__ . ' using implicit format: ' . $this->format );
+ \MediaWiki\Logger\LoggerFactory::getInstance( 'message-format' )->warning(
+ $ex->getMessage(), [ 'exception' => $ex, 'format' => $this->format, 'key' => $this->key ] );
+ $format = $this->format;
+ }
$string = $this->fetchMessage();
if ( $string === false ) {
}
# Replace parameters before text parsing
- $string = $this->replaceParameters( $string, 'before' );
+ $string = $this->replaceParameters( $string, 'before', $format );
# Maybe transform using the full parser
- if ( $this->format === 'parse' ) {
+ if ( $format === self::FORMAT_PARSE ) {
$string = $this->parseText( $string );
$string = Parser::stripOuterParagraph( $string );
- } elseif ( $this->format === 'block-parse' ) {
+ } elseif ( $format === self::FORMAT_BLOCK_PARSE ) {
$string = $this->parseText( $string );
- } elseif ( $this->format === 'text' ) {
+ } elseif ( $format === self::FORMAT_TEXT ) {
$string = $this->transformText( $string );
- } elseif ( $this->format === 'escaped' ) {
+ } elseif ( $format === self::FORMAT_ESCAPED ) {
$string = $this->transformText( $string );
$string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
}
# Raw parameter replacement
- $string = $this->replaceParameters( $string, 'after' );
+ $string = $this->replaceParameters( $string, 'after', $format );
return $string;
}
* @return string
*/
public function __toString() {
- if ( $this->format !== 'parse' ) {
- $ex = new LogicException( __METHOD__ . ' using implicit format: ' . $this->format );
- \MediaWiki\Logger\LoggerFactory::getInstance( 'message-format' )->warning(
- $ex->getMessage(), [ 'exception' => $ex, 'format' => $this->format, 'key' => $this->key ] );
- }
-
// PHP doesn't allow __toString to throw exceptions and will
// trigger a fatal error if it does. So, catch any exceptions.
try {
- return $this->toString();
+ return $this->toString( self::FORMAT_PARSE );
} catch ( Exception $ex ) {
try {
trigger_error( "Exception caught in " . __METHOD__ . " (message " . $this->key . "): "
// Doh! Cause a fatal error after all?
}
- if ( $this->format === 'plain' || $this->format === 'text' ) {
- return '<' . $this->key . '>';
- }
- return '<' . htmlspecialchars( $this->key ) . '>';
+ return '⧼' . htmlspecialchars( $this->key ) . '⧽';
}
}
* @return string Parsed HTML.
*/
public function parse() {
- $this->format = 'parse';
- return $this->toString();
+ $this->format = self::FORMAT_PARSE;
+ return $this->toString( self::FORMAT_PARSE );
}
/**
* @return string Unescaped message text.
*/
public function text() {
- $this->format = 'text';
- return $this->toString();
+ $this->format = self::FORMAT_TEXT;
+ return $this->toString( self::FORMAT_TEXT );
}
/**
* @return string Unescaped untransformed message text.
*/
public function plain() {
- $this->format = 'plain';
- return $this->toString();
+ $this->format = self::FORMAT_PLAIN;
+ return $this->toString( self::FORMAT_PLAIN );
}
/**
* @return string HTML
*/
public function parseAsBlock() {
- $this->format = 'block-parse';
- return $this->toString();
+ $this->format = self::FORMAT_BLOCK_PARSE;
+ return $this->toString( self::FORMAT_BLOCK_PARSE );
}
/**
* @return string Escaped message text.
*/
public function escaped() {
- $this->format = 'escaped';
- return $this->toString();
+ $this->format = self::FORMAT_ESCAPED;
+ return $this->toString( self::FORMAT_ESCAPED );
}
/**
*
* @param string $message The message text.
* @param string $type Either "before" or "after".
+ * @param string $format One of the FORMAT_* constants.
*
* @return string
*/
- protected function replaceParameters( $message, $type = 'before' ) {
+ protected function replaceParameters( $message, $type = 'before', $format ) {
$replacementKeys = [];
foreach ( $this->parameters as $n => $param ) {
- list( $paramType, $value ) = $this->extractParam( $param );
+ list( $paramType, $value ) = $this->extractParam( $param, $format );
if ( $type === $paramType ) {
$replacementKeys['$' . ( $n + 1 )] = $value;
}
* @since 1.18
*
* @param mixed $param Parameter as defined in this class.
+ * @param string $format One of the FORMAT_* constants.
*
* @return array Array with the parameter type (either "before" or "after") and the value.
*/
- protected function extractParam( $param ) {
+ protected function extractParam( $param, $format ) {
if ( is_array( $param ) ) {
if ( isset( $param['raw'] ) ) {
return [ 'after', $param['raw'] ];
} elseif ( isset( $param['bitrate'] ) ) {
return [ 'before', $this->getLanguage()->formatBitrate( $param['bitrate'] ) ];
} elseif ( isset( $param['plaintext'] ) ) {
- return [ 'after', $this->formatPlaintext( $param['plaintext'] ) ];
+ return [ 'after', $this->formatPlaintext( $param['plaintext'], $format ) ];
} else {
$warning = 'Invalid parameter for message "' . $this->getKey() . '": ' .
htmlspecialchars( serialize( $param ) );
// Message objects should not be before parameters because
// then they'll get double escaped. If the message needs to be
// escaped, it'll happen right here when we call toString().
- return [ 'after', $param->toString() ];
+ return [ 'after', $param->toString( $format ) ];
} else {
return [ 'before', $param ];
}
* @since 1.25
*
* @param string $plaintext String to ensure plaintext output of
+ * @param string $format One of the FORMAT_* constants.
*
- * @return string Input plaintext encoded for output to $this->format
+ * @return string Input plaintext encoded for output to $format
*/
- protected function formatPlaintext( $plaintext ) {
- switch ( $this->format ) {
- case 'text':
- case 'plain':
+ protected function formatPlaintext( $plaintext, $format ) {
+ switch ( $format ) {
+ case self::FORMAT_TEXT:
+ case self::FORMAT_PLAIN:
return $plaintext;
- case 'parse':
- case 'block-parse':
- case 'escaped':
+ case self::FORMAT_PARSE:
+ case self::FORMAT_BLOCK_PARSE:
+ case self::FORMAT_ESCAPED:
default:
return htmlspecialchars( $plaintext, ENT_QUOTES );
$this->logger->debug( "Clock drift calculation " .
"(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
"iterations=$iterations, " .
- "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
+ "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)" );
return $data;
}
*/
public function generate( $bytes, $forceStrong = false ) {
- $this->logger->debug( "Generating cryptographic random bytes for\n" );
-
$bytes = floor( $bytes );
static $buffer = '';
if ( is_null( $this->strong ) ) {
$rem = $bytes - strlen( $buffer );
$iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
if ( $iv === false ) {
- $this->logger->debug( "mcrypt_create_iv returned false.\n" );
+ $this->logger->debug( "mcrypt_create_iv returned false." );
} else {
$buffer .= $iv;
$this->logger->debug( "mcrypt_create_iv generated " . strlen( $iv ) .
- " bytes of randomness.\n" );
+ " bytes of randomness." );
}
}
}
$rem = $bytes - strlen( $buffer );
$openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
if ( $openssl_bytes === false ) {
- $this->logger->debug( "openssl_random_pseudo_bytes returned false.\n" );
+ $this->logger->debug( "openssl_random_pseudo_bytes returned false." );
} else {
$buffer .= $openssl_bytes;
$this->logger->debug( "openssl_random_pseudo_bytes generated " .
strlen( $openssl_bytes ) . " bytes of " .
- ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
+ ( $openssl_strong ? "strong" : "weak" ) . " randomness." );
}
if ( strlen( $buffer ) >= $bytes ) {
// openssl tells us if the random source was strong, if some of our data was generated
$rem = $bytes - strlen( $buffer );
if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
$this->logger->debug( "Was forced to read from /dev/urandom " .
- "without control over the buffer size.\n" );
+ "without control over the buffer size." );
}
// /dev/urandom is generally considered the best possible commonly
// available random source, and is available on most *nix systems.
$buffer .= $random_bytes;
fclose( $urandom );
$this->logger->debug( "/dev/urandom generated " . strlen( $random_bytes ) .
- " bytes of randomness.\n" );
+ " bytes of randomness." );
if ( strlen( $buffer ) >= $bytes ) {
// urandom is always strong, set to true if all our data was generated using it
$this->strong = true;
}
} else {
- $this->logger->debug( "/dev/urandom could not be opened.\n" );
+ $this->logger->debug( "/dev/urandom could not be opened." );
}
}
// out and being used to predict the /randomness/ that follows.
if ( strlen( $buffer ) < $bytes ) {
$this->logger->debug( __METHOD__ .
- ": Falling back to using a pseudo random state to generate randomness.\n" );
+ ": Falling back to using a pseudo random state to generate randomness." );
}
while ( strlen( $buffer ) < $bytes ) {
$buffer .= MWCryptHash::hmac( $this->randomState(), strval( mt_rand() ) );
$buffer = substr( $buffer, $bytes );
$this->logger->debug( strlen( $buffer ) .
- " bytes of randomness leftover in the buffer.\n" );
+ " bytes of randomness leftover in the buffer." );
return $generated;
}
*/
protected function getMagickVersion() {
$cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
+ $method = __METHOD__;
return $cache->getWithSetCallback(
'imagemagick-version',
$cache::TTL_HOUR,
- function () {
+ function () use ( $method ) {
global $wgImageMagickConvertCommand;
$cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
- wfDebug( __METHOD__ . ": Running convert -version\n" );
+ wfDebug( $method . ": Running convert -version\n" );
$retval = '';
$return = wfShellExec( $cmd, $retval );
$x = preg_match(
'/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches
);
if ( $x != 1 ) {
- wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+ wfDebug( $method . ": ImageMagick version check failed\n" );
return false;
}
private static $list;
private static $aliases;
- private static $pageObjectCache = [];
/**
* Reset the internal list of special pages. Useful when changing $wgSpecialPages after
public static function resetList() {
self::$list = null;
self::$aliases = null;
- self::$pageObjectCache = [];
}
/**
public static function getPage( $name ) {
list( $realName, /*...*/ ) = self::resolveAlias( $name );
- if ( isset( self::$pageObjectCache[$realName] ) ) {
- return self::$pageObjectCache[$realName];
- }
-
$specialPageList = self::getPageList();
if ( isset( $specialPageList[$realName] ) ) {
$page = null;
}
- self::$pageObjectCache[$realName] = $page;
if ( $page instanceof SpecialPage ) {
return $page;
} else {
--- /dev/null
+<?php
+/**
+ * Update the CREDITS list by merging in the list of git commit authors.
+ *
+ * The contents of the existing contributors list will be preserved. If a name
+ * needs to be removed for some reason that must be done manually before or
+ * after running this script.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+ die( "This script can only be run from the command line.\n" );
+}
+
+chdir( dirname( __DIR__ ) );
+
+$CREDITS = 'CREDITS';
+$START_CONTRIBUTORS = '<!-- BEGIN CONTRIBUTOR LIST -->';
+$END_CONTRIBUTORS = '<!-- END CONTRIBUTOR LIST -->';
+
+$inHeader = true;
+$inFooter = false;
+$header = [];
+$contributors = [];
+$footer = [];
+
+$lines = explode( "\n", file_get_contents( $CREDITS ) );
+foreach ( $lines as $line ) {
+ if ( $inHeader ) {
+ $header[] = $line;
+ $inHeader = $line !== $START_CONTRIBUTORS;
+ } elseif ( $inFooter ) {
+ $footer[] = $line;
+ } elseif ( $line == $END_CONTRIBUTORS ) {
+ $inFooter = true;
+ $footer[] = $line;
+ } else {
+ $name = substr( $line, 2 );
+ $contributors[$name] = true;
+ }
+}
+unset( $lines );
+
+$lines = explode( "\n", shell_exec( 'git log --format="%aN"' ) );
+foreach ( $lines as $line ) {
+ if ( empty( $line ) ) {
+ continue;
+ }
+ if ( substr( $line, 0, 5 ) === '[BOT]' ) {
+ continue;
+ }
+ $contributors[$line] = true;
+}
+
+$contributors = array_keys( $contributors );
+$collator = Collator::create( 'uca-default-u-kn' );
+$collator->sort( $contributors );
+array_walk( $contributors, function ( &$v, $k ) {
+ $v = "* {$v}";
+} );
+
+file_put_contents( $CREDITS,
+ implode( "\n", array_merge( $header, $contributors, $footer ) ) );
},
apiCheckValid: function () {
var that = this;
- return this.isValid().done( function ( ok ) {
+ return this.getValidity().then( function () {
+ return $.Deferred().resolve( true ).promise();
+ }, function () {
+ return $.Deferred().resolve( false ).promise();
+ } ).done( function ( ok ) {
ok = ok || suppressErrors;
that.setIcon( ok ? null : 'alert' );
that.setIconTitle( ok ? '' : mw.message( 'apisandbox-alert-field' ).plain() );
},
dateTimeInputWidget: {
- isValid: function () {
- var ok = !Util.apiBool( this.paramInfo.required ) || this.getApiValue() !== '';
- return $.Deferred().resolve( ok ).promise();
+ getValidity: function () {
+ if ( !Util.apiBool( this.paramInfo.required ) || this.getApiValue() !== '' ) {
+ return $.Deferred().resolve().promise();
+ } else {
+ return $.Deferred().reject().promise();
+ }
}
},
} );
widget.setIcon = widget.input.setIcon.bind( widget.input );
widget.setIconTitle = widget.input.setIconTitle.bind( widget.input );
- widget.isValid = widget.input.isValid.bind( widget.input );
+ widget.getValidity = widget.input.getValidity.bind( widget.input );
widget.paramInfo = pi;
$.extend( widget, WidgetMethods.textInputWidget );
if ( Util.apiBool( pi.enforcerange ) ) {
} );
widget.setIcon = widget.input.setIcon.bind( widget.input );
widget.setIconTitle = widget.input.setIconTitle.bind( widget.input );
- widget.isValid = widget.input.isValid.bind( widget.input );
+ widget.getValidity = widget.input.getValidity.bind( widget.input );
widget.input.setValidation( function ( value ) {
return value === 'max' || widget.validateNumber( value );
} );
public static function provideToString() {
return [
- [ 'mainpage', 'Main Page' ],
- [ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽' ],
- [ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽', 'escaped' ],
- [ 'script>alert(1)</script', '⧼script>alert(1)</script⧽', 'escaped' ],
- [ 'script>alert(1)</script', '⧼script>alert(1)</script⧽' ],
+ // key, transformation, transformed, transformed implicitly
+ [ 'mainpage', 'plain', 'Main Page', 'Main Page' ],
+ [ 'i-dont-exist-evar', 'plain', '⧼i-dont-exist-evar⧽', '⧼i-dont-exist-evar⧽' ],
+ [ 'i-dont-exist-evar', 'escaped', '⧼i-dont-exist-evar⧽', '⧼i-dont-exist-evar⧽' ],
+ [ 'script>alert(1)</script', 'escaped', '⧼script>alert(1)</script⧽',
+ '⧼script>alert(1)</script⧽' ],
+ [ 'script>alert(1)</script', 'plain', '⧼script>alert(1)</script⧽',
+ '⧼script>alert(1)</script⧽' ],
];
}
* @covers Message::__toString
* @dataProvider provideToString
*/
- public function testToString( $key, $expect, $format = 'plain' ) {
+ public function testToString( $key, $format, $expect, $expectImplicit ) {
$msg = new Message( $key );
- $msg->$format();
+ $this->assertEquals( $expect, $msg->$format() );
+ $this->assertEquals( $expect, $msg->toString() );
+ $this->assertEquals( $expectImplicit, $msg->__toString() );
+ $this->assertEquals( $expect, $msg->toString() );
+ }
+
+ public static function provideToString_raw() {
+ return [
+ [ '<span>foo</span>', 'parse', '<span>foo</span>', '<span>foo</span>' ],
+ [ '<span>foo</span>', 'escaped', '<span>foo</span>',
+ '<span>foo</span>' ],
+ [ '<span>foo</span>', 'plain', '<span>foo</span>', '<span>foo</span>' ],
+ [ '<script>alert(1)</script>', 'parse', '<script>alert(1)</script>',
+ '<script>alert(1)</script>' ],
+ [ '<script>alert(1)</script>', 'escaped', '<script>alert(1)</script>',
+ '<script>alert(1)</script>' ],
+ [ '<script>alert(1)</script>', 'plain', '<script>alert(1)</script>',
+ '<script>alert(1)</script>' ],
+ ];
+ }
+
+ /**
+ * @covers Message::toString
+ * @covers Message::__toString
+ * @dataProvider provideToString_raw
+ */
+ public function testToString_raw( $key, $format, $expect, $expectImplicit ) {
+ // make the message behave like RawMessage and use the key as-is
+ $msg = $this->getMockBuilder( Message::class )->setMethods( [ 'fetchMessage' ] )
+ ->setConstructorArgs( [ $key ] )
+ ->getMock();
+ $msg->expects( $this->any() )->method( 'fetchMessage' )->willReturn( $key );
+ /** @var Message $msg */
+ $this->assertEquals( $expect, $msg->$format() );
+ $this->assertEquals( $expect, $msg->toString() );
+ $this->assertEquals( $expectImplicit, $msg->__toString() );
$this->assertEquals( $expect, $msg->toString() );
- $this->assertEquals( $expect, $msg->__toString() );
}
/**
*/
class ApiMessageTest extends MediaWikiTestCase {
- private function compareMessages( $msg, $msg2 ) {
+ private function compareMessages( Message $msg, Message $msg2 ) {
$this->assertSame( $msg->getKey(), $msg2->getKey(), 'getKey' );
$this->assertSame( $msg->getKeysToTry(), $msg2->getKeysToTry(), 'getKeysToTry' );
$this->assertSame( $msg->getParams(), $msg2->getParams(), 'getParams' );
- $this->assertSame( $msg->getFormat(), $msg2->getFormat(), 'getFormat' );
$this->assertSame( $msg->getLanguage(), $msg2->getLanguage(), 'getLanguage' );
$msg = TestingAccessWrapper::newFromObject( $msg );
$msg2 = TestingAccessWrapper::newFromObject( $msg2 );
$this->assertSame( $msg->interface, $msg2->interface, 'interface' );
$this->assertSame( $msg->useDatabase, $msg2->useDatabase, 'useDatabase' );
+ $this->assertSame( $msg->format, $msg2->format, 'format' );
$this->assertSame(
$msg->title ? $msg->title->getFullText() : null,
$msg2->title ? $msg2->title->getFullText() : null,
$specialPageTestHelper = new SpecialPageTestHelper();
return [
- 'class name' => [ 'SpecialAllPages' ],
+ 'class name' => [ 'SpecialAllPages', false ],
'closure' => [ function () {
return new SpecialAllPages();
- } ],
- 'function' => [ [ $this, 'newSpecialAllPages' ] ],
- 'callback string' => [ 'SpecialPageTestHelper::newSpecialAllPages' ],
+ }, false ],
+ 'function' => [ [ $this, 'newSpecialAllPages' ], false ],
+ 'callback string' => [ 'SpecialPageTestHelper::newSpecialAllPages', false ],
'callback with object' => [
- [ $specialPageTestHelper, 'newSpecialAllPages' ]
+ [ $specialPageTestHelper, 'newSpecialAllPages' ],
+ false
],
'callback array' => [
- [ 'SpecialPageTestHelper', 'newSpecialAllPages' ]
+ [ 'SpecialPageTestHelper', 'newSpecialAllPages' ],
+ false
]
];
}
* @covers SpecialPageFactory::getPage
* @dataProvider specialPageProvider
*/
- public function testGetPage( $spec ) {
+ public function testGetPage( $spec, $shouldReuseInstance ) {
$this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => $spec ] );
SpecialPageFactory::resetList();
$this->assertInstanceOf( 'SpecialPage', $page );
$page2 = SpecialPageFactory::getPage( 'testdummy' );
- $this->assertEquals( true, $page2 === $page, "Should re-use instance:" );
+ $this->assertEquals( $shouldReuseInstance, $page2 === $page, "Should re-use instance:" );
}
/**
// Messages for examples.
foreach ( $module->getExamplesMessages() as $qs => $msg ) {
+ $this->assertStringStartsNotWith( 'api.php?', $qs,
+ "Query string must not begin with 'api.php?'" );
$this->checkMessage( $msg, "Example $qs" );
}
}