1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-02-16 16:58:38 +01:00

Simplify non-bare working copy rules for the new "git fetch" strategy

Summary:
Ref T13280. In D20421, I changed our observe strategy to `git fetch <uri>` in all cases.

This doesn't work in an ancient, non-bare repository if `master` is checked out and `master` is also fetch: `git` refuses to overwrite the local ref unless we pass `--update-head-ok`. Pass this flag.

Also, remove some code which examines branches and tags in a special way for non-bare working copies. The old `git fetch <origin>` code without explicit revsets meant that `refs/remotes/orgin/heads/xyz` got updated instead of `refs/heads/xyz`. We now update our local refs in all cases (bare and non-bare) so we can throw away this special casing.

Test Plan:
  - Replaced a modern bare working copy with a non-bare working copy by explicitly using `git clone` without `--bare`.
  - Ran `bin/repository update`, hit the `--update-head-ok` error. Applied the patch, got a clean update.
  - Used the "repository.branchquery" API method...
    - ...with "contains" to trigger the "git branch" case. Got identical results after removing the special casing.
    - ...without "contains" to trigger the "low level ref" case. Got identical results after removing the special casing.
  - Grepped for `isWorkingCopyBare()`. The only remaining callsites deal with hook paths, and genuinely need to be specialized.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13280

Differential Revision: https://secure.phabricator.com/D20450
This commit is contained in:
epriestley 2019-04-18 06:52:15 -07:00
parent e1076528ef
commit a82a2b8459
3 changed files with 12 additions and 25 deletions

View file

@ -46,22 +46,12 @@ final class DiffusionBranchQueryConduitAPIMethod
// NOTE: We can't use DiffusionLowLevelGitRefQuery here because
// `git for-each-ref` does not support `--contains`.
if ($repository->isWorkingCopyBare()) {
list($stdout) = $repository->execxLocalCommand(
'branch --verbose --no-abbrev --contains %s -- %Ls',
$contains,
$patterns_argv);
$ref_map = DiffusionGitBranch::parseLocalBranchOutput(
$stdout);
} else {
list($stdout) = $repository->execxLocalCommand(
'branch -r --verbose --no-abbrev --contains %s -- %Ls',
$contains,
$patterns_argv);
$ref_map = DiffusionGitBranch::parseRemoteBranchOutput(
$stdout,
DiffusionGitBranch::DEFAULT_GIT_REMOTE);
}
list($stdout) = $repository->execxLocalCommand(
'branch --verbose --no-abbrev --contains %s -- %Ls',
$contains,
$patterns_argv);
$ref_map = DiffusionGitBranch::parseLocalBranchOutput(
$stdout);
$refs = array();
foreach ($ref_map as $ref => $commit) {

View file

@ -33,16 +33,9 @@ final class DiffusionLowLevelGitRefQuery extends DiffusionLowLevelQuery {
$prefixes = array();
if ($repository->isWorkingCopyBare()) {
$branch_prefix = 'refs/heads/';
} else {
$remote = DiffusionGitBranch::DEFAULT_GIT_REMOTE;
$branch_prefix = 'refs/remotes/'.$remote.'/';
}
$branch_prefix = 'refs/heads/';
$tag_prefix = 'refs/tags/';
if ($with_refs || count($ref_types) > 1) {
// If we're loading refs or more than one type of ref, just query
// everything.

View file

@ -366,8 +366,12 @@ final class PhabricatorRepositoryPullEngine
$fetch_rules = $this->getGitFetchRules($repository);
// For very old non-bare working copies, we need to use "--update-head-ok"
// to tell Git that it is allowed to overwrite whatever is currently
// checked out. See T13280.
$future = $repository->getRemoteCommandFuture(
'fetch --prune -- %P %Ls',
'fetch --prune --update-head-ok -- %P %Ls',
$repository->getRemoteURIEnvelope(),
$fetch_rules);