r96856 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r96855‎ | r96856 | r96857 >
Date:15:35, 12 September 2011
Author:reedy
Status:resolved
Tags:
Comment:
1.17wmf1: MFT r94212, r96373, r96386, r96389, r96420, r96645

Skipped tests and RELEASE-NOTES
Modified paths:
  • /branches/wmf/1.17wmf1/includes/IP.php (modified) (history)
  • /branches/wmf/1.17wmf1/includes/Linker.php (modified) (history)
  • /branches/wmf/1.17wmf1/includes/filerepo/File.php (modified) (history)
  • /branches/wmf/1.17wmf1/includes/filerepo/LocalFile.php (modified) (history)
  • /branches/wmf/1.17wmf1/includes/objectcache/BagOStuff.php (modified) (history)
  • /branches/wmf/1.17wmf1/includes/objectcache/MultiWriteBagOStuff.php (modified) (history)
  • /branches/wmf/1.17wmf1/includes/objectcache/SqlBagOStuff.php (modified) (history)
  • /branches/wmf/1.17wmf1/languages/messages/MessagesEn.php (modified) (history)
  • /branches/wmf/1.17wmf1/languages/messages/MessagesQqq.php (modified) (history)
  • /branches/wmf/1.17wmf1/maintenance/language/messages.inc (modified) (history)
  • /branches/wmf/1.17wmf1/maintenance/purgeParserCache.php (added) (history)

Diff [purge]

Index: branches/wmf/1.17wmf1/maintenance/language/messages.inc
@@ -2024,6 +2024,7 @@
20252025 'unblocklink',
20262026 'change-blocklink',
20272027 'contribslink',
 2028+ 'emaillink',
20282029 'autoblocker',
20292030 'blocklogpage',
20302031 'blocklog-showlog',
Index: branches/wmf/1.17wmf1/maintenance/purgeParserCache.php
@@ -0,0 +1,43 @@
 2+<?php
 3+
 4+require( dirname( __FILE__ ) . '/Maintenance.php' );
 5+
 6+class PurgeParserCache extends Maintenance {
 7+ function __construct() {
 8+ parent::__construct();
 9+ $this->addDescription( "Remove old objects from the parser cache. " .
 10+ "This only works when the parser cache is in an SQL database." );
 11+ $this->addOption( 'expiredate', 'Delete objects expiring before this date.', false, true );
 12+ $this->addOption( 'age',
 13+ 'Delete objects created more than this many seconds ago, assuming $wgParserCacheExpireTime '.
 14+ 'has been consistent.',
 15+ false, true );
 16+ }
 17+
 18+ function execute() {
 19+ $inputDate = $this->getOption( 'expiredate' );
 20+ $inputAge = $this->getOption( 'age' );
 21+ if ( $inputDate !== null ) {
 22+ $date = wfTimestamp( TS_MW, strtotime( $inputDate ) );
 23+ } elseif ( $inputAge !== null ) {
 24+ global $wgParserCacheExpireTime;
 25+ $date = wfTimestamp( TS_MW, time() + $wgParserCacheExpireTime - intval( $inputAge ) );
 26+ } else {
 27+ echo "Must specify either --expiredate or --age\n";
 28+ exit( 1 );
 29+ }
 30+
 31+ $english = Language::factory( 'en' );
 32+ echo "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n";
 33+
 34+ $pc = wfGetParserCacheStorage();
 35+ $success = $pc->deleteObjectsExpiringBefore( $date );
 36+ if ( !$success ) {
 37+ echo "Cannot purge this kind of parser cache.\n";
 38+ exit( 1 );
 39+ }
 40+ echo "Done\n";
 41+ }
 42+}
 43+$maintClass = 'PurgeParserCache';
 44+require_once( RUN_MAINTENANCE_IF_MAIN );
Property changes on: branches/wmf/1.17wmf1/maintenance/purgeParserCache.php
___________________________________________________________________
Added: svn:eol-style
145 + native
Index: branches/wmf/1.17wmf1/includes/objectcache/BagOStuff.php
@@ -86,6 +86,16 @@
8787 return array();
8888 }
8989
 90+ /**
 91+ * Delete all objects expiring before a certain date.
 92+ *
 93+ * @return true on success, false if unimplemented
 94+ */
 95+ public function deleteObjectsExpiringBefore( $date ) {
 96+ // stub
 97+ return false;
 98+ }
 99+
