2012-01-27 8 views
6

Ésta es mi guión pre-commit:¿Cómo puedo ejecutar un script Python virtualenv como git gancho pre-commit

#!/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 

Uno de los ejecutables en pre-commit.d es un script en Python (pre- commit-pylint.py) que comienza con:

#!/usr/bin/env python 
import pylint 

pylint está instalado en mi virtualenv. Mi problema es que git ejecuta pre-commit anteponiendo /usr/libexec/git-core:/usr/bin a $PATH, por lo que incluso si mi virtualenv está activado, el script pre-commit.d/pre-commit-pylint.py se ejecuta con el sistema /usr/bin/python (en lugar de ejecutarse con el virtualenv python).

Quiero tener ganchos que son compatibles para los desarrolladores que no están usando virtualenv. ¿Hay alguna manera de ejecutar mi secuencia de comandos python virtualenv de forma transparente (es decir, permanecer compatible con los desarrolladores que están utilizando su sistema python)?

+0

¿Alguna vez encontró una forma de evitar que Git anteponga '/ usr/bin' al $ PATH del gancho? Solo lo encontré yo mismo. – joemaller

+0

no, no lo hice. Trabajé alrededor de mi problema con la respuesta de Rob. –

+0

mismo para Rubben's rbenv: https://github.com/sstephenson/rbenv/issues/374 –

Respuesta

2

Usted puede comprobar en su pre-commit guión de la variable $ VIRTUAL_ENV y anteponer a $ PATH en consecuencia:

#!/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

Lo que terminé haciendo es: la estructura .git archivo:

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

.git/ganchos/comprobaciones previas a:

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

.git/ganchos/pre-commit-main.py:

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

Entonces, cuando se llama git commit, asegúrese de que THE_GOOD_PATH, es definió:

export THE_GOOD_PATH="$PATH" 
git commit 

también puede exportar THE_GOOD_PATH="$PATH" de sus .profile o el nivel superior de su solicitud y todos los ganchos enlace simbólico en un solo archivo.

Este método tiene la ventaja de ser virtualenv agnóstico: también funciona con Ruby RVM rbenv.

Escribí a los desarrolladores de Git al: http://permalink.gmane.org/gmane.comp.version-control.git/258454 pidiéndoles que dejaran nuestro PATH solo, pero la respuesta inicial fue WONTFIX.

Cuestiones relacionadas