From af5fc8a017e9659d2abc7b09cc06abb38cb3e4d8 Mon Sep 17 00:00:00 2001 From: Correl Roush Date: Fri, 15 Feb 2008 20:12:49 +0000 Subject: [PATCH] Added the ability to supply SVN revisions to check Mantis: 2691 git-svn-id: file:///srv/svn/scanner/trunk@6 a0501263-5b7a-4423-a8ba-1edf086583e7 --- scanner.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/scanner.php b/scanner.php index 49c85c5..56cf660 100644 --- a/scanner.php +++ b/scanner.php @@ -17,7 +17,10 @@ $config = array( 'output_file' => 'php://stdout', 'quiet' => false, ); -$help = "Usage: {$argv[0]} [options] file|path [file|path ...] +$help = "Usage: +{$argv[0]} [options] file|path [file|path ...] +{$argv[0]} [options] -b base_path -r revision[,revision ...] + Options: -b path Set the base path for the scan. Useful if you want --base-path path to scan individual files in a code base that don't @@ -39,7 +42,10 @@ Options: -q Suppresses all progress output --quiet - --svn Enables SVN integration + -r Get files from a comma separated list of SVN revisions. + You must supply a base path first for this! + + --svn Enables SVN integration "; $faults = array(); @@ -53,7 +59,13 @@ class ScannerModule { err( "Initializing " . get_class( $this ) . "...\n" ); } function fault( $object, $level, $reason = '' ) { - global $config, $faults; + global $config, $revisions, $faults; + if( count( $revisions ) > 0 && !in_array( $this->blame[$object['line']]['revision'], $revisions ) ) { + /* If files have been added using SVN revisions, filter out any faulty + changes that aren't a part of the requested changeset(s). + */ + return false; + } $object['file'] = filename( $object['file'] ); $faults[] = $this->faults[] = array( 'module' => get_class( $this ), @@ -126,6 +138,7 @@ function err( $string ) { // Handle application arguments +$revisions = array(); $files = array(); $base_path = false; for( $i = 1; $i < $argc; $i++ ) { @@ -157,6 +170,43 @@ for( $i = 1; $i < $argc; $i++ ) { case '--quiet': $config['quiet'] = true; break; + case '-r': + $revs = explode( ',', $argv[++$i] ); + if( $base_path === false ) { + die( "Set a base path before supplying SVN revisions\n" ); + } + // First, find out what the full path is so we can trim it down to the relative one. + $xml = shell_exec( "svn info --xml $base_path" ); + $parser = xml_parser_create(); + xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 ); + xml_parse_into_struct( $parser, $xml, $values, $index ); + xml_parser_free( $parser ); + foreach( $values as $value ) { + switch( $value['tag'] ) { + case 'URL': + $svn_url = $value['value']; + break; + case 'ROOT': + $svn_root = $value['value']; + } + } + $svn_base = substr( $svn_url, strlen( $svn_root ) ); + foreach( $revs as $rev ) { + $revisions[] = $rev = intval( $rev ); + $xml = shell_exec( "svn log -v --xml -r $rev $base_path" ); + $parser = xml_parser_create(); + xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 ); + xml_parse_into_struct( $parser, $xml, $values, $index ); + xml_parser_free( $parser ); + foreach( $values as $value ) { + if( $value['tag'] == 'PATH' ) { + $file = realpath( $base_path . substr( $value['value'], strlen( $svn_base ) ) ); + if( !in_array( $file, $files ) ) { + $files[] = $file; + } + } + } + } case '--svn': $config['svn'] = true; break; @@ -220,5 +270,7 @@ foreach( $files as $file ) { } err( "\n" ); $modules['output']->write( $config['output_file'] ); + +sleep( 1 ); err( sprintf( "Found %d faults in %d files.\n", count( $faults ), count( $files ) ) ); ?>