90100 /* *** Emulated functions *** */
91101
92102 public function add( $key, $value, $exptime = 0 ) {
Index: branches/wmf/1.17wmf1/includes/objectcache/SqlBagOStuff.php
@@ -287,21 +287,29 @@
288288 }
289289
290290 public function expireAll() {
 291+ $this->deleteObjectsExpiringBefore( wfTimestampNow() );
 292+ }
 293+
 294+ /**
 295+ * Delete objects from the database which expire before a certain date.
 296+ */
 297+ public function deleteObjectsExpiringBefore( $timestamp ) {
291298 $db = $this->getDB();
292 - $now = $db->timestamp();
 299+ $dbTimestamp = $db->timestamp( $timestamp );
293300
294301 try {
295302 for ( $i = 0; $i < $this->shards; $i++ ) {
296303 $db->begin();
297304 $db->delete(
298305 $this->getTableByShard( $i ),
299 - array( 'exptime < ' . $db->addQuotes( $now ) ),
 306+ array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) ),
300307 __METHOD__ );
301308 $db->commit();
302309 }
303310 } catch ( DBQueryError $e ) {
304311 $this->handleWriteError( $e );
305312 }
 313+ return true;
306314 }
307315
308316 public function deleteAll() {
Property changes on: branches/wmf/1.17wmf1/includes/objectcache/SqlBagOStuff.php
___________________________________________________________________
Modified: svn:mergeinfo
309317 Merged /trunk/phase3/includes/objectcache/SqlBagOStuff.php:r94212,96373,96386,96399,96420,96645
Index: branches/wmf/1.17wmf1/includes/objectcache/MultiWriteBagOStuff.php
@@ -87,9 +87,25 @@
8888 array_shift( $args );
8989
9090 foreach ( $this->caches as $cache ) {
91 - $ret = $ret && call_user_func_array( array( $cache, $method ), $args );
 91+ if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
 92+ $ret = false;
 93+ }
9294 }
9395 return $ret;
9496 }
9597
 98+ /**
 99+ * Delete objects expiring before a certain date.
 100+ *
 101+ * Succeed if any of the child caches succeed.
 102+ */
 103+ public function deleteObjectsExpiringBefore( $date ) {
 104+ $ret = false;
 105+ foreach ( $this->caches as $cache ) {
 106+ if ( $cache->deleteObjectsExpiringBefore( $date ) ) {
 107+ $ret = true;
 108+ }
 109+ }
 110+ return $ret;
 111+ }
96112 }
Index: branches/wmf/1.17wmf1/includes/Linker.php
@@ -14,6 +14,7 @@
1515 * Flags for userToolLinks()
1616 */
1717 const TOOL_LINKS_NOBLOCK = 1;
 18+ const TOOL_LINKS_EMAIL = 2;
1819
1920 function __construct() {}
2021
@@ -852,7 +853,7 @@
853854 * @param $userText String: user name or IP address
854855 * @param $redContribsWhenNoEdits Boolean: should the contributions link be
855856 * red if the user has no edits?
856 - * @param $flags Integer: customisation flags (e.g. self::TOOL_LINKS_NOBLOCK)
 857+ * @param $flags Integer: customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
857858 * @param $edits Integer: user edit count (optional, for performance)
858859 * @return String: HTML fragment
859860 */
@@ -860,6 +861,7 @@
861862 global $wgUser, $wgDisableAnonTalk, $wgSysopUserBans, $wgLang;
862863 $talkable = !( $wgDisableAnonTalk && 0 == $userId );
863864 $blockable = ( $wgSysopUserBans || 0 == $userId ) && !$flags & self::TOOL_LINKS_NOBLOCK;
 865+ $addEmailLink = $flags & self::TOOL_LINKS_EMAIL;
864866
865867 $items = array();
866868 if ( $talkable ) {
@@ -882,6 +884,10 @@
883885 $items[] = $this->blockLink( $userId, $userText );
884886 }
885887
 888+ if ( $addEmailLink && $wgUser->canSendEmail() ) {
 889+ $items[] = self::emailLink( $userId, $userText );
 890+ }
 891+
