Перенаправление текста exec() для PHP в Windows на обработчике после фиксации SVN

Я следил за сообщением ниже, пытаясь подключить мою установку SubVersion к моему трекеру ошибок Mantis.

Как интегрировать Subversion и Mantis

Все работает нормально до последней строки, где он вызывает скрипт Mantis checkin.php и передает ему строку сообщения, созданную в скрипте.

exec(CHECKIN . " <<< \"$message\"");

Я понимаю, что целью этой строки является отправка строки сообщения на STDIN, которую Mantis считывает checkin.php, чтобы проверить наличие подходящей совпадающей строки и обновить отслеживание Mantis. база данных.

В любом случае, я знаю, что приведенное выше соглашение предназначено для установки Linux. Мой вопрос заключается в том, как использовать функцию PHP exec() в среде Windows для вызова PHP-скрипта (checkin.php) и передачи строки, созданной в этой программе, в STDIN.

ПРИМЕЧАНИЕ. Я бы предпочел не изменять логику в checkin.php для чтения из стандартного ввода.

Спасибо!!


person jaywon    schedule 24.11.2009    source источник


Ответы (2)


Перенаправления с использованием ‹ и > обрабатываются оболочкой — в Windows — cmd.exe. Самый простой способ получить эту функциональность — использовать system(). exec() не использует оболочку: чтобы использовать ее, вам нужно организовать перенаправление перед вызовом exec.

person wallyk    schedule 24.11.2009
comment
@wallyk - +1 за полезный совет. все еще не совсем там, но это направляет меня в правильном направлении, спасибо! Теперь я могу передать файл, но до сих пор не могу понять, как передать строку. - person jaywon; 24.11.2009

Я больше не получал сообщений, но после игры с функцией system() я смог перенаправить файл в качестве ввода в STDIN, но не смог передать строку данных. У меня была возможность сделать что-то похожее на пакетное задание в моем PHP, где я должен был написать временный файл и использовать его в качестве входных данных для STDIN, но поскольку я уже использовал пакетный файл для хука после фиксации в SVN для вызова PHP-скрипт, я решил пойти дальше и просто написать весь скрипт в командном файле.

Вот мое окончательное решение для хука после фиксации SVN:

post-commit.bat

@ECHO off
SETLOCAL

SET REPOS=%1
SET REV=%2

SET PHP="C:\Program Files\PHP\php.exe"
SET CHECKIN="D:\mantisbt-1.1.8\core\checkin.php"
SET SVNLOOK="C:\Program Files\CollabNet\Subversion Server\svnlook.exe"

SET LOGFILE=log%REV%.txt
SET AUTHORFILE=author%REV%.txt
SET OUTPUTFILE=output%REV%.txt
SET CHANGEFILE=change%REV%.txt

ECHO Author: > %AUTHORFILE%
%SVNLOOK% author -r %REV% %REPOS% >> %AUTHORFILE%

ECHO Log: > %LOGFILE%
%SVNLOOK% log -r %REV% %REPOS% >> %LOGFILE%

ECHO Files: > %CHANGEFILE%
%SVNLOOK% changed %REPOS% %REV% >> %CHANGEFILE%

ECHO Revision: %REV% > %OUTPUTFILE%
%SVNLOOK% date %REPOS% -r %REV% >>  %OUTPUTFILE%
TYPE %AUTHORFILE% >> %OUTPUTFILE%
TYPE %LOGFILE% >> %OUTPUTFILE%
TYPE %CHANGEFILE% >> %OUTPUTFILE%

TYPE %OUTPUTFILE% | %PHP% %CHECKIN% 

CALL DEL %LOGFILE%
CALL DEL %AUTHORFILE%
CALL DEL %CHANGEFILE%
CALL DEL %OUTPUTFILE%

Этот скрипт обновляет соответствующий билет богомола комментарием в следующем формате:

Revision: 41
2009-11-25 11:47:18 -1000 (Wed, 25 Nov 2009)
Author: 
jason
Log: 
Testing for checkin for TER #12345 which fixes Mantis issue 0000001.
Files:
U TANDEM/CAB/CABLONGD
person jaywon    schedule 01.12.2009