r96508 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r96507‎ | r96508 | r96509 >
Date:21:56, 7 September 2011
Author:catrope
Status:ok
Tags:
Comment:
Modified paths:
  • /branches/REL1_18/extensions/ArchiveLinks/spider.php (modified) (history)
  • /branches/REL1_18/extensions/CollabWatchlist/includes/SpecialCollabWatchlist.php (modified) (history)
  • /branches/REL1_18/extensions/CreateRedirect/CreateRedirect.body.php (modified) (history)
  • /branches/REL1_18/extensions/FlaggedRevs/presentation/FlaggedPageView.php (modified) (history)
  • /branches/REL1_18/extensions/InterwikiIntegration/SpecialInterwikiWatchlist.php (modified) (history)
  • /branches/REL1_18/extensions/ParserFunctions/ParserFunctions.i18n.php (modified) (history)
  • /branches/REL1_18/extensions/RefreshSpecial/RefreshSpecial.body.php (modified) (history)
  • /branches/REL1_18/extensions/SemanticForms/specials/SF_FormEdit.php (modified) (history)
  • /branches/REL1_18/extensions/TalkHere/TalkHereHooks.php (modified) (history)
  • /branches/REL1_18/extensions/WikiEditor/WikiEditor.i18n.php (modified) (history)
  • /branches/REL1_18/extensions/WikiEditor/WikiEditor.php (modified) (history)
  • /branches/REL1_18/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js (modified) (history)
  • /branches/REL1_18/phase3/RELEASE-NOTES-1.18 (modified) (history)
  • /branches/REL1_18/phase3/includes/EditPage.php (modified) (history)
  • /branches/REL1_18/phase3/includes/api/ApiBase.php (modified) (history)
  • /branches/REL1_18/phase3/includes/api/ApiEditPage.php (modified) (history)
  • /branches/REL1_18/phase3/includes/db/Database.php (modified) (history)
  • /branches/REL1_18/phase3/includes/db/DatabaseMysql.php (modified) (history)
  • /branches/REL1_18/phase3/includes/db/DatabaseOracle.php (modified) (history)
  • /branches/REL1_18/phase3/includes/db/LoadBalancer.php (modified) (history)
  • /branches/REL1_18/phase3/includes/db/LoadMonitor.php (modified) (history)
  • /branches/REL1_18/phase3/includes/specials/SpecialContributions.php (modified) (history)
  • /branches/REL1_18/phase3/includes/specials/SpecialDeletedContributions.php (modified) (history)
  • /branches/REL1_18/phase3/includes/specials/SpecialEditWatchlist.php (modified) (history)
  • /branches/REL1_18/phase3/includes/specials/SpecialWatchlist.php (modified) (history)
  • /branches/REL1_18/phase3/languages/messages/MessagesEn.php (modified) (history)
  • /branches/REL1_18/phase3/maintenance/language/messages.inc (modified) (history)
  • /branches/REL1_18/phase3/resources/mediawiki/mediawiki.js (modified) (history)
  • /branches/REL1_18/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js (modified) (history)

Diff [purge]

Index: branches/REL1_18/extensions/TalkHere/TalkHereHooks.php
@@ -333,7 +333,7 @@
334334
335335 public function internalAttemptSave( &$result, $bot = false ) {
336336 $res = parent::internalAttemptSave( $result, $bot );
337 - $this->code = $res;
 337+ $this->code = $res->value;
338338 if ( isset( $result['sectionanchor'] ) ) {
339339 $this->sectionanchor = $result['sectionanchor'];
340340 }
Index: branches/REL1_18/extensions/SemanticForms/specials/SF_FormEdit.php
@@ -307,7 +307,8 @@
308308
309309 // Try to save the page!
310310 $resultDetails = array();
311 - $saveResultCode = $editor->internalAttemptSave( $resultDetails );
 311+ $saveResult = $editor->internalAttemptSave( $resultDetails );
 312+ $saveResultCode = $saveResult->value;
312313
313314 if ( ( $saveResultCode == EditPage::AS_HOOK_ERROR || $saveResultCode == EditPage::AS_HOOK_ERROR_EXPECTED ) && $redirectOnError ) {
314315
Index: branches/REL1_18/extensions/FlaggedRevs/presentation/FlaggedPageView.php
@@ -704,7 +704,7 @@
705705 # Update page sync status for tracking purposes.
706706 # NOTE: avoids master hits and doesn't have to be perfect for what it does
707707 if ( $this->article->syncedInTracking() != $synced ) {
708 - if ( wfGetDB( DB_SLAVE )->getLag() <= 5 ) { // avoid write-delay cycles
 708+ if ( wfGetLB()->safeGetLag( wfGetDB( DB_SLAVE ) ) <= 5 ) { // avoid write-delay cycles
709709 $this->article->updateSyncStatus( $synced );
710710 }
711711 }
Index: branches/REL1_18/extensions/ArchiveLinks/spider.php
@@ -162,7 +162,7 @@
163163
164164 $this->jobs = array();
165165
166 - $wait_time = $this->db_slave->getLag() * 3;
 166+ $wait_time = wfGetLB()->safeGetLag( $this->db_slave ) * 3;
167167 $pid = (string) microtime() . ' - ' . getmypid();
168168 $time = time();
169169
@@ -287,4 +287,4 @@
288288 }
289289
290290 $maintClass = 'ArchiveLinksSpider';
291 -require_once RUN_MAINTENANCE_IF_MAIN;
\ No newline at end of file
 291+require_once RUN_MAINTENANCE_IF_MAIN;
Index: branches/REL1_18/extensions/WikiEditor/WikiEditor.php
@@ -311,6 +311,7 @@
312312 'wikieditor-toolbar-characters-page-greek',
313313 'wikieditor-toolbar-characters-page-cyrillic',
314314 'wikieditor-toolbar-characters-page-arabic',
 315+ 'wikieditor-toolbar-characters-page-arabicextended',
315316 'wikieditor-toolbar-characters-page-persian',
316317 'wikieditor-toolbar-characters-page-hebrew',
317318 'wikieditor-toolbar-characters-page-bangla',
Index: branches/REL1_18/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
@@ -650,19 +650,108 @@
651651 "\u042f", "\u044f"
652652 ]
653653 },
 654+ // The core 28-letter alphabet, special letters for the Arabic language,
 655+ // vowels, punctuation, digits.
 656+ // Names of letters are written as in the Unicode charts.