886892 if ( $items ) {
887893 return ' <span class="mw-usertoollinks">(' . $wgLang->pipeList( $items ) . ')</span>';
888894 } else {
@@ -925,6 +931,18 @@
926932 }
927933
928934 /**
 935+ * @param $userId Integer: userid
 936+ * @param $userText String: user name in database.
 937+ * @return String: HTML fragment with e-mail user link
 938+ * @private
 939+ */
 940+ static function emailLink( $userId, $userText ) {
 941+ $emailPage = SpecialPage::getTitleFor( 'EmailUser', $userText );
 942+ $emailLink = self::link( $emailPage, wfMsgHtml( 'emaillink' ) );
 943+ return $emailLink;
 944+ }
 945+
 946+ /**
929947 * Generate a user link if the current user is allowed to view it
930948 * @param $rev Revision object.
931949 * @param $isPublic Boolean: show only if all users can see it
Index: branches/wmf/1.17wmf1/includes/filerepo/LocalFile.php
@@ -591,12 +591,19 @@
592592
593593 /**
594594 * Get all thumbnail names previously generated for this file
 595+ * @param $archiveName string|false Name of an archive file
 596+ * @return array first element is the base dir, then files in that base dir.
595597 */
596 - function getThumbnails() {
 598+ function getThumbnails( $archiveName = false ) {
597599 $this->load();
598600
 601+ if ( $archiveName ) {
 602+ $dir = $this->getArchiveThumbPath( $archiveName );
 603+ } else {
 604+ $dir = $this->getThumbPath();
 605+ }
599606 $files = array();
600 - $dir = $this->getThumbPath();
 607+ $files[] = $dir;
601608
602609 if ( is_dir( $dir ) ) {
603610 $handle = opendir( $dir );
@@ -633,6 +640,11 @@
634641 $hashedName = md5( $this->getName() );
635642 $oldKey = $this->repo->getSharedCacheKey( 'oldfile', $hashedName );
636643
 644+ // Must purge thumbnails for old versions too! bug 30192
 645+ foreach( $this->getHistory() as $oldFile ) {
 646+ $oldFile->purgeThumbnails();
 647+ }
 648+
637649 if ( $oldKey ) {
638650 $wgMemc->delete( $oldKey );
639651 }
@@ -653,32 +665,74 @@
654666 }
655667
656668 /**
657 - * Delete cached transformed files
 669+ * Delete cached transformed files for archived files
 670+ * @param $archiveName string name of the archived file
658671 */
 672+ function purgeOldThumbnails( $archiveName ) {
 673+ global $wgUseSquid;
 674+ // get a list of old thumbnails and URLs
 675+ $files = $this->getThumbnails( $archiveName );
 676+ $dir = array_shift( $files );
 677+ $this->purgeThumbList( $dir, $files );
 678+
 679+ // Directory should be empty, delete it too. This will probably suck on
 680+ // something like NFS or if the directory isn't actually empty, so hide
 681+ // the warnings :D
 682+ wfSuppressWarnings();
 683+ if( !rmdir( $dir ) ) {
 684+ wfDebug( __METHOD__ . ": unable to remove archive directory: $dir\n" );
 685+ }
 686+ wfRestoreWarnings();
 687+
 688+ // Purge the squid
 689+ if ( $wgUseSquid ) {
 690+ $urls = array();
 691+ foreach( $files as $file ) {
 692+ $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
 693+ }
 694+ SquidUpdate::purge( $urls );
 695+ }
 696+ }
 697+
 698+
 699+ /**
 700+ * Delete cached transformed files for the current version only.
 701+ */
659702 function purgeThumbnails() {
660703 global $wgUseSquid;
661 -
662 - // Delete thumbnails
 704+ // get a list of thumbnails and URLs
663705 $files = $this->getThumbnails();
664 - $dir = $this->getThumbPath();
665 - $urls = array();
 706+ $dir = array_shift( $files );
 707+ $this->purgeThumbList( $dir, $files );
666708
 709+ // Purge the squid
 710+ if ( $wgUseSquid ) {
 711+ $urls = array();
 712+ foreach( $files as $file ) {
 713+ $urls[] = $this->getThumbUrl( $file );
 714+ }
 715+ SquidUpdate::purge( $urls );
 716+ }
 717+ }
 718+
 719+ /**
 720+ * Delete a list of thumbnails visible at urls
 721+ * @param $dir string base dir of the files.
 722+ * @param $files array of strings: relative filenames (to $dir)
 723+ */
 724+ function purgeThumbList($dir, $files) {
 725+ global $wgExcludeFromThumbnailPurge;
 726+
 727+ wfDebug( __METHOD__ . ": " . var_export( $files, true ) . "\n" );
667728 foreach ( $files as $file ) {
668729 # Check that the base file name is part of the thumb name
669730 # This is a basic sanity check to avoid erasing unrelated directories
670731 if ( strpos( $file, $this->getName() ) !== false ) {
671 - $url = $this->getThumbUrl( $file );
672 - $urls[] = $url;
673732 wfSuppressWarnings();
674733 unlink( "$dir/$file" );
675734 wfRestoreWarnings();
676735 }
677736 }
678 -
679 - // Purge the squid
680 - if ( $wgUseSquid ) {
681 - SquidUpdate::purge( $urls );
682 - }
683737 }
684738
685739 /** purgeDescription inherited */
@@ -1134,6 +1188,7 @@
11351189 array( 'oi_name' => $this->getName() ) );
11361190 foreach ( $result as $row ) {
11371191 $batch->addOld( $row->oi_archive_name );
 1192+ $this->purgeOldThumbnails( $row->oi_archive_name );
11381193 }
11391194 $status = $batch->execute();
11401195
@@ -1168,6 +1223,7 @@
11691224
11701225 $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
11711226 $batch->addOld( $archiveName );
 1227+ $this->purgeOldThumbnails( $archiveName );
11721228 $status = $batch->execute();
11731229
11741230 $this->unlock();
Property changes on: branches/wmf/1.17wmf1/includes/filerepo/LocalFile.php
___________________________________________________________________
Modified: svn:mergeinfo
11751231 Merged /trunk/phase3/includes/filerepo/LocalFile.php:r94212,96373,96386,96399,96420,96645
Index: branches/wmf/1.17wmf1/includes/filerepo/File.php
@@ -766,7 +766,13 @@
767767 return $this->getHashPath() . rawurlencode( $this->getName() );
768768 }
769769
770 - /** Get the relative path for an archive file */
 770+ /**
 771+ * Get the relative path for an archived file
 772+ *
 773+ * @param $suffix bool|string if not false, the name of an archived thumbnail file
 774+ *
 775+ * @return string
 776+ */
