Как запустить скрипт python virtualenv в качестве git pre-commit hook

Это мой сценарий предварительной фиксации:

#!/bin/bash
for f in .git/hooks/pre-commit.d/*; do
    if [ -x "$f" ]; then
        if ! "$f"; then
            echo "DID NOT COMMIT YOUR CHANGES!";
            exit 1
        fi
    fi
done

Одним из исполняемых файлов в pre-commit.d является скрипт на python (pre-commit-pylint.py), который начинается с:

#!/usr/bin/env python
import pylint

Пилинт установлен на моем virtualenv. Моя проблема в том, что git выполняет pre-commit preeding /usr/libexec/git-core:/usr/bin в $PATH, так что даже если мой virtualenv активирован pre-commit.d/pre-commit-pylint.py скрипт работает с системой /usr/bin/python (вместо того, чтобы работать с питоном virtualenv).

Я хочу иметь хуки, совместимые с разработчиками, которые не используют virtualenv. Есть ли способ прозрачно запустить мой скрипт на python с помощью virtualenv (т. Е. Оставаться совместимым с разработчиками, использующими свой системный python)?

2 ответа

Решение

Вы можете проверить в своем скрипте предварительной фиксации переменную $VIRTUAL_ENV и добавить ее к $PATH соответственно:

#!/bin/bash

if [ -n $VIRTUAL_ENV ]; then
    PATH=$VIRTUAL_ENV/bin:$PATH
fi

for f in .git/hooks/pre-commit.d/*; do
    if [ -x "$f" ]; then
        if ! "$f"; then
            echo "DID NOT COMMIT YOUR CHANGES!";
            exit 1
        fi
    fi
done

То, что я в конечном итоге сделал: .git структура файла:

  • .git/hooks/pre-commit
  • .git/hooks/pre-commit-main.py

.git / Крючки / предварительная фиксация:

#!/usr/bin/env bash
export PATH="$THE_GOOD_PATH"
python "$GIT_DIR/hooks/pre-commit-main.py"

.git / Крючки / pre-commit-main.py:

#!/usr/bin/env python
import sys
print sys.version_info

Затем, когда вы звоните git commit, удостоверься что THE_GOOD_PATH, определено:

export THE_GOOD_PATH="$PATH"
git commit

Вы также можете экспортировать THE_GOOD_PATH="$PATH" от твоего .profile или верхний уровень вашего приложения и символическую ссылку все хуки в один файл.

Преимущество этого метода в том, что он не зависит от виртуальности: он также работает с Ruby RVM rbenv.

Я написал разработчикам Git по адресу: http://permalink.gmane.org/gmane.comp.version-control.git/258454 просьбой покинуть наш PATH один, но первоначальный ответ был WONTFIX.

Другие вопросы по тегам