654657 'arabic': {
655658 'labelMsg': 'wikieditor-toolbar-characters-page-arabic',
656659 'layout': 'characters',
657660 'language': 'ar',
658661 'direction': 'rtl',
659662 'characters': [
660 - "\u061b", "\u061f", "\u0621", "\u0622", "\u0623", "\u0624", "\u0625", "\u0626", "\u0627",
661 - "\u0628", "\u0629", "\u062a", "\u062b", "\u062c", "\u062d", "\u062e", "\u062f", "\u0630",
662 - "\u0631", "\u0632", "\u0633", "\u0634", "\u0635", "\u0636", "\u0637", "\u0638", "\u0639",
663 - "\u063a", "\u0641", "\u0642", "\u0643", "\u0644", "\u0645", "\u0646", "\u0647", "\u0648",
664 - "\u0649", "\u064a", "\u060c", "\u067e", "\u0686", "\u0698", "\u06af", "\u06ad"
 663+ // core alphabet
 664+ "\u0627", "\u0628", "\u062a", "\u062b", "\u062c", "\u062d", "\u062e", "\u062f",
 665+ "\u0630", "\u0631", "\u0632", "\u0633", "\u0634", "\u0635", "\u0636", "\u0637",
 666+ "\u0638", "\u0639", "\u063a", "\u0641", "\u0642", "\u0643", "\u0644", "\u0645",
 667+ "\u0646", "\u0647", "\u0648", "\u064a",
 668+ // special letters for the Arabic language
 669+ "\u0621", // Hamza
 670+ "\u0622", "\u0623", "\u0625", "\u0671", // Alef
 671+ "\u0624", // Waw hamza
 672+ "\u0626", // Yeh hamza
 673+ "\u0649", // Alef maksura
 674+ "\u0629", // Teh marbuta
 675+ // vowels
 676+ "\u064E", "\u064F", "\u0650", "\u064B", "\u064C", "\u064D", "\u0651", "\u0652",
 677+ "\u0670",
 678+ // punctuation
 679+ "\u060c", "\u061b", "\u061f", "\u0640",
 680+ // digits
 681+ "\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667",
 682+ "\u0668", "\u0669", "\u066A", "\u066B", "\u066C", "\u066D"
665683 ]
666684 },
 685+ // Characters for languages other than Arabic.
 686+ 'arabicextended': {
 687+ 'labelMsg': 'wikieditor-toolbar-characters-page-arabicextended',
 688+ 'layout': 'characters',
 689+ 'language': 'ar',
 690+ 'direction': 'rtl',
 691+ 'characters': [
 692+ // Alef
 693+ "\u0672", "\u0673", "\u0674", "\u0675", "\u0773", "\u0774",
 694+ // Beh
 695+ "\u066E", "\u067B", "\u067E", "\u0680", "\u0750", "\u0751", "\u0752", "\u0753",
 696+ "\u0754", "\u0755", "\u0756",
 697+ // Teh
 698+ "\u0679", "\u067A", "\u067C", "\u067D", "\u067F",
 699+ // Jeem
 700+ "\u0681", "\u0682", "\u0683", "\u0684", "\u0685", "\u0686", "\u0687", "\u06BF",
 701+ // Hah
 702+ "\u0757", "\u0758", "\u076E", "\u076F", "\u0772", "\u077C",
 703+ // Dal
 704+ "\u0688", "\u0689", "\u068A", "\u068B", "\u068C", "\u068D", "\u068E", "\u068F",
 705+ "\u0690", "\u06EE", "\u0759", "\u075A",
 706+ // Reh
 707+ "\u0691", "\u0692", "\u0693", "\u0694", "\u0695", "\u0696", "\u0697", "\u0698",
 708+ "\u0699", "\u06EF", "\u075B", "\u076B", "\u076C", "\u0771",
 709+ // Seen
 710+ "\u069A", "\u069B", "\u069C", "\u077D",
 711+ // Sheen
 712+ "\u06FA", "\u075C", "\u076D", "\u0770", "\u077E",
 713+ // Sad
 714+ "\u069D", "\u069E",
 715+ // Dad
 716+ "\u06FB",
 717+ // Tah
 718+ "\u069F",
 719+ // Ain
 720+ "\u06A0", "\u075D", "\u075E", "\u075F",
 721+ // Ghain
 722+ "\u06FC",
 723+ // Feh
 724+ "\u06A1", "\u06A2", "\u06A3", "\u06A4", "\u06A5", "\u06A6", "\u0760", "\u0761",
 725+ // Qaf
 726+ "\u066F", "\u06A7", "\u06A8",
 727+ // Kaf
 728+ "\u063B", "\u063C", "\u06A9", "\u06AA", "\u06AB", "\u06AC", "\u06AD", "\u06AE",
 729+ "\u06AF", "\u06B0", "\u06B1", "\u06B2", "\u06B3", "\u06B4", "\u0762", "\u0763",
 730+ "\u0764", "\u077F",
 731+ // Lam
 732+ "\u06B5", "\u06B6", "\u06B7", "\u06B8", "\u076A",
 733+ // Meem
 734+ "\u0765", "\u0766",
 735+ // Noon
 736+ "\u06B9", "\u06BA", "\u06BB", "\u06BC", "\u06BD", "\u0767", "\u0768", "\u0769",
 737+ // Heh
 738+ "\u06BE", "\u06C0", "\u06C1", "\u06C2", "\u06C3", "\u06D5", "\u06FF",
 739+ // Waw
 740+ "\u0676", "\u0677", "\u06C4", "\u06C5", "\u06C6", "\u06C7", "\u06C8", "\u06C9",
 741+ "\u06CA", "\u06CB", "\u06CF", "\u0778", "\u0779",
 742+ // Yeh
 743+ "\u0620", "\u063D", "\u063E", "\u063F", "\u0678", "\u06CC", "\u06CD", "\u06CE",
 744+ "\u06D0", "\u06D1", "\u06D2", "\u06D3", "\u0775", "\u0776", "\u0777", "\u077A",
 745+ "\u077B",
 746+ // diacritics
 747+ "\u0656", "\u0657", "\u0658", "\u0659", "\u065A", "\u065B", "\u065C", "\u065D",
 748+ "\u065E", "\u065F",
 749+ // special punctuation
 750+ "\u06D4", "\u06FD", "\u06FE",
 751+ // special digits
 752+ "\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7",
 753+ "\u06F8", "\u06F9",
 754+ ]
 755+ },
667756 'hebrew': {
668757 'labelMsg': 'wikieditor-toolbar-characters-page-hebrew',
669758 'layout': 'characters',
Index: branches/REL1_18/extensions/WikiEditor/WikiEditor.i18n.php
@@ -180,6 +180,7 @@
181181 'wikieditor-toolbar-characters-page-greek' => 'Greek',
182182 'wikieditor-toolbar-characters-page-cyrillic' => 'Cyrillic',
183183 'wikieditor-toolbar-characters-page-arabic' => 'Arabic',
 184+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabic extended',
184185 'wikieditor-toolbar-characters-page-persian' => 'Persian',
185186 'wikieditor-toolbar-characters-page-hebrew' => 'Hebrew',
186187 'wikieditor-toolbar-characters-page-bangla' => 'Bangla',
Index: branches/REL1_18/extensions/RefreshSpecial/RefreshSpecial.body.php
@@ -241,7 +241,7 @@
242242
243243 # Wait for the slave to catch up
244244 $slaveDB = wfGetDB( DB_SLAVE, array( 'QueryPage::recache', 'vslow' ) );
245 - while( $slaveDB->getLag() > REFRESHSPECIAL_SLAVE_LAG_LIMIT ) {
 245+ while( wfGetLB()->safeGetLag( $slaveDB ) > REFRESHSPECIAL_SLAVE_LAG_LIMIT ) {
246246 $wgOut->addHTML( wfMsg( 'refreshspecial-slave-lagged' ) . '<br />' );
247247 sleep( REFRESHSPECIAL_SLAVE_LAG_SLEEP );
248248 }
@@ -290,4 +290,4 @@
291291 $link_back = $sk->makeKnownLinkObj( $titleObj, wfMsg( 'refreshspecial-link-back' ) );
292292 $wgOut->addHTML( '<br /><b>' . $link_back . '</b>' );
293293 }
294 -}
\ No newline at end of file
 294+}
Index: branches/REL1_18/extensions/ParserFunctions/ParserFunctions.i18n.php
@@ -459,7 +459,7 @@
460460 'pfunc-convert-unit-volume-kilolitre' => '{{PLURAL:$1|kilollitru|kilollitros}}',
461461 'pfunc-convert-unit-volume-litre' => '{{PLURAL:$1|llitru|llitros}}',
462462 'pfunc-convert-unit-volume-centilitre' => '{{PLURAL:$1|centillitru|centillitros}}',
463 - 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1|millillitru|millillitros}}',
 463+ 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1|milillitru|milillitros}}',
464464 'pfunc-convert-unit-volume-cubicmetre-abbr' => 'm<sup>3</sup>',
465465 'pfunc-convert-unit-volume-cubiccentimetre-abbr' => 'cm<sup>3</sup>',
466466 'pfunc-convert-unit-volume-cubicmillimetre-abbr' => 'mm<sup>3</sup>',
@@ -468,7 +468,7 @@
469469 'pfunc-convert-unit-pressure-pascal' => '{{PLURAL:$1|$2pascal|$2pascales}}',
470470 'pfunc-convert-unit-pressure-bar' => 'bar',
471471 'pfunc-convert-unit-pressure-decibar' => 'decibar',
472 - 'pfunc-convert-unit-pressure-millibar' => 'millibar',
 472+ 'pfunc-convert-unit-pressure-millibar' => 'milibar',
473473 'pfunc-convert-unit-pressure-kilobarye' => 'kilobario',
474474 'pfunc-convert-unit-pressure-barye' => 'bario',
475475 'pfunc-convert-unit-pressure-atmosphere' => '{{PLURAL:$1|atmósfera|atmósferes}}',
@@ -767,7 +767,7 @@
768768 'pfunc-convert-prefix-deca' => 'deka',
769769 'pfunc-convert-prefix-deci' => 'deci',
770770 'pfunc-convert-prefix-centi' => 'centi',
771 - 'pfunc-convert-prefix-milli' => 'milli',
 771+ 'pfunc-convert-prefix-milli' => 'mili',
772772 'pfunc-convert-prefix-micro' => 'mikro',
773773 'pfunc-convert-prefix-nano' => 'nano',
774774 'pfunc-convert-prefix-pico' => 'piko',
@@ -2344,7 +2344,7 @@
23452345 'pfunc-convert-prefix-deca' => 'deka',
23462346 'pfunc-convert-prefix-deci' => 'desi',
23472347 'pfunc-convert-prefix-centi' => 'senti',
2348 - 'pfunc-convert-prefix-milli' => 'milli',
 2348+ 'pfunc-convert-prefix-milli' => 'mili',
23492349 'pfunc-convert-prefix-micro' => 'mikro',
23502350 'pfunc-convert-prefix-nano' => 'nano',
23512351 'pfunc-convert-prefix-pico' => 'piko',
@@ -2386,7 +2386,7 @@
23872387 'pfunc-convert-unit-area-squarekilometre' => '{{PLURAL:$1|kilometer persegi|kilometer persegi}}',
23882388 'pfunc-convert-unit-area-squaremetre' => '{{PLURAL:$1|meter persegi|meter persegi}}',
23892389 'pfunc-convert-unit-area-squarecentimetre' => '{{PLURAL:$1|sentimeter persegi|sentimeter persegi}}',
2390 - 'pfunc-convert-unit-area-squaremillimetre' => '{{PLURAL:$1|millimeter persegi|millimeter persegi}}',
 2390+ 'pfunc-convert-unit-area-squaremillimetre' => '{{PLURAL:$1|milimeter persegi|milimeter persegi}}',
