/kr-githooks-collection

Githook collection

GNU General Public License v3.0GPL-3.0

Table of Contents

  1. Проверка на брейкпоинты и временный код.
  2. Контроль тестирования\сборки
    1. Сборка
  3. Вставка имени ветки в сообщение коммита
  4. Настройка и добавление хуков в репы
    1. Бонус для емаксеров
  5. Дополнение

Шаблоны git-хуков, облегчающие трудовыебудни.

И немного поднимающие настроение. Чтобы завести своего гитотамагочи, установите cowsay и наслаждайтесь. А нет, так выпилите. Это ж шаблон, в конце концов.

Проверка на брейкпоинты и временный код.

Помечать временный код – хорошее решение. Помечайте временный код. Называйте специфично временные переменные, или добавляйте соответствующий комментарий. Я, например, для помечания временного кода использую слово Petuch в данных, комментариях или как имя временной переменной, используемой для отладки. Хук отлавливает помеченный временный код, забытые бряки гнутых дебаггеров и прерывает коммит при их нахождении.

REJECT_MESSAGE=$($GETTEXT "Кажется, тут сломанная ветка! Код содержит брейкпоинты или помеченные временные конструкции. Удалите их перед коммитом!")
CLEAR_STATUS_MESSAGE=$($GETTEXT "Код не содержит бряков и временного кода")
tc_check=$(git grep -i "$REGXP_TC" -- "$F_MASK")
if [ ${#tc_check} -gt 0 ]
then
        echo -e $tc_check "\e[31m$REJECT_MESSAGE\e[0m" | cowsay -f bounty
        echo -e $tc_check 
        exit 1
else
        echo -e $tc_check "\e[36m$CLEAR_STATUS_MESSAGE\e[0m" | cowsay
        echo -e $tc_check 
fi

Контроль тестирования\сборки

Перед коммитов выполняется команда на контроль качества. Прогон тестов, сборка.

TEST_PASSED=$($GETTEXT "\e[36mТесты пройдены успешно\e[0m")
TEST_FAILED=$($GETTEXT "
\e[31mCOMMIT REJECTED: Кажется, тут сломанная ветка! 
Убедитесь, что программа работает корректно и повторите попытку.\e[0m
Если подозреваете, что в поломке виноват кто-то другой (или молодой вы), 
воспльзуйтесь командой\n
\t\e[1mgit bisect\e[0m
")
$QCONTROL_COMMAND
RESULT=$?
if [ $RESULT -ne 0 ]
then
    echo -e $TEST_FAILED | cowsay -f bounty
    exit 1
else
    echo -e $TEST_PASSED | cowsay 
fi

Сборка

В блок кода ниже вставить имена чанков в noweb-синтаксисе и выполнить org-babel-tangle (по-умолчанию C-c C-v t)

#!/bin/bash
{{{l10n}}}
REGXP_TC="; Tracer()()\|.set_trace()\|petuch"
F_MASK="*.py"
QCONTROL_COMMAND="./manage.py test"
{{{Проверка на наличие нежелательного\временного кода}}}
{{{тесты перед коммитом}}}
exit 0

Вставка имени ветки в сообщение коммита

Всякие ЖИРО-образные системы любят, чтобы в сообщении коммита писались имена задач, чтобы их можно было вставлять в историю задач. И чтобы еще и ветки так же назывались. По жиротрадиции, это что-то вроде FOO-1337.

#!/bin/bash 
BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD | grep "[[:upper:]].*-[[:digit:]].*")
echo "$BRANCH_NAME" >> $1

Настройка и добавление хуков в репы

Один из вариантов – проекто-специфичные вещи описать в отдельном орг-файле. Для того, чтобы чанки из этого сурца были доступны для извлечения в проектном орг-файле, выполните M-x org-babel-lob-ingest и укажите путь до файла program.org

#+TITLE: Пример настройки проекта
#+AUTHOR: Roman Zayrullin
#+EMAIL: krosenmann@gmail.com
#+STARTUP: showall


* На стройку!
Проект настраивается заполнением таблицы. Каждая переменная необходима
либо для работы и установки, а так же служит напоминанием, какой набор
хуков в какой проект установлен. 
#+TBLNAME: setup
| Имя параметра    | значение                                    | Описание                                                   |
|------------------+---------------------------------------------+------------------------------------------------------------|
| REGXP_TC         | "; Tracer()()"                              | Регулярка с нежелательными последовательностями            |
| F_MASK           | "*.py"                                      | Маска файлов, по которым ведется поиск последовательностей |
| QCONTROL_COMMAND | "./manage.py test"                          | Контрольная команда (тесты, сборка, етс.)                  |
| PROJECT          | "/home/roman/sources/django-business-logic" | Путь до проекта                                            |
|------------------+---------------------------------------------+------------------------------------------------------------|

#+NAME: create-precommit
#+header: :shebang #!/bin/bash :var F_MASK=setup[3, 1] :var QCONTROL_COMMAND=setup[4, 1] :var REGEXP_TC=setup[2, 1]
#+BEGIN_SRC shell :noweb yes :tangle pre-commit :exports none :results output
  {{{l10n}}}
  {{{Проверка на наличие нежелательного\временного кода}}}
  {{{тесты перед коммитом}}}
#+END_SRC

#+RESULTS: create-precommit

После того, как все необходимые параметры заданы:
1. ~C-c C-v t~ - для извлечения чанков с хуками
2. ~C-c C-c~ на строке CALL ниже

#+CALL: установка(PROJECT=setup[5, 1])

#+RESULTS:

* File-local variables                                             :noexport:  
  # Local Variables:
  # org-babel-noweb-wrap-start: "{{{"
  # org-babel-noweb-wrap-end: "}}}"
  # org-confirm-babel-evaluate: nil
  # org-export-allow-bind-keywords: t
  # End:

Бонус для емаксеров

  • Настройка
    1. Задать значения для переменных
    2. Вставить чанки интересующих хуков {{{<имя чанка>}}}
    3. Выполнить C-c C-v t
  • Установка
    1. Перейти в чанк "установка"
    2. В хедере чанка, в переменной PROJECT, задать путь до проекта
    3. В чанке "установка" выполнить C-c C-c

Дополнение

А если станет совсем печально и скучно, то на фейлы можно поставить вот этого парня. Для установки извлеченный cow-файл поместите в /usr/share/cowsay/cows

 ________________________________
< Кажется, здесь сломанная ветка >
 --------------------------------
                                              \
                                               \
                                                \      
                                                 \
                                                  \
                                                   \        
                                                    \  | \
                                             ,,        |: \    / 
                         /""-.               + \,     _|,: +- /|        
                   _ /"''     \.,             \  \, _/   \:| \ |          
                ./               \    ,________\   X-     \|   \             
               / _,-'"\           \,-/          \_/    \      / \-,            
              |/'      \     ,---/    \           |  "{C\    /C)|  \         /\
                      /   /""         |            \__    ( \ __/   ',      /  ",
                      | /"       .-.   \            \ \-___''/  |,    ',   / ,"' 
                      /"      ,-'   \, |             \          | '-,   \ /  ', 
                     /      .'        '-\             \         \    \   ',   ,'
                   /-     /'            |              ""\       |    \   | ,"
                  /     /'             ,-\.               |"\    ,    / ,. ', 
               /'/    .'            ,-/    \--------,__    \  ""-"    \/ /  : 
             /' /      ',      ,---/       /-------,   '--'"\         / /"-'  
           /'  /         ;    '.      ,-' /'        '"'-.---'\       (__)    
         /'   /    ,--,__/      \-, /'   /                    \.             
       /'    | /  / /""  \        .'   /'                       \            
      |      /\/__/|     |       /    /            /\            \ 
       -____/       -.__/        -----\,__________/  \___________/