From d8cc830c4a23a4eaca1b64971585d47e3a0d4a23 Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Thu, 16 Oct 2003 13:30:45 +0000 Subject: [PATCH] block/unblock log; split off profiling into Profiling.php and broke it (turn it off for now) --- includes/Article.php | 32 ++++-- includes/GlobalFunctions.php | 24 ----- includes/LinkCache.php | 15 ++- includes/LinksUpdate.php | 4 +- includes/MagicWord.php | 1 - includes/OutputPage.php | 60 ++++------- includes/Profiling.php | 179 ++++++++++++++++++++++++++++++++ includes/Setup.php | 12 +++ includes/Skin.php | 44 ++++---- includes/SpecialBlockip.php | 7 ++ includes/SpecialIpblocklist.php | 15 ++- includes/Title.php | 12 ++- languages/Language.php | 6 ++ 13 files changed, 305 insertions(+), 106 deletions(-) create mode 100755 includes/Profiling.php diff --git a/includes/Article.php b/includes/Article.php index 269b193651..dcf84b6080 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -35,17 +35,18 @@ class Article { function getContent( $noredir = false ) { global $action,$section,$count; # From query string - wfProfileIn( "Article::getContent" ); + $fname = "Article::getContent"; + wfProfileIn( $fname ); if ( 0 == $this->getID() ) { if ( "edit" == $action ) { + wfProfileOut( $fname ); return ""; # was "newarticletext", now moved above the box) } - wfProfileOut(); + wfProfileOut( $fname ); return wfMsg( "noarticletext" ); } else { $this->loadContent( $noredir ); - wfProfileOut(); if( # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page @@ -54,22 +55,29 @@ class Article { $action=="view" ) { + wfProfileOut( $fname ); return $this->mContent . "\n" .wfMsg("anontalkpagetext"); } else { if($action=="edit") { if($section!="") { - if($section=="new") { return ""; } + if($section=="new") { + wfProfileOut( $fname ); + return ""; + } $secs=preg_split("/(^=+.*?=+|^.*?<\/h[1-6].*?>)/mi", $this->mContent, -1, PREG_SPLIT_DELIM_CAPTURE); if($section==0) { + wfProfileOut( $fname ); return trim($secs[0]); } else { + wfProfileOut( $fname ); return trim($secs[$section*2-1] . $secs[$section*2]); } } } + wfProfileOut( $fname ); return $this->mContent; } } @@ -248,7 +256,8 @@ class Article { global $wgUser, $wgOut, $wgLang; global $oldid, $diff; # From query global $wgLinkCache; - wfProfileIn( "Article::view" ); + $fname = "Article::view"; + wfProfileIn( $fname ); $wgOut->setArticleFlag( true ); $wgOut->setRobotpolicy( "index,follow" ); @@ -260,7 +269,7 @@ class Article { $wgOut->setPageTitle( $this->mTitle->getPrefixedText() ); $de = new DifferenceEngine( $oldid, $diff ); $de->showDiffPage(); - wfProfileOut(); + wfProfileOut( $fname ); return; } $text = $this->getContent(); # May change wgTitle! @@ -287,7 +296,7 @@ class Article { $wgOut->addWikiText( $text ); $this->viewUpdates(); - wfProfileOut(); + wfProfileOut( $fname ); } # Theoretically we could defer these whole insert and update @@ -538,7 +547,8 @@ class Article { # If page hasn't changed, client can cache this $wgOut->checkLastModified( $this->getTimestamp() ); - wfProfileIn( "Article::history" ); + $fname = "Article::history"; + wfProfileIn( $fname ); $wgOut->setPageTitle( $this->mTitle->getPRefixedText() ); $wgOut->setSubtitle( wfMsg( "revhistory" ) ); @@ -547,7 +557,7 @@ class Article { if( $this->mTitle->getArticleID() == 0 ) { $wgOut->addHTML( wfMsg( "nohistory" ) ); - wfProfileOut(); + wfProfileOut( $fname ); return; } @@ -567,7 +577,7 @@ class Article { $revs = wfNumRows( $res ); if( $this->mTitle->getArticleID() == 0 ) { $wgOut->addHTML( wfMsg( "nohistory" ) ); - wfProfileOut(); + wfProfileOut( $fname ); return; } @@ -595,7 +605,7 @@ class Article { $s .= $sk->endHistoryList(); $s .= $numbar; $wgOut->addHTML( $s ); - wfProfileOut(); + wfProfileOut( $fname ); } function protect( $limit = "sysop" ) diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 57f89ccf55..9f28e23260 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -140,30 +140,6 @@ function wfDebug( $text, $logonly = false ) } } -if( !isset( $wgProfiling ) ) - $wgProfiling = false; -$wgProfileStack = array(); -$wgProfileWorkStack = array(); - -if( $wgProfiling ) { - function wfProfileIn( $functionname ) - { - global $wgProfileStack, $wgProfileWorkStack; - array_push( $wgProfileWorkStack, "$functionname " . - count( $wgProfileWorkStack ) . " " . microtime() ); - } - - function wfProfileOut() { - global $wgProfileStack, $wgProfileWorkStack; - $bit = array_pop( $wgProfileWorkStack ); - $bit .= " " . microtime(); - array_push( $wgProfileStack, $bit ); - } -} else { - function wfProfileIn( $functionname ) { } - function wfProfileOut( ) { } -} - function wfReadOnly() { global $wgReadOnlyFile; diff --git a/includes/LinkCache.php b/includes/LinkCache.php index 379da89f4a..fe35d60907 100644 --- a/includes/LinkCache.php +++ b/includes/LinkCache.php @@ -79,13 +79,17 @@ class LinkCache { if ( 0 != $id ) { return $id; } global $wgMemc, $wgDBname; - wfProfileIn( "LinkCache::addLink-checkdatabase" ); + $fname = "LinkCache::addLink-checkdatabase"; + wfProfileIn( $fname ); $nt = Title::newFromDBkey( $title ); $ns = $nt->getNamespace(); $t = $nt->getDBkey(); - if ( "" == $t ) { return 0; } + if ( "" == $t ) { + wfProfileOut( $fname); + return 0; + } $id = $wgMemc->get( $key = "$wgDBname:lc:title:$title" ); if( $id === FALSE ) { @@ -103,13 +107,14 @@ class LinkCache { } if ( 0 == $id ) { $this->addBadLink( $title ); } else { $this->addGoodLink( $id, $title ); } - wfProfileOut(); + wfProfileOut( $fname ); return $id; } function preFill( $fromtitle ) { - wfProfileIn( "LinkCache::preFill" ); + $fname = "LinkCache::preFill"; + wfProfileIn( $fname ); # Note -- $fromtitle is a Title *object* $dbkeyfrom = wfStrencode( $fromtitle->getPrefixedDBKey() ); $sql = "SELECT HIGH_PRIORITY cur_id,cur_namespace,cur_title @@ -138,7 +143,7 @@ class LinkCache { $this->mOldGoodLinks = $this->mGoodLinks; $this->mPreFilled = true; - wfProfileOut(); + wfProfileOut( $fname ); } function getGoodAdditions() diff --git a/includes/LinksUpdate.php b/includes/LinksUpdate.php index de4b86182e..98bc427182 100644 --- a/includes/LinksUpdate.php +++ b/includes/LinksUpdate.php @@ -136,7 +136,7 @@ class LinksUpdate { $sql = "COMMIT"; wfQuery( $sql, DB_WRITE, $fname ); } - wfProfileOut(); + wfProfileOut( $fname ); } function doDumbUpdate() @@ -211,7 +211,7 @@ class LinksUpdate { $sql = "COMMIT"; wfQuery( $sql, DB_WRITE, $fname ); } - wfProfileOut(); + wfProfileOut( $fname ); } function fixBrokenLinks() { diff --git a/includes/MagicWord.php b/includes/MagicWord.php index dc98d9db08..b8d39da1e2 100644 --- a/includes/MagicWord.php +++ b/includes/MagicWord.php @@ -55,7 +55,6 @@ class MagicWord { $this->mRegex = "/{$this->mBaseRegex}/{$case}"; $this->mRegexStart = "/^{$this->mBaseRegex}/{$case}"; $this->mVariableRegex = str_replace( "\\$1", "([A-Za-z0-9]*)", $this->mRegex ); - wfDebug( "{$this->mVariableRegex}\n" ); } function getRegex() diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 4f5a53e4d4..1bff75d927 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -133,7 +133,8 @@ class OutputPage { function addWikiText( $text, $linestart = true ) { global $wgUseTeX; - wfProfileIn( "OutputPage::addWikiText" ); + $fname = "OutputPage::addWikiText"; + wfProfileIn( $fname ); $unique = "3iyZiyA7iMwg5rhxP0Dcc9oTnj8qD1jm1Sfv4"; $unique2 = "4LIQ9nXtiYFPCSfitVwDw7EYwQlL4GeeQ7qSO"; $unique3 = "fPaA8gDfdLBqzj68Yjg9Hil3qEF8JGO0uszIp"; @@ -209,7 +210,7 @@ class OutputPage { $escapedChars, $nwlist[$i] ), $text, 1 ); } $this->addHTML( $text ); - wfProfileOut(); + wfProfileOut( $fname ); } function sendCacheControl() { @@ -328,27 +329,7 @@ class OutputPage { $elapsed = $now - $start; if ( "" != $wgDebugLogFile ) { - $prof = ""; - if( $wgProfiling and count( $wgProfileStack ) ) { - $lasttime = $start; - foreach( $wgProfileStack as $ile ) { - # "foo::bar 99 0.12345 1 0.23456 2" - if( preg_match( '/^(\S+)\s+([0-9]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9\.]+)/', $ile, $m ) ) { - $thisstart = (float)$m[3] + (float)$m[4] - $start; - $thisend = (float)$m[5] + (float)$m[6] - $start; - $thiselapsed = $thisend - $thisstart; - $thispercent = $thiselapsed / $elapsed * 100.0; - - $prof .= sprintf( "\tat %04.3f in %04.3f (%2.1f%%) - %s %s\n", - $thisstart, $thiselapsed, $thispercent, - str_repeat( "*", $m[2] ), $m[1] ); - $lasttime = $thistime; - #$prof .= "\t(^ $ile)\n"; - } else { - $prof .= "\t?broken? $ile\n"; - } - } - } + $prof = wfGetProfilingOutput( $start, $elapsed ); if( $forward = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'] ) $forward = " forwarded for $forward"; @@ -734,7 +715,8 @@ $t[] = "" ; function doWikiPass2( $text, $linestart ) { global $wgUser, $wgLang, $wgUseDynamicDates; - wfProfileIn( "OutputPage::doWikiPass2" ); + $fname = "OutputPage::doWikiPass2"; + wfProfileIn( $fname ); $text = $this->removeHTMLtags( $text ); $text = $this->replaceVariables( $text ); @@ -762,7 +744,7 @@ $t[] = "" ; $text = $sk->transformContent( $text ); $text .= $this->categoryMagic () ; - wfProfileOut(); + wfProfileOut( $fname ); return $text; } @@ -840,14 +822,15 @@ $t[] = "" ; /* private */ function replaceExternalLinks( $text ) { - wfProfileIn( "OutputPage::replaceExternalLinks" ); + $fname = "OutputPage::replaceExternalLinks"; + wfProfileIn( $fname ); $text = $this->subReplaceExternalLinks( $text, "http", true ); $text = $this->subReplaceExternalLinks( $text, "https", true ); $text = $this->subReplaceExternalLinks( $text, "ftp", false ); $text = $this->subReplaceExternalLinks( $text, "gopher", false ); $text = $this->subReplaceExternalLinks( $text, "news", false ); $text = $this->subReplaceExternalLinks( $text, "mailto", false ); - wfProfileOut(); + wfProfileOut( $fname ); return $text; } @@ -935,7 +918,7 @@ $t[] = "" ; $e1 = "/^([{$tc}]+)\\|([^]]+)]](.*)\$/sD"; $e2 = "/^([{$tc}]+)]](.*)\$/sD"; - wfProfileOut(); + wfProfileOut( "$fname-setup" ); foreach ( $a as $line ) { wfProfileIn( "$fname-loop" ); @@ -952,7 +935,7 @@ $t[] = "" ; else { # Invalid form; output directly $s .= "[[" . $line ; - wfProfileOut(); + wfProfileOut( "$fname-loop" ); continue; } if(substr($m[1],0,1)=="/") { # subpage @@ -1021,9 +1004,9 @@ $t[] = "" ; if ( "" == $text ) { $text = $link; } $s .= $sk->makeLink( $link, $text, "", $trail ); } - wfProfileOut(); + wfProfileOut( "$fname-loop" ); } - wfProfileOut(); + wfProfileOut( $fname ); return $s; } @@ -1106,7 +1089,8 @@ $t[] = "" ; /* private */ function doBlockLevels( $text, $linestart ) { - wfProfileIn( "OutputPage::doBlockLevels" ); + $fname = "OutputPage::doBlockLevels"; + wfProfileIn( $fname ); # Parsing through the text line by line. The main thing # happening here is handling of block-level elements p, pre, # and making lists from lines starting with * # : etc. @@ -1205,14 +1189,15 @@ $t[] = "" ; } $this->mLastSection = ""; } - wfProfileOut(); + wfProfileOut( $fname ); return $text; } /* private */ function replaceVariables( $text ) { global $wgLang; - wfProfileIn( "OutputPage:replaceVariables" ); + $fname = "OutputPage:replaceVariables"; + wfProfileIn( $fname ); /* As with sigs, use server's local time -- ensure this is appropriate for your audience! */ @@ -1257,13 +1242,14 @@ $t[] = "" ; $mw =& MagicWord::get( MAG_MSGNW ); $text = $mw->substituteCallback( $text, "replaceMsgVarNw" ); - wfProfileOut(); + wfProfileOut( $fname ); return $text; } /* private */ function removeHTMLtags( $text ) { - wfProfileIn( "OutputPage::removeHTMLtags" ); + $fname = "OutputPage::removeHTMLtags"; + wfProfileIn( $fname ); $htmlpairs = array( # Tags that must be closed "b", "i", "u", "font", "big", "small", "sub", "sup", "h1", "h2", "h3", "h4", "h5", "h6", "cite", "code", "em", "s", @@ -1350,7 +1336,7 @@ $t[] = "" ; $text .= "\n"; if ( $t == "table" ) { $tagstack = array_pop( $tablestack ); } } - wfProfileOut(); + wfProfileOut( $fname ); return $text; } diff --git a/includes/Profiling.php b/includes/Profiling.php new file mode 100755 index 0000000000..091d01b316 --- /dev/null +++ b/includes/Profiling.php @@ -0,0 +1,179 @@ +profileIn( $functionname ); +} + +function wfProfileOut( $functionname = "missing" ) +{ + global $wgProfiler; + $wgProfiler->profileOut( $functionname ); +} + +function wfGetProfilingOutput( $start, $elapsed ) { + global $wgProfiler; + return $wgProfiler->getOutput( $start, $elapsed ); +} + +function wfProfileClose() +{ + global $wgProfiler; + $wgProfiler->close(); +} + +class Profiler +{ + var $mStack = array(), $mWorkStack = array(), $mCollated = array(); + var $mCalls = array(), $mTotals = array(); + /* + function Profiler() + { + $this->mProfileStack = array(); + $this->mWorkStack = array(); + $this->mCollated = array(); + } + */ + + function profileIn( $functionname ) + { + array_push( $this->mWorkStack, array($functionname, count( $this->mWorkStack ), microtime() ) ); + } + + function profileOut( $functionname) + { + global $wgDebugProfiling; + $bit = array_pop( $this->mWorkStack ); + + if ( $wgDebugProfiling ) { + if ( $functionname == "close" ) { + wfDebug( "Profile section ended by close(): {$bit[0]}\n" ); + } elseif ( $bit[0] != $functionname ) { + wfDebug( "Profiling error: in({$bit[0]}), out($functionname)\n" ); + } + } + array_push( $bit, microtime() ); + array_push( $this->mStack, $bit ); + } + + function close() + { + while ( count( $this->mWorkStack ) ) { + $this->profileOut( "close" ); + } + } + + + function getOutput( $scriptStart, $scriptElapsed ) + { + set_time_limit( 0 ); + $width = 80; + $format = "%-39s %6.2f / %6.2f = %6.2f %6.2f%%\n"; + $prof = ""; + if( !count( $this->mStack ) ) { + return "No profiling output\n"; + } + $this->mCollated = array(); + + $top = $this->doLevel( 0, true ); + $this->merge( "WIKI.PHTML", $top, $scriptElapsed ); + $this->mCollated = array_reverse( $this->mCollated, true ); +/* + # Calculate totals + foreach ( $this->mCollated as $f1 => $f1data ) { + $total = 0; + foreach ( $f1data as $f2 => $t ) { + $total += $t; + } + $this->mCollated[$f1][0] = $total; + } +*/ + # Output + foreach ( $this->mCollated as $f1 => $f1data ) { + $prof .= "\n" . str_repeat( "-", $width ) . "\n"; + $t = $this->mTotals[$f1] * 1000; + $calls = $this->mCalls[$f1]; + if ( $calls == 0 ) { + $calls = 1; + } + $each = $t / $calls; + $percent = $this->mTotals[$f1] / $scriptElapsed * 100; + $prof .= sprintf( $format, "| $f1", $t, $calls, $each, $percent ); + $prof .= str_repeat( "-", $width ) . "\n"; + foreach ( $f1data as $f2 => $t ) { + $percent = $t / $this->mTotals[$f1] * 100; + $t *= 1000; + $calls = $this->mCalls[$f1]; + if ( $calls == 0 ) { + $calls = 1; + } + $each = $t / $calls; + $percent = $this->mTotals[$f1] / $scriptElapsed * 100; + $prof .= sprintf( $format, $f2, $t, $calls, $each, $percent ); + } + } + $prof .= str_repeat( "-", $width ) . "\n"; + return $prof; + } + + + function doLevel( $p, $fTop ) + { + $level = false; + $getOut = false; + $hotArray = false; + $tempArray = array(); + do { + $fname = $this->mStack[$p][0]; + $thislevel = $this->mStack[$p][1]; + $start = (float)$this->mStack[$p][2] + (float)$this->mStack[$p][3]; + $end = (float)$this->mStack[$p][4] + (float)$this->mStack[$p][5]; + $elapsed = $end - $start; + if ( $hotArray !== false ) { + # Just dropped down a level + # Therefore this entry is the parent of $hotArray + $this->merge( $fname, $hotArray, $elapsed ); + $hotArray = false; + } + + if ( $level === false ) { + $level = $thislevel; + } + + if ( $thislevel == $level ) { + $tempArray[$fname] += $elapsed; + #$this->mTotals[$fname] += elapsed; + $this->mCalls[$fname] ++; + } elseif ($thislevel > $level ) { + $hotArray = $this->doLevel( $p, false ); + } else { + $getOut = true; + } + + # Special case: top of hierarchy + # File starts with lvl 1 entry, then drops back to lvl 0 + if ( $fTop && $getOut ) { + $hotArray = $tempArray; + $getOut = false; + } + + $p++; + } while ( !$getOut && $p < count( $this->mStack ) ); + return $tempArray; + } + + function merge( $f1, $a, $parentTime ) + { + foreach ( $a as $f2 => $elapsed ) { + $this->mCollated[$f1][$f2] += $elapsed; + } + $this->mTotals[$f1] += $parentTime; + } +} + +$wgProfiler = new Profiler(); + +?> diff --git a/includes/Setup.php b/includes/Setup.php index fdc3b8711f..80f0c0b877 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -48,6 +48,18 @@ if( ! class_exists( $wgLangClass ) ) { } $wgLang = new $wgLangClass(); +if( !isset( $wgProfiling ) ) + $wgProfiling = false; + +if ( $wgProfiling ) { + include_once( "$IP/Profiling.php" ); +} else { + function wfProfileIn( $fn ) {} + function wfProfileOut( $fn = "" ) {} + function wfGetProfilingOutput( $s, $e ) {} + function wfProfileClose() {} +} + $wgUser = User::loadFromSession(); $wgDeferredUpdateList = array(); $wgLinkCache = new LinkCache(); diff --git a/includes/Skin.php b/includes/Skin.php index 2ea643d7ca..dad6d940ba 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -70,16 +70,18 @@ class Skin { function initPage() { global $wgOut, $wgStyleSheetPath; - wfProfileIn( "Skin::initPage" ); + $fname = "Skin::initPage"; + wfProfileIn( $fname ); $wgOut->addLink( "shortcut icon", "", "/favicon.ico" ); if ( $wgOut->isPrintable() ) { $ss = "wikiprintable.css"; } else { $ss = $this->getStylesheet(); } $wgOut->addLink( "stylesheet", "", "{$wgStyleSheetPath}/{$ss}" ); - wfProfileOut(); + wfProfileOut( $fname ); } function outputPage( &$out ) { + wfProfileIn( "Skin::outputPage" ); $this->initPage(); $out->out( $out->headElement() ); @@ -98,9 +100,8 @@ class Skin { $out->out( $out->mBodytext ); $out->out( $this->afterContent() ); - wfProfileOut(); - - wfProfileOut(); # A hack - we can't report after here + + wfProfileClose(); $out->out( $out->reportTime() ); $out->out( "\n" ); @@ -238,7 +239,8 @@ class Skin { function doBeforeContent() { global $wgUser, $wgOut, $wgTitle, $wgLang; - wfProfileIn( "Skin::doBeforeContent" ); + $fname = "Skin::doBeforeContent"; + wfProfileIn( $fname ); $s = ""; $qb = $this->qbSetting(); @@ -290,7 +292,7 @@ class Skin { $s .= $this->pageSubtitle() ; $s .= getCategories(); // For some odd reason, zhis can't be a function of the object $s .= "\n

"; - wfProfileOut(); + wfProfileOut( $fname ); return $s; } @@ -326,7 +328,8 @@ class Skin { function doAfterContent() { global $wgUser, $wgOut, $wgLang; - wfProfileIn( "Skin::doAfterContent" ); + $fname = "Skin::doAfterContent"; + wfProfileIn( $fname ); $s = "\n
\n"; @@ -358,7 +361,7 @@ class Skin { $s .= "\n\n\n"; if ( 0 != $qb ) { $s .= $this->quickBar(); } - wfProfileOut(); + wfProfileOut( $fname ); return $s; } @@ -482,7 +485,7 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) if( $wgShowIPinHeader ) { $n = getenv( "REMOTE_ADDR" ); - $tl = $this->makeKnownLink( $wgLang->getNsText( + $tl = $this->makeKnownLink( $wgLang->getNsText( Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", $wgLang->getNsText( Namespace::getTalk( 0 ) ) ); @@ -638,7 +641,9 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) { global $wgOut, $wgTitle, $wgUser, $action, $wgLang; global $wpPreview; - wfProfileIn( "Skin::quickBar" ); + $fname = "Skin::quickBar"; + wfProfileIn( $fname ); + $tns=$wgTitle->getNamespace(); $s = "\n

"; @@ -655,11 +660,10 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) } // only show watchlist link if logged in - if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ; - $s .= "\n

"; + if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ; + $s .= "\n

"; $articleExists = $wgTitle->getArticleId(); - if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) { - + if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) { if($wgOut->isArticle()) { $s .= "" . $this->editThisPage() . ""; } else { # backlink to the article in edit or history mode @@ -761,7 +765,7 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) . $sep . $this->bugReportsLink(); $s .= "\n
\n"; - wfProfileOut(); + wfProfileOut( $fname ); return $s; } @@ -983,7 +987,7 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) if ( !$wgUseNewInterlanguage ) return ""; $ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ; if ( $ns != 0 AND $ns != 1 ) return "" ; - $pn = "Intl" ; + $pn = "Intl" ; $x = "mode=addlink&xt=".$wgTitle->getDBkey() ; return $this->makeKnownLink( $wgLang->specialPage( $pn ), wfMsg( "intl" ) , $x ); @@ -1100,7 +1104,7 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) # a final pass through here for things like table backgrounds. # function transformContent( $text ) - { + { return $text; } @@ -1578,7 +1582,7 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) "diff={$oldid}&oldid={$diffid}" ); # Finagle's law } if ( 0 == $u ) { - $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ), + $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ), $ut, "target=" . $ut ); } else { $ul = $this->makeLink( $wgLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut ); } @@ -1665,7 +1669,7 @@ if ( isset ( $wgUseApproval ) && $wgUseApproval ) } if ( 0 == $u ) { - $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ), + $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ), $ut, "target=" . $ut ); } else { $ul = $this->makeLink( $wgLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut ); } diff --git a/includes/SpecialBlockip.php b/includes/SpecialBlockip.php index 448914173c..5ce5ebf9f6 100644 --- a/includes/SpecialBlockip.php +++ b/includes/SpecialBlockip.php @@ -83,11 +83,18 @@ class IPBlockForm { return; } + # Create block # Note: for a user block, ipb_address is only for display purposes $ban = new Block( $wpBlockAddress, $userId, $wgUser->getID(), wfStrencode( $wpBlockReason ), wfTimestampNow(), 0 ); $ban->insert(); + # Make log entry + $log = new LogPage( wfMsg( "blocklogpage" ), wfMsg( "blocklogtext" ) ); + $action = str_replace( "$1", $wpBlockAddress, wfMsg( "blocklogentry" ) ); + $log->addEntry( $action, $wpBlockReason ); + + # Report to the user $success = wfLocalUrl( $wgLang->specialPage( "Blockip" ), "action=success&ip={$wpBlockAddress}" ); $wgOut->redirect( $success ); diff --git a/includes/SpecialIpblocklist.php b/includes/SpecialIpblocklist.php index 2b9d216de5..2cd660c15d 100644 --- a/includes/SpecialIpblocklist.php +++ b/includes/SpecialIpblocklist.php @@ -36,6 +36,7 @@ class IPUnblockForm { if ( ! $wpUnblockAddress ) { $wpUnblockAddress = $ip; } $ipa = wfMsg( "ipaddress" ); + $ipr = wfMsg( "ipbreason" ); $ipus = wfMsg( "ipusubmit" ); $action = wfLocalUrlE( $wgLang->specialPage( "Ipblocklist" ), "action=submit" ); @@ -51,6 +52,10 @@ class IPUnblockForm { +{$ipr}: + + +   @@ -61,7 +66,7 @@ class IPUnblockForm { function doSubmit() { global $wgOut, $wgUser, $wgLang; - global $wpUnblockAddress; + global $wpUnblockAddress, $wpUnblockReason; $block = new Block(); $wpUnblockAddress = trim( $wpUnblockAddress ); @@ -72,8 +77,16 @@ class IPUnblockForm { $block->mAddress = $wpUnblockAddress; } + # Delete block (if it exists) + # We should probably check for errors rather than just declaring success $block->delete(); + # Make log entry + $log = new LogPage( wfMsg( "blocklogpage" ), wfMsg( "blocklogtext" ) ); + $action = str_replace( "$1", $wpUnblockAddress, wfMsg( "unblocklogentry" ) ); + $log->addEntry( $action, $wpUnblockReason ); + + # Report to the user $success = wfLocalUrl( $wgLang->specialPage( "Ipblocklist" ), "action=success&ip=" . urlencode($wpUnblockAddress) ); $wgOut->redirect( $success ); diff --git a/includes/Title.php b/includes/Title.php index 7f374da276..e5cd9b9eb9 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -31,7 +31,8 @@ class Title { function newFromText( $text ) { - wfProfileIn( "Title::newFromText" ); + $fname = "Title::newFromText"; + wfProfileIn( $fname ); # Note - mixing latin1 named entities and unicode numbered # ones will result in a bad link. @@ -45,8 +46,8 @@ class Title { $t = new Title(); $t->mDbkeyform = str_replace( " ", "_", $text ); + wfProfileOut( $fname ); if( $t->secureAndSplit() ) { - wfProfileOut(); return $t; } else { return NULL; @@ -352,7 +353,8 @@ class Title { /* private */ function secureAndSplit() { global $wgLang, $wgLocalInterwiki; - wfProfileIn( "Title::secureAndSplit" ); + $fname = "Title::secureAndSplit"; + wfProfileIn( $fname ); $validNamespaces = $wgLang->getNamespaces(); unset( $validNamespaces[0] ); @@ -365,7 +367,7 @@ class Title { $l = strlen( $t ); if ( $l && ( "_" == $t{$l-1} ) ) { $t = substr( $t, 0, $l-1 ); } if ( "" == $t ) { - wfProfileOut(); + wfProfileOut( $fname ); return false; } @@ -424,7 +426,7 @@ class Title { $this->mUrlform = wfUrlencode( $t ); $this->mTextform = str_replace( "_", " ", $t ); - wfProfileOut(); + wfProfileOut( $fname ); return true; } } diff --git a/languages/Language.php b/languages/Language.php index 57655b7bbd..684af7a0ad 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -1146,6 +1146,12 @@ to a previously blocked IP address or username.", "unblocklink" => "unblock", "contribslink" => "contribs", "autoblocker" => "Autoblocked because you share an IP address with \"$1\". Reason \"$2\".", +"blocklogpage" => "Block_log", +"blocklogentry" => 'blocked "$1"', +"blocklogtext" => "This is a log of user blocking and unblocking actions. Automatically +blocked IP addresses are not be listed. See the [[Special:Ipblocklist|IP block list]] for +the list of currently operational bans and blocks.", +"unblocklogentry" => 'unblocked "$1"', # Developer tools # -- 2.20.1