15

Click here to load reader

SVN Hook

Embed Size (px)

DESCRIPTION

Some slides from a PHP usergroup talk about a svn pre commit hook.

Citation preview

Page 1: SVN Hook

PHPUG

SVN Commit Hookcoding standard and syntax check

Page 2: SVN Hook

Pre-Commit Hook

● Check data before commit● Can not change files● Return error messages● Allow/disallow commit

Page 3: SVN Hook

pre-commit

● Shellscript– Parameters

● --transaction● --revision

– Attributes● 1 = repository● 2 = transaction

– Return error code● = 0 – no error, finish commit● <> 0 – error, abort

Page 4: SVN Hook

Get Changes

● svnlook changed /svn/repository– Returns file list prefixed with action (no xml)

● A = added, U = updated

● Create a list of changes– Filter for action and files extension– Filter for external code files

Page 5: SVN Hook

Get File Content● svnlook cat /svn/repository/trunk/project/file.php --transaction 123

● No local file, just the content

Page 6: SVN Hook

PHPCodeSniffer

● PEAR package● Check files, directories or a string● Parses php source to tokens

– ext/tokenizer– JS support

● Runs checks on token tree● Default checks for several coding standards● Outputs text or xml

Page 7: SVN Hook

Use PHPCodeSniffer: Source

//init code snifferinclude('PHP/CodeSniffer.php');$phpcs = new PHP_CodeSniffer(1, 1, array(), TRUE); //run the codesnifferob_start();$phpcs->process($phpFiles, 'PAPAYA');ob_end_clean(); ob_start();$phpcs->printXMLErrorReport(FALSE);$xml = ob_get_clean();

Page 8: SVN Hook

Use PHPCodeSniffer

● Block output during process()● Catch output from printXMLErrorReport()● Parse XML messages● Extract/map file name● Output error messages to php://stderr

Page 9: SVN Hook

Problem: No local files

● Call PHPCodesniffer for each file providing its content

– Performance● Write temporary files

– Performance– Different file names

● PHP stream wrapper– Different file names

Page 10: SVN Hook

PHP Stream Wrapper

● Define a location syntax– svnlook:///svn/repository/.../file.php|transaction|123

● Register your own stream wrapper

include(dirname(__FILE__).'/svnlookstreamwrapper.php');stream_wrapper_register( 'svnlook', 'SVNLookStreamWrapper');

Page 11: SVN Hook

SVNLookStreamWrapper

● PHP class● Read only● Public methods

– url_stat()● Used by file_exists()

– stream_open() / stream_read() / stream_seek()– stream_tell() / stream_eof()

Page 12: SVN Hook

Error Sample

Page 13: SVN Hook

PHP Syntax Check

● PAPAYA_Sniffs_Debug_PHPLintSniff– .../PEAR/PHP/CodeSniffer/Standards/PAPAYA/

Sniffs/Debug/PHPLintSniff.php● Use the PHP binary: php -l● No local files

– Temporary file– Pipes

Page 14: SVN Hook

PHP Lint$descriptorSpec = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'),);$pipes = array(); $lint = proc_open( $lintPath.' -l', $descriptorSpec, $pipes);if (is_resource($lint)) { fwrite($pipes[0], file_get_contents($fileName)); fclose($pipes[0]); $output = preg_split( '(\r\n|\n\r|[\r\n])', stream_get_contents($pipes[1]) ); fclose($pipes[1]); $exitCode = proc_close($lint);

Page 15: SVN Hook

Syntax Error Sample