23912391 'pfunc-convert-unit-area-hectare' => '{{PLURAL:$1|hektar|hektar}}',
23922392 'pfunc-convert-unit-area-squaremile' => '{{PLURAL:$1|batu persegi|batu persegi}}',
23932393 'pfunc-convert-unit-area-acre' => '{{PLURAL:$1|ekar|ekar}}',
@@ -2421,11 +2421,11 @@
24222422 'pfunc-convert-unit-time-minute-abbr' => 'min',
24232423 'pfunc-convert-unit-volume-cubicmetre' => '{{PLURAL:$1|meter padu|meter padu}}',
24242424 'pfunc-convert-unit-volume-cubiccentimetre' => '{{PLURAL:$1|sentimeter padu|sentimeter padu}}',
2425 - 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1|millimeter padu|millimeter padu}}',
 2425+ 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1|milimeter padu|milimeter padu}}',
24262426 'pfunc-convert-unit-volume-kilolitre' => '{{PLURAL:$1|kilolite|kiloliter}}',
24272427 'pfunc-convert-unit-volume-litre' => '{{PLURAL:$1|liter|liter}}',
24282428 'pfunc-convert-unit-volume-centilitre' => '{{PLURAL:$1|sentiliter|sentiliter}}',
2429 - 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1|milliliter|milliliter}}',
 2429+ 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1|mililiter|mililiter}}',
24302430 'pfunc-convert-unit-volume-cubicyard' => '{{PLURAL:$1|ela padu|ela padu}}',
24312431 'pfunc-convert-unit-volume-cubicfoot' => '{{PLURAL:$1|kaki padu|kaki padu}}',
24322432 'pfunc-convert-unit-volume-cubicinch' => '{{PLURAL:$1|inci padu|inci padu}}',
@@ -2479,12 +2479,12 @@
24802480 'pfunc-convert-unit-pressure-pascal' => '{{PLURAL:$1|$2pascal|$2pascal}}',
24812481 'pfunc-convert-unit-pressure-bar' => 'bar',
24822482 'pfunc-convert-unit-pressure-decibar' => 'desibar',
2483 - 'pfunc-convert-unit-pressure-millibar' => 'millibar',
 2483+ 'pfunc-convert-unit-pressure-millibar' => 'milibar',
24842484 'pfunc-convert-unit-pressure-kilobarye' => 'kilobarye',
24852485 'pfunc-convert-unit-pressure-barye' => 'barye',
24862486 'pfunc-convert-unit-pressure-atmosphere' => '{{PLURAL:$1|atmosfera|atmosfera}}',
24872487 'pfunc-convert-unit-pressure-torr' => '{{PLURAL:$1|Torr|Torr}}',
2488 - 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1|millimeter raksa|millimeter raksa}}',
 2488+ 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1|milimeter raksa|milimeter raksa}}',
24892489 'pfunc-convert-unit-pressure-inhg' => '{{PLURAL:$1|inci raksa|inci raksa}}',
24902490 'pfunc-convert-unit-pressure-psi' => '{{PLURAL:$1|paun seinci persegi|paun seinci persegi}}',
24912491 'pfunc-convert-unit-pressure-pascal-abbr' => '$2Pa',
@@ -2903,7 +2903,7 @@
29042904 'pfunc-convert-prefix-deca' => 'deka',
29052905 'pfunc-convert-prefix-deci' => 'decy',
29062906 'pfunc-convert-prefix-centi' => 'centy',
2907 - 'pfunc-convert-prefix-milli' => 'milli',
 2907+ 'pfunc-convert-prefix-milli' => 'mili',
29082908 'pfunc-convert-prefix-micro' => 'mikro',
29092909 'pfunc-convert-prefix-nano' => 'nano',
29102910 'pfunc-convert-prefix-pico' => 'piko',
@@ -2945,7 +2945,7 @@
29462946 'pfunc-convert-unit-area-squarekilometre' => '{{PLURAL:$1|kilometr kwadratowy|kilometry kwadratowe|kilometrów kwadratowych}}',
29472947 'pfunc-convert-unit-area-squaremetre' => '{{PLURAL:$1|metr kwadratowy|metry kwadratowe|metrów kwadratowych}}',
29482948 'pfunc-convert-unit-area-squarecentimetre' => '{{PLURAL:$1|centymetr kwadratowy|centymetry kwadratowe|centymetrów kwadratowych}}',
2949 - 'pfunc-convert-unit-area-squaremillimetre' => '{{PLURAL:$1|millimetr kwadratowy|millimetry kwadratowe|millimetrów kwadratowych}}',
 2949+ 'pfunc-convert-unit-area-squaremillimetre' => '{{PLURAL:$1|milimetr kwadratowy|milimetry kwadratowe|milimetrów kwadratowych}}',
29502950 'pfunc-convert-unit-area-hectare' => '{{PLURAL:$1|hektar|hektary|hektarów}}',
29512951 'pfunc-convert-unit-area-squaremile' => '{{PLURAL:$1|mila kwadratowa|mile kwadratowe|mil kwadratowych}}',
29522952 'pfunc-convert-unit-area-acre' => '{{PLURAL:$1|akr|akry|akrów}}',
@@ -2980,11 +2980,11 @@
29812981 'pfunc-convert-unit-time-minute-abbr' => 'min',
29822982 'pfunc-convert-unit-volume-cubicmetre' => '{{PLURAL:$1|metr sześcienny|metry sześcienne|metrów sześciennych}}',
29832983 'pfunc-convert-unit-volume-cubiccentimetre' => '{{PLURAL:$1|centymetr sześcienny|centymetry sześcienne|centymetrów sześciennych}}',
2984 - 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1|millimetr sześcienny|millimetry sześcienne|millimetrów sześciennych}}',
 2984+ 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1|milimetr sześcienny|milimetry sześcienne|milimetrów sześciennych}}',
29852985 'pfunc-convert-unit-volume-kilolitre' => '{{PLURAL:$1|tysiąc litrów|tysiące litrów|tysięcy litrów}}',
29862986 'pfunc-convert-unit-volume-litre' => '{{PLURAL:$1|litr|litry|litrów}}',
29872987 'pfunc-convert-unit-volume-centilitre' => '{{PLURAL:$1|dziesiąta część|dziesiąte części|dziesiątych części}} litra',
2988 - 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1|millilitr|millilitry|millilitrów}}',
 2988+ 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1|mililitr|mililitry|mililitrów}}',
29892989 'pfunc-convert-unit-volume-quart' => '{{PLURAL:$1|jard|jardów}}',
29902990 'pfunc-convert-unit-volume-cubicmetre-abbr' => 'm<sup>3</sup>',
29912991 'pfunc-convert-unit-volume-cubiccentimetre-abbr' => 'cm<sup>3</sup>',
@@ -2997,7 +2997,7 @@
29982998 'pfunc-convert-unit-pressure-millibar' => 'millibarów',
29992999 'pfunc-convert-unit-pressure-kilobarye' => 'kilobarów',
30003000 'pfunc-convert-unit-pressure-atmosphere' => '{{PLURAL:$1|atmosfera|atmosfer}}',
3001 - 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1|millimtr słupka rtęci|millimetrów słupka rtęci}}',
 3001+ 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1|milimtr słupka rtęci|milimetrów słupka rtęci}}',
30023002 'pfunc-convert-unit-pressure-inhg' => '{{PLURAL:$1|cal słupka rtęci|cali słupka rtęci}}',
30033003 'pfunc-convert-unit-pressure-pascal-abbr' => '$2Pa',
30043004 'pfunc-convert-unit-pressure-bar-abbr' => 'bar.',
@@ -3704,7 +3704,7 @@
37053705 'pfunc-convert-prefix-deca' => 'deka',
37063706 'pfunc-convert-prefix-deci' => 'deci',
37073707 'pfunc-convert-prefix-centi' => 'centi',
3708 - 'pfunc-convert-prefix-milli' => 'milli',
 3708+ 'pfunc-convert-prefix-milli' => 'mili',
37093709 'pfunc-convert-prefix-micro' => 'mikro',
37103710 'pfunc-convert-prefix-nano' => 'nano',
37113711 'pfunc-convert-prefix-pico' => 'piko',
@@ -3748,7 +3748,7 @@
37493749 'pfunc-convert-unit-area-squarekilometre' => '{{PLURAL:$1|kvadratni kilometer|kvadratna kilometra|kvadratni kilometri|kvadratnih kilometrov}}',
37503750 'pfunc-convert-unit-area-squaremetre' => '{{PLURAL:$1|kvadratni meter|kvadratna metra|kvadratni metri|kvadratnih metrov}}',
37513751 'pfunc-convert-unit-area-squarecentimetre' => '{{PLURAL:$1|kvadratni centimeter|kvadratna centimetra|kvadratni centimetri|kvadratnih centimetrov}}',
3752 - 'pfunc-convert-unit-area-squaremillimetre' => '{{PLURAL:$1|kvadratni millimeter|kvadratna millimetra|kvadratni millimetri|kvadratnih millimetrov}}',
 3752+ 'pfunc-convert-unit-area-squaremillimetre' => '{{PLURAL:$1|kvadratni milimeter|kvadratna milimetra|kvadratni milimetri|kvadratnih milimetrov}}',
