mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-23 07:12:41 +01:00
Add setup checks for the availability of 'which' and 'diff' binaries
Summary: Spent an hour or two helping a user figure this out. Make sure I never do that again. If the webserver is configured with an empty or bogus PATH, binaries like 'which' and 'diff' (and 'git', and 'svn', etc.) may not be available. In most cases, this is fine, because we get an error like "sh: whatever-command not found", which is obvious to diagnose. In the case of 'diff', we don't get this, because 'diff' is expected to exit with a nonzero code for differing files -- so we interpret the "sh: whatever-command not found" as "files differ" and then try to parse the empty output. Explicitly check for 'which' (on Windows, 'where') and 'diff' during setup (I plan to refine the behavior around 'git', 'svn' and 'hg' at some point, but this is less pressing since the errors are trivial to support). Test Plan: Faked failures on all modes, verified setup warnings look reasonable. Reviewers: btrahan, chad Reviewed By: btrahan CC: aran Differential Revision: https://secure.phabricator.com/D6008
This commit is contained in:
parent
40680e459f
commit
e591ef4db9
3 changed files with 101 additions and 5 deletions
|
@ -1392,6 +1392,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php',
|
||||
'PhabricatorSetupCheckAPC' => 'applications/config/check/PhabricatorSetupCheckAPC.php',
|
||||
'PhabricatorSetupCheckBaseURI' => 'applications/config/check/PhabricatorSetupCheckBaseURI.php',
|
||||
'PhabricatorSetupCheckBinaries' => 'applications/config/check/PhabricatorSetupCheckBinaries.php',
|
||||
'PhabricatorSetupCheckDatabase' => 'applications/config/check/PhabricatorSetupCheckDatabase.php',
|
||||
'PhabricatorSetupCheckExtensions' => 'applications/config/check/PhabricatorSetupCheckExtensions.php',
|
||||
'PhabricatorSetupCheckExtraConfig' => 'applications/config/check/PhabricatorSetupCheckExtraConfig.php',
|
||||
|
@ -3147,6 +3148,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorSettingsPanelSearchPreferences' => 'PhabricatorSettingsPanel',
|
||||
'PhabricatorSetupCheckAPC' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorSetupCheckBaseURI' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorSetupCheckBinaries' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorSetupCheckDatabase' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorSetupCheckExtensions' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorSetupCheckExtraConfig' => 'PhabricatorSetupCheck',
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorSetupCheckBinaries extends PhabricatorSetupCheck {
|
||||
|
||||
|
||||
protected function executeChecks() {
|
||||
|
||||
if (phutil_is_windows()) {
|
||||
$bin_name = 'where';
|
||||
} else {
|
||||
$bin_name = 'which';
|
||||
}
|
||||
|
||||
if (!Filesystem::binaryExists($bin_name)) {
|
||||
$message = pht(
|
||||
"Without '%s', Phabricator can not test for the availability ".
|
||||
"of other binaries.",
|
||||
$bin_name);
|
||||
$this->raiseWarning($bin_name, $message);
|
||||
|
||||
// We need to return here if we can't find the 'which' / 'where' binary
|
||||
// because the other tests won't be valid.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Filesystem::binaryExists('diff')) {
|
||||
$message = pht(
|
||||
"Without 'diff', Phabricator will not be able to generate or render ".
|
||||
"diffs in multiple applications.");
|
||||
$this->raiseWarning('diff', $message);
|
||||
} else {
|
||||
$tmp_a = new TempFile();
|
||||
$tmp_b = new TempFile();
|
||||
$tmp_c = new TempFile();
|
||||
|
||||
Filesystem::writeFile($tmp_a, 'A');
|
||||
Filesystem::writeFile($tmp_b, 'A');
|
||||
Filesystem::writeFile($tmp_c, 'B');
|
||||
|
||||
list($err) = exec_manual('diff %s %s', $tmp_a, $tmp_b);
|
||||
if ($err) {
|
||||
$this->newIssue('bin.diff.same')
|
||||
->setName(pht("Unexpected 'diff' Behavior"))
|
||||
->setMessage(
|
||||
pht(
|
||||
"The 'diff' binary on this system has unexpected behavior: ".
|
||||
"it was expected to exit without an error code when passed ".
|
||||
"identical files, but exited with code %d.",
|
||||
$err));
|
||||
}
|
||||
|
||||
list($err) = exec_manual('diff %s %s', $tmp_a, $tmp_c);
|
||||
if (!$err) {
|
||||
$this->newIssue('bin.diff.diff')
|
||||
->setName(pht("Unexpected 'diff' Behavior"))
|
||||
->setMessage(
|
||||
pht(
|
||||
"The 'diff' binary on this system has unexpected behavior: ".
|
||||
"it was expected to exit with a nonzero error code when passed ".
|
||||
"differing files, but did not."));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function raiseWarning($bin, $message) {
|
||||
if (phutil_is_windows()) {
|
||||
$preamble = pht(
|
||||
"The '%s' binary could not be found. Set the webserver's %s ".
|
||||
"environmental variable to include the directory where it resides, or ".
|
||||
"add that directory to '%s' in the Phabricator configuration.",
|
||||
$bin,
|
||||
'PATH',
|
||||
'environment.append-paths');
|
||||
} else {
|
||||
$preamble = pht(
|
||||
"The '%s' binary could not be found. Symlink it into '%s', or set the ".
|
||||
"webserver's %s environmental variable to include the directory where ".
|
||||
"it resides, or add that directory to '%s' in the Phabricator ".
|
||||
"configuration.",
|
||||
$bin,
|
||||
'phabricator/support/bin/',
|
||||
'PATH',
|
||||
'environment.append-paths');
|
||||
}
|
||||
|
||||
$this->newIssue('bin.'.$bin)
|
||||
->setShortName(pht("'%s' Missing", $bin))
|
||||
->setName(pht("Missing '%s' Binary", $bin))
|
||||
->setSummary(
|
||||
pht("The '%s' binary could not be located or excuted.", $bin))
|
||||
->setMessage($preamble.' '.$message)
|
||||
->addPhabricatorConfig('environment.append-paths');
|
||||
}
|
||||
|
||||
}
|
|
@ -5,12 +5,11 @@ final class PhabricatorSetupCheckImagemagick extends PhabricatorSetupCheck {
|
|||
protected function executeChecks() {
|
||||
$imagemagick = PhabricatorEnv::getEnvConfig('files.enable-imagemagick');
|
||||
if ($imagemagick) {
|
||||
list($err) = exec_manual('which convert');
|
||||
if ($err) {
|
||||
if (!Filesystem::binaryExists('convert')) {
|
||||
$message = pht(
|
||||
'You have enabled Imagemagick in your config, but the \'convert\''.
|
||||
' binary is not in the webserver\'s $PATH. Disable imagemagick'.
|
||||
' or make it available to the webserver.');
|
||||
'You have enabled Imagemagick in your config, but the \'convert\' '.
|
||||
'binary is not in the webserver\'s $PATH. Disable imagemagick '.
|
||||
'or make it available to the webserver.');
|
||||
|
||||
$this->newIssue('files.enable-imagemagick')
|
||||
->setName(pht(
|
||||
|
|
Loading…
Reference in a new issue