Improve low-level branch resolution in Mercurial

Summary:
Ref T7100. Ref T7108. Ref T6160. Several issues:

  - High load for mercurial repositories with huge numbers of branches (T7108).
    - In Mercurial, we resolve refs individually (one `hg` call per ref).
    - Each repository update also updates all refs, which requires resolving all of them.
    - For repositories with a huge number of branches,
  - We don't distinguish between closed branches (a Mercurial-only concept) and open branches (T6160).
    - In Git, when a branch is merged, it ceases to exist.
    - In Mercurial, when a branch is merged, it still exists, it's just "closed". Normally, no one cares about these branches.
    - In the low-level query, correctly identify which refs we resolve as branches.
    - In the low-level query, correctly mark closed branches as closed.
  - This marginally improves ref handling in general (see T7100).

Test Plan:
{F384366}

{F384367}

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T6160, T7108, T7100

Differential Revision: https://secure.phabricator.com/D12548
This commit is contained in:
epriestley
2015-04-27 03:50:20 -07:00
parent 7f43cde82d
commit 21c4aeb032
2 changed files with 89 additions and 14 deletions

View File

@@ -66,18 +66,32 @@ final class DiffusionRefTableController extends DiffusionController {
$type = idx($cache, 'type');
}
$identifier = idx($vcs, 'identifier');
if ($identifier !== null) {
$identifier = DiffusionView::linkCommit(
$hash = idx($vcs, 'identifier');
if ($hash !== null) {
$hash = DiffusionView::linkCommit(
$repository,
$identifier);
$hash);
}
$cache_identifier = idx($cache, 'identifier');
if ($cache_identifier !== null) {
$cache_identifier = DiffusionView::linkCommit(
$cached_hash = idx($cache, 'identifier');
if ($cached_hash !== null) {
$cache_hash = DiffusionView::linkCommit(
$repository,
$cache_identifier);
$cached_hash);
}
$closed = idx($vcs, 'closed', false);
if (!$vcs) {
$state = null;
} else {
$state = $closed ? pht('Closed') : pht('Open');
}
$cached_closed = idx($cache, 'closed', false);
if (!$cache) {
$cached_state = null;
} else {
$cached_state = $cached_closed ? pht('Closed') : pht('Open');
}
$alternate = idx($vcs, 'alternate');
@@ -90,8 +104,10 @@ final class DiffusionRefTableController extends DiffusionController {
$rows[] = array(
$ref,
$type,
$identifier,
$cache_identifier,
$hash,
$cached_hash,
$state,
$cached_state,
$alternate,
);
}
@@ -102,8 +118,10 @@ final class DiffusionRefTableController extends DiffusionController {
array(
pht('Ref'),
pht('Type'),
pht('Identifier'),
pht('Cached'),
pht('Hash'),
pht('Cached Hash'),
pht('State'),
pht('Cached State'),
pht('Alternate'),
));