37533753 'pfunc-convert-unit-area-hectare' => '{{PLURAL:$1|hektar|hektara|hektare|hektarov}}',
37543754 'pfunc-convert-unit-area-squaremile' => '{{PLURAL:$1|kvadratna milja|kvadratni milji|kvadratne milje|kvadratnih milj}}',
37553755 'pfunc-convert-unit-area-acre' => '{{PLURAL:$1|aker|akra|akri|akrov}}',
@@ -3783,11 +3783,11 @@
37843784 'pfunc-convert-unit-time-minute-abbr' => 'min',
37853785 'pfunc-convert-unit-volume-cubicmetre' => '{{PLURAL:$1|kubični meter|kubična metra|kubični metri|kubičnih metrov}}',
37863786 'pfunc-convert-unit-volume-cubiccentimetre' => '{{PLURAL:$1|kubični centimeter|kubična centimetra|kubični centimetri|kubičnih centimetrov}}',
3787 - 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1|kubični millimeter|kubična millimetra|kubični millimetri|kubičnih millimetrov}}',
 3787+ 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1|kubični milimeter|kubična milimetra|kubični milimetri|kubičnih milimetrov}}',
37883788 'pfunc-convert-unit-volume-kilolitre' => 'kilo{{PLURAL:$1|liter|litra|litri|litrov}}',
37893789 'pfunc-convert-unit-volume-litre' => '{{PLURAL:$1|liter|litra|litri|litrov}}',
37903790 'pfunc-convert-unit-volume-centilitre' => 'centi{{PLURAL:$1|liter|litra|litri|litrov}}',
3791 - 'pfunc-convert-unit-volume-millilitre' => 'milli{{PLURAL:$1|liter|litra|litri|litrov}}',
 3791+ 'pfunc-convert-unit-volume-millilitre' => 'mili{{PLURAL:$1|liter|litra|litri|litrov}}',
37923792 'pfunc-convert-unit-volume-cubicyard' => '{{PLURAL:$1|kubični jard|kubična jarda|kubični jardi|kubičnih jardov}}',
37933793 'pfunc-convert-unit-volume-cubicfoot' => '{{PLURAL:$1|kubični čevelj|kubična čevlja|kubični čevlji|kubičnih čevljev}}',
37943794 'pfunc-convert-unit-volume-cubicinch' => '{{PLURAL:$1|kubični palec|kubična palca|kubični palci|kubičnih palcev}}',
@@ -3841,12 +3841,12 @@
38423842 'pfunc-convert-unit-pressure-pascal' => '{{PLURAL:$1|paskal|paskala|paskali|paskalov}}',
38433843 'pfunc-convert-unit-pressure-bar' => 'bar',
38443844 'pfunc-convert-unit-pressure-decibar' => 'decibar',
3845 - 'pfunc-convert-unit-pressure-millibar' => 'millibar',
 3845+ 'pfunc-convert-unit-pressure-millibar' => 'milibar',
38463846 'pfunc-convert-unit-pressure-kilobarye' => 'kilobarye',
38473847 'pfunc-convert-unit-pressure-barye' => 'barye',
38483848 'pfunc-convert-unit-pressure-atmosphere' => '{{PLURAL:$1|atmosfera|atmosferi|atmosfere|atmosfer}}',
38493849 'pfunc-convert-unit-pressure-torr' => '{{PLURAL:$1|torr|torra|torri|torrov}}',
3850 - 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1|millimeter|millimetra|millimetri|millimetrov}} živega srebra',
 3850+ 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1|milimeter|milimetra|milimetri|milimetrov}} živega srebra',
38513851 'pfunc-convert-unit-pressure-inhg' => '{{PLURAL:$1|palec|palca|palci|palcev}} živega srebra',
38523852 'pfunc-convert-unit-pressure-psi' => '{{PLURAL:$1|funt|funta|funti|funtov}} na kvadratni palec',
38533853 'pfunc-convert-unit-pressure-pascal-abbr' => 'Pa',
@@ -4426,7 +4426,7 @@
44274427 'pfunc-convert-prefix-deca' => 'đềca',
44284428 'pfunc-convert-prefix-deci' => 'đêxi',
44294429 'pfunc-convert-prefix-centi' => 'xenti',
4430 - 'pfunc-convert-prefix-milli' => 'milli',
 4430+ 'pfunc-convert-prefix-milli' => 'mili',
44314431 'pfunc-convert-prefix-micro' => 'micrô',
44324432 'pfunc-convert-prefix-nano' => 'nanô',
44334433 'pfunc-convert-prefix-pico' => 'picô',
@@ -4503,11 +4503,11 @@
45044504 'pfunc-convert-unit-time-minute-abbr' => 'min',
45054505 'pfunc-convert-unit-volume-cubicmetre' => '{{PLURAL:$1}}mét khối',
45064506 'pfunc-convert-unit-volume-cubiccentimetre' => '{{PLURAL:$1}}xentimét khối',
4507 - 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1}}millimét khối',
 4507+ 'pfunc-convert-unit-volume-cubicmillimetre' => '{{PLURAL:$1}}milimét khối',
45084508 'pfunc-convert-unit-volume-kilolitre' => '{{PLURAL:$1}}kilôlít',
45094509 'pfunc-convert-unit-volume-litre' => '{{PLURAL:$1}}lít',
45104510 'pfunc-convert-unit-volume-centilitre' => '{{PLURAL:$1}}xentilít',
4511 - 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1}}millilít',
 4511+ 'pfunc-convert-unit-volume-millilitre' => '{{PLURAL:$1}}mililít',
45124512 'pfunc-convert-unit-volume-cubicyard' => '{{PLURAL:$1}}yard khối',
45134513 'pfunc-convert-unit-volume-cubicfoot' => '{{PLURAL:$1}}foot khối',
45144514 'pfunc-convert-unit-volume-cubicinch' => '{{PLURAL:$1}}inch khối',
@@ -4561,12 +4561,12 @@
45624562 'pfunc-convert-unit-pressure-pascal' => '{{PLURAL:$1}}$2pascal',
45634563 'pfunc-convert-unit-pressure-bar' => 'ba',
45644564 'pfunc-convert-unit-pressure-decibar' => 'đêxiba',
4565 - 'pfunc-convert-unit-pressure-millibar' => 'milliba',
 4565+ 'pfunc-convert-unit-pressure-millibar' => 'miliba',
45664566 'pfunc-convert-unit-pressure-kilobarye' => 'kilôbarye',
45674567 'pfunc-convert-unit-pressure-barye' => 'barye',
45684568 'pfunc-convert-unit-pressure-atmosphere' => '{{PLURAL:$1}}atmôtphe',
45694569 'pfunc-convert-unit-pressure-torr' => '{{PLURAL:$1}}torr',
4570 - 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1}}millimét thủy ngân',
 4570+ 'pfunc-convert-unit-pressure-mmhg' => '{{PLURAL:$1}}milimét thủy ngân',
45714571 'pfunc-convert-unit-pressure-inhg' => '{{PLURAL:$1}}inch thủy ngân',
45724572 'pfunc-convert-unit-pressure-psi' => '{{PLURAL:$1}}pound một inch vuông',
45734573 'pfunc-convert-unit-pressure-pascal-abbr' => '$2Pa',
Index: branches/REL1_18/extensions/InterwikiIntegration/SpecialInterwikiWatchlist.php
@@ -222,7 +222,8 @@
223223 }
224224
225225 # Show a message about slave lag, if applicable
226 - if( ( $lag = $dbr->getLag() ) > 0 )
 226+ $lag = wfGetLB()->safeGetLag( $dbr );
 227+ if( $lag > 0 )
227228 $wgOut->showLagWarning( $lag );
228229
229230 # Create output form
Index: branches/REL1_18/extensions/CollabWatchlist/includes/SpecialCollabWatchlist.php
@@ -197,7 +197,8 @@
198198 }
199199
200200 # Show a message about slave lag, if applicable
201 - if( ( $lag = $dbr->getLag() ) > 0 )
 201+ $lag = wfGetLB()->safeGetLag( $dbr );
 202+ if ( $lag > 0 )
202203 $wgOut->showLagWarning( $lag );
203204
204205 # Create output form
Index: branches/REL1_18/extensions/CreateRedirect/CreateRedirect.body.php
@@ -125,7 +125,8 @@
126126 }
127127
128128 $resultDetails = false;
129 - $value = $crEdit->internalAttemptSave( $resultDetails, $wgUser->isAllowed( 'bot' ) && $wgRequest->getBool( 'bot', true ) );
 129+ $status = $crEdit->internalAttemptSave( $resultDetails, $wgUser->isAllowed( 'bot' ) && $wgRequest->getBool( 'bot', true ) );
 130+ $value = $status->value;
