Automatické testování coding style pro změněné soubory Mozektevidi.net - Mozektevidi.net.

Automatické testování coding style pro změněné soubory

Máte rozjetý projekt, který nemá ve všech souborech opravený coding style a oprava všech chyb by trvala moc dlouho? Ani v tomto případně neodkládejte automatickou kontrolu coding standards. Každý nový pull request zlepší váš kód. Jak nastavit kontrolu kódu jen pro změněné soubory? PHP + Travis + git + PHP CodeSniffer

Soubor .travis.yml

before_script:
  - if [ ! -d "vendor/php-parallel-lint" ]; then composer create-project --prefer-dist --no-interaction jakub-onderka/php-parallel-lint vendor/php-parallel-lint; fi
  - php vendor/php-parallel-lint/parallel-lint.php -e php --exclude vendor .

První řádek mi nainstaluje paraller lint, dalším řádkem se pak spustí rychlá kontrola, zda v souboru není parse error.

script:
  - composer global require "squizlabs/php_codesniffer=*"
  - touch app/cache/cs.sh
  - git remote add upstream git@github.com:mzk/foo.git
  - php app/run-cs.php
  - chmod +x app/cache/cs.sh
  - app/cache/cs.sh
  1. Nejprve se nainstaluje php code sniffer. XML soubor s pravidli našeho projektuje v git repozitáři.
  2. Vytvořím prázdný soubor cs.sh (kvůli právům)
  3. do repozitáře přidám remote upstream. Je to protože travis si naklonuje pouze branch, ve které je pull request. (git fetch origin +refs/pull/272/merge:) A my potřebuje větve master + stable, abychom věděli jaké soubory jsou změněné.
  4. spustím soubor run-cs.php, který obsahuje toto:
run-cs.php
<?php

exec('git diff --name-only master', $changedAllFilesMaster); //změněné soubory oproti větvi master
exec('git diff --name-only upstream/stable', $changedAllFilesStable); //změněné soubory oproti větvi stable

//less changed files => probable pull request master / stable
if (count($changedAllFilesMaster) < count($changedAllFilesStable)) {
    $changedAllFiles = $changedAllFilesMaster;
} else {
    $changedAllFiles = $changedAllFilesStable;
}

print_r($changedAllFiles);

//ne všechny soubory chci kontrolovat. Ty které mají v commit message `--no-check` se nekontrolují + ty co jsou v souboru `.csignore`
$filteredFiles = [];
foreach ($changedAllFiles as $file) {
    $file = trim($file);
    exec('git log --oneline -n 1 -- ' . $file, $output);
    if (isset($output[0])) {
        $output = $output[0];
    } else {
        $output = ''; //new file = output empty array.
    }

    $fileNames = [];
    if (file_exists(__DIR__ . '/.csignore')) {
        $fileNames = explode("\n", file_get_contents(__DIR__ . '/.csignore'));
    }

    if (!strpos($output, '--no-check') && strpos($file, '.php') && file_exists($file)) {
        $filteredFiles[] = $file;
    }

    $filteredFiles = array_diff($filteredFiles, $fileNames);
}

print_r($filteredFiles);
$str = '#!/usr/bin/env bash' . "\n";
if ($filteredFiles) {
    $str .= '~/.composer/vendor/bin/phpcs --standard=ruleset.xml --extensions=php --warning-severity=0 --encoding=utf-8 --tab-width=4 -sp';
    foreach ($filteredFiles as $file) {
        $str .= ' ' . $file;
    }
}

file_put_contents(__DIR__ . '/../app/cache/cs.sh', $str);
chmod(__DIR__ . '/../app/cache/cs.sh', 777);
  1. Nastavím práva na spuštění a vytvořený soubor spustím.

Zbytečné psát, ale přecijen.

Pokud ještě nemáte napsané testy pro coding style, určitě si je napište. Ušetříte si zbytečné komentování pull requestů, kde bude plno zbytečných zpráv typu cs, fix cs, remove whitespace, add new line... Tyto testy se dají pouštět i na localhostu ještě před posláním pull requestu.

Nám se toto v praxi hodně osvědčilo. Pull requesty, které opravovali coding style měli i 5 tisíc změněných řádků. A než na to někdo kouknul a dal merge, tak byly konflikty. Navíc se to nikomu nechce opravovat ani dělat review.

Tímto prostě musí, jakmile soubor změní. A to je fajn "buzerace" :).


autor článku OS | datum publikování 29.Oct.2016 19:44 | články ze světa počítačů IT |

Kometáře

Zatím tu nejsou žádné (schválené) kometáře.

Přidej názor do diskuze

Pamatuj na to, že tvůj příspěvek o tobě něco vypovídá. O tom, jak jsi inteligentní, jak se chováš a kolik ti je let. Tak se podle toho chovej ;-)
Kometáře s neověřenou IP adresou čekají na ruční schválení. Pokud se některý kometář nezobrazí ihned, čeká na schválení, neposílejte komentář znova.