Как запустить пользовательский файл сценария оболочки до хука предварительной фиксации

В моем проекте python у меня есть pre-commit-config.YAML, в котором я хочу создать свой собственный файл.

Назначение этого файла - сбой git commit, если ошибки python lint больше определенных чисел. Следующая команда будет использоваться для подсчета строк

pylint api/ | wc -l

Может кто-нибудь предложить какой-нибудь подход. Я новичок в экосистеме MAC и Python?

EDIT sh файл выглядит так.

#!/bin/sh
a=$(pylint source/ | wc -l)
b=20

errorsCount="$(echo "${a}" | tr -d '[:space:]')"

if [ $errorsCount -gt $b ]
then
    exit 1
fi

Я пытался

repos:
- repo: local
  hooks:
    - id: custom-script-file
      name: custom-script-file
      entry: hooks/pre-commit.sh
      language: script
      types: [python]
      pass_filenames: false

Но это не сработало.


person Kedar Shinde    schedule 27.12.2019    source источник
comment
But it wouldn't worked не могли бы вы уточнить? Как вы проверили, что это не работает? Любая ошибка вывода?   -  person RafalS    schedule 27.12.2019
comment
догадываюсь, у тебя бы не получилось, что это Skipped? попробуйте с --all-files или установив always_run: true (если вы хотите, чтобы он всегда работал)   -  person Anthony Sottile    schedule 27.12.2019


Ответы (1)


Вот что вы можете сделать, чтобы использовать встроенную команду bash в качестве записи ловушки перед фиксацией

- repo: local
  hooks:
    - id: pylint-error-count
      name: pylint-error-count
      entry: bash -c 'lines=$(pylint api/ | wc -l) && (( lines > 10)) && exit 1'
      language: system
      types: [python]
      pass_filenames: false

Вы также можете написать сценарий и вызвать его следующим образом:

      entry: path/relavite/to/repo/root/pylint_validator.sh
      language: script

ПРИМЕЧАНИЕ. wc -l - неточное число ошибок.

РЕДАКТИРОВАТЬ: добавление дополнительных опций

- repo: local
  hooks:
    - id: simple-pylint
      name: simple-pylint
      entry: pylint
      args: ["api/"]
      language: system
      types: [python]
      pass_filenames: false

    - id: inline-pylint-with-bash
      name: inline-pylint-with-bash
      entry: bash -c 'lines=$(pylint api/ | wc -l) && (( lines > 10)) && exit 1'
      language: system
      types: [python]
      pass_filenames: false

    - id: custom-script-file
      name: custom-script-file
      entry: relative/path/to/repo/root/check_pylint.sh
      language: script
      types: [python]
      pass_filenames: false

person RafalS    schedule 27.12.2019
comment
Спасибо за ваш ответ. Вы можете сообщить мне об этом с помощью подключаемого файла сценария? Я бы добавил еще чеков. Я проверю и помечу как ответ позже. Я ценю вашу помощь. - person Kedar Shinde; 27.12.2019
comment
Я отредактировал вопрос. Пожалуйста, еще раз проверьте. Третий способ не сработал. - person Kedar Shinde; 27.12.2019
comment
Встроенный один: запись: bash -c 'lines = $ (pylint api / | wc -l) && ((строки ›10)) && exit 1' не сработало. - person Kedar Shinde; 27.12.2019
comment
У меня совсем не работает. - person Artem Dumanov; 13.03.2021