Как запустить скрипт python virtualenv в качестве git pre-commit hook - PullRequest
7 голосов
/ 27 января 2012

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

#!/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 (вместо работы с python virtualenv).

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

Ответы [ 2 ]

4 голосов
/ 27 января 2012

Вы можете проверить в своем скрипте предварительной фиксации переменную $ 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
0 голосов

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

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

.git /hooks / pre-commit:

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

.git / hooks / 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 или верхнего уровня вашего приложения и ставить ссылки на все хуки в один файл.

Этот методимеет преимущество быть независимым от virtualenv: он также работает с Ruby RVM rbenv.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...