Differential D15752 Diff 37961 src/applications/diffusion/protocol/DiffusionMercurialCommandEngine.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/diffusion/protocol/DiffusionMercurialCommandEngine.php
- This file was added.
| <?php | |||||
| final class DiffusionMercurialCommandEngine | |||||
| extends DiffusionCommandEngine { | |||||
| protected function canBuildForRepository( | |||||
| PhabricatorRepository $repository) { | |||||
| return $repository->isHg(); | |||||
| } | |||||
| protected function newFormattedCommand($pattern, array $argv) { | |||||
| $args = array(); | |||||
| if ($this->isAnySSHProtocol()) { | |||||
| $pattern = "hg --config ui.ssh=%s {$pattern}"; | |||||
| $args[] = $this->getSSHWrapper(); | |||||
| } else { | |||||
| $pattern = "hg {$pattern}"; | |||||
| } | |||||
| return array($pattern, array_merge($args, $argv)); | |||||
| } | |||||
| protected function newCustomEnvironment() { | |||||
| $env = array(); | |||||
| // NOTE: This overrides certain configuration, extensions, and settings | |||||
| // which make Mercurial commands do random unusual things. | |||||
| $env['HGPLAIN'] = 1; | |||||
| return $env; | |||||
| } | |||||
| /** | |||||
| * Sanitize output of an `hg` command invoked with the `--debug` flag to make | |||||
| * it usable. | |||||
| * | |||||
| * @param string Output from `hg --debug ...` | |||||
| * @return string Usable output. | |||||
| */ | |||||
| public static function filterMercurialDebugOutput($stdout) { | |||||
| // When hg commands are run with `--debug` and some config file isn't | |||||
| // trusted, Mercurial prints out a warning to stdout, twice, after Feb 2011. | |||||
| // | |||||
| // http://selenic.com/pipermail/mercurial-devel/2011-February/028541.html | |||||
| // | |||||
| // After Jan 2015, it may also fail to write to a revision branch cache. | |||||
| $ignore = array( | |||||
| 'ignoring untrusted configuration option', | |||||
| "couldn't write revision branch cache:", | |||||
| ); | |||||
| foreach ($ignore as $key => $pattern) { | |||||
| $ignore[$key] = preg_quote($pattern, '/'); | |||||
| } | |||||
| $ignore = '('.implode('|', $ignore).')'; | |||||
| $lines = preg_split('/(?<=\n)/', $stdout); | |||||
| $regex = '/'.$ignore.'.*\n$/'; | |||||
| foreach ($lines as $key => $line) { | |||||
| $lines[$key] = preg_replace($regex, '', $line); | |||||
| } | |||||
| return implode('', $lines); | |||||
| } | |||||
| } | |||||