/**
* Send a line to a supplementary debug log file, if configured, or main debug log if not.
* $wgDebugLogGroups[$logGroup] should be set to a filename to send to a separate log.
+ *
* @param string $logGroup
* @param string $text
+ * @param bool $public Whether to log the event in the public log if no private
+ * log file is specified, (default true)
*/
-function wfDebugLog( $logGroup, $text ) {
+function wfDebugLog( $logGroup, $text, $public = true ) {
global $wgDebugLogGroups, $wgDBname;
if( $text{strlen( $text ) - 1} != "\n" ) $text .= "\n";
if( isset( $wgDebugLogGroups[$logGroup] ) ) {
@error_log( "$wgDBname: $text", 3, $wgDebugLogGroups[$logGroup] );
- } else {
+ } else if ( $public === true ) {
wfDebug( $text, true );
}
}
/**
- * Get a message from anywhere, for the current user language
+ * Get a message from anywhere, for the current user language.
+ *
+ * Use wfMsgForContent() instead if the message should NOT
+ * change depending on the user preferences.
+ *
+ * Note that the message may contain HTML, and is therefore
+ * not safe for insertion anywhere. Some functions such as
+ * addWikiText will do the escaping for you. Use wfMsgHtml()
+ * if you need an escaped message.
*
- * @param string
+ * @param string lookup key for the message, usually
+ * defined in languages/Language.php
*/
function wfMsg( $key ) {
$args = func_get_args();
/**
* Get a message from anywhere, for the current global language
+ * set with $wgLanguageCode.
+ *
+ * Use this if the message should NOT change dependent on the
+ * language set in the user's preferences. This is the case for
+ * most text written into logs, as well as link targets (such as
+ * the name of the copyright policy page). Link titles, on the
+ * other hand, should be shown in the UI language.
+ *
+ * Note that MediaWiki allows users to change the user interface
+ * language in their preferences, but a single installation
+ * typically only contains content in one language.
+ *
+ * Be wary of this distinction: If you use wfMsg() where you should
+ * use wfMsgForContent(), a user of the software may have to
+ * customize over 70 messages in order to, e.g., fix a link in every
+ * possible language.
+ *
+ * @param string lookup key for the message, usually
+ * defined in languages/Language.php
*/
function wfMsgForContent( $key ) {
global $wgForceUIMsgAsContentMsg;
if( is_object( $lang ) ) {
$message = $lang->getMessage( $key );
} else {
- $message = '';
+ $message = false;
}
wfRestoreWarnings();
- if(!$message)
+ if($message === false)
$message = Language::getMessage($key);
if(strstr($message, '{{' ) !== false) {
$message = $wgParser->transformMsg($message, $wgMsgParserOptions);
} else {
$msg .= "\n<p>Backtrace:</p>\n$backtrace";
}
- }
- echo $msg;
- die( -1 );
+ }
+ echo $msg;
+ echo wfReportTime()."\n";
+ die( -1 );
}
+ /**
+ * Returns a HTML comment with the elapsed time since request.
+ * This method has no side effects.
+ * @return string
+ */
+ function wfReportTime() {
+ global $wgRequestTime;
+
+ $now = wfTime();
+ list( $usec, $sec ) = explode( ' ', $wgRequestTime );
+ $start = (float)$sec + (float)$usec;
+ $elapsed = $now - $start;
+
+ # Use real server name if available, so we know which machine
+ # in a server farm generated the current page.
+ if ( function_exists( 'posix_uname' ) ) {
+ $uname = @posix_uname();
+ } else {
+ $uname = false;
+ }
+ if( is_array( $uname ) && isset( $uname['nodename'] ) ) {
+ $hostname = $uname['nodename'];
+ } else {
+ # This may be a virtual server.
+ $hostname = $_SERVER['SERVER_NAME'];
+ }
+ $com = sprintf( "<!-- Served by %s in %01.2f secs. -->",
+ $hostname, $elapsed );
+ return $com;
+ }
+
function wfBacktrace() {
global $wgCommandLineMode;
if ( !function_exists( 'debug_backtrace' ) ) {
# This check may also protect against code injection in
# case of broken installations.
if(! file_exists( $wgDiff3 ) ){
+ wfDebug( "diff3 not found\n" );
return false;
}
fwrite( $yourtextFile, $yours ); fclose( $yourtextFile );
# Check for a conflict
- $cmd = wfEscapeShellArg( $wgDiff3 ) . ' -a --overlap-only ' .
+ $cmd = $wgDiff3 . ' -a --overlap-only ' .
wfEscapeShellArg( $mytextName ) . ' ' .
wfEscapeShellArg( $oldtextName ) . ' ' .
wfEscapeShellArg( $yourtextName );
pclose( $handle );
# Merge differences
- $cmd = wfEscapeShellArg( $wgDiff3 ) . ' -a -e --merge ' .
+ $cmd = $wgDiff3 . ' -a -e --merge ' .
wfEscapeShellArg( $mytextName, $oldtextName, $yourtextName );
$handle = popen( $cmd, 'r' );
$result = '';
} while ( true );
pclose( $handle );
unlink( $mytextName ); unlink( $oldtextName ); unlink( $yourtextName );
+
+ if ( $result === '' && $old !== '' && $conflict == false ) {
+ wfDebug( "Unexpected null result from diff3.\nCommand: $cmd\nOutput: " . `$cmd 2>&1` . "\n" );
+ $conflict = true;
+ }
return ! $conflict;
}
if ( $end ) {
if ( $suppressCount ) {
- $suppressCount --;
+ --$suppressCount;
if ( !$suppressCount ) {
error_reporting( $originalLevel );
}
if ( !$suppressCount ) {
$originalLevel = error_reporting( E_ALL & ~( E_WARNING | E_NOTICE ) );
}
- $suppressCount++;
+ ++$suppressCount;
}
}
* @return string Time in the format specified in $outputtype
*/
function wfTimestamp($outputtype=TS_UNIX,$ts=0) {
+ $uts = 0;
if ($ts==0) {
$uts=time();
} elseif (preg_match("/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/",$ts,$da)) {
return wfElement( $element, $attribs, $contents );
}
+// Shortcuts
+function wfOpenElement( $element ) { return "<$element>"; }
+function wfCloseElement( $element ) { return "</$element>"; }
+
/**
* Create a namespace selector
*
*/
function &HTMLnamespaceselector($selected = '', $allnamespaces = null) {
global $wgContLang;
- $s = "<select name='namespace' class='namespaceselector'>\n";
+ $s = "<select name='namespace' class='namespaceselector'>\n\t";
$arr = $wgContLang->getFormattedNamespaces();
if( !is_null($allnamespaces) ) {
$arr = array($allnamespaces => wfMsgHtml('namespacesall')) + $arr;
$s .= wfElement("option", array("value" => $index), $name);
}
}
- $s .= "</select>\n";
+ $s .= "\n</select>\n";
return $s;
}
* @param $wfMsgOut The output of wfMsg*()
* @return bool
*/
-function wfNoMsg( $msg, $wfMsgOut ) {
+function wfEmptyMsg( $msg, $wfMsgOut ) {
return $wfMsgOut === "<$msg>";
}
+
+/**
+ * Find out whether or not a mixed variable exists in a string
+ *
+ * @param mixed needle
+ * @param string haystack
+ * @return bool
+ */
+function in_string( $needle, $str ) {
+ return strpos( $str, $needle ) !== false;
+}
?>