Ler de STDIN em um Git Hook (com PHP) pre-commit
Pergunta
Eu estou procurando uma maneira de ter espera git-commit
para a entrada padrão. Eu estou codificação isso em PHP
, como minhas habilidades bash
são inexistente, então eu thougth fazendo um regular
<?php
$input = trim(fgets(STDIN));
fscanf(STDIN, "%d\n", $line);
?>
faria o truque, e esperar até que eu escrever coisas para continuar, mas ele só vai em frente e continua a executar o meu script PHP de qualquer maneira.
A idéia por trás disso é que depois que eu marcar um lançamento, git vai empurrar HEAD
para o servidor de teste, envie um par de tweets, e deixe-me escrever em alguns detalhes sobre o lançamento no changelog.
Embora eu possa alcançar a escrita para um arquivo (usando exec('mate -w')
), eu gostaria que ele pendurar até que eu faça um teste rápido no servidor. Isso me permitiria reverter se eu perceber quaisquer erros (preguiçoso, eu sei).
Obrigado por qualquer ajuda!
Solução
A maioria dos ganchos git quer ter algo especial alimentado para lá stdin, ou ter stdin separado do terminal. Eles são todos concebidos para ser executado de forma não interativa, então eu não acredito que um gancho é adequado para o que você quer fazer. Você pode, é claro, falar manualmente para /dev/tty
mas eu não acho que é uma idéia muito boa.
Eu também não acredito que o gancho 'pré-compromisso' é adequado para a sua tarefa, certamente não cada submissão que você fizer vai ser uma liberação de algum tipo? A 'pós-receber' gancho nos sons máquina de teste do servidor web mais apropriados.
Outras dicas
Eu preciso de entrada do usuário no meu gancho post-merge (escrito em PHP).
Eu resolvi-lo com este pedaço de código: trim(exec('exec < /dev/tty && read input && echo $input'))
Não pergunte, ele funciona;)