Предотвращение фиксации pdb или pytest set_trace с помощью перехвата предварительной фиксации

#python #git #githooks

#python #git #githooks

Вопрос:

Я хотел бы создать перехват предварительной фиксации git, который предотвращает раскомментированный pytest.set_trace() or pdb.set_trace() и другие .set_trace() . Это потому, что я часто выполняю отладку из командной строки и иногда забываю, что я оставил инструкцию debug в коде. Используя перехват предварительной фиксации, я смогу избежать этого в будущем.

В блоге Keul есть решение для этого, но сеанс должен находиться в корневом каталоге репозитория git, чтобы он работал, иначе он будет жаловаться.

Я в основном хочу not , чтобы эквивалент этого работал в grep

 #(s )?.*.set_trace()
  

Смотрите Тест regexr

Спасибо

Ответ №1:

Правильное регулярное выражение ^s?[^#] .set_trace()

Объяснение:

  1. ^ начинается с
  2. s? соответствует пробелу или более, или пробел отсутствует
  3. [^#] соответствует любым символам, исключая #
  4. .set_trace() соответствует любой функции, заканчивающейся на .set_trace()
    • мы можем быть более явными, включив только pdb or pytest set_trace s, но могут быть и другие пакеты, которые также имеют set_trace

Пример кода python

 import pdb

if __name__ == "__main__":
      pdb.set_trace()
      pytest.set_trace()
      # pdb.set_trace()
      #       pytest.set_trace()
      #pytest.set_trace()
# pdb.set_trace()
      # somethingelse.set_trace()
  

Проверьте, используя ripgrep

 $ rg '^s?[^#] .set_trace()'
main.py
4:      pdb.set_trace()
5:      pytest.set_trace()
  

Теперь мы можем использовать git-secrets , который запускается при перехвате предварительной фиксации, и это помешает нам зафиксировать эту строку

 $ git secrets --add '^s?[^#] .set_trace()'
$ git add main.py
$ git commit -m 'test'
main.py:4:      pdb.set_trace()
main.py:5:      pytest.set_trace()