'Perforce', 'url' => 'http://public.perforce.com', 'author' => 'Matt Attaway', 'description' => 'Display Perforce data in wiki pages', ); function perforceExtension() { global $wgParser; $wgParser->setHook( "changelist", "renderChangelist" ); $wgParser->setHook( "recentchanges", 'tagP4Changes' ); $wgParser->setFunctionHook( 'p4changes', 'runP4Changes' ); } function wfPerforceLanguageGetMagic( &$magicWords, $langCode = "en" ) { switch( $langCode ) { default: $magicWords['p4changes'] = array ( 0, 'p4changes' ); } return true; } # {{#p4changes:num|path|brief/long/full|user}} function runP4Changes( &$parser, $num = '', $path = '', $desc = '', $user = '' ) { $argv['num'] = $num; $argv['path'] = $path; $argv['desc'] = $desc; $argv['user'] = $user; return renderRecentChanges( '', $argv, $parser, 'wiki' ); } function tagP4Changes( $input, $argv, &$parser ) { return renderRecentChanges( $input, $argv, $parser, 'html' ); } function renderChangelist( $input, $argv, &$parser ) { global $wgP4EXEC; global $wgP4PORT; global $wgP4USER; global $wgP4PASSWD; global $wgP4WEBURL; if( $argv["style"] ) { $range = '@' . $input . ',' . $input; $cmdline = wfEscapeShellArg( $wgP4EXEC ) . " -u " . wfEscapeShellArgr( $wgP4USER ) . " -p " . wfEscapeShellArg( $wgP4PORT ); if( $wgP4PASSWD != "" ) $cmdline .= " -P " . wfEscapeShellArg( $wgP4PASSWD ); $cmdline .= " changes " . wfEscapeShellArg( $range ); $text = `{$cmdline}`; return formatShortChange( $text ); } else return "" . $input . ""; } function renderRecentchanges( $input, $argv, &$parser, $format ) { $parser->disableCache(); global $wgP4EXEC; global $wgP4PORT; global $wgP4USER; global $wgP4PASSWD; $path = $argv["path"]; $num = $argv["num"]; $desc = $argv["desc"]; $user = $argv["user"]; if( $path == "" || $num == "" ) return "Please provide both a depot path(path attribute) and the number of changes to show(num attribute)."; $arg = $path . '@' . $change; $cmdline = $wgP4EXEC . " -u " . $wgP4USER . " -p " . $wgP4PORT ; if( $wgP4PASSWD != "" ) $cmdline .= " -P " . $wgP4PASSWD ; $cmdline .= " changes -m" . escapeshellarg( $num ) . " "; if ( $desc == "long" ) $cmdline .= "-L "; if ( $desc == "full" ) $cmdline .= "-l "; if ( $user != "" ) $cmdline .= "-u " . escapeshellarg( $user ) . " "; $cmdline .= escapeshellarg( $path ); $cmdline .= ' 2>&1'; $changes = array(); exec( $cmdline, $changes ); $isDarkStripe = true; $output .= "'; $inListList = false; } if ( $inList ) { $output .= "\n"; $inList = false; } $output .= ""; return $output; } function formatShortChange( $text, $format='html' ) { global $wgP4WEBURL; $pattern[0] = '/Change (\d+) /'; $pattern[1] = '/ (\S+)@(\S+)/'; switch( $format ) { default: case 'html': $replacement[0] = 'Change ${1} '; $replacement[1] = ' ${1}@${2} '; break; case 'wiki': $replacement[0] = 'Change [' . $wgP4WEBURL . '${1}?ac=10 ${1}] '; $replacement[1] = ' [' . $wgP4WEBURL . '${1}?ac=17 ${1}]@[' . $wgP4WEBURL . '${2}?ac=15 ${2}] '; break; } return preg_replace( $pattern, $replacement, $text ); } ?>