771777 function getArchiveRel( $suffix = false ) {
772778 $path = 'archive/' . $this->getHashPath();
773779 if ( $suffix === false ) {
@@ -777,12 +783,53 @@
778784 return $path;
779785 }
780786
781 - /** Get the path of the archive directory, or a particular file if $suffix is specified */
 787+ /**
 788+ * Get the relative path for an archived file's thumbs directory
 789+ * or a specific thumb if the $suffix is given.
 790+ *
 791+ * @param $archiveName string the timestamped name of an archived image
 792+ * @param $suffix bool|string if not false, the name of a thumbnail file
 793+ */
 794+ function getArchiveThumbRel( $archiveName, $suffix = false ) {
 795+ $path = 'archive/' . $this->getHashPath() . $archiveName . "/";
 796+ if ( $suffix === false ) {
 797+ $path = substr( $path, 0, -1 );
 798+ } else {
 799+ $path .= $suffix;
 800+ }
 801+ return $path;
 802+ }
 803+
 804+ /**
 805+ * Get the path of the archive directory, or a particular file if $suffix is specified */
 806+ *
 807+ * @param $suffix bool|string if not false, the name of an archived file.
 808+ *
 809+ * @return string
 810+ */
782811 function getArchivePath( $suffix = false ) {
783 - return $this->repo->getZonePath('public') . '/' . $this->getArchiveRel( $suffix );
 812+ return $this->repo->getZonePath( 'public' ) . '/' . $this->getArchiveRel( $suffix );
784813 }
785814
786 - /** Get the path of the thumbnail directory, or a particular file if $suffix is specified */
 815+ /**
 816+ * Get the path of the archived file's thumbs, or a particular thumb if $suffix is specified
 817+ *
 818+ * @param $archiveName string the timestamped name of an archived image
 819+ * @param $suffix bool|string if not false, the name of a thumbnail file
 820+ *
 821+ * @return string
 822+ */
 823+ function getArchiveThumbPath( $archiveName, $suffix = false ) {
 824+ return $this->repo->getZonePath( 'thumb' ) . '/' . $this->getArchiveThumbRel( $archiveName, $suffix );
 825+ }
 826+
 827+ /**
 828+ * Get the path of the thumbnail directory, or a particular file if $suffix is specified
 829+ *
 830+ * @param $suffix bool|string if not false, the name of a thumbnail file
 831+ *
 832+ * @return string
 833+ */
787834 function getThumbPath( $suffix = false ) {
788835 $path = $this->repo->getZonePath('thumb') . '/' . $this->getRel();
789836 if ( $suffix !== false ) {
@@ -791,7 +838,13 @@
792839 return $path;
793840 }
794841
795 - /** Get the URL of the archive directory, or a particular file if $suffix is specified */
 842+ /**
 843+ * Get the URL of the archive directory, or a particular file if $suffix is specified
 844+ *
 845+ * @param $suffix bool|string if not false, the name of an archived file
 846+ *
 847+ * @return string
 848+ */
796849 function getArchiveUrl( $suffix = false ) {
797850 $path = $this->repo->getZoneUrl('public') . '/archive/' . $this->getHashPath();
798851 if ( $suffix === false ) {
@@ -802,7 +855,31 @@
803856 return $path;
804857 }
805858
806 - /** Get the URL of the thumbnail directory, or a particular file if $suffix is specified */
 859+ /**
 860+ * Get the URL of the archived file's thumbs, or a particular thumb if $suffix is specified
 861+ *
 862+ * @param $archiveName string the timestamped name of an archived image
 863+ * @param $suffix bool|string if not false, the name of a thumbnail file
 864+ *
 865+ * @return string
 866+ */
 867+ function getArchiveThumbUrl( $archiveName, $suffix = false ) {
 868+ $path = $this->repo->getZoneUrl('thumb') . '/archive/' . $this->getHashPath() . rawurlencode( $archiveName ) . "/";
 869+ if ( $suffix === false ) {
 870+ $path = substr( $path, 0, -1 );
 871+ } else {
 872+ $path .= rawurlencode( $suffix );
 873+ }
 874+ return $path;
 875+ }
 876+
 877+ /**
 878+ * Get the URL of the thumbnail directory, or a particular file if $suffix is specified
 879+ *
 880+ * @param $suffix bool|string if not false, the name of a thumbnail file
 881+ *
 882+ * @return path
 883+ */
807884 function getThumbUrl( $suffix = false ) {
808885 $path = $this->repo->getZoneUrl('thumb') . '/' . $this->getUrlRel();
809886 if ( $suffix !== false ) {
@@ -812,6 +889,13 @@
813890 }
814891
815892 /** Get the virtual URL for an archive file or directory */
 893+ /**
 894+ * Get the virtual URL for an archived file's thumbs, or a specific thumb.
 895+ *
 896+ * @param $suffix bool|string if not false, the name of a thumbnail file
 897+ *
 898+ * @return string
 899+ */
816900 function getArchiveVirtualUrl( $suffix = false ) {
817901 $path = $this->repo->getVirtualUrl() . '/public/archive/' . $this->getHashPath();
818902 if ( $suffix === false ) {
@@ -822,7 +906,13 @@
823907 return $path;
824908 }
825909
826 - /** Get the virtual URL for a thumbnail file or directory */
 910+ /**
 911+ * Get the virtual URL for a thumbnail file or directory
 912+ *
 913+ * @param $suffix bool|string if not false, the name of a thumbnail file
 914+ *
 915+ * @return string
 916+ */
827917 function getThumbVirtualUrl( $suffix = false ) {
828918 $path = $this->repo->getVirtualUrl() . '/thumb/' . $this->getUrlRel();
829919 if ( $suffix !== false ) {
@@ -831,7 +921,13 @@
832922 return $path;
833923 }
834924
835 - /** Get the virtual URL for the file itself */
 925+ /**
 926+ * Get the virtual URL for the file itself
 927+ *
 928+ * @param $suffix bool|string if not false, the name of a thumbnail file
 929+ *
 930+ * @return string
 931+ */
836932 function getVirtualUrl( $suffix = false ) {
837933 $path = $this->repo->getVirtualUrl() . '/public/' . $this->getUrlRel();
838934 if ( $suffix !== false ) {
Property changes on: branches/wmf/1.17wmf1/includes/filerepo/File.php
___________________________________________________________________
Modified: svn:mergeinfo
839935 Merged /trunk/phase3/includes/filerepo/File.php:r94212,96373,96386,96399,96420,96645
Index: branches/wmf/1.17wmf1/includes/IP.php
@@ -319,7 +319,7 @@
320320 static $privateRanges = false;
321321 if ( !$privateRanges ) {
322322 $privateRanges = array(
323 - array( 'fc::', 'fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' ), # RFC 4193 (local)
 323+ array( 'fc00::', 'fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' ), # RFC 4193 (local)
324324 array( '0:0:0:0:0:0:0:1', '0:0:0:0:0:0:0:1' ), # loopback
325325 );
326326 }
Index: branches/wmf/1.17wmf1/languages/messages/MessagesQqq.php
@@ -2641,13 +2641,15 @@
26422642 'anononlyblock' => 'Part of the log entry of user block.
26432643
26442644 {{Identical|Anon only}}',
2645 -'noautoblockblock' => '{{Identical|Autoblock disabled}}',
2646 -'emailblock' => '{{Identical|E-mail blocked}}',
2647 -'blocklist-nousertalk' => 'Used in [[Special:IPBlockList]] when "Allow this user to edit own talk page while blocked" option hasn\'t been flagged. See also {{msg-mw|Block-log-flags-nousertalk}}.',
2648 -'blocklink' => "Display name for a link that, when selected, leads to a form where a user can be blocked. Used in page history and recent changes pages. Example: \"''UserName (Talk | contribs | '''block''')''\".",
2649 -'change-blocklink' => 'Used to name the link on Special:Log',
2650 -'contribslink' => 'Short for "contributions". Used as display name for a link to user contributions on history pages, [[Special:RecentChanges]], [[Special:Watchlist]], etc.',
2651 -'blocklogpage' => "The page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").
 2645+'noautoblockblock' => '{{Identical|Autoblock disabled}}',
 2646+'emailblock' => '{{Identical|E-mail blocked}}',
 2647+'blocklist-nousertalk' => 'Used in [[Special:IPBlockList]] when "Allow this user to edit own talk page while blocked" option hasn\'t been flagged. See also {{msg-mw|Block-log-flags-nousertalk}}.',
 2648+'ipblocklist-empty' => 'Shown on page [[Special:Blocklist]], if no blocks are to be shown.',
 2649+'blocklink' => "Display name for a link that, when selected, leads to a form where a user can be blocked. Used in page history and recent changes pages. Example: \"''UserName (Talk | contribs | '''block''')''\".",
 2650+'change-blocklink' => 'Used to name the link on Special:Log',
 2651+'contribslink' => 'Short for "contributions". Used as display name for a link to user contributions on history pages, [[Special:RecentChanges]], [[Special:Watchlist]], etc.',
 2652+'emaillink' => 'Used as display name for a link to send an e-mail to a user in the user tool links. Example: "(Talk | contribs | block | send e-mail)".',
 2653+'blocklogpage' => "The page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").
26522654
26532655 {{Identical|Block log}}",
26542656 'blocklog-showlog' => 'Parameters:
Index: branches/wmf/1.17wmf1/languages/messages/MessagesEn.php
@@ -3028,6 +3028,7 @@
30293029 'unblocklink' => 'unblock',
30303030 'change-blocklink' => 'change block',
30313031 'contribslink' => 'contribs',
 3032+'emaillink' => 'send e-mail',
30323033 'autoblocker' => 'Autoblocked because your IP address has been recently used by "[[User:$1|$1]]".
30333034 The reason given for $1\'s block is: "$2"',
30343035 'blocklogpage' => 'Block log',
Property changes on: branches/wmf/1.17wmf1/languages/messages/MessagesEn.php
___________________________________________________________________
Modified: svn:mergeinfo
30353036 Merged /trunk/phase3/languages/messages/MessagesEn.php:r94212,96373,96386,96399,96420,96645

Follow-up revisions

RevisionCommit summaryAuthorDate
r96857Fix comment fail from r96856reedy15:42, 12 September 2011
r96864Revert Linker.php in r96858, r96856...reedy16:49, 12 September 2011

Past revisions this follows-up on

RevisionCommit summaryAuthorDate
r94212(bug 30192) Old thumbnails not properly purged. Unlike the bug suggests, we d...demon23:29, 10 August 2011
r96373(bug 30192) Thumbnails of archived images don't get deleted. Patch by Russ an...demon21:01, 6 September 2011
r96386Fixed typo in ipv6 private IP range list and added test (bug 30739)aaron23:15, 6 September 2011
r96389fixed single-character bugs that caused UW to fail on ie6/ie7.raindrift00:26, 7 September 2011
r96420Add constant Linker::TOOL_LINKS_EMAIL to allow adding a "send e-mail" link fr...siebrand12:12, 7 September 2011
r96645* Added a script to reduce disk space on a MySQL parser cache setup such as t...tstarling03:51, 9 September 2011

Status & tagging log