2012-01-27 1 views
6

Questo è il mio script di pre-commit:Come posso eseguire uno script python virtualenv come 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 

Uno degli eseguibili in pre-commit.d è uno script python (pre- commit-pylint.py) che inizia con:

#!/usr/bin/env python 
import pylint 

pylint è installato sul mio virtualenv. Il mio problema è che git esegue pre-commit prepagando /usr/libexec/git-core:/usr/bin a $PATH, quindi anche se il mio virtualenv è attivato lo script pre-commit.d/pre-commit-pylint.py viene eseguito con il sistema /usr/bin/python (invece di essere eseguito con virtualenv python).

Desidero avere gli hook compatibili per gli sviluppatori che non utilizzano virtualenv. C'è un modo per eseguire il mio script python con virtualenv in modo trasparente (cioè, rimanendo compatibile con gli sviluppatori che utilizzano il loro sistema python)?

+0

hai mai trovato un modo per impedire a Git di anteporre '/ usr/bin' al $ PATH del hook? Ho appena incontrato questo me stesso. – joemaller

+0

no, non l'ho fatto. Ho lavorato attorno al mio problema con la risposta di Rob. –

+0

stesso per Ruben's rbenv: https://github.com/sstephenson/rbenv/issues/374 –

risposta

2

È possibile controllare nello script pre-commit per la variabile $ VIRTUAL_ENV e anteporre esso a $ PATH di conseguenza:

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

Quello che ho finito per fare è: la struttura .git di file:

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

.git/ganci/pre-commit:

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

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

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

Poi, quando si chiama git commit, assicurarsi che THE_GOOD_PATH, è definito:

export THE_GOOD_PATH="$PATH" 
git commit 

Si potrebbe anche esportare THE_GOOD_PATH="$PATH" dalle vostre .profile o di primo livello della vostra applicazione e collegamento simbolico tutti i ganci per un singolo file.

Questo metodo ha il vantaggio di essere indipendente da virtualenv: funziona anche con Ruby RVM rbenv.

Ho scritto agli sviluppatori Git a: http://permalink.gmane.org/gmane.comp.version-control.git/258454 chiedendo loro di lasciare il nostro PATH da solo, ma la risposta iniziale era WONTFIX.