130131
131132 if ( $value == EditPage::AS_SUCCESS_UPDATE || $value == EditPage::AS_SUCCESS_NEW_ARTICLE ) {
132133 $wgOut->wrapWikiMsg(
Index: branches/REL1_18/phase3/maintenance/language/messages.inc
@@ -1135,7 +1135,6 @@
11361136 'right-userrights',
11371137 'right-userrights-interwiki',
11381138 'right-siteadmin',
1139 - 'right-reset-passwords',
11401139 'right-override-export-depth',
11411140 'right-sendemail',
11421141 ),
Index: branches/REL1_18/phase3/RELEASE-NOTES-1.18
@@ -175,8 +175,11 @@
176176 * (bug 28904) (bug 29773) Update jQuery version from 1.4.4 to 1.6.2 (the latest version)
177177 * (bug 29441) Expose CapitalLinks config in JS to allow modules to properly
178178 handle titles on case-sensitive wikis.
179 -* In MySQL 4.1.9+ with replication enabled, the slave lag should come from
180 - SHOW SLAVE STATUS instead of SHOW PROCESSLIST.
 179+* In MySQL 4.1.9+ with replication enabled, fetch the slave lag from SHOW SLAVE
 180+ STATUS instead of SHOW PROCESSLIST. This ensures that lag is reported
 181+ correctly in the case where there are no write events occurring. Note that
 182+ the DB user now needs to have the REPLICATION CLIENT privilege if you are
 183+ using replication.
181184 * Language codes in $wgDummyLanguageCodes are now excluded on localization
182185 statistics (maintenance/language/transstat.php)
183186 * (bug 29586) Make the (next 200) links on categories link directly to
@@ -435,6 +438,7 @@
436439 * (bug 30264) Changed installer-generated LocalSettings.php to use require_once()
437440 instead require() for included extensions.
438441 * Tracking categories are no longer shown in footer for special pages
 442+* (bug 30684) Fix bad escaping in mw.message for inexistent messages (i.e. <key>)
439443
440444 === API changes in 1.18 ===
441445 * BREAKING CHANGE: action=watch now requires POST and token.
Property changes on: branches/REL1_18/phase3/RELEASE-NOTES-1.18
___________________________________________________________________
Modified: svn:mergeinfo
442446 Merged /trunk/phase3/RELEASE-NOTES-1.18:r95562,95570,95597,95608,95647-95648,95674,95790,95999,96087
443447 Merged /trunk/phase3/RELEASE-NOTES-1.19:r95999
Index: branches/REL1_18/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js
@@ -80,7 +80,7 @@
8181 });
8282
8383 test( 'mw.message & mw.messages', function() {
84 - expect(16);
 84+ expect(17);
8585
8686 ok( mw.messages, 'messages defined' );
8787 ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
@@ -113,12 +113,16 @@
114114 var goodbye = mw.message( 'goodbye' );
115115 strictEqual( goodbye.exists(), false, 'Message.exists returns false for inexisting messages' );
116116
117 - equal( goodbye.toString(), '<goodbye>', 'Message.toString returns <key> if key does not exist' );
 117+ equal( goodbye.plain(), '<goodbye>', 'Message.toString returns plain <key> if format is "plain" and key does not exist' );
 118+ // bug 30684
 119+ equal( goodbye.escaped(), '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if format is "escaped" and key does not exist' );
118120 });
119121
120122 test( 'mw.msg', function() {
121 - expect(2);
 123+ expect(3);
122124
 125+ ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
 126+
123127 equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
124128 equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (inexisting message)' );
125129 });
Property changes on: branches/REL1_18/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js
___________________________________________________________________
Added: svn:mergeinfo
126130 Merged /branches/new-installer/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js:r43664-66004
127131 Merged /branches/REL1_15/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js:r51646
128132 Merged /branches/REL1_17/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js:r81445,81448
129133 Merged /trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.test.js:r95999
130134 Merged /branches/sqlite/tests/qunit/suites/resources/mediawiki/mediawiki.js:r58211-58321
131135 Merged /trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js:r92580,92634,92713,92762,92765,92791,92854,92884,92886-92887,92894,92898,92907,92932,92958,93141,93149,93151,93233-93234,93258,93266,93303,93516-93518,93520,93818-93822,93847,93858,93891,93935-93936,94058,94062,94068,94107,94155,94235,94277,94346,94372,94422,94425,94444,94448,94456,94498,94517,94601,94630,94728,94738,94825,94862,94995-94997,95023,95042,95072-95073,95155,95327,95332,95410,95422,95426,95442,95468,95601,95812
Index: branches/REL1_18/phase3/includes/db/DatabaseMysql.php
@@ -376,9 +376,9 @@
377377 return $this->mFakeSlaveLag;
378378 }
379379
380 - /*if ( version_compare( $this->getServerVersion(), '4.1.9', '>=' ) ) {
 380+ if ( version_compare( $this->getServerVersion(), '4.1.9', '>=' ) ) {
381381 return $this->getLagFromSlaveStatus();
382 - } else */{
 382+ } else {
383383 return $this->getLagFromProcesslist();
384384 }
385385 }
Index: branches/REL1_18/phase3/includes/db/DatabaseOracle.php
@@ -697,11 +697,11 @@
698698 FROM all_sequences asq, all_tab_columns atc
699699 WHERE decode(atc.table_name, '{$this->mTablePrefix}MWUSER', '{$this->mTablePrefix}USER', atc.table_name) || '_' ||
700700 atc.column_name || '_SEQ' = '{$this->mTablePrefix}' || asq.sequence_name
701 - AND asq.sequence_owner = '{$this->mDBname}'
702 - AND atc.owner = '{$this->mDBname}'" );
 701+ AND asq.sequence_owner = upper('{$this->mDBname}')
 702+ AND atc.owner = upper('{$this->mDBname}')" );
