Use Doxygen @addtogroup instead of phpdoc @package && @subpackage
[lhc/web/wiklou.git] / includes / GlobalFunctions.php
index 1759545..4b73d5a 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * Global functions used everywhere
- * @package MediaWiki
  */
 
 /**
@@ -230,7 +229,7 @@ function wfLogProfilingData() {
                        $forward .= ' anon';
                $log = sprintf( "%s\t%04.3f\t%s\n",
                  gmdate( 'YmdHis' ), $elapsed,
-                 urldecode( $_SERVER['REQUEST_URI'] . $forward ) );
+                 urldecode( $wgRequest->getRequestURL() . $forward ) );
                if ( '' != $wgDebugLogFile && ( $wgRequest->getVal('action') != 'raw' || $wgDebugRawPage ) ) {
                        error_log( $log . $prof, 3, $wgDebugLogFile );
                }
@@ -376,8 +375,11 @@ function wfMsgNoDBForContent( $key ) {
  * @return String: the requested message.
  */
 function wfMsgReal( $key, $args, $useDB = true, $forContent=false, $transform = true ) {
+       $fname = 'wfMsgReal';
+       wfProfileIn( $fname );
        $message = wfMsgGetKey( $key, $useDB, $forContent, $transform );
        $message = wfMsgReplaceArgs( $message, $args );
+       wfProfileOut( $fname );
        return $message;
 }
 
@@ -547,12 +549,10 @@ function wfMsgExt( $key, $options ) {
                        $string = $m[1];
                }
        } elseif ( in_array('parsemag', $options) ) {
-               global $wgTitle;
-               $parser = new Parser();
-               $parserOptions = new ParserOptions();
-               $parserOptions->setInterfaceMessage( true );
-               $parser->startExternalParse( $wgTitle, $parserOptions, OT_MSG );
-               $string = $parser->transformMsg( $string, $parserOptions );
+               global $wgMessageCache;
+               if ( isset( $wgMessageCache ) ) {
+                       $string = $wgMessageCache->transform( $string );
+               }
        }
 
        if ( in_array('escape', $options) ) {
@@ -581,8 +581,8 @@ function wfAbruptExit( $error = false ){
        }
        $called = true;
 
-       if( function_exists( 'debug_backtrace' ) ){ // PHP >= 4.3
-               $bt = debug_backtrace();
+       $bt = wfDebugBacktrace();
+       if( $bt ) {
                for($i = 0; $i < count($bt) ; $i++){
                        $file = isset($bt[$i]['file']) ? $bt[$i]['file'] : "unknown";
                        $line = isset($bt[$i]['line']) ? $bt[$i]['line'] : "unknown";
@@ -664,18 +664,36 @@ function wfHostname() {
                return $com;
        }
 
+/**
+ * Safety wrapper for debug_backtrace().
+ *
+ * With Zend Optimizer 3.2.0 loaded, this causes segfaults under somewhat
+ * murky circumstances, which may be triggered in part by stub objects
+ * or other fancy talkin'.
+ *
+ * Will return an empty array if Zend Optimizer is detected, otherwise
+ * the output from debug_backtrace() (trimmed).
+ *
+ * @return array of backtrace information
+ */
+function wfDebugBacktrace() {
+       if( extension_loaded( 'Zend Optimizer' ) ) {
+               wfDebug( "Zend Optimizer detected; skipping debug_backtrace for safety.\n" );
+               return array();
+       } else {
+               return array_slice( debug_backtrace(), 1 );
+       }
+}
+
 function wfBacktrace() {
        global $wgCommandLineMode;
-       if ( !function_exists( 'debug_backtrace' ) ) {
-               return false;
-       }
 
        if ( $wgCommandLineMode ) {
                $msg = '';
        } else {
                $msg = "<ul>\n";
        }
-       $backtrace = debug_backtrace();
+       $backtrace = wfDebugBacktrace();
        foreach( $backtrace as $call ) {
                if( isset( $call['file'] ) ) {
                        $f = explode( DIRECTORY_SEPARATOR, $call['file'] );
@@ -1069,7 +1087,7 @@ function wfHttpError( $code, $label, $desc ) {
                "</title></head><body><h1>" .
                htmlspecialchars( $label ) .
                "</h1><p>" .
-               htmlspecialchars( $desc ) .
+               nl2br( htmlspecialchars( $desc ) ) .
                "</p></body></html>\n";
 }
 
@@ -1608,6 +1626,7 @@ function wfMkdirParents( $fullDir, $mode = 0777 ) {
        foreach ( $createList as $dir ) {
                # use chmod to override the umask, as suggested by the PHP manual
                if ( !mkdir( $dir, $mode ) || !chmod( $dir, $mode ) ) {
+                       wfDebugLog( 'mkdir', "Unable to create directory $dir\n" );
                        return false;
                } 
        }
@@ -1827,6 +1846,41 @@ function wfBaseName( $path ) {
        }
 }
 
+/**
+ * Generate a relative path name to the given file.
+ * May explode on non-matching case-insensitive paths,
+ * funky symlinks, etc.
+ *
+ * @param string $path Absolute destination path including target filename
+ * @param string $from Absolute source path, directory only
+ * @return string
+ */
+function wfRelativePath( $path, $from ) {
+       // Normalize mixed input on Windows...
+       $path = str_replace( '/', DIRECTORY_SEPARATOR, $path );
+       $from = str_replace( '/', DIRECTORY_SEPARATOR, $from );
+       
+       $pieces  = explode( DIRECTORY_SEPARATOR, dirname( $path ) );
+       $against = explode( DIRECTORY_SEPARATOR, $from );
+
+       // Trim off common prefix
+       while( count( $pieces ) && count( $against )
+               && $pieces[0] == $against[0] ) {
+               array_shift( $pieces );
+               array_shift( $against );
+       }
+
+       // relative dots to bump us to the parent
+       while( count( $against ) ) {
+               array_unshift( $pieces, '..' );
+               array_shift( $against );
+       }
+
+       array_push( $pieces, wfBaseName( $path ) );
+
+       return implode( DIRECTORY_SEPARATOR, $pieces );
+}
+
 /**
  * Make a URL index, appropriate for the el_index field of externallinks.
  */
@@ -2040,7 +2094,7 @@ function wfGetPrecompiledData( $name ) {
 }
 
 function wfGetCaller( $level = 2 ) {
-       $backtrace = debug_backtrace();
+       $backtrace = wfDebugBacktrace();
        if ( isset( $backtrace[$level] ) ) {
                if ( isset( $backtrace[$level]['class'] ) ) {
                        $caller = $backtrace[$level]['class'] . '::' . $backtrace[$level]['function'];
@@ -2061,7 +2115,7 @@ function wfGetAllCallers() {
                                $frame["class"]."::".$frame["function"]:
                                $frame["function"]; 
                        '),
-               array_reverse(debug_backtrace())));
+               array_reverse(wfDebugBacktrace())));
 }
 
 /**
@@ -2110,8 +2164,9 @@ function wfWikiID() {
  *                master (for write queries), DB_SLAVE for potentially lagged 
  *                read queries, or an integer >= 0 for a particular server.
  *
- * @param array $groups Query groups. A list of group names that this query 
- *              belongs to.
+ * @param mixed $groups Query groups. An array of group names that this query 
+ *              belongs to. May contain a single string if the query is only 
+ *              in one group.
  */
 function &wfGetDB( $db = DB_LAST, $groups = array() ) {
        global $wgLoadBalancer;