Existe uma melhor maneira de escrever um git pré-compromisso de gancho para verificar qualquer arquivo php em um commit para analisar erros?

StackOverflow https://stackoverflow.com/questions/43374

  •  09-06-2019
  •  | 
  •  

Pergunta

O que eu tenho até agora é

#!/bin/sh

php_syntax_check()
{
    retval=0
    for i in $(git-diff-index --name-only --cached HEAD -- | grep -e '\.php$'); do
        if [ -f $i ]; then
            output=$(php -l $i)
            retval=$?
            if [ $retval -gt 0 ]; then
                echo "=============================================================================="
                echo "Unstaging $i for the commit due to the follow parse errors"
                echo "$output"
                git reset -q HEAD $i
            fi
        fi
    done

    if [ $retval -gt 0 ]; then
        exit $retval
    fi
}
php_syntax_check
Foi útil?

Solução

Se o commit é um parcial de consolidação (não todas as alterações na árvore de trabalho estão comprometidos) e, em seguida, fazer dar resultados incorretos, pois testa a cópia de trabalho, e não a teste de cópia.

Uma maneira de fazer isso pode ser:

git diff --cached --name-only --diff-filter=ACMR | xargs git checkout-index --prefix=$TMPDIR/ --
find $TMPDIR -name '*.php' -print | xargs -n 1 php -l

O que gostaria de fazer uma cópia do teste de imagens em um espaço de rascunho e, em seguida, execute o comando de teste-los lá.Se qualquer um dos arquivos de incluir outros ficheiros na compilação, em seguida, poderá ter de recriar todo encenado imagem no teste de árvore e, em seguida, teste os arquivos alterados lá (Veja: Git pré-commit gancho :alterado e/ou arquivos adicionados).

Outras dicas

Me desculpe se é offtopic, mas não é suposto para executar algum tipo de testes automatizados (o que implica que o código não tem erros de sintaxe) antes de fazer o commit?

Se você tem o php5-cli instalado, você pode escrever a sua pré-commit no PHP e usar a sintaxe mais familiarizado.

Basta fazer algo mais gosta.

#!/usr/bin/php
<?php /* Your pre-commit check. */ ?>

Meu PHP implementação do pre-commit gancho verifica se os arquivos modificados no git são "livre de erros" e são, como por PSR2 padrão usando 'php-code-sniffer' ou 'php-cs-fixer'

#!/usr/local/bin/php
<?php
    /**
         * Collect all files which have been added, copied or
         * modified and store them in an array - output
         */
        exec('git diff --cached --name-only --diff-filter=ACM', $output);

        $isViolated = 0;
        $violatedFiles = array();
        // $php_cs_path = "/usr/local/bin/php-cs-fixer";
        $php_cs_path = "~/.composer/vendor/bin/phpcs";

        foreach ($output as $fileName) {
            // Consider only PHP file for processing
            if (pathinfo($fileName, PATHINFO_EXTENSION) == "php") {
                $psr_output = array();

                // Put the changes to be made in $psr_output, if not as per PSR2 standard

                // php-cs-fixer
                // exec("{$php_cs_path} fix {$fileName} --rules=@PSR2 --dry-run --diff", $psr_output, $return);

                // php-code-sniffer
                exec("{$php_cs_path} --standard=PSR2 --colors -n {$fileName}", $psr_output, $return);

                if ($return != 0) {
                    $isViolated = 1;
                    $violatedFiles[] = $fileName;
                    echo implode("\n", $psr_output), "\n";
                }
            }
        }
        if ($isViolated == 1) {
            echo "\n---------------------------- IMPORTANT --------------------------------\n";
            echo "\nPlease use the suggestions above to fix the code in the following file: \n";
            echo " => " . implode("\n => ", $violatedFiles);
            echo "\n-----------------------------------------------------------------------\n\n\n";
            exit(1);
        } else {
            echo "\n => Committed Successfully :-)\n\n";
            exit(0);
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top