From 9310df9615402aea3bdc07971096a3296ba5dae2 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 4 Nov 2013 12:15:12 -0800 Subject: [PATCH] Handle empty output from `hg --debug branches` in the parser Summary: Ref T1493. Also consolidate this a bit more. Test Plan: Unit tests. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T1493 Differential Revision: https://secure.phabricator.com/D7481 --- src/repository/api/ArcanistMercurialAPI.php | 19 ++++++------------- .../parser/ArcanistMercurialParser.php | 8 +++++++- .../ArcanistMercurialParserTestCase.php | 4 ++++ .../__tests__/mercurial/branches-empty.txt | 0 4 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 src/repository/parser/__tests__/mercurial/branches-empty.txt diff --git a/src/repository/api/ArcanistMercurialAPI.php b/src/repository/api/ArcanistMercurialAPI.php index ba2f2b4e..5ad75746 100644 --- a/src/repository/api/ArcanistMercurialAPI.php +++ b/src/repository/api/ArcanistMercurialAPI.php @@ -984,22 +984,15 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { } public function getBranches() { + list($stdout) = $this->execxLocal('--debug branches'); + $lines = ArcanistMercurialParser::parseMercurialBranches($stdout); + $branches = array(); - - list($raw_output) = $this->execxLocal('branches'); - $raw_output = trim($raw_output); - - foreach (explode("\n", $raw_output) as $line) { - // example line: default 0:a5ead76cdf85 (inactive) - list($name, $rev_line) = $this->splitBranchOrBookmarkLine($line); - - // strip off the '(inactive)' bit if it exists - $rev_parts = explode(' ', $rev_line); - $revision = $rev_parts[0]; - + foreach ($lines as $name => $spec) { $branches[] = array( 'name' => $name, - 'revision' => $revision); + 'revision' => $spec['rev'], + ); } return $branches; diff --git a/src/repository/parser/ArcanistMercurialParser.php b/src/repository/parser/ArcanistMercurialParser.php index 884e37bb..62df7789 100644 --- a/src/repository/parser/ArcanistMercurialParser.php +++ b/src/repository/parser/ArcanistMercurialParser.php @@ -188,7 +188,13 @@ final class ArcanistMercurialParser { * @task parse */ public static function parseMercurialBranches($stdout) { - $lines = explode("\n", trim($stdout)); + $stdout = rtrim($stdout, "\n"); + if (!strlen($stdout)) { + // No branches; commonly, this occurs in a newly initialized repository. + return array(); + } + + $lines = explode("\n", $stdout); $branches = array(); foreach ($lines as $line) { diff --git a/src/repository/parser/__tests__/ArcanistMercurialParserTestCase.php b/src/repository/parser/__tests__/ArcanistMercurialParserTestCase.php index 418dbfb5..8e199669 100644 --- a/src/repository/parser/__tests__/ArcanistMercurialParserTestCase.php +++ b/src/repository/parser/__tests__/ArcanistMercurialParserTestCase.php @@ -36,6 +36,10 @@ final class ArcanistMercurialParserTestCase extends ArcanistTestCase { array('0b9d8290c4e0', '78963faacfc7', '5db03c5500c6', 'ffffffffffff'), array_values(ipull($output, 'rev'))); break; + case 'branches-empty.txt': + $output = ArcanistMercurialParser::parseMercurialBranches($data); + $this->assertEqual(array(), $output); + break; case 'log-basic.txt': $output = ArcanistMercurialParser::parseMercurialLog($data); $this->assertEqual( diff --git a/src/repository/parser/__tests__/mercurial/branches-empty.txt b/src/repository/parser/__tests__/mercurial/branches-empty.txt new file mode 100644 index 00000000..e69de29b