From c9c4dc1d9b01db42431581828c063c0ff7eb6df6 Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Fri, 14 Nov 2014 14:58:18 -0800 Subject: [PATCH] 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 --- .../check/PhabricatorSetupCheckBinaries.php | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/src/applications/config/check/PhabricatorSetupCheckBinaries.php b/src/applications/config/check/PhabricatorSetupCheckBinaries.php index b5bc79d808..cea3576e19 100644 --- a/src/applications/config/check/PhabricatorSetupCheckBinaries.php +++ b/src/applications/config/check/PhabricatorSetupCheckBinaries.php @@ -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; + } + + + } + }