Existe uma melhor maneira de escrever um git pré-compromisso de gancho para verificar qualquer arquivo php em um commit para analisar erros?
-
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
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);
}