Как можно использовать raw_input () в хуке Python Git? - PullRequest
15 голосов
/ 16 сентября 2011

Я пишу ловушку перед фиксацией для Git, которая запускает pyflakes и проверяет наличие вкладок и завершающих пробелов в измененных файлах (код на Github ). Я хотел бы сделать возможным переопределить ловушку, запросив подтверждение пользователя следующим образом:

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)

Этот код выдает ошибку:

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

Можно ли даже использовать raw_input () или аналогичную функцию в хуках Git, и если да, что я делаю не так?

Ответы [ 2 ]

18 голосов
/ 16 сентября 2011

Вы можете использовать:

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

git commit звонки 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

Заглянув внутрь /proc/21802/fd (в этом окне linux) показывает состояние файловых дескрипторов для процесса с PID 21802 (процесс 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

Таким образом, pre-commit был порожден с sys.stdin, указывающим на /dev/null. sys.stdin = open('/dev/tty') перенаправляет sys.stdin в открытый дескриптор файла, из которого raw_input может читать.

0 голосов
/ 22 марта 2013

В оболочке вы можете:

read ANSWER < /dev/tty
...