703703
704704 while ( ( $row = $result->fetchRow() ) !== false ) {
705 - $this->sequenceData[$this->tableName( $row[1] )] = array(
 705+ $this->sequenceData[$row[1]] = array(
706706 'sequence' => $row[0],
707707 'column' => $row[2]
708708 );
@@ -1172,6 +1172,24 @@
11731173 if ( is_array($conds) ) {
11741174 $conds = $this->wrapConditionsForWhere( $table, $conds );
11751175 }
 1176+ // a hack for deleting pages, users and images (which have non-nullable FKs)
 1177+ // all deletions on these tables have transactions so final failure rollbacks these updates
 1178+ $table = $this->tableName( $table );
 1179+ if ( $table == $this->tableName( 'page' ) ) {
 1180+ $this->update( 'recentchanges', array( 'rc_cur_id' => 0 ), array( 'rc_cur_id' => $conds['page_id'] ), $fname );
 1181+ } elseif ( $table == $this->tableName( 'user' ) ) {
 1182+ $this->update( 'archive', array( 'ar_user' => 0 ), array( 'ar_user' => $conds['user_id'] ), $fname );
 1183+ $this->update( 'ipblocks', array( 'ipb_user' => 0 ), array( 'ipb_user' => $conds['user_id'] ), $fname );
 1184+ $this->update( 'image', array( 'img_user' => 0 ), array( 'img_user' => $conds['user_id'] ), $fname );
 1185+ $this->update( 'oldimage', array( 'oi_user' => 0 ), array( 'oi_user' => $conds['user_id'] ), $fname );
 1186+ $this->update( 'filearchive', array( 'fa_deleted_user' => 0 ), array( 'fa_deleted_user' => $conds['user_id'] ), $fname );
 1187+ $this->update( 'filearchive', array( 'fa_user' => 0 ), array( 'fa_user' => $conds['user_id'] ), $fname );
 1188+ $this->update( 'uploadstash', array( 'us_user' => 0 ), array( 'us_user' => $conds['user_id'] ), $fname );
 1189+ $this->update( 'recentchanges', array( 'rc_user' => 0 ), array( 'rc_user' => $conds['user_id'] ), $fname );
 1190+ $this->update( 'logging', array( 'log_user' => 0 ), array( 'log_user' => $conds['user_id'] ), $fname );
 1191+ } elseif ( $table == $this->tableName( 'image' ) ) {
 1192+ $this->update( 'oldimage', array( 'oi_name' => 0 ), array( 'oi_name' => $conds['img_name'] ), $fname );
 1193+ }
11761194 return parent::delete( $table, $conds, $fname );
11771195 }
11781196
Index: branches/REL1_18/phase3/includes/db/Database.php
@@ -2857,8 +2857,12 @@
28582858 }
28592859
28602860 /**
2861 - * Get slave lag.
2862 - * Currently supported only by MySQL
 2861+ * Get slave lag. Currently supported only by MySQL.
 2862+ *
 2863+ * Note that this function will generate a fatal error on many
 2864+ * installations. Most callers should use LoadBalancer::safeGetLag()
 2865+ * instead.
 2866+ *
28632867 * @return Database replication lag in seconds
28642868 */
28652869 function getLag() {
Property changes on: branches/REL1_18/phase3/includes/db/Database.php
___________________________________________________________________
Modified: svn:mergeinfo
28662870 Merged /trunk/phase3/includes/db/Database.php:r95562,95570,95597,95608,95647-95648,95674,95790,95999,96087
Index: branches/REL1_18/phase3/includes/db/LoadBalancer.php
@@ -928,7 +928,9 @@
929929 /**
930930 * Get the hostname and lag time of the most-lagged slave.
931931 * This is useful for maintenance scripts that need to throttle their updates.
932 - * May attempt to open connections to slaves on the default DB.
 932+ * May attempt to open connections to slaves on the default DB. If there is
 933+ * no lag, the maximum lag will be reported as -1.
 934+ *
933935 * @param $wiki string Wiki ID, or false for the default database
934936 *
935937 * @return array ( host, max lag, index of max lagged host )
@@ -937,23 +939,25 @@
938940 $maxLag = -1;
939941 $host = '';
940942 $maxIndex = 0;
941 - foreach ( $this->mServers as $i => $conn ) {
942 - $conn = false;
943 - if ( $wiki === false ) {
944 - $conn = $this->getAnyOpenConnection( $i );
 943+ if ( $this->getServerCount() > 1 ) { // no replication = no lag
 944+ foreach ( $this->mServers as $i => $conn ) {
 945+ $conn = false;
 946+ if ( $wiki === false ) {
 947+ $conn = $this->getAnyOpenConnection( $i );
 948+ }
 949+ if ( !$conn ) {
 950+ $conn = $this->openConnection( $i, $wiki );
 951+ }
 952+ if ( !$conn ) {
 953+ continue;
 954+ }
 955+ $lag = $conn->getLag();
 956+ if ( $lag > $maxLag ) {
 957+ $maxLag = $lag;
 958+ $host = $this->mServers[$i]['host'];
 959+ $maxIndex = $i;
 960+ }
945961 }
946 - if ( !$conn ) {
947 - $conn = $this->openConnection( $i, $wiki );
948 - }
949 - if ( !$conn ) {
950 - continue;
951 - }
952 - $lag = $conn->getLag();
953 - if ( $lag > $maxLag ) {
954 - $maxLag = $lag;
955 - $host = $this->mServers[$i]['host'];
956 - $maxIndex = $i;
957 - }
958962 }
959963 return array( $host, $maxLag, $maxIndex );
960964 }
@@ -971,12 +975,37 @@
972976 if ( isset( $this->mLagTimes ) ) {
973977 return $this->mLagTimes;
974978 }
975 - # No, send the request to the load monitor
976 - $this->mLagTimes = $this->getLoadMonitor()->getLagTimes( array_keys( $this->mServers ), $wiki );
 979+ if ( $this->getServerCount() == 1 ) {
 980+ # No replication
 981+ $this->mLagTimes = array( 0 => 0 );
 982+ } else {
 983+ # Send the request to the load monitor
 984+ $this->mLagTimes = $this->getLoadMonitor()->getLagTimes(
 985+ array_keys( $this->mServers ), $wiki );
 986+ }
977987 return $this->mLagTimes;
978988 }
979989
980990 /**
 991+ * Get the lag in seconds for a given connection, or zero if this load
 992+ * balancer does not have replication enabled.
 993+ *
 994+ * This should be used in preference to Database::getLag() in cases where
 995+ * replication may not be in use, since there is no way to determine if
 996+ * replication is in use at the connection level without running
 997+ * potentially restricted queries such as SHOW SLAVE STATUS. Using this
 998+ * function instead of Database::getLag() avoids a fatal error in this
 999+ * case on many installations.
 1000+ */
 1001+ function safeGetLag( $conn ) {
 1002+ if ( $this->getServerCount() == 1 ) {
 1003+ return 0;
 1004+ } else {
 1005+ return $conn->getLag();
 1006+ }
 1007+ }
 1008+
 1009+ /**
9811010 * Clear the cache for getLagTimes
9821011 */
9831012 function clearLagTimeCache() {
Property changes on: branches/REL1_18/phase3/includes/db/LoadBalancer.php
___________________________________________________________________
Modified: svn:mergeinfo
9841013 Merged /trunk/phase3/includes/db/LoadBalancer.php:r95562,95570,95597,95608,95647-95648,95674,95790,95999,96087
Index: branches/REL1_18/phase3/includes/db/LoadMonitor.php
@@ -106,6 +106,11 @@
107107 * @return array
108108 */
109109 function getLagTimes( $serverIndexes, $wiki ) {
 110+ if ( count( $serverIndexes ) == 1 && reset( $serverIndexes ) == 0 ) {
 111+ // Single server only, just return zero without caching
 112+ return array( 0 => 0 );
 113+ }
 114+
110115 wfProfileIn( __METHOD__ );
111116 $expiry = 5;
112117 $requestRate = 10;
Index: branches/REL1_18/phase3/includes/EditPage.php
@@ -856,32 +856,42 @@
857857 * @param $result
858858 * @param $bot bool
859859 *
860 - * @return int one of the constants describing the result
 860+ * @return Status object, possibly with a message, but always with one of the AS_* constants in $status->value,
 861+ *
 862+ * FIXME: This interface is TERRIBLE, but hard to get rid of due to various error display idiosyncrasies. There are
 863+ * also lots of cases where error metadata is set in the object and retrieved later instead of being returned, e.g.
 864+ * AS_CONTENT_TOO_BIG and AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some time.
861865 */
862866 function internalAttemptSave( &$result, $bot = false ) {
863867 global $wgFilterCallback, $wgUser, $wgParser;
864868 global $wgMaxArticleSize;
 869+
 870+ $status = Status::newGood();
865871
866872 wfProfileIn( __METHOD__ );
867873 wfProfileIn( __METHOD__ . '-checks' );
868874
869875 if ( !wfRunHooks( 'EditPage::attemptSave', array( $this ) ) ) {
870876 wfDebug( "Hook 'EditPage::attemptSave' aborted article saving\n" );
 877+ $status->fatal( 'hookaborted' );
 878+ $status->value = self::AS_HOOK_ERROR;
871879 wfProfileOut( __METHOD__ . '-checks' );
872880 wfProfileOut( __METHOD__ );
873 - return self::AS_HOOK_ERROR;
 881+ return $status;
874882 }
875883
876884 # Check image redirect
877885 if ( $this->mTitle->getNamespace() == NS_FILE &&
878886 Title::newFromRedirect( $this->textbox1 ) instanceof Title &&
879887 !$wgUser->isAllowed( 'upload' ) ) {
880 - $isAnon = $wgUser->isAnon();
 888+ $code = $wgUser->isAnon() ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED;
 889+ $status->setResult( false, $code );
881890
882891 wfProfileOut( __METHOD__ . '-checks' );
 892+
883893 wfProfileOut( __METHOD__ );
884894
885 - return $isAnon ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED;
 895+ return $status;
886896 }
887897
888898 # Check for spam
@@ -895,71 +905,88 @@
896906 $pdbk = $this->mTitle->getPrefixedDBkey();
897907 $match = str_replace( "\n", '', $match );
898908 wfDebugLog( 'SpamRegex', "$ip spam regex hit [[$pdbk]]: \"$match\"" );
 909+ $status->fatal( 'spamprotectionmatch', $match );
 910+ $status->value = self::AS_SPAM_ERROR;
899911 wfProfileOut( __METHOD__ . '-checks' );
900912 wfProfileOut( __METHOD__ );
901 - return self::AS_SPAM_ERROR;
 913+ return $status;
902914 }
903915 if ( $wgFilterCallback && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section, $this->hookError, $this->summary ) ) {
904916 # Error messages or other handling should be performed by the filter function
 917+ $status->setResult( false, self::AS_FILTERING );
905918 wfProfileOut( __METHOD__ . '-checks' );
906919 wfProfileOut( __METHOD__ );
907 - return self::AS_FILTERING;
 920+ return $status;
908921 }
909922 if ( !wfRunHooks( 'EditFilter', array( $this, $this->textbox1, $this->section, &$this->hookError, $this->summary ) ) ) {
910923 # Error messages etc. could be handled within the hook...
 924+ $status->fatal( 'hookaborted' );
 925+ $status->value = self::AS_HOOK_ERROR;
911926 wfProfileOut( __METHOD__ . '-checks' );
912927 wfProfileOut( __METHOD__ );
913 - return self::AS_HOOK_ERROR;
 928+ return $status;
914929 } elseif ( $this->hookError != '' ) {
915930 # ...or the hook could be expecting us to produce an error
 931+ $status->fatal( 'hookaborted' );
 932+ $status->value = self::AS_HOOK_ERROR_EXPECTED;
916933 wfProfileOut( __METHOD__ . '-checks' );
917934 wfProfileOut( __METHOD__ );
918 - return self::AS_HOOK_ERROR_EXPECTED;
 935+ return $status;
919936 }
920937 if ( $wgUser->isBlockedFrom( $this->mTitle, false ) ) {
921938 # Check block state against master, thus 'false'.
 939+ $status->setResult( false, self::AS_BLOCKED_PAGE_FOR_USER );
922940 wfProfileOut( __METHOD__ . '-checks' );
923941 wfProfileOut( __METHOD__ );
924 - return self::AS_BLOCKED_PAGE_FOR_USER;
 942+ return $status;
925943 }
926944 $this->kblength = (int)( strlen( $this->textbox1 ) / 1024 );
927945 if ( $this->kblength > $wgMaxArticleSize ) {
928946 // Error will be displayed by showEditForm()
929947 $this->tooBig = true;
 948+ $status->setResult( false, self::AS_CONTENT_TOO_BIG );
930949 wfProfileOut( __METHOD__ . '-checks' );
931950 wfProfileOut( __METHOD__ );
932 - return self::AS_CONTENT_TOO_BIG;
 951+ return $status;
933952 }
934953
935954 if ( !$wgUser->isAllowed( 'edit' ) ) {
936955 if ( $wgUser->isAnon() ) {
 956+ $status->setResult( false, self::AS_READ_ONLY_PAGE_ANON );
937957 wfProfileOut( __METHOD__ . '-checks' );
938958 wfProfileOut( __METHOD__ );
939 - return self::AS_READ_ONLY_PAGE_ANON;
 959+ return $status;
940960 } else {
 961+ $status->fatal( 'readonlytext' );
 962+ $status->value = self::AS_READ_ONLY_PAGE_LOGGED;
941963 wfProfileOut( __METHOD__ . '-checks' );
942964 wfProfileOut( __METHOD__ );
943 - return self::AS_READ_ONLY_PAGE_LOGGED;
 965+ return $status;
944966 }
945967 }
946968
947969 if ( wfReadOnly() ) {
 970+ $status->fatal( 'readonlytext' );
 971+ $status->value = self::AS_READ_ONLY_PAGE;
948972 wfProfileOut( __METHOD__ . '-checks' );
949973 wfProfileOut( __METHOD__ );
950 - return self::AS_READ_ONLY_PAGE;
 974+ return $status;
951975 }
952976 if ( $wgUser->pingLimiter() ) {
 977+ $status->fatal( 'actionthrottledtext' );
 978+ $status->value = self::AS_RATE_LIMITED;
953979 wfProfileOut( __METHOD__ . '-checks' );
954980 wfProfileOut( __METHOD__ );
955 - return self::AS_RATE_LIMITED;
 981+ return $status;
956982 }
957983
958984 # If the article has been deleted while editing, don't save it without
959985 # confirmation
960986 if ( $this->wasDeletedSinceLastEdit() && !$this->recreate ) {
 987+ $status->setResult( false, self::AS_ARTICLE_WAS_DELETED );
961988 wfProfileOut( __METHOD__ . '-checks' );
962989 wfProfileOut( __METHOD__ );
963 - return self::AS_ARTICLE_WAS_DELETED;
 990+ return $status;
964991 }
965992
966993 wfProfileOut( __METHOD__ . '-checks' );
@@ -971,34 +998,43 @@
972999 if ( $new ) {
9731000 // Late check for create permission, just in case *PARANOIA*
9741001 if ( !$this->mTitle->userCan( 'create' ) ) {
 1002+ $status->fatal( 'nocreatetext' );
 1003+ $status->value = self::AS_NO_CREATE_PERMISSION;
9751004 wfDebug( __METHOD__ . ": no create permission\n" );
9761005 wfProfileOut( __METHOD__ );
977 - return self::AS_NO_CREATE_PERMISSION;
 1006+ return $status;
9781007 }
9791008
9801009 # Don't save a new article if it's blank.
9811010 if ( $this->textbox1 == '' ) {
 1011+ $status->setResult( false, self::AS_BLANK_ARTICLE );
9821012 wfProfileOut( __METHOD__ );
983 - return self::AS_BLANK_ARTICLE;
 1013+ return $status;
9841014 }
9851015
9861016 // Run post-section-merge edit filter
9871017 if ( !wfRunHooks( 'EditFilterMerged', array( $this, $this->textbox1, &$this->hookError, $this->summary ) ) ) {
9881018 # Error messages etc. could be handled within the hook...
 1019+ $status->fatal( 'hookaborted' );
 1020+ $status->value = self::AS_HOOK_ERROR;
9891021 wfProfileOut( __METHOD__ );
990 - return self::AS_HOOK_ERROR;
 1022+ return $status;
9911023 } elseif ( $this->hookError != '' ) {
9921024 # ...or the hook could be expecting us to produce an error
 1025+ $status->fatal( 'hookaborted' );
 1026+ $status->value = self::AS_HOOK_ERROR_EXPECTED;
9931027 wfProfileOut( __METHOD__ );
994 - return self::AS_HOOK_ERROR_EXPECTED;
 1028+ return $status;
9951029 }
9961030
9971031 # Handle the user preference to force summaries here. Check if it's not a redirect.
9981032 if ( !$this->allowBlankSummary && !Title::newFromRedirect( $this->textbox1 ) ) {
9991033 if ( md5( $this->summary ) == $this->autoSumm ) {
10001034 $this->missingSummary = true;
 1035+ $status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
 1036+ $status->value = self::AS_SUMMARY_NEEDED;
10011037 wfProfileOut( __METHOD__ );
1002 - return self::AS_SUMMARY_NEEDED;
 1038+ return $status;
10031039 }
10041040 }
10051041
@@ -1007,7 +1043,7 @@
10081044 $text = wfMsgForContent( 'newsectionheaderdefaultlevel', $this->summary ) . "\n\n" . $text;
10091045 }
10101046
1011 - $retval = self::AS_SUCCESS_NEW_ARTICLE;
 1047+ $status->value = self::AS_SUCCESS_NEW_ARTICLE;
10121048
10131049 } else {
10141050
@@ -1067,8 +1103,9 @@
10681104 }
10691105
10701106 if ( $this->isConflict ) {
 1107+ $status->setResult( false, self::AS_CONFLICT_DETECTED );
10711108 wfProfileOut( __METHOD__ );
1072 - return self::AS_CONFLICT_DETECTED;
 1109+ return $status;
10731110 }
10741111
10751112 $oldtext = $this->mArticle->getContent();
@@ -1076,12 +1113,16 @@
10771114 // Run post-section-merge edit filter
10781115 if ( !wfRunHooks( 'EditFilterMerged', array( $this, $text, &$this->hookError, $this->summary ) ) ) {
10791116 # Error messages etc. could be handled within the hook...
 1117+ $status->fatal( 'hookaborted' );
 1118+ $status->value = self::AS_HOOK_ERROR;
10801119 wfProfileOut( __METHOD__ );
1081 - return self::AS_HOOK_ERROR;
 1120+ return $status;
10821121 } elseif ( $this->hookError != '' ) {
10831122 # ...or the hook could be expecting us to produce an error
 1123+ $status->fatal( 'hookaborted' );
 1124+ $status->value = self::AS_HOOK_ERROR_EXPECTED;
10841125 wfProfileOut( __METHOD__ );
1085 - return self::AS_HOOK_ERROR_EXPECTED;
 1126+ return $status;
10861127 }
10871128
10881129 # Handle the user preference to force summaries here, but not for null edits
@@ -1099,8 +1140,10 @@
11001141 if ( $this->section == 'new' && !$this->allowBlankSummary ) {
11011142 if ( trim( $this->summary ) == '' ) {
11021143 $this->missingSummary = true;
 1144+ $status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
 1145+ $status->value = self::AS_SUMMARY_NEEDED;
11031146 wfProfileOut( __METHOD__ );
1104 - return self::AS_SUMMARY_NEEDED;
 1147+ return $status;
11051148 }
11061149 }
11071150
@@ -1110,9 +1153,11 @@
11111154 if ( $this->section == 'new' ) {
11121155 if ( $this->textbox1 == '' ) {
11131156 $this->missingComment = true;
 1157+ $status->fatal( 'missingcommenttext' );
 1158+ $status->value = self::AS_TEXTBOX_EMPTY;
11141159 wfProfileOut( __METHOD__ . '-sectionanchor' );
11151160 wfProfileOut( __METHOD__ );
1116 - return self::AS_TEXTBOX_EMPTY;
 1161+ return $status;
11171162 }
11181163 if ( $this->summary != '' ) {
11191164 $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
@@ -1142,15 +1187,16 @@
11431188 $this->textbox1 = $text;
11441189 $this->section = '';
11451190
1146 - $retval = self::AS_SUCCESS_UPDATE;
 1191+ $status->value = self::AS_SUCCESS_UPDATE;
11471192 }
11481193
11491194 // Check for length errors again now that the section is merged in
11501195 $this->kblength = (int)( strlen( $text ) / 1024 );
11511196 if ( $this->kblength > $wgMaxArticleSize ) {
11521197 $this->tooBig = true;
 1198+ $status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED );
11531199 wfProfileOut( __METHOD__ );
1154 - return self::AS_MAX_ARTICLE_SIZE_EXCEEDED;
 1200+ return $status;
11551201 }
11561202
11571203 $flags = EDIT_DEFER_UPDATES | EDIT_AUTOSUMMARY |
@@ -1158,17 +1204,18 @@
11591205 ( ( $this->minoredit && !$this->isNew ) ? EDIT_MINOR : 0 ) |
11601206 ( $bot ? EDIT_FORCE_BOT : 0 );
11611207
1162 - $status = $this->mArticle->doEdit( $text, $this->summary, $flags );
 1208+ $doEditStatus = $this->mArticle->doEdit( $text, $this->summary, $flags );
11631209
1164 - if ( $status->isOK() ) {
 1210+ if ( $doEditStatus->isOK() ) {
11651211 $result['redirect'] = Title::newFromRedirect( $text ) !== null;
11661212 $this->commitWatch();
11671213 wfProfileOut( __METHOD__ );
1168 - return $retval;
 1214+ return $status;
11691215 } else {
11701216 $this->isConflict = true;
 1217+ $doEditStatus->value = self::AS_END; // Destroys data doEdit() put in $status->value but who cares
11711218 wfProfileOut( __METHOD__ );
1172 - return self::AS_END;
 1219+ return $doEditStatus;
11731220 }
11741221 }
11751222
@@ -2803,13 +2850,14 @@
28042851 $resultDetails = false;
28052852 # Allow bots to exempt some edits from bot flagging
28062853 $bot = $wgUser->isAllowed( 'bot' ) && $this->bot;
2807 - $value = $this->internalAttemptSave( $resultDetails, $bot );
 2854+ $status = $this->internalAttemptSave( $resultDetails, $bot );
 2855+ // FIXME: once the interface for internalAttemptSave() is made nicer, this should use the message in $status
28082856
2809 - if ( $value == self::AS_SUCCESS_UPDATE || $value == self::AS_SUCCESS_NEW_ARTICLE ) {
 2857+ if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) {
28102858 $this->didSave = true;
28112859 }
28122860
2813 - switch ( $value ) {
 2861+ switch ( $status->value ) {
28142862 case self::AS_HOOK_ERROR_EXPECTED:
28152863 case self::AS_CONTENT_TOO_BIG:
28162864 case self::AS_ARTICLE_WAS_DELETED:
Property changes on: branches/REL1_18/phase3/includes/EditPage.php
___________________________________________________________________
Modified: svn:mergeinfo
28172865 Merged /trunk/phase3/includes/EditPage.php:r95562,95570,95597,95608,95647-95648,95674,95790,95999,96087
Index: branches/REL1_18/phase3/includes/api/ApiEditPage.php
@@ -270,11 +270,11 @@
271271 $oldRequest = $wgRequest;
272272 $wgRequest = $req;
273273
274 - $retval = $ep->internalAttemptSave( $result, $wgUser->isAllowed( 'bot' ) && $params['bot'] );
 274+ $status = $ep->internalAttemptSave( $result, $wgUser->isAllowed( 'bot' ) && $params['bot'] );
275275 $wgRequest = $oldRequest;
276276 global $wgMaxArticleSize;
277277
278 - switch( $retval ) {
 278+ switch( $status->value ) {
279279 case EditPage::AS_HOOK_ERROR:
280280 case EditPage::AS_HOOK_ERROR_EXPECTED:
281281 $this->dieUsageMsg( 'hookaborted' );
@@ -353,15 +353,12 @@
354354 $this->dieUsageMsg( 'summaryrequired' );
355355
356356 case EditPage::AS_END:
357 - // This usually means some kind of race condition
358 - // or DB weirdness occurred. Fall through to throw an unknown
359 - // error.
360 -
361 - // This needs fixing higher up, as EditPage::internalAttemptSave
362 - // should return the Status object, so that specific error
363 - // conditions can be returned
 357+ // $status came from WikiPage::doEdit()
 358+ $errors = $status->getErrorsArray();
 359+ $this->dieUsageMsg( $errors[0] ); // TODO: Add new errors to message map
 360+ break;
364361 default:
365 - $this->dieUsageMsg( array( 'unknownerror', $retval ) );
 362+ $this->dieUsageMsg( array( 'unknownerror', $status->value ) );
366363 }
367364 $apiResult->addValue( null, $this->getModuleName(), $r );
368365 }
Index: branches/REL1_18/phase3/includes/api/ApiBase.php
@@ -1164,6 +1164,12 @@
11651165 'emptynewsection' => array( 'code' => 'emptynewsection', 'info' => 'Creating empty new sections is not possible.' ),
11661166 'revwrongpage' => array( 'code' => 'revwrongpage', 'info' => "r\$1 is not a revision of ``\$2''" ),
11671167 'undo-failure' => array( 'code' => 'undofailure', 'info' => 'Undo failed due to conflicting intermediate edits' ),
 1168+
 1169+ // Messages from WikiPage::doEit()
 1170+ 'edit-hook-aborted' => array( 'code' => 'edit-hook-aborted', 'info' => "Your edit was aborted by an ArticleSave hook" ),
 1171+ 'edit-gone-missing' => array( 'code' => 'edit-gone-missing', 'info' => "The page you tried to edit doesn't seem to exist anymore" ),
 1172+ 'edit-conflict' => array( 'code' => 'editconflict', 'info' => "Edit conflict detected" ),
 1173+ 'edit-already-exists' => array( 'code' => 'edit-already-exists', 'info' => "It seems the page you tried to create already exist" ),
11681174
11691175 // uploadMsgs
11701176 'invalid-session-key' => array( 'code' => 'invalid-session-key', 'info' => 'Not a valid session key' ),
Index: branches/REL1_18/phase3/includes/specials/SpecialEditWatchlist.php
@@ -150,7 +150,7 @@
151151 }
152152 } else {
153153 $this->clearWatchlist();
154 - $this->getLang()->invalidateCache();
 154+ $this->getUser()->invalidateCache();
155155 $this->successMessage .= wfMessage(
156156 'watchlistedit-raw-removed',
157157 $this->getLang()->formatNum( count( $current ) )
Index: branches/REL1_18/phase3/includes/specials/SpecialContributions.php
@@ -172,7 +172,8 @@
173173 $wgOut->addWikiMsg( 'nocontribs', $target );
174174 } else {
175175 # Show a message about slave lag, if applicable
176 - if( ( $lag = $pager->getDatabase()->getLag() ) > 0 )
 176+ $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
 177+ if( $lag > 0 )
177178 $wgOut->showLagWarning( $lag );
178179
179180 $wgOut->addHTML(
Index: branches/REL1_18/phase3/includes/specials/SpecialDeletedContributions.php
@@ -326,7 +326,8 @@
327327 }
328328
329329 # Show a message about slave lag, if applicable
330 - if( ( $lag = $pager->getDatabase()->getLag() ) > 0 )
 330+ $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
 331+ if( $lag > 0 )
331332 $wgOut->showLagWarning( $lag );
332333
333334 $wgOut->addHTML(
Index: branches/REL1_18/phase3/includes/specials/SpecialWatchlist.php
@@ -240,7 +240,7 @@
241241 }
242242
243243 # Show a message about slave lag, if applicable
244 - $lag = $dbr->getLag();
 244+ $lag = wfGetLB()->safeGetLag( $dbr );
245245 if( $lag > 0 ) {
246246 $output->showLagWarning( $lag );
247247 }
Index: branches/REL1_18/phase3/languages/messages/MessagesEn.php
@@ -1965,7 +1965,6 @@
19661966 'right-userrights' => 'Edit all user rights',
19671967 'right-userrights-interwiki' => 'Edit user rights of users on other wikis',
19681968 'right-siteadmin' => 'Lock and unlock the database',
1969 -'right-reset-passwords' => "Reset other users' passwords",
19701969 'right-override-export-depth' => 'Export pages including linked pages up to a depth of 5',
19711970 'right-sendemail' => 'Send e-mail to other users',
19721971
Index: branches/REL1_18/phase3/resources/mediawiki/mediawiki.js
@@ -144,7 +144,11 @@
145145 */
146146 Message.prototype.toString = function() {
147147 if ( !this.map.exists( this.key ) ) {
148 - // Return <key> if key does not exist
 148+ // Use <key> as text if key does not exist
 149+ if ( this.format !== 'plain' ) {
 150+ // format 'escape' and 'parse' need to have the brackets and key html escaped
 151+ return mw.html.escape( '<' + this.key + '>' );
 152+ }
149153 return '<' + this.key + '>';
150154 }
151155 var text = this.map.get( this.key );

Past revisions this follows-up on

RevisionCommit summaryAuthorDate
r95562(bug 29246) Edit API occasionally throws "unknown error 231". Per comment #1 ...catrope16:26, 26 August 2011
r95570Follow-up r95525: restore some translations of "mili" that were actually corr...happy-melon19:06, 26 August 2011
r95597Remove a message for a feature introduced with r47569 and reverted with r48780.raymond11:01, 27 August 2011
r95608Per Nikerabbit, fix for r92231: this was the wrong objectialex20:59, 27 August 2011
r95647* Fix for r90643: in the case where there is only one server, implying no rep...tstarling04:42, 29 August 2011
r95648Further updates for r90643/r95647 in core and extensions. Fixed all callers o...tstarling05:04, 29 August 2011
r95674Followup r95562: update callers to internalAttemptSave() in extensions. Thank...catrope16:06, 29 August 2011
r95790(bug 30611) Improve WikiEditor localization for Arabic script languages. Patc...siebrand16:22, 30 August 2011
r95999Fix bad escaping in mw.message for inexistent messages (bug 30684)...krinkle15:28, 1 September 2011
r96087* resolved some issues with sequences and deleting of rows on referenced tablesfreakolowsky10:42, 2 September 2011

Status & tagging log