views:

240

answers:

3

Hey.

I'd like to check code committed to my remote git repository with PHP CodeSniffer and reject it if there are any problems code standards. Does anyone have an example how to use it on git remote repository or maybe example how to use it with pre-receive hook? Thanks.

+2  A: 

Maybe this point you in the right direction: (Orginal from: http://www.squatlabs.de/versionierung/arbeiten-git-hooks in German)

#!/usr/bin/php
<?php

$output = array();
$rc     = 0;
exec('git rev-parse --verify HEAD 2> /dev/null', $output, $rc);
if ($rc == 0)  $against = 'HEAD';
else           $against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';

exec('git diff-index --cached --name-only '. $against, $output);

$needle            = '/(\.php|\.module|\.install)$/';
$exit_status = 0;

foreach ($output as $file) {
        if (!preg_match($needle, $file)) {
                // only check php files
                continue;
        }

        $lint_output = array();
        $rc              = 0;
        exec('php -l '. escapeshellarg($file), $lint_output, $rc);
        if ($rc == 0) {
                continue;
        }
        # echo implode("\n", $lint_output), "\n";
        $exit_status = 1;
}

exit($exit_status);

You will have to edit the exec line exec('php -l... to point to your codesniffer installation.

Rufinus
unfortunately it does not work with pre-receive hook :(
Ralphz
A: 

Ok I found the solution :)

This is proof of concept code :) for pre-receive hook:

#!/bin/bash

while read old_sha1 new_sha1 refname; do
    echo "ns: " $new_sha1;
    echo "os: " $old_sha1;

    echo "----"

    git ls-tree -r $new_sha1 | cut -f 3 -d ' ' | cut -f 1 | while read file; do
        git cat-file blob $file
    done; 

    echo "----"

done

exit 1

This example code will only print blobs received by remote repository but it's enough to get someone needing something like that going (I hope).

You can put every blob in some temporary file run whatever you need on this file delete the file and so on...

Ralphz
A: 

This might help: http://github.com/s0enke/git-hooks/tree/master/phpcs-pre-commit/

s0enke