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:
parent
e1076528ef
commit
a82a2b8459
3 changed files with 12 additions and 25 deletions
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue