Git preCommit (возможно, с помощью PhpStorm) и php-cs-fixer

Я хочу автоматический процесс, когда я фиксирую файл моего php-cs-fixer trn и исправляю все файлы, которые добавляются для фиксации, возможно, у PhpStorm есть какая-то возможность запускать внешние инструменты перед фиксацией или отправкой. Я нашел только после фиксации, но мне не нужно после, нужно до. И я пытаюсь настроить свой git, используя событие предварительной фиксации, которое я создаю в своем файле проекта, например, только без расширения

sudo gedit .git/hooks/pre-commit

затем добавьте код

#!/usr/bin/env bash

ROOT="/home/ivan/host/master"

echo "php-cs-fixer pre commit hook start"

PHP_CS_FIXER="php-cs-fixer"
HAS_PHP_CS_FIXER=false

if [ -x php-cs-fixer ]; then
    HAS_PHP_CS_FIXER=true
fi

if $HAS_PHP_CS_FIXER; then
    git status --porcelain | grep -e '^[AM]\(.*\).php$' | cut -c 3- | while read line; do
        $PHP_CS_FIXER fix --config-file=$ROOT/.php_cs --verbose "$line";
        git add "$line";
    done
else
    echo ""
    echo "Please install php-cs-fixer, e.g.:"
    echo ""
    echo "  composer require --dev fabpot/php-cs-fixer:dev-master"
    echo ""
fi

echo "php-cs-fixer pre commit hook finish"

затем сравните, когда я запускаю php-cs-fixer для некоторого файла,

php-cs-fixer fix src/AppBundle/Services/OutboundInvoiceService.php

затем проверьте файл и получите много частей исправления для этого файла, затем измените изменения и просто добавьте пустую строку для этого файла и зафиксируйте его, предварительная фиксация не работает, только то, что у меня есть в моей фиксации репо с пустой строкой, без php-cs- фиксатор рабочий. Что я делаю не так ?

Пример, когда я добавляю неиспользуемые пространства имен, php-cs-fixer должен удалить его и добавить другое исправление, но после добавления файла у меня есть только неиспользуемое пространство имен :(

введите здесь описание изображениявведите здесь описание изображения введите здесь описание изображения введите здесь описание изображения   введите здесь описание изображения

Работает только если я создаю файл php

#!/usr/bin/php
<?php
/**
 * .git/hooks/pre-commit
 *
 */

 /**
  * collect all files which have been added, copied or
  * modified and store them in an array called output
  */
 exec('git diff --cached --name-status --diff-filter=ACM', $output);
foreach ($output as $file) {

$fileName = trim(substr($file, 1) );
/**
 * Only PHP file
 */
if (pathinfo($fileName,PATHINFO_EXTENSION) == "php") {
    /**
     * Check for error
     */
    $lint_output = array();
    exec("php -l " . escapeshellarg($fileName), $lint_output, $return);
    if ($return == 0) {

        /**
         * PHP-CS-Fixer && add it back
         */
        exec("php-cs-fixer fix {$fileName}; git add {$fileName}");
    } else {

        echo implode("\n", $lint_output), "\n";

        exit(1);

    }
    }
}
exit(0);

и после того, как git добавить файл перед нажатием, запустите этот файл.

Но это сложный подход, потому что после фиксации файла мне нужно запустить этот скрипт, НО ЭТО РАБОТАЕТ.

И мой вопрос, как использовать git hooks pre-commit для автоматического этого процесса?


person shuba.ivan    schedule 24.07.2017    source источник
comment
Взгляните на github.com/refinery29/php-cs- fixer-config#pre-commit-hook   -  person localheinz    schedule 24.07.2017
comment
У меня очень похожий код, но, возможно, проблема в какой-то переменной, которую я меняю ` ROOT=/home/ivan/host/master/src/` или PHP_CS_FIXER="php-cs-fixer" у меня есть глобальная команда php-cs-fixer, что вы думаете об этом? И не знаю, как я зафиксировал файл с помощью git-gui, PhpStorm или консольной команды?   -  person shuba.ivan    schedule 24.07.2017
comment
Кстати, пакет fabpot/php-cs-fixer был перемещен и переименован в friendsofphp/php-cs-fixer, см. packagist.org. /packages/fabpot/php-cs-fixer.   -  person localheinz    schedule 24.07.2017
comment
Да, я устанавливаю глобально этот пакет. Я обновляю свой ответ, добавляю скрин, посмотрите пожалуйста   -  person shuba.ivan    schedule 24.07.2017