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