diff --git a/src/filesystem/binary/PhutilMercurialBinaryAnalyzer.php b/src/filesystem/binary/PhutilMercurialBinaryAnalyzer.php --- a/src/filesystem/binary/PhutilMercurialBinaryAnalyzer.php +++ b/src/filesystem/binary/PhutilMercurialBinaryAnalyzer.php @@ -7,6 +7,8 @@ const CAPABILITY_FILES = 'files'; const CAPABILITY_INJECTION = 'injection'; + const CAPABILITY_TEMPLATE_PNODE = 'template_pnode'; + const CAPABILTIY_ANNOTATE_TEMPLATES = 'annotate_templates'; protected function newBinaryVersion() { $future = id(new ExecFuture('hg --version --quiet')) @@ -60,6 +62,33 @@ self::CAPABILITY_INJECTION); } + /** + * When using `--template` the format for accessing individual parents + * changed from `{p1node}` to `{p1.node}` in Mercurial 4.9. + * + * @return boolean True if the version of Mercurial is new enough to support + * the `{p1.node}` format in templates, or false if otherwise. + */ + public function isMercurialTemplatePnodeAvailable() { + return self::versionHasCapability( + $this->requireBinaryVersion(), + self::CAPABILITY_TEMPLATE_PNODE); + } + + /** + * The `hg annotate` command did not accept the `--template` argument until + * version 4.6. It appears to function in version 4.5 however it's not + * documented and wasn't announced until the 4.6 release. + * + * @return boolean True if the version of Mercurial is new enough to support + * the `--template` option when using `hg annotate`, or false if otherwise. + */ + public function isMercurialAnnotateTemplatesAvailable() { + return self::versionHasCapability( + $this->requireBinaryVersion(), + self::CAPABILTIY_ANNOTATE_TEMPLATES); + } + public static function versionHasCapability( $mercurial_version, @@ -70,6 +99,10 @@ return version_compare($mercurial_version, '3.2', '>='); case self::CAPABILITY_INJECTION: return version_compare($mercurial_version, '3.2.4', '<'); + case self::CAPABILITY_TEMPLATE_PNODE: + return version_compare($mercurial_version, '4.9', '>='); + case self::CAPABILTIY_ANNOTATE_TEMPLATES: + return version_compare($mercurial_version, '4.6', '>='); default: throw new Exception( pht(