1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-30 10:42:41 +01:00

Config - add setup checks for minimum and "bad" versions of VCS software.

Summary: Fixes T3046. Git has no minimum or bad versions; svn has no minimum and the bad version of 1.7.1, and mercurial has a minimum of 1.9 and bad versions 2.2 and 2.1. These error messages are specific about the problem but do not include the details as to what specifically is bad about a given version. I don't think that's really necessary - the details don't help solve the problem and its probably booooooring at best to the average user. The details about a bad version are included in the code however.

Test Plan: hardcoded a VCS array to let me test all the VCS stuff. added some phlog() calls to make sure the VCS version parsing stuff was working correctly relative to the version(s) on my system. played around with setting minimum versions and bad versions and saw good results depending on what I set.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin, epriestley

Maniphest Tasks: T3046

Differential Revision: https://secure.phabricator.com/D10852
This commit is contained in:
Bob Trahan 2014-11-14 14:58:18 -08:00
parent a1f5fc2231
commit c9c4dc1d9b

View file

@ -92,6 +92,53 @@ final class PhabricatorSetupCheckBinaries extends PhabricatorSetupCheck {
'version control system. It will not work without the VCS binary.');
$this->raiseWarning($binary, $message);
}
switch ($binary) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$minimum_version = null;
$bad_versions = array();
list($err, $stdout, $stderr) = exec_manual('git --version');
$version = trim(substr($stdout, strlen('git version ')));
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$minimum_version = null;
$bad_versions = array(
'1.7.1' => pht('This version of Subversion has a bug where '.
'"svn diff -c N" does not work for files added '.
'in rN (Subverison issue #2873), fixed in 1.7.2.'),);
list($err, $stdout, $stderr) = exec_manual('svn --version --quiet');
$version = trim($stdout);
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$minimum_version = '1.9';
$bad_versions = array(
'2.1' => pht('This version of Mercurial returns a bad exit code '.
'after a successful pull.'),
'2.2' => pht('This version of Mercurial has a significant memory '.
'leak, fixed in 2.2.1. Pushing fails with this '.
'version as well; see T3046#54922.'),);
list($err, $stdout, $stderr) = exec_manual('hg --version --quiet');
$version = rtrim(
substr($stdout, strlen('Mercurial Distributed SCM (version ')),
")\n");
break;
}
if ($minimum_version &&
version_compare($version, $minimum_version, '<')) {
$this->raiseMinimumVersionWarning(
$binary,
$minimum_version,
$version);
}
foreach ($bad_versions as $bad_version => $details) {
if ($bad_version === $version) {
$this->raiseBadVersionWarning(
$binary,
$bad_version);
}
}
}
}
@ -126,4 +173,61 @@ final class PhabricatorSetupCheckBinaries extends PhabricatorSetupCheck {
->addPhabricatorConfig('environment.append-paths');
}
private function raiseMinimumVersionWarning(
$binary,
$minimum_version,
$version) {
switch ($binary) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$summary = pht(
"The '%s' binary is version %s and Phabricator requires version ".
"%s or higher.",
$binary,
$version,
$minimum_version);
$message = pht(
"Please upgrade the '%s' binary to a more modern version.",
$binary);
$this->newIssue('bin.'.$binary)
->setShortName(pht("Unsupported '%s' Version", $binary))
->setName(pht("Unsupported '%s' Version", $binary))
->setSummary($summary)
->setMessage($summary.' '.$message);
break;
}
}
private function raiseBadVersionWarning($binary, $bad_version) {
switch ($binary) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$summary = pht(
"The '%s' binary is version %s which has bugs that break ".
"Phabricator.",
$binary,
$bad_version);
$message = pht(
"Please upgrade the '%s' binary to a more modern version.",
$binary);
$this->newIssue('bin.'.$binary)
->setShortName(pht("Unsupported '%s' Version", $binary))
->setName(pht("Unsupported '%s' Version", $binary))
->setSummary($summary)
->setMessage($summary.' '.$message);
break;
}
}
}