2011-09-15 12 views
12

Estoy escribiendo un gancho precompromiso para Git que ejecuta pyflakes y comprueba las pestañas y los espacios finales en los archivos modificados (code on Github). Me gustaría que sea posible anular el gancho al pedir la confirmación del usuario de la siguiente manera:¿Cómo es posible usar raw_input() en un gancho Python Git?

answer = raw_input('Commit anyway? [N/y] ') 
if answer.strip()[0].lower() == 'y': 
    print >> sys.stderr, 'Committing anyway.' 
    sys.exit(0) 
else: 
    print >> sys.stderr, 'Commit aborted.' 
    sys.exit(1) 

Este código produce un error:

Commit anyway? [N/y] Traceback (most recent call last): 
    File ".git/hooks/pre-commit", line 59, in ? 
    main() 
    File ".git/hooks/pre-commit", line 20, in main 
    answer = raw_input('Commit anyway? [N/y] ') 
EOFError: EOF when reading a line 

¿Es incluso posible utilizar raw_input() o una función similar en ganchos Git y si es así, ¿qué estoy haciendo mal?

Respuesta

15

que puede usar:

sys.stdin = open('/dev/tty') 
answer = raw_input('Commit anyway? [N/y] ') 
if answer.strip().lower().startswith('y'): 
    ... 

git commit llamadas python .git/hooks/pre-commit:

% ps axu 
... 
unutbu 21801 0.0 0.1 6348 1520 pts/1 S+ 17:44 0:00 git commit -am line 5a 
unutbu 21802 0.1 0.2 5708 2944 pts/1 S+ 17:44 0:00 python .git/hooks/pre-commit 

Mirando el interior /proc/21802/fd (en esta máquina Linux) muestra el estado de los descriptores de fichero para el proceso con PID 21802 (el proceso pre-commit):

/proc/21802/fd: 
    lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 0 -> /dev/null 
    lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 1 -> /dev/pts/1 
    lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 2 -> /dev/pts/1 
    lr-x------ 1 unutbu unutbu 64 2011-09-15 17:45 3 -> /dev/tty 
    lr-x------ 1 unutbu unutbu 64 2011-09-15 17:45 5 -> /dev/null 

Por lo tanto, pre-commit se engendró con sys.stdin apuntando a /dev/null. sys.stdin = open('/dev/tty') redirige sys.stdin a un identificador de archivo abierto desde el que raw_input puede leer.

+0

Esto funciona perfectamente. Gracias. – badzil

-1

Con cáscara se puede:

read ANSWER < /dev/tty 
+0

¿Cómo es este Python? – badzil

Cuestiones relacionadas