@gitkraken/core-gitlens 0.16.0 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -1
- package/dist/git/cache.js +2 -2
- package/dist/git/cache.js.map +1 -1
- package/dist/git/run.types.d.ts +3 -0
- package/dist/git/watching/classifyChange.js +3 -0
- package/dist/git/watching/classifyChange.js.map +1 -1
- package/dist/git/watching/watchSession.d.ts +2 -0
- package/dist/git/watching/watchSession.js +9 -1
- package/dist/git/watching/watchSession.js.map +1 -1
- package/dist/git-cli/cliGitProvider.d.ts +1 -1
- package/dist/git-cli/cliGitProvider.js +7 -4
- package/dist/git-cli/cliGitProvider.js.map +1 -1
- package/dist/git-cli/exec/commandClassifier.d.ts +18 -3
- package/dist/git-cli/exec/commandClassifier.js +562 -16
- package/dist/git-cli/exec/commandClassifier.js.map +1 -1
- package/dist/git-cli/exec/exec.d.ts +2 -2
- package/dist/git-cli/exec/git.d.ts +31 -4
- package/dist/git-cli/exec/git.js +105 -43
- package/dist/git-cli/exec/git.js.map +1 -1
- package/dist/git-cli/exec/headState.d.ts +32 -0
- package/dist/git-cli/exec/headState.js +78 -0
- package/dist/git-cli/exec/headState.js.map +1 -0
- package/dist/git-cli/providers/branches.js +14 -4
- package/dist/git-cli/providers/branches.js.map +1 -1
- package/dist/git-cli/providers/operations.d.ts +6 -7
- package/dist/git-cli/providers/operations.js +46 -64
- package/dist/git-cli/providers/operations.js.map +1 -1
- package/dist/git-cli/providers/refs.d.ts +4 -1
- package/dist/git-cli/providers/refs.js +13 -9
- package/dist/git-cli/providers/refs.js.map +1 -1
- package/dist/plus/integrations/integrationService.d.ts +1 -0
- package/dist/plus/integrations/integrationService.js +18 -5
- package/dist/plus/integrations/integrationService.js.map +1 -1
- package/dist/plus/integrations/providers/apiClients.d.ts +2 -0
- package/dist/plus/integrations/providers/apiClients.js +12 -3
- package/dist/plus/integrations/providers/apiClients.js.map +1 -1
- package/dist/plus/integrations/providers/azure/azure.d.ts +13 -11
- package/dist/plus/integrations/providers/azure/azure.js +128 -47
- package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
- package/dist/plus/integrations/providers/azure/models.d.ts +4 -10
- package/dist/plus/integrations/providers/azure/models.js +25 -9
- package/dist/plus/integrations/providers/azure/models.js.map +1 -1
- package/dist/plus/integrations/providers/azure/workItemDescriptions.d.ts +10 -0
- package/dist/plus/integrations/providers/azure/workItemDescriptions.js +48 -0
- package/dist/plus/integrations/providers/azure/workItemDescriptions.js.map +1 -0
- package/dist/plus/integrations/providers/azure/workItemStateCategories.d.ts +20 -19
- package/dist/plus/integrations/providers/azure/workItemStateCategories.js +65 -40
- package/dist/plus/integrations/providers/azure/workItemStateCategories.js.map +1 -1
- package/dist/plus/integrations/providers/issueSorts.d.ts +0 -1
- package/dist/plus/integrations/providers/providerApiClient.d.ts +9 -0
- package/dist/plus/integrations/providers/providerApiClient.js +66 -0
- package/dist/plus/integrations/providers/providerApiClient.js.map +1 -0
- package/dist/plus/integrations/providers/providersApi.d.ts +10 -9
- package/dist/plus/integrations/providers/providersApi.js +163 -145
- package/dist/plus/integrations/providers/providersApi.js.map +1 -1
- package/dist/plus/integrations/reads/drains.d.ts +0 -1
- package/dist/utils/env/node/exec.d.ts +38 -1
- package/dist/utils/env/node/exec.js +14 -6
- package/dist/utils/env/node/exec.js.map +1 -1
- package/docs/integrations.md +30 -13
- package/package.json +2 -2
|
@@ -146,17 +146,16 @@ export declare class OperationsGitSubProvider implements GitOperationsSubProvide
|
|
|
146
146
|
private throwIfSigningError;
|
|
147
147
|
/**
|
|
148
148
|
* Called once git has run, success or not — a rejected write can still have moved HEAD or left state behind.
|
|
149
|
-
* `
|
|
150
|
-
* says it wrote that branch's tracking, to its own config section.
|
|
149
|
+
* `moved` is the one branch the write could have moved, when it knows it, or `'detached'` when it moved a detached
|
|
150
|
+
* HEAD and so no branch; `wroteTracking` says it wrote that branch's tracking, to its own config section.
|
|
151
151
|
*/
|
|
152
152
|
private announceHeadChanged;
|
|
153
153
|
/**
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
* `HEAD` file holds the placeholder `refs/heads/.invalid`, and its real HEAD is in the tables.
|
|
154
|
+
* Runs a write that moves only the branch HEAD is on (or no branch, on a detached HEAD), then announces it, success
|
|
155
|
+
* or not. HEAD is read on both sides of the run: a hook or an outside `git switch` that moves it meanwhile leaves the
|
|
156
|
+
* moved branch unknown, so then none is named.
|
|
158
157
|
*/
|
|
159
|
-
private
|
|
158
|
+
private runMovingHeadBranch;
|
|
160
159
|
/** The caller has already announced the change — the conflict is what the failed run left behind */
|
|
161
160
|
private createConflictResult;
|
|
162
161
|
}
|
|
@@ -2,13 +2,13 @@ import { chunkByStringLength } from "../../utils/iterable.js";
|
|
|
2
2
|
import { Logger as _logger } from "../../utils/logger.js";
|
|
3
3
|
import { getScopedLogger } from "../../utils/logger.scoped.js";
|
|
4
4
|
import { debug } from "../../utils/decorators/log.js";
|
|
5
|
-
import { joinUriPath } from "../../utils/uri.js";
|
|
6
5
|
import { normalizePath, splitPath } from "../../utils/path.js";
|
|
7
6
|
import { isBranchReference } from "../../git/utils/reference.utils.js";
|
|
8
7
|
import __decorate from "../../_virtual/@oxc-project+runtime/helpers/esm/decorate.js";
|
|
9
8
|
import { CheckoutError, CherryPickError, CommitError, FetchError, MergeError, PullError, PushError, RebaseError, ResetError, RevertError, SigningError } from "../../git/errors.js";
|
|
10
9
|
import { getRefChangeKind } from "../../git/watching/changeEvent.js";
|
|
11
10
|
import { mayWriteTracking } from "../exec/commandClassifier.js";
|
|
11
|
+
import { getMovedHead, readHeadState } from "../exec/headState.js";
|
|
12
12
|
import { GitErrors, classifySigningError, getGitCommandError, gitConfigsPull, inferSigningFormatFromError, isRunHookFailure, maxGitCliLength } from "../exec/git.js";
|
|
13
13
|
import { resolveBranchRemote } from "./branchRemote.js";
|
|
14
14
|
import { parseGitBoolean } from "./config.js";
|
|
@@ -100,7 +100,7 @@ var OperationsGitSubProvider = class {
|
|
|
100
100
|
}
|
|
101
101
|
}, ex));
|
|
102
102
|
} finally {
|
|
103
|
-
this.announceHeadChanged(repoPath, options?.createBranch ? `refs/heads/${options.createBranch}` : void 0, Boolean(options?.createBranch) && mayWriteTracking(ref, options?.noTracking));
|
|
103
|
+
this.announceHeadChanged(repoPath, options?.createBranch ? { branch: `refs/heads/${options.createBranch}` } : void 0, Boolean(options?.createBranch) && mayWriteTracking(ref, options?.noTracking));
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
async cherryPick(repoPath, revs, options, runOptions) {
|
|
@@ -120,15 +120,11 @@ var OperationsGitSubProvider = class {
|
|
|
120
120
|
}
|
|
121
121
|
args.push(...revs);
|
|
122
122
|
try {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}, ...args);
|
|
129
|
-
} finally {
|
|
130
|
-
this.announceHeadChanged(repoPath);
|
|
131
|
-
}
|
|
123
|
+
await this.runMovingHeadBranch(repoPath, () => this.git.run({
|
|
124
|
+
cwd: repoPath,
|
|
125
|
+
errors: "throw",
|
|
126
|
+
...runOptions
|
|
127
|
+
}, ...args));
|
|
132
128
|
return { conflicted: false };
|
|
133
129
|
} catch (ex) {
|
|
134
130
|
scope?.error(ex);
|
|
@@ -158,20 +154,14 @@ var OperationsGitSubProvider = class {
|
|
|
158
154
|
const sign = this.context.config?.signing?.enabled === true;
|
|
159
155
|
if (sign) params.push("-S");
|
|
160
156
|
params.push("-F", "-");
|
|
161
|
-
const headBranchBefore = await this.readHeadBranchRef(repoPath);
|
|
162
157
|
try {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}, ...params);
|
|
171
|
-
} finally {
|
|
172
|
-
const headBranch = await this.readHeadBranchRef(repoPath);
|
|
173
|
-
this.announceHeadChanged(repoPath, headBranch === headBranchBefore ? headBranch : void 0);
|
|
174
|
-
}
|
|
158
|
+
await this.runMovingHeadBranch(repoPath, () => this.git.run({
|
|
159
|
+
cwd: repoPath,
|
|
160
|
+
stdin: message,
|
|
161
|
+
stdinEncoding: "utf8",
|
|
162
|
+
errors: "throw",
|
|
163
|
+
...runOptions
|
|
164
|
+
}, ...params));
|
|
175
165
|
if (sign) {
|
|
176
166
|
let format;
|
|
177
167
|
try {
|
|
@@ -410,16 +400,12 @@ var OperationsGitSubProvider = class {
|
|
|
410
400
|
if (options?.noCommit) args.push("--no-commit");
|
|
411
401
|
args.push(ref);
|
|
412
402
|
try {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}, ...args);
|
|
420
|
-
} finally {
|
|
421
|
-
this.announceHeadChanged(repoPath);
|
|
422
|
-
}
|
|
403
|
+
await this.runMovingHeadBranch(repoPath, () => this.git.run({
|
|
404
|
+
cwd: repoPath,
|
|
405
|
+
errors: "throw",
|
|
406
|
+
timeout: 0,
|
|
407
|
+
...runOptions
|
|
408
|
+
}, ...args));
|
|
423
409
|
return { conflicted: false };
|
|
424
410
|
} catch (ex) {
|
|
425
411
|
scope?.error(ex);
|
|
@@ -764,12 +750,10 @@ var OperationsGitSubProvider = class {
|
|
|
764
750
|
async reset(repoPath, rev, options, runOptions) {
|
|
765
751
|
const scope = getScopedLogger();
|
|
766
752
|
try {
|
|
767
|
-
await this.resetCore(repoPath, rev, options?.mode, runOptions);
|
|
753
|
+
await this.runMovingHeadBranch(repoPath, () => this.resetCore(repoPath, rev, options?.mode, runOptions));
|
|
768
754
|
} catch (ex) {
|
|
769
755
|
scope?.error(ex);
|
|
770
756
|
throw ex;
|
|
771
|
-
} finally {
|
|
772
|
-
this.announceHeadChanged(repoPath);
|
|
773
757
|
}
|
|
774
758
|
}
|
|
775
759
|
async resetCore(repoPath, rev, mode, runOptions) {
|
|
@@ -854,16 +838,12 @@ var OperationsGitSubProvider = class {
|
|
|
854
838
|
else if (options?.editMessage === false) args.push("--no-edit");
|
|
855
839
|
args.push(...refs);
|
|
856
840
|
try {
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
}, ...args);
|
|
864
|
-
} finally {
|
|
865
|
-
this.announceHeadChanged(repoPath);
|
|
866
|
-
}
|
|
841
|
+
await this.runMovingHeadBranch(repoPath, () => this.git.run({
|
|
842
|
+
cwd: repoPath,
|
|
843
|
+
errors: "throw",
|
|
844
|
+
timeout: 0,
|
|
845
|
+
...runOptions
|
|
846
|
+
}, ...args));
|
|
867
847
|
return { conflicted: false };
|
|
868
848
|
} catch (ex) {
|
|
869
849
|
scope?.error(ex);
|
|
@@ -910,10 +890,15 @@ var OperationsGitSubProvider = class {
|
|
|
910
890
|
}
|
|
911
891
|
/**
|
|
912
892
|
* Called once git has run, success or not — a rejected write can still have moved HEAD or left state behind.
|
|
913
|
-
* `
|
|
914
|
-
* says it wrote that branch's tracking, to its own config section.
|
|
893
|
+
* `moved` is the one branch the write could have moved, when it knows it, or `'detached'` when it moved a detached
|
|
894
|
+
* HEAD and so no branch; `wroteTracking` says it wrote that branch's tracking, to its own config section.
|
|
915
895
|
*/
|
|
916
|
-
announceHeadChanged(repoPath,
|
|
896
|
+
announceHeadChanged(repoPath, moved, wroteTracking) {
|
|
897
|
+
if (moved === "detached") {
|
|
898
|
+
this.context.hooks?.cache?.onReset?.(repoPath, "branches", "status", "worktrees");
|
|
899
|
+
this.context.hooks?.repository?.onChanged?.(repoPath, ["head", "index"]);
|
|
900
|
+
return;
|
|
901
|
+
}
|
|
917
902
|
this.context.hooks?.cache?.onReset?.(repoPath, "branches", "status");
|
|
918
903
|
const changes = wroteTracking ? [
|
|
919
904
|
"config",
|
|
@@ -925,24 +910,21 @@ var OperationsGitSubProvider = class {
|
|
|
925
910
|
"heads",
|
|
926
911
|
"index"
|
|
927
912
|
];
|
|
928
|
-
if (
|
|
929
|
-
else if (wroteTracking) this.context.hooks?.repository?.onChanged?.(repoPath, changes, [
|
|
930
|
-
else this.context.hooks?.repository?.onChanged?.(repoPath, changes, [
|
|
913
|
+
if (moved == null) this.context.hooks?.repository?.onChanged?.(repoPath, changes);
|
|
914
|
+
else if (wroteTracking) this.context.hooks?.repository?.onChanged?.(repoPath, changes, [moved.branch], { configConfinedToRefs: true });
|
|
915
|
+
else this.context.hooks?.repository?.onChanged?.(repoPath, changes, [moved.branch]);
|
|
931
916
|
}
|
|
932
917
|
/**
|
|
933
|
-
*
|
|
934
|
-
*
|
|
935
|
-
*
|
|
936
|
-
* `HEAD` file holds the placeholder `refs/heads/.invalid`, and its real HEAD is in the tables.
|
|
918
|
+
* Runs a write that moves only the branch HEAD is on (or no branch, on a detached HEAD), then announces it, success
|
|
919
|
+
* or not. HEAD is read on both sides of the run: a hook or an outside `git switch` that moves it meanwhile leaves the
|
|
920
|
+
* moved branch unknown, so then none is named.
|
|
937
921
|
*/
|
|
938
|
-
async
|
|
922
|
+
async runMovingHeadBranch(repoPath, write) {
|
|
923
|
+
const before = await readHeadState(repoPath, this.context.fs, this.cache);
|
|
939
924
|
try {
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
return ref != null && !ref.split("/").some((part) => part.startsWith(".")) ? ref : void 0;
|
|
944
|
-
} catch {
|
|
945
|
-
return;
|
|
925
|
+
return await write();
|
|
926
|
+
} finally {
|
|
927
|
+
this.announceHeadChanged(repoPath, getMovedHead(before, await readHeadState(repoPath, this.context.fs, this.cache)));
|
|
946
928
|
}
|
|
947
929
|
}
|
|
948
930
|
/** The caller has already announced the change — the conflict is what the failed run left behind */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","names":[],"sources":["../../../../git-cli/src/providers/operations.ts"],"sourcesContent":["import * as l10n from '@vscode/l10n';\nimport type { Cache } from '@gitlens/git/cache.js';\nimport type { GitConflictCommand, GitServiceContext } from '@gitlens/git/context.js';\nimport {\n\tCheckoutError,\n\tCherryPickError,\n\tCommitError,\n\tFetchError,\n\tMergeError,\n\tPullError,\n\tPushError,\n\tRebaseError,\n\tResetError,\n\tRevertError,\n\tSigningError,\n} from '@gitlens/git/errors.js';\nimport type { GitBranchReference, GitReference } from '@gitlens/git/models/reference.js';\nimport type { RepositoryChange } from '@gitlens/git/models/repository.js';\nimport type { SigningFormat } from '@gitlens/git/models/signature.js';\nimport type { GitConflictFile } from '@gitlens/git/models/staging.js';\nimport type {\n\tGitOperationResult,\n\tGitOperationRunOptions,\n\tGitOperationsSubProvider,\n} from '@gitlens/git/providers/operations.js';\nimport { isBranchReference } from '@gitlens/git/utils/reference.utils.js';\nimport { getRefChangeKind } from '@gitlens/git/watching/changeEvent.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { sequentialize } from '@gitlens/utils/decorators/sequentialize.js';\nimport { chunkByStringLength } from '@gitlens/utils/iterable.js';\nimport { Logger } from '@gitlens/utils/logger.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport { joinUriPath } from '@gitlens/utils/uri.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { mayWriteTracking } from '../exec/commandClassifier.js';\nimport type { Git, PushForceOptions } from '../exec/git.js';\nimport {\n\tclassifySigningError,\n\tgetGitCommandError,\n\tgitConfigsPull,\n\tGitErrors,\n\tinferSigningFormatFromError,\n\tisRunHookFailure,\n\tmaxGitCliLength,\n} from '../exec/git.js';\nimport { resolveBranchRemote } from './branchRemote.js';\nimport { parseGitBoolean } from './config.js';\n\n/** The remotes a fetch read with their configured refspecs: one named remote, all of them, or a bare fetch's default */\ntype FetchedRemotes = { remote: string } | 'all' | 'default';\n\n/** The ref kinds a fetch can move, in the order its announcement lists them */\nconst fetchRefChangeKinds: readonly RepositoryChange[] = ['remotes', 'heads', 'tags', 'stash'];\n\n/** The destinations a fetch's snapshot covers when the remotes' configured refspecs can't be read */\nconst broadFetchDestinations: readonly string[] = ['refs/heads', 'refs/remotes'];\n\n/**\n * The ref a fetch refspec stores into, qualified as git's fetch does — `heads/`, `tags/` and `remotes/` get `refs/`,\n * and any other unqualified name is a local branch — or `undefined` when it stores nothing (no `:`, or nothing after\n * it). A glob destination keeps its glob.\n */\nfunction getRefspecDestination(refspec: string): string | undefined {\n\tconst stripped = refspec.startsWith('+') ? refspec.slice(1) : refspec;\n\tconst colonIndex = stripped.indexOf(':');\n\tif (colonIndex === -1) return undefined;\n\n\tconst destination = stripped.slice(colonIndex + 1);\n\tif (!destination) return undefined;\n\tif (destination.startsWith('refs/')) return destination;\n\n\treturn /^(?:heads|tags|remotes)\\//.test(destination) ? `refs/${destination}` : `refs/heads/${destination}`;\n}\n\n/**\n * The for-each-ref patterns covering `destinations` (the refs a fetch may store into) and tags, which a fetch follows\n * into what it fetched. A pattern's `*` doesn't match across `/`, so a glob destination is widened to the directory\n * above its first glob.\n */\nfunction getFetchSnapshotPatterns(destinations: Iterable<string>): string[] {\n\tconst patterns = ['refs/tags'];\n\tfor (let destination of destinations) {\n\t\tconst globIndex = destination.search(/[*?[]/);\n\t\tif (globIndex !== -1) {\n\t\t\tdestination = destination.substring(0, destination.lastIndexOf('/', globIndex));\n\t\t}\n\t\tif (patterns.some(p => destination === p || destination.startsWith(`${p}/`))) continue;\n\n\t\tpatterns.push(destination);\n\t}\n\treturn patterns;\n}\n\n/** The refs created, moved, retargeted or deleted between two snapshots */\nfunction getMovedRefs(before: ReadonlyMap<string, string>, after: ReadonlyMap<string, string>): string[] {\n\tconst moved: string[] = [];\n\tfor (const [ref, sha] of after) {\n\t\tif (before.get(ref) !== sha) {\n\t\t\tmoved.push(ref);\n\t\t}\n\t}\n\tfor (const ref of before.keys()) {\n\t\tif (!after.has(ref)) {\n\t\t\tmoved.push(ref);\n\t\t}\n\t}\n\treturn moved;\n}\n\nexport class OperationsGitSubProvider implements GitOperationsSubProvider {\n\t/** The `commonPath\\0remote` pairs {@link followRemoteHeads} has handled */\n\tprivate readonly followedRemoteHeads = new Set<string>();\n\n\tconstructor(\n\t\tprivate readonly context: GitServiceContext,\n\t\tprivate readonly git: Git,\n\t\tprivate readonly cache: Cache,\n\t\tprivate readonly provider: CliGitProviderInternal,\n\t) {}\n\n\t@debug()\n\tasync checkout(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { createBranch?: string; noTracking?: boolean },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['checkout'];\n\t\tif (options?.createBranch) {\n\t\t\tparams.push('-b', options.createBranch);\n\t\t\tif (options.noTracking) {\n\t\t\t\tparams.push('--no-track');\n\t\t\t}\n\t\t\tparams.push(ref, '--');\n\t\t} else {\n\t\t\tparams.push(ref, '--');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t\tif (options?.createBranch) {\n\t\t\t\t// Evict the cached base only — see `createBranch` on why the persisted keys stay.\n\t\t\t\tthis.cache.deleteBaseBranchName(repoPath, options.createBranch);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\t// `-b` moves only the branch it creates, and writes tracking to that branch's own config section\n\t\t\tthis.announceHeadChanged(\n\t\t\t\trepoPath,\n\t\t\t\toptions?.createBranch ? `refs/heads/${options.createBranch}` : undefined,\n\t\t\t\tBoolean(options?.createBranch) && mayWriteTracking(ref, options?.noTracking),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync cherryPick(\n\t\trepoPath: string,\n\t\trevs: string[],\n\t\toptions?: { edit?: boolean; noCommit?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['cherry-pick'];\n\t\tif (options?.edit) {\n\t\t\targs.push('-e');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('-n');\n\t\t}\n\n\t\tif (revs.length > 1) {\n\t\t\t// Sort commits in topological order (oldest ancestor first) so cherry-pick applies them correctly.\n\t\t\t// This is a local read-only pre-flight, not the user-initiated op — don't subject it to caller env/timeout.\n\t\t\tconst revsSet = new Set(revs);\n\t\t\tconst result = await this.git.run({ cwd: repoPath }, 'rev-list', '--topo-order', '--reverse', ...revs);\n\n\t\t\tconst ordered: string[] = [];\n\t\t\tfor (const sha of result.stdout.trim().split('\\n')) {\n\t\t\t\tif (sha && revsSet.has(sha)) {\n\t\t\t\t\tordered.push(sha);\n\t\t\t\t\tif (ordered.length === revs.length) break; // Early exit once we have all\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ordered.length === revs.length) {\n\t\t\t\trevs = ordered;\n\t\t\t}\n\t\t\t// If we didn't get all commits (shouldn't happen), keep original order\n\t\t}\n\n\t\targs.push(...revs);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...args);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'cherry-pick',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CherryPickError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', revs: revs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (CherryPickError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'cherry-pick');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync commit(\n\t\trepoPath: string,\n\t\tmessage: string,\n\t\toptions?: {\n\t\t\tall?: boolean;\n\t\t\tallowEmpty?: boolean;\n\t\t\tamend?: boolean;\n\t\t\tauthor?: string;\n\t\t\tdate?: string;\n\t\t\tsignoff?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['commit'];\n\t\tif (options?.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\t\tif (options?.allowEmpty) {\n\t\t\tparams.push('--allow-empty');\n\t\t}\n\t\tif (options?.amend) {\n\t\t\tparams.push('--amend');\n\t\t}\n\t\tif (options?.signoff) {\n\t\t\tparams.push('--signoff');\n\t\t}\n\t\tif (options?.author) {\n\t\t\tparams.push(`--author=${options.author}`);\n\t\t}\n\t\tif (options?.date) {\n\t\t\tparams.push(`--date=${options.date}`);\n\t\t}\n\t\t// Host-level override (e.g. VS Code's `git.enableCommitSigning`) — request signing explicitly\n\t\t// via `-S`. Implicit repo-config signing (`commit.gpgsign=true`) needs no flag, and `-S`\n\t\t// alongside it is harmless, so the override can only enable signing, never force it off.\n\t\tconst sign = this.context.config?.signing?.enabled === true;\n\t\tif (sign) {\n\t\t\tparams.push('-S');\n\t\t}\n\t\t// Read commit message from stdin via -F - to avoid shell escaping issues\n\t\tparams.push('-F', '-');\n\n\t\t// A commit moves only the branch HEAD is on. HEAD is read on both sides of the run: a hook or an outside\n\t\t// `git switch` that moves it meanwhile leaves the moved branch unknown, so then none is named\n\t\tconst headBranchBefore = await this.readHeadBranchRef(repoPath);\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t{ cwd: repoPath, stdin: message, stdinEncoding: 'utf8', errors: 'throw', ...runOptions },\n\t\t\t\t\t...params,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\t// A commit refused by a hook can still have restaged files\n\t\t\t\tconst headBranch = await this.readHeadBranchRef(repoPath);\n\t\t\t\tthis.announceHeadChanged(repoPath, headBranch === headBranchBefore ? headBranch : undefined);\n\t\t\t}\n\t\t\tif (sign) {\n\t\t\t\t// `-S` was passed and the commit succeeded, so signing is confirmed — fire the\n\t\t\t\t// explicit-sign hook (same contract as the patch provider's `commit-tree -S` path).\n\t\t\t\tlet format: SigningFormat | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t\t\t} catch {}\n\t\t\t\tthis.context.hooks?.commits?.onSigned?.(format ?? 'gpg', options?.source);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options?.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'commit',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CommitError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync fetch(\n\t\trepoPath: string,\n\t\toptions?:\n\t\t\t| {\n\t\t\t\t\tall?: boolean;\n\t\t\t\t\tbranch?: GitBranchReference;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote?: string;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: undefined;\n\t\t\t\t\tremote: string;\n\t\t\t\t\trefspecs: readonly string[];\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { branch, ...opts } = options ?? {};\n\t\tlet ran = false;\n\t\tlet fetched: FetchedRemotes | undefined;\n\t\tlet snapshot: { patterns: string[]; before: Map<string, string> | undefined } | undefined;\n\t\ttry {\n\t\t\tif (isBranchReference(branch)) {\n\t\t\t\tconst resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\t\tif (resolved.remote == null) return;\n\n\t\t\t\t// A pull fetch stores the upstream into the local branch (see `fetchCore`)\n\t\t\t\tconst patterns = await this.getFetchSnapshotPatterns(\n\t\t\t\t\trepoPath,\n\t\t\t\t\tresolved.remote,\n\t\t\t\t\toptions?.pull ? [`${resolved.upstream}:${resolved.name}`] : undefined,\n\t\t\t\t);\n\t\t\t\tsnapshot = { patterns: patterns, before: await this.snapshotRefs(repoPath, patterns) };\n\t\t\t\tran = true;\n\t\t\t\tawait this.fetchCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tbranch: resolved.name,\n\t\t\t\t\t\tremote: resolved.remote,\n\t\t\t\t\t\tupstream: resolved.upstream!,\n\t\t\t\t\t\tpull: options?.pull,\n\t\t\t\t\t\tpreserveFetchHead: options?.preserveFetchHead,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// A bare fetch reads its default remote, or all of them: every remote's refspecs cover either\n\t\t\t\tconst patterns = await this.getFetchSnapshotPatterns(repoPath, opts.remote, opts.refspecs);\n\t\t\t\tsnapshot = { patterns: patterns, before: await this.snapshotRefs(repoPath, patterns) };\n\t\t\t\tran = true;\n\t\t\t\tawait this.fetchCore(repoPath, opts, runOptions);\n\t\t\t\tif (!opts.refspecs?.length) {\n\t\t\t\t\tfetched = opts.remote != null ? { remote: opts.remote } : opts.all ? 'all' : 'default';\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\t// A rejected fetch may have stored some of its refs before it failed\n\t\t\tif (ran) {\n\t\t\t\tawait this.announceFetch(repoPath, snapshot, () => this.getFetchChanges(branch, options));\n\t\t\t}\n\t\t\tif (fetched != null) {\n\t\t\t\tvoid this.followRemoteHeads(repoPath, fetched);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Writes the missing `refs/remotes/<remote>/HEAD` (the default branch the base reads) of each remote a fetch just\n\t * read with its configured refspecs, once per remote, on git < 2.48 — newer git's fetch creates it itself. A bare\n\t * fetch/pull reads every remote when `fetch.all` is set (git 2.44+), else its default remote. Right after the\n\t * fetch, so the credentials it used are still cached. Never awaited; never rejects, failures not retried.\n\t */\n\tprivate async followRemoteHeads(repoPath: string, fetched: FetchedRemotes): Promise<void> {\n\t\ttry {\n\t\t\tif (await this.git.supports('git:fetch:follow-remote-head')) return;\n\n\t\t\tconst commonPath = this.cache.getCommonPath(repoPath);\n\t\t\tconst pending = (names: string[]): string[] =>\n\t\t\t\tnames.filter(r => !this.followedRemoteHeads.has(`${commonPath}\\0${r}`));\n\n\t\t\t// One cached read for everything that picks the remotes\n\t\t\tconst config = await this.provider.config.getConfigRegex(\n\t\t\t\trepoPath,\n\t\t\t\t'^(fetch\\\\.all|remote\\\\..+\\\\.skipfetchall|branch\\\\..+\\\\.remote)$',\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\tfetched === 'default' &&\n\t\t\t\tparseGitBoolean(config.get('fetch.all')) &&\n\t\t\t\t(await this.git.supports('git:fetch:all-config'))\n\t\t\t) {\n\t\t\t\tfetched = 'all';\n\t\t\t}\n\n\t\t\tlet remotes: string[];\n\t\t\tif (fetched === 'all') {\n\t\t\t\t// `fetch --all` skips the remotes marked `skipFetchAll`\n\t\t\t\tremotes = pending(\n\t\t\t\t\t(await this.provider.remotes.getRemotes(repoPath))\n\t\t\t\t\t\t.map(r => r.name)\n\t\t\t\t\t\t.filter(r => !parseGitBoolean(config.get(`remote.${r}.skipfetchall`))),\n\t\t\t\t);\n\t\t\t} else if (fetched === 'default') {\n\t\t\t\tconst remote = await this.getDefaultFetchRemote(repoPath, config);\n\t\t\t\tremotes = pending(remote != null ? [remote] : []);\n\t\t\t} else {\n\t\t\t\tremotes = pending([fetched.remote]);\n\t\t\t}\n\t\t\tif (!remotes.length) return;\n\n\t\t\tfor (const remote of remotes) {\n\t\t\t\tthis.followedRemoteHeads.add(`${commonPath}\\0${remote}`);\n\t\t\t}\n\t\t\tfor (const remote of remotes) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.provider.branches.setRemoteHeadIfMissing(repoPath, remote);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\t/**\n\t * The remote a bare `fetch`/`pull` reads: the current branch's `branch.<name>.remote` (none for `.`, the local\n\t * repository), else the sole remote, else `origin`\n\t */\n\tprivate async getDefaultFetchRemote(repoPath: string, config: Map<string, string>): Promise<string | undefined> {\n\t\tconst current = await this.provider.branches.getBranch(repoPath);\n\t\tconst configured = current != null ? config.get(`branch.${current.name}.remote`) : undefined;\n\t\tif (configured) return configured === '.' ? undefined : configured;\n\n\t\tconst remotes = await this.provider.remotes.getRemotes(repoPath);\n\t\treturn remotes.length === 1 ? remotes[0].name : 'origin';\n\t}\n\n\t/**\n\t * The for-each-ref patterns covering every ref a fetch from `remote` (`undefined`: from any remote) may write: the\n\t * destinations of `refspecs`, those of the remote's configured `remote.<name>.fetch` refspecs (which a fetch of\n\t * explicit refspecs still updates opportunistically, and which may store into local branches, as a mirror's do),\n\t * and tags. A `remote` with no refspecs of its own may be a remote group (`remotes.<group>`), which fetches each of\n\t * its remotes, so every remote's destinations stand for it. When the configuration can't be read, all local and\n\t * remote-tracking branches stand for the configured destinations.\n\t */\n\tprivate async getFetchSnapshotPatterns(\n\t\trepoPath: string,\n\t\tremote: string | undefined,\n\t\trefspecs: readonly string[] | undefined,\n\t): Promise<string[]> {\n\t\tconst destinations: string[] = [];\n\t\tconst add = (refspec: string): void => {\n\t\t\tconst destination = getRefspecDestination(refspec);\n\t\t\tif (destination != null) {\n\t\t\t\tdestinations.push(destination);\n\t\t\t}\n\t\t};\n\n\t\tfor (const refspec of refspecs ?? []) {\n\t\t\tadd(refspec);\n\t\t}\n\n\t\tlet configured: Map<string, string[]> | undefined;\n\t\ttry {\n\t\t\tconfigured = await this.provider.config.getConfigRegexAll(repoPath, '^remote\\\\..+\\\\.fetch$');\n\t\t} catch {\n\t\t\tdestinations.unshift(...broadFetchDestinations);\n\t\t}\n\t\tconst ownKey = remote != null ? `remote.${remote}.fetch` : undefined;\n\t\tconst onlyKey = ownKey != null && configured?.has(ownKey) ? ownKey : undefined;\n\t\tfor (const [key, values] of configured ?? []) {\n\t\t\tif (onlyKey != null && key !== onlyKey) continue;\n\n\t\t\tfor (const refspec of values) {\n\t\t\t\tadd(refspec);\n\t\t\t}\n\t\t}\n\t\treturn getFetchSnapshotPatterns(destinations);\n\t}\n\n\t/**\n\t * Announces what a fetch moved. Its refs are compared with the snapshot taken before it ran, so a fetch that\n\t * brought nothing new announces nothing (and resets nothing), and one that did names exactly the refs it moved,\n\t * letting every worktree that doesn't track them skip its refresh. When either snapshot is missing, it announces\n\t * `fallback()`'s kinds unnamed, as if every ref of them may have moved; when a ref moved outside the kinds an\n\t * announcement can name (`refs/notes/*`), the kinds it did see, together with `fallback()`'s, unnamed.\n\t */\n\tprivate async announceFetch(\n\t\trepoPath: string,\n\t\tsnapshot: { patterns: string[]; before: Map<string, string> | undefined } | undefined,\n\t\tfallback: () => RepositoryChange[],\n\t): Promise<void> {\n\t\tconst after = snapshot?.before != null ? await this.snapshotRefs(repoPath, snapshot.patterns) : undefined;\n\n\t\tlet changes: RepositoryChange[] | undefined;\n\t\tlet moved: string[] | undefined;\n\t\tif (snapshot?.before != null && after != null) {\n\t\t\tmoved = getMovedRefs(snapshot.before, after);\n\t\t\tif (!moved.length) return;\n\n\t\t\tconst kinds = new Set<RepositoryChange>();\n\t\t\tlet unnameable = false;\n\t\t\tfor (const ref of moved) {\n\t\t\t\tconst kind = ref.startsWith('refs/') ? getRefChangeKind(ref) : undefined;\n\t\t\t\tif (kind != null) {\n\t\t\t\t\tkinds.add(kind);\n\t\t\t\t} else {\n\t\t\t\t\tunnameable = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unnameable) {\n\t\t\t\tfor (const kind of fallback()) {\n\t\t\t\t\tkinds.add(kind);\n\t\t\t\t}\n\t\t\t\tmoved = undefined;\n\t\t\t}\n\t\t\tchanges = fetchRefChangeKinds.filter(k => kinds.has(k));\n\t\t}\n\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\tif (changes != null && moved != null) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, moved);\n\t\t} else {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes ?? fallback());\n\t\t}\n\t}\n\n\t/**\n\t * Each ref under `patterns` (for-each-ref patterns) with its object and, for a symbolic ref, its target (a remote's\n\t * `HEAD` can move to another branch at the same commit), or `undefined` when git couldn't answer. A read, so it\n\t * announces nothing.\n\t */\n\tprivate async snapshotRefs(\n\t\trepoPath: string,\n\t\tpatterns: readonly string[],\n\t): Promise<Map<string, string> | undefined> {\n\t\ttry {\n\t\t\tconst result = await this.git.run(\n\t\t\t\t{ cwd: repoPath, errors: 'ignore' },\n\t\t\t\t'for-each-ref',\n\t\t\t\t'--format=%(refname)%00%(objectname)%00%(symref)',\n\t\t\t\t...patterns,\n\t\t\t);\n\t\t\t// `errors: 'ignore'` resolves a failed read empty, which would read as every ref deleted\n\t\t\tif (result.completion.status !== 'exited' || result.exitCode !== 0) return undefined;\n\n\t\t\tconst refs = new Map<string, string>();\n\t\t\tfor (const line of result.stdout.split('\\n')) {\n\t\t\t\tconst index = line.indexOf('\\0');\n\t\t\t\tif (index === -1) continue;\n\n\t\t\t\trefs.set(line.substring(0, index), line.substring(index + 1).trim());\n\t\t\t}\n\t\t\treturn refs;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/** `remotes`, plus `heads`/`tags` for any local branch or tag the fetch writes — a `pull` fetch writes `<upstream>:<branch>` */\n\tprivate getFetchChanges(\n\t\tbranch: GitBranchReference | undefined,\n\t\toptions: { pull?: boolean; refspecs?: readonly string[] } | undefined,\n\t): RepositoryChange[] {\n\t\tif (isBranchReference(branch)) {\n\t\t\treturn options?.pull ? ['heads', 'remotes'] : ['remotes'];\n\t\t}\n\t\tif (!options?.refspecs?.length) return ['remotes'];\n\n\t\tconst changes: RepositoryChange[] = ['remotes'];\n\t\tfor (const refspec of options.refspecs) {\n\t\t\tconst destination = getRefspecDestination(refspec);\n\t\t\tif (destination == null) continue;\n\n\t\t\tif (destination.startsWith('refs/tags/')) {\n\t\t\t\tif (!changes.includes('tags')) {\n\t\t\t\t\tchanges.push('tags');\n\t\t\t\t}\n\t\t\t} else if (destination.startsWith('refs/heads/')) {\n\t\t\t\tif (!changes.includes('heads')) {\n\t\t\t\t\tchanges.push('heads');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn changes;\n\t}\n\n\tprivate async fetchCore(\n\t\trepoPath: string,\n\t\toptions:\n\t\t\t| {\n\t\t\t\t\tall?: boolean;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote?: string;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tprune?: undefined;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tupstream: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * `-u` (`--update-head-ok`, the default) lets a `pull` fetch move a branch even where it is\n\t\t\t\t\t * checked out; `false` keeps git's own refusal as a guard against a stale worktree lookup.\n\t\t\t\t\t */\n\t\t\t\t\tupdateHeadOk?: boolean;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: undefined;\n\t\t\t\t\tremote: string;\n\t\t\t\t\trefspecs: readonly string[];\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['fetch'];\n\n\t\tif (options.prune) {\n\t\t\tparams.push('--prune');\n\t\t}\n\n\t\tif (options.preserveFetchHead && (await this.git.supports('git:fetch:no-write-fetch-head'))) {\n\t\t\tparams.push('--no-write-fetch-head');\n\t\t}\n\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream && options.pull) {\n\t\t\t\tif (options.updateHeadOk !== false) {\n\t\t\t\t\tparams.push('-u');\n\t\t\t\t}\n\t\t\t\tparams.push(options.remote, `${options.upstream}:${options.branch}`);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.upstream || options.branch);\n\t\t\t}\n\t\t} else if (options.refspecs?.length) {\n\t\t\tparams.push(options.remote, ...options.refspecs);\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'fetch',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew FetchError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tbranch: options?.branch,\n\t\t\t\t\t\t\tremote: options?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync merge(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { fastForward?: boolean | 'only'; noCommit?: boolean; squash?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['merge'];\n\n\t\tif (options?.fastForward === 'only') {\n\t\t\targs.push('--ff-only');\n\t\t} else if (options?.fastForward === true) {\n\t\t\targs.push('--ff');\n\t\t} else if (options?.fastForward === false) {\n\t\t\targs.push('--no-ff');\n\t\t}\n\t\tif (options?.squash) {\n\t\t\targs.push('--squash');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('--no-commit');\n\t\t}\n\n\t\targs.push(ref);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since merges can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'merge',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew MergeError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (MergeError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'merge');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync pull(\n\t\trepoPath: string,\n\t\toptions?: {\n\t\t\tbranch?: GitBranchReference;\n\t\t\tfastForward?: 'only';\n\t\t\trebase?: boolean;\n\t\t\ttags?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\t// Set once a git command is about to run, so a pull that fails partway (a merge or rebase stopping on a\n\t\t// conflict, a fetch that stored some refs) announces what it changed the way a finished one does\n\t\tlet announce: (() => void) | undefined;\n\t\t// A `pull` with no arguments fetches the branch's remote with its configured refspecs\n\t\tlet fetched: { repoPath: string; remotes: FetchedRemotes } | undefined;\n\t\ttry {\n\t\t\tif (isBranchReference(options?.branch)) {\n\t\t\t\tconst branch = options.branch;\n\t\t\t\t// Find the worktree where this branch is checked out (if any)\n\t\t\t\tconst worktree = await this.provider.worktrees?.getWorktree(\n\t\t\t\t\trepoPath,\n\t\t\t\t\twt => wt.branch?.name === branch.name,\n\t\t\t\t);\n\t\t\t\tif (worktree != null) {\n\t\t\t\t\t// Branch is checked out in a worktree — run git pull in that worktree's directory\n\t\t\t\t\t// Any rebase state (e.g. from `pull.rebase=true`) appears under the worktree path\n\t\t\t\t\tconst worktreePath = normalizePath(worktree.uri.fsPath);\n\t\t\t\t\t// Its HEAD, index and any paused merge or rebase belong to that worktree, not to `repoPath`\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.announcePull(repoPath);\n\t\t\t\t\t\tif (worktreePath !== normalizePath(repoPath)) {\n\t\t\t\t\t\t\tthis.announcePull(worktreePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'started');\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.pullCore(\n\t\t\t\t\t\t\tworktreePath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfetched = { repoPath: worktreePath, remotes: 'default' };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'ended');\n\t\t\t\t\t}\n\t\t\t\t} else if (options?.fastForward === 'only') {\n\t\t\t\t\t// Not checked out anywhere, so there is no working tree to merge into — but a fast-forward\n\t\t\t\t\t// needs none: fetching `<upstream>:<branch>` advances the local branch, and git refuses that\n\t\t\t\t\t// non-forced refspec unless it fast-forwards. A plain fetch would leave the branch unmoved\n\t\t\t\t\t// and report success.\n\t\t\t\t\t// Fetched without `-u`: the worktree lookup above is cached and can miss a worktree added\n\t\t\t\t\t// outside core, and then git's own refusal is what keeps a checked-out branch from moving.\n\t\t\t\t\tconst {\n\t\t\t\t\t\tname: branchName,\n\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\tupstream,\n\t\t\t\t\t} = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\t\t\tif (remoteName == null || upstream == null) {\n\t\t\t\t\t\tthrow new PullError({\n\t\t\t\t\t\t\treason: 'noUpstream',\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: ['pull', '--ff-only', branch.name] },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// A `pull` fetch writes `<upstream>:<branch>`, moving the local branch too — same\n\t\t\t\t\t// hooks `fetch()` fires for a pull fetch with a branch reference.\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['heads', 'remotes']);\n\t\t\t\t\t};\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.fetchCore(\n\t\t\t\t\t\t\trepoPath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbranch: branchName,\n\t\t\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\t\tpull: true,\n\t\t\t\t\t\t\t\tupdateHeadOk: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tif (FetchError.is(ex, 'noFastForward')) {\n\t\t\t\t\t\t\tthrow new PullError(\n\t\t\t\t\t\t\t\t{ reason: 'noFastForward', gitCommand: ex.details.gitCommand },\n\t\t\t\t\t\t\t\tex.original,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow ex;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Branch is not checked out anywhere — can only fetch (no working tree to merge into)\n\t\t\t\t\tawait this.fetch(repoPath, { branch: branch }, runOptions);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tannounce = () => this.announcePull(repoPath);\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'started');\n\t\t\ttry {\n\t\t\t\tawait this.pullCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t\tfetched = { repoPath: repoPath, remotes: 'default' };\n\t\t\t} finally {\n\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'ended');\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\tannounce?.();\n\t\t\tif (fetched != null) {\n\t\t\t\tvoid this.followRemoteHeads(fetched.repoPath, fetched.remotes);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate announcePull(repoPath: string): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\n\t}\n\n\tprivate async pullCore(\n\t\trepoPath: string,\n\t\toptions: { fastForward?: 'only'; rebase?: boolean; tags?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['pull'];\n\n\t\tif (options.tags) {\n\t\t\tparams.push('--tags');\n\t\t}\n\n\t\tif (options.rebase) {\n\t\t\tparams.push('-r');\n\t\t}\n\n\t\tif (options.fastForward === 'only') {\n\t\t\tparams.push('--ff-only');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsPull, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'pull',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PullError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync push(\n\t\trepoPath: string,\n\t\toptions?: { reference?: GitReference; force?: boolean; publish?: { remote: string } },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tlet branchName: string;\n\t\tlet remoteName: string | undefined;\n\t\tlet upstreamName: string | undefined;\n\t\t// Whether the push itself writes `branch.<n>.remote/merge` (`-u`): only when it establishes tracking,\n\t\t// never to rewrite what a branch with a live upstream already has\n\t\tlet trackUpstream = options?.publish != null;\n\t\tlet setUpstream:\n\t\t\t| {\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tremoteBranch: string;\n\t\t\t }\n\t\t\t| undefined;\n\n\t\tif (isBranchReference(options?.reference)) {\n\t\t\tconst resolved = await resolveBranchRemote(\n\t\t\t\tthis.provider,\n\t\t\t\trepoPath,\n\t\t\t\toptions.reference,\n\t\t\t\trunOptions?.cancellation,\n\t\t\t);\n\t\t\tif (options.publish != null) {\n\t\t\t\tbranchName = options.reference.name;\n\t\t\t\tremoteName = options.publish.remote;\n\t\t\t} else {\n\t\t\t\tbranchName = resolved.name;\n\t\t\t\tremoteName = resolved.remote;\n\t\t\t}\n\t\t\t// A local upstream names a branch in this repository, never a branch on the remote being published to\n\t\t\tupstreamName = options.publish != null && resolved.local ? undefined : resolved.upstream;\n\t\t\ttrackUpstream ||= options.reference.upstream?.missing === true;\n\n\t\t\t// Without a remote, a bare `git push` would follow `push.default` somewhere the caller didn't pick\n\t\t\tif (options.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: options.reference.name });\n\t\t\t}\n\t\t} else {\n\t\t\tconst branch = await this.provider.branches.getBranch(repoPath);\n\t\t\tif (branch == null) return;\n\n\t\t\tconst resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\tif (options?.reference != null) {\n\t\t\t\t// Onto the upstream's remote-side name, which a custom fetch refspec or a renamed upstream can make differ\n\t\t\t\tbranchName = `${options.reference.ref}:${\n\t\t\t\t\toptions?.publish != null ? `refs/heads/${resolved.name}` : (resolved.upstream ?? resolved.name)\n\t\t\t\t}`;\n\t\t\t} else {\n\t\t\t\tconst tracking = options?.publish == null ? resolved.upstream : undefined;\n\t\t\t\tbranchName =\n\t\t\t\t\ttracking != null && tracking !== resolved.name ? `${branch.name}:${tracking}` : branch.name;\n\t\t\t}\n\t\t\tremoteName = resolved.remote ?? options?.publish?.remote;\n\t\t\tif (options?.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: branch.name });\n\t\t\t}\n\n\t\t\tupstreamName = options?.reference == null && options?.publish != null ? branch.name : undefined;\n\n\t\t\t// Git can't setup upstream tracking when publishing a new branch to a specific commit, so we'll need to do it after the push\n\t\t\tif (options?.publish?.remote != null && options?.reference != null) {\n\t\t\t\tsetUpstream = {\n\t\t\t\t\tbranch: resolved.name,\n\t\t\t\t\tremote: remoteName!,\n\t\t\t\t\tremoteBranch: resolved.name,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tlet forceOpts: PushForceOptions | undefined;\n\t\tif (options?.force) {\n\t\t\t// Honor the host's force-push preferences (e.g. VS Code's `git.useForcePushWithLease` /\n\t\t\t// `git.useForcePushIfIncludes`); fall back to the safer `--force-with-lease` behavior.\n\t\t\tconst useForceWithLease = this.context.config?.push?.useForceWithLease ?? true;\n\t\t\tforceOpts = useForceWithLease\n\t\t\t\t? { withLease: true, ifIncludes: this.context.config?.push?.useForceIfIncludes ?? true }\n\t\t\t\t: { withLease: false };\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.pushCore(\n\t\t\t\trepoPath,\n\t\t\t\t{\n\t\t\t\t\tbranch: branchName,\n\t\t\t\t\tremote: remoteName,\n\t\t\t\t\tupstream: upstreamName,\n\t\t\t\t\tforce: forceOpts,\n\t\t\t\t\tsetUpstream: trackUpstream,\n\t\t\t\t},\n\t\t\t\trunOptions,\n\t\t\t);\n\n\t\t\t// Since Git can't setup upstream tracking when publishing a new branch to a specific commit, do it now.\n\t\t\t// Soft-fail: the push already succeeded, so don't let a local upstream-tracking failure (cancellation\n\t\t\t// arriving mid-spawn, transient git error) suppress the post-push hook fan-out below.\n\t\t\tif (setUpstream != null) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.git.run(\n\t\t\t\t\t\t{ cwd: repoPath, ...runOptions },\n\t\t\t\t\t\t'branch',\n\t\t\t\t\t\t'--set-upstream-to',\n\t\t\t\t\t\t`${setUpstream.remote}/${setUpstream.remoteBranch}`,\n\t\t\t\t\t\tsetUpstream.branch,\n\t\t\t\t\t);\n\t\t\t\t} catch (ex) {\n\t\t\t\t\tscope?.error(ex, 'Unable to set upstream tracking after publish');\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\t// A rejected push may have updated some of its remote-tracking refs before it failed\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches');\n\t\t\tconst changes: RepositoryChange[] = [];\n\t\t\tif (trackUpstream || setUpstream != null) {\n\t\t\t\tchanges.push('config');\n\t\t\t}\n\t\t\tif (options?.publish != null) {\n\t\t\t\tchanges.push('heads');\n\t\t\t}\n\t\t\tchanges.push('remotes');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes);\n\t\t}\n\t}\n\n\tprivate async pushCore(\n\t\trepoPath: string,\n\t\toptions: {\n\t\t\tbranch?: string;\n\t\t\tforce?: PushForceOptions;\n\t\t\tsetUpstream?: boolean;\n\t\t\tremote?: string;\n\t\t\tupstream?: string;\n\t\t\tdelete?: { remote: string; branch: string };\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['push'];\n\n\t\tif (options.force != null) {\n\t\t\tif (options.force.withLease) {\n\t\t\t\tparams.push('--force-with-lease');\n\t\t\t\tif (options.force.ifIncludes) {\n\t\t\t\t\tif (await this.git.supports('git:push:force-if-includes')) {\n\t\t\t\t\t\tparams.push('--force-if-includes');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams.push('--force');\n\t\t\t}\n\t\t}\n\n\t\t// `push` refuses a branch without a remote before reaching here, as this would drop the branch\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream) {\n\t\t\t\tif (options.setUpstream) {\n\t\t\t\t\tparams.push('-u');\n\t\t\t\t}\n\t\t\t\tparams.push(options.remote, `${options.branch}:${options.upstream}`);\n\t\t\t} else if (options.setUpstream) {\n\t\t\t\tparams.push('--set-upstream', options.remote, options.branch);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.branch);\n\t\t\t}\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.delete) {\n\t\t\tparams.push(options.delete.remote, `:${options.delete.branch}`);\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tconst error = getGitCommandError(\n\t\t\t\t'push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason,\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (options?.force?.withLease && error.details.reason === 'rejected') {\n\t\t\t\tif (ex.stderr && /! \\[rejected\\].*\\(stale info\\)/m.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLease',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\toptions.force.ifIncludes &&\n\t\t\t\t\tex.stderr &&\n\t\t\t\t\t/! \\[rejected\\].*\\(remote ref updated since checkout\\)/m.test(ex.stderr)\n\t\t\t\t) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLeaseIfIncludes',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (ex.stderr && GitErrors.pushRejectedRefDoesNotExists.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedRefDoesNotExist',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync rebase(\n\t\trepoPath: string,\n\t\tupstream: string,\n\t\toptions?: {\n\t\t\tautoStash?: boolean;\n\t\t\tbranch?: string;\n\t\t\teditor?: string;\n\t\t\tinteractive?: boolean;\n\t\t\tprogrammaticEditor?: boolean;\n\t\t\tautosquash?: boolean;\n\t\t\tmessageEditor?: string;\n\t\t\tonto?: string;\n\t\t\tupdateRefs?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['rebase'];\n\t\tconst configs: string[] = [];\n\n\t\tif (options?.autoStash !== false) {\n\t\t\targs.push('--autostash');\n\t\t}\n\n\t\tif (options?.interactive) {\n\t\t\targs.push('--interactive');\n\n\t\t\tif (options.editor) {\n\t\t\t\tconfigs.push('-c', `sequence.editor=${options.editor}`);\n\t\t\t}\n\n\t\t\t// A script-based sequence editor rewrites the todo by command word + SHA, so git must emit a\n\t\t\t// plain, natural-order todo regardless of the user's rebase config: `rebase.autosquash` would\n\t\t\t// reorder commits and rewrite `pick`→`fixup`, and `rebase.abbreviateCommands` would emit `p`.\n\t\t\tif (options.programmaticEditor) {\n\t\t\t\tconfigs.push('-c', 'rebase.autosquash=false', '-c', 'rebase.abbreviateCommands=false');\n\t\t\t}\n\t\t}\n\n\t\tif (options?.autosquash != null) {\n\t\t\tif (options.autosquash && options.programmaticEditor) {\n\t\t\t\tthrow new Error(l10n.t('rebase: autosquash cannot be combined with programmaticEditor'));\n\t\t\t}\n\n\t\t\t// `--no-autosquash` is passed explicitly when `false` — omitting the flag would let a\n\t\t\t// `rebase.autosquash=true` git config fold fixups anyway.\n\t\t\targs.push(options.autosquash ? '--autosquash' : '--no-autosquash');\n\t\t}\n\n\t\t// Drive per-commit message editing (the combined message a `squash` produces, or a `reword`).\n\t\t// `GIT_EDITOR` (not `core.editor`) is what git's interactive-rebase backend honors for the `reword`\n\t\t// amend step, so set it on the environment; also set `core.editor` config as a fallback.\n\t\tlet env = runOptions?.env;\n\t\tif (options?.messageEditor) {\n\t\t\tconfigs.push('-c', `core.editor=${options.messageEditor}`);\n\t\t\tenv = { ...env, GIT_EDITOR: options.messageEditor };\n\t\t}\n\n\t\tif (options?.updateRefs === true) {\n\t\t\targs.push('--update-refs');\n\t\t} else if (options?.updateRefs === false) {\n\t\t\targs.push('--no-update-refs');\n\t\t}\n\n\t\tif (options?.onto) {\n\t\t\targs.push('--onto', options.onto);\n\t\t}\n\n\t\targs.push(upstream);\n\n\t\tif (options?.branch) {\n\t\t\targs.push(options.branch);\n\t\t}\n\n\t\t// Fired before the process runs — `git rebase` exits 0 when stopping at `edit`/`break`,\n\t\t// so the result can't be used to detect that a rebase started\n\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'started');\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since rebases can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', configs: configs, timeout: 0, ...runOptions, env: env },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'rebase',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RebaseError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: args },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RebaseError.is(mapped, 'conflicts')) {\n\t\t\t\treturn await this.createConflictResult(repoPath, 'rebase');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t} finally {\n\t\t\t// The command exited (success, pause, or failure) — any rebase it left behind is on disk now\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'ended');\n\t\t}\n\t}\n\n\t@debug()\n\tasync reset(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: { mode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tawait this.resetCore(repoPath, rev, options?.mode, runOptions);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\tthis.announceHeadChanged(repoPath);\n\t\t}\n\t}\n\n\tprivate async resetCore(\n\t\trepoPath: string,\n\t\trev: string,\n\t\tmode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['reset', '-q'];\n\t\tif (mode) {\n\t\t\tparams.push(`--${mode}`);\n\t\t}\n\t\tparams.push(rev, '--');\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'reset',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew ResetError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync restore(\n\t\trepoPath: string,\n\t\tpath: string | string[],\n\t\toptions?: { ref?: string; side?: 'ours' | 'theirs' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst paths = Array.isArray(path) ? path : [path];\n\t\tif (!paths.length) return;\n\n\t\tconst scope = getScopedLogger();\n\t\tconst normalized = paths.map(p => splitPath(p, repoPath, true)[0]);\n\n\t\t// `side` and `ref` are mutually exclusive in git (--ours/--theirs apply during conflict\n\t\t// resolution and take no source ref); side takes precedence if both are somehow supplied.\n\t\t// Use a truthy check on `ref` so an empty string falls through to index-restore rather than\n\t\t// producing a malformed `git checkout '' -- …`. Implemented via `checkout` rather than\n\t\t// `git restore` for compatibility with the minimum supported git (2.7.2); `git restore`\n\t\t// only landed in 2.23.\n\t\tconst selector = options?.side != null ? `--${options.side}` : options?.ref || undefined;\n\t\tconst prefix = selector != null ? ['checkout', selector, '--'] : ['checkout', '--'];\n\n\t\tlet ran = false;\n\t\ttry {\n\t\t\tif (await this.git.supports('git:checkout:pathspec-from-file')) {\n\t\t\t\t// Git ≥ 2.26: stream all pathspecs via stdin (NUL-separated) in a single invocation —\n\t\t\t\t// no CLI-length limit (so no batching), and robust for paths with spaces/newlines.\n\t\t\t\t// Pathspecs come from the file rather than argv, so `--` isn't used.\n\t\t\t\tconst args = ['checkout'];\n\t\t\t\tif (selector != null) {\n\t\t\t\t\targs.push(selector);\n\t\t\t\t}\n\t\t\t\targs.push('--pathspec-from-file=-', '--pathspec-file-nul');\n\t\t\t\tran = true;\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', ...runOptions, stdin: normalized.join('\\0') },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Older git: pass pathspecs as args, one git invocation per chunk (collapsing N\n\t\t\t\t// path-mode checkouts into ⌈N / chunk⌉ spawns). Reserve the command prefix length and\n\t\t\t\t// a per-arg overhead (separator + possible quoting) so the assembled command line\n\t\t\t\t// can't exceed the OS limit even with many short paths.\n\t\t\t\tconst perArgOverhead = 3;\n\t\t\t\tconst prefixLength = prefix.reduce((sum, arg) => sum + arg.length + perArgOverhead, 0);\n\t\t\t\tfor (const batch of chunkByStringLength(normalized, maxGitCliLength - prefixLength, perArgOverhead)) {\n\t\t\t\t\tran = true;\n\t\t\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...prefix, ...batch);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tref: options?.side ?? options?.ref,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: [...prefix, ...normalized] },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tif (ran) {\n\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'status');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['index']);\n\t\t\t}\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync revert(\n\t\trepoPath: string,\n\t\trefs: string[],\n\t\toptions?: { editMessage?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['revert'];\n\n\t\tif (options?.editMessage === true) {\n\t\t\targs.push('--edit');\n\t\t} else if (options?.editMessage === false) {\n\t\t\targs.push('--no-edit');\n\t\t}\n\n\t\targs.push(...refs);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since reverts can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'revert',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RevertError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', refs: refs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RevertError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'revert');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t/**\n\t * Classifies `ex` as a signing failure; if so, fires the `commits.onSigningFailed`\n\t * hook and throws a typed {@link SigningError}. Callers should invoke this first\n\t * in their catch blocks, before falling through to command-specific error mapping\n\t * via {@link getGitCommandError}.\n\t *\n\t * `SigningFormat` is read opportunistically from `config.getSigningConfig`, with\n\t * {@link inferSigningFormatFromError} as a stderr-based fallback and `'gpg'` as\n\t * the final default.\n\t */\n\tprivate async throwIfSigningError(\n\t\trepoPath: string,\n\t\targs: readonly (string | undefined)[],\n\t\tex: unknown,\n\t\tsource?: unknown,\n\t): Promise<void> {\n\t\tconst reason = classifySigningError(ex);\n\t\tif (reason == null) return;\n\n\t\tlet format: SigningFormat | undefined;\n\t\ttry {\n\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t} catch {\n\t\t\t// Fall through — config read failed; use stderr-inferred format or gpg default\n\t\t}\n\t\tformat ??= inferSigningFormatFromError(ex) ?? 'gpg';\n\n\t\tthis.context.hooks?.commits?.onSigningFailed?.(reason, format, source);\n\t\tthrow new SigningError(\n\t\t\t{ reason: reason, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\tex instanceof Error ? ex : undefined,\n\t\t);\n\t}\n\n\t/**\n\t * Called once git has run, success or not — a rejected write can still have moved HEAD or left state behind.\n\t * `branchRef` is the full name of the one branch the write could have moved, when it knows it; `wroteTracking`\n\t * says it wrote that branch's tracking, to its own config section.\n\t */\n\tprivate announceHeadChanged(repoPath: string, branchRef?: string, wroteTracking?: boolean): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\tconst changes: RepositoryChange[] = wroteTracking\n\t\t\t? ['config', 'head', 'heads', 'index']\n\t\t\t: ['head', 'heads', 'index'];\n\t\tif (branchRef == null) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes);\n\t\t} else if (wroteTracking) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, [branchRef], {\n\t\t\t\tconfigConfinedToRefs: true,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, [branchRef]);\n\t\t}\n\t}\n\n\t/**\n\t * The full name of the branch HEAD is on, from the worktree's own `HEAD` file (`ref: refs/heads/main`): read around\n\t * a write, so it names the branch that write moved, whatever a switch outside core left in the caches; no git\n\t * runs. `undefined` when HEAD is detached, unreadable, or not a branch name git allows — a reftable repository's\n\t * `HEAD` file holds the placeholder `refs/heads/.invalid`, and its real HEAD is in the tables.\n\t */\n\tprivate async readHeadBranchRef(repoPath: string): Promise<string | undefined> {\n\t\ttry {\n\t\t\tconst gitDir = await this.provider.config.getGitDir(repoPath);\n\t\t\tconst head = new TextDecoder().decode(await this.context.fs.readFile(joinUriPath(gitDir.uri, 'HEAD')));\n\t\t\tconst ref = /^ref:\\s*(refs\\/heads\\/\\S+)\\s*$/.exec(head)?.[1];\n\t\t\treturn ref != null && !ref.split('/').some(part => part.startsWith('.')) ? ref : undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/** The caller has already announced the change — the conflict is what the failed run left behind */\n\tprivate async createConflictResult(repoPath: string, command: GitConflictCommand): Promise<GitOperationResult> {\n\t\tlet conflicts: GitConflictFile[] | undefined;\n\t\ttry {\n\t\t\tconflicts = await this.provider.status.getConflictingFiles(repoPath);\n\t\t} catch (ex) {\n\t\t\t// Don't let a secondary status-read failure mask the original conflict signal\n\t\t\tLogger.warn(`Unable to read conflicting files after ${command}: ${ex}`);\n\t\t}\n\t\tthis.context.hooks?.operations?.onConflicted?.(command, conflicts);\n\t\treturn { conflicted: true, conflicts: conflicts };\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"operations.js","names":[],"sources":["../../../../git-cli/src/providers/operations.ts"],"sourcesContent":["import * as l10n from '@vscode/l10n';\nimport type { Cache } from '@gitlens/git/cache.js';\nimport type { GitConflictCommand, GitServiceContext } from '@gitlens/git/context.js';\nimport {\n\tCheckoutError,\n\tCherryPickError,\n\tCommitError,\n\tFetchError,\n\tMergeError,\n\tPullError,\n\tPushError,\n\tRebaseError,\n\tResetError,\n\tRevertError,\n\tSigningError,\n} from '@gitlens/git/errors.js';\nimport type { GitBranchReference, GitReference } from '@gitlens/git/models/reference.js';\nimport type { RepositoryChange } from '@gitlens/git/models/repository.js';\nimport type { SigningFormat } from '@gitlens/git/models/signature.js';\nimport type { GitConflictFile } from '@gitlens/git/models/staging.js';\nimport type {\n\tGitOperationResult,\n\tGitOperationRunOptions,\n\tGitOperationsSubProvider,\n} from '@gitlens/git/providers/operations.js';\nimport { isBranchReference } from '@gitlens/git/utils/reference.utils.js';\nimport { getRefChangeKind } from '@gitlens/git/watching/changeEvent.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { sequentialize } from '@gitlens/utils/decorators/sequentialize.js';\nimport { chunkByStringLength } from '@gitlens/utils/iterable.js';\nimport { Logger } from '@gitlens/utils/logger.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { mayWriteTracking } from '../exec/commandClassifier.js';\nimport type { Git, PushForceOptions } from '../exec/git.js';\nimport {\n\tclassifySigningError,\n\tgetGitCommandError,\n\tgitConfigsPull,\n\tGitErrors,\n\tinferSigningFormatFromError,\n\tisRunHookFailure,\n\tmaxGitCliLength,\n} from '../exec/git.js';\nimport type { HeadState } from '../exec/headState.js';\nimport { getMovedHead, readHeadState } from '../exec/headState.js';\nimport { resolveBranchRemote } from './branchRemote.js';\nimport { parseGitBoolean } from './config.js';\n\n/** The remotes a fetch read with their configured refspecs: one named remote, all of them, or a bare fetch's default */\ntype FetchedRemotes = { remote: string } | 'all' | 'default';\n\n/** The ref kinds a fetch can move, in the order its announcement lists them */\nconst fetchRefChangeKinds: readonly RepositoryChange[] = ['remotes', 'heads', 'tags', 'stash'];\n\n/** The destinations a fetch's snapshot covers when the remotes' configured refspecs can't be read */\nconst broadFetchDestinations: readonly string[] = ['refs/heads', 'refs/remotes'];\n\n/**\n * The ref a fetch refspec stores into, qualified as git's fetch does — `heads/`, `tags/` and `remotes/` get `refs/`,\n * and any other unqualified name is a local branch — or `undefined` when it stores nothing (no `:`, or nothing after\n * it). A glob destination keeps its glob.\n */\nfunction getRefspecDestination(refspec: string): string | undefined {\n\tconst stripped = refspec.startsWith('+') ? refspec.slice(1) : refspec;\n\tconst colonIndex = stripped.indexOf(':');\n\tif (colonIndex === -1) return undefined;\n\n\tconst destination = stripped.slice(colonIndex + 1);\n\tif (!destination) return undefined;\n\tif (destination.startsWith('refs/')) return destination;\n\n\treturn /^(?:heads|tags|remotes)\\//.test(destination) ? `refs/${destination}` : `refs/heads/${destination}`;\n}\n\n/**\n * The for-each-ref patterns covering `destinations` (the refs a fetch may store into) and tags, which a fetch follows\n * into what it fetched. A pattern's `*` doesn't match across `/`, so a glob destination is widened to the directory\n * above its first glob.\n */\nfunction getFetchSnapshotPatterns(destinations: Iterable<string>): string[] {\n\tconst patterns = ['refs/tags'];\n\tfor (let destination of destinations) {\n\t\tconst globIndex = destination.search(/[*?[]/);\n\t\tif (globIndex !== -1) {\n\t\t\tdestination = destination.substring(0, destination.lastIndexOf('/', globIndex));\n\t\t}\n\t\tif (patterns.some(p => destination === p || destination.startsWith(`${p}/`))) continue;\n\n\t\tpatterns.push(destination);\n\t}\n\treturn patterns;\n}\n\n/** The refs created, moved, retargeted or deleted between two snapshots */\nfunction getMovedRefs(before: ReadonlyMap<string, string>, after: ReadonlyMap<string, string>): string[] {\n\tconst moved: string[] = [];\n\tfor (const [ref, sha] of after) {\n\t\tif (before.get(ref) !== sha) {\n\t\t\tmoved.push(ref);\n\t\t}\n\t}\n\tfor (const ref of before.keys()) {\n\t\tif (!after.has(ref)) {\n\t\t\tmoved.push(ref);\n\t\t}\n\t}\n\treturn moved;\n}\n\nexport class OperationsGitSubProvider implements GitOperationsSubProvider {\n\t/** The `commonPath\\0remote` pairs {@link followRemoteHeads} has handled */\n\tprivate readonly followedRemoteHeads = new Set<string>();\n\n\tconstructor(\n\t\tprivate readonly context: GitServiceContext,\n\t\tprivate readonly git: Git,\n\t\tprivate readonly cache: Cache,\n\t\tprivate readonly provider: CliGitProviderInternal,\n\t) {}\n\n\t@debug()\n\tasync checkout(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { createBranch?: string; noTracking?: boolean },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['checkout'];\n\t\tif (options?.createBranch) {\n\t\t\tparams.push('-b', options.createBranch);\n\t\t\tif (options.noTracking) {\n\t\t\t\tparams.push('--no-track');\n\t\t\t}\n\t\t\tparams.push(ref, '--');\n\t\t} else {\n\t\t\tparams.push(ref, '--');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t\tif (options?.createBranch) {\n\t\t\t\t// Evict the cached base only — see `createBranch` on why the persisted keys stay.\n\t\t\t\tthis.cache.deleteBaseBranchName(repoPath, options.createBranch);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\t// `-b` moves only the branch it creates, and writes tracking to that branch's own config section\n\t\t\tthis.announceHeadChanged(\n\t\t\t\trepoPath,\n\t\t\t\toptions?.createBranch ? { branch: `refs/heads/${options.createBranch}` } : undefined,\n\t\t\t\tBoolean(options?.createBranch) && mayWriteTracking(ref, options?.noTracking),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync cherryPick(\n\t\trepoPath: string,\n\t\trevs: string[],\n\t\toptions?: { edit?: boolean; noCommit?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['cherry-pick'];\n\t\tif (options?.edit) {\n\t\t\targs.push('-e');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('-n');\n\t\t}\n\n\t\tif (revs.length > 1) {\n\t\t\t// Sort commits in topological order (oldest ancestor first) so cherry-pick applies them correctly.\n\t\t\t// This is a local read-only pre-flight, not the user-initiated op — don't subject it to caller env/timeout.\n\t\t\tconst revsSet = new Set(revs);\n\t\t\tconst result = await this.git.run({ cwd: repoPath }, 'rev-list', '--topo-order', '--reverse', ...revs);\n\n\t\t\tconst ordered: string[] = [];\n\t\t\tfor (const sha of result.stdout.trim().split('\\n')) {\n\t\t\t\tif (sha && revsSet.has(sha)) {\n\t\t\t\t\tordered.push(sha);\n\t\t\t\t\tif (ordered.length === revs.length) break; // Early exit once we have all\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ordered.length === revs.length) {\n\t\t\t\trevs = ordered;\n\t\t\t}\n\t\t\t// If we didn't get all commits (shouldn't happen), keep original order\n\t\t}\n\n\t\targs.push(...revs);\n\n\t\ttry {\n\t\t\tawait this.runMovingHeadBranch(repoPath, () =>\n\t\t\t\tthis.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...args),\n\t\t\t);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'cherry-pick',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CherryPickError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', revs: revs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (CherryPickError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'cherry-pick');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync commit(\n\t\trepoPath: string,\n\t\tmessage: string,\n\t\toptions?: {\n\t\t\tall?: boolean;\n\t\t\tallowEmpty?: boolean;\n\t\t\tamend?: boolean;\n\t\t\tauthor?: string;\n\t\t\tdate?: string;\n\t\t\tsignoff?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['commit'];\n\t\tif (options?.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\t\tif (options?.allowEmpty) {\n\t\t\tparams.push('--allow-empty');\n\t\t}\n\t\tif (options?.amend) {\n\t\t\tparams.push('--amend');\n\t\t}\n\t\tif (options?.signoff) {\n\t\t\tparams.push('--signoff');\n\t\t}\n\t\tif (options?.author) {\n\t\t\tparams.push(`--author=${options.author}`);\n\t\t}\n\t\tif (options?.date) {\n\t\t\tparams.push(`--date=${options.date}`);\n\t\t}\n\t\t// Host-level override (e.g. VS Code's `git.enableCommitSigning`) — request signing explicitly\n\t\t// via `-S`. Implicit repo-config signing (`commit.gpgsign=true`) needs no flag, and `-S`\n\t\t// alongside it is harmless, so the override can only enable signing, never force it off.\n\t\tconst sign = this.context.config?.signing?.enabled === true;\n\t\tif (sign) {\n\t\t\tparams.push('-S');\n\t\t}\n\t\t// Read commit message from stdin via -F - to avoid shell escaping issues\n\t\tparams.push('-F', '-');\n\n\t\ttry {\n\t\t\t// A commit refused by a hook can still have restaged files, which the announcement covers too\n\t\t\tawait this.runMovingHeadBranch(repoPath, () =>\n\t\t\t\tthis.git.run(\n\t\t\t\t\t{ cwd: repoPath, stdin: message, stdinEncoding: 'utf8', errors: 'throw', ...runOptions },\n\t\t\t\t\t...params,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (sign) {\n\t\t\t\t// `-S` was passed and the commit succeeded, so signing is confirmed — fire the\n\t\t\t\t// explicit-sign hook (same contract as the patch provider's `commit-tree -S` path).\n\t\t\t\tlet format: SigningFormat | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t\t\t} catch {}\n\t\t\t\tthis.context.hooks?.commits?.onSigned?.(format ?? 'gpg', options?.source);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options?.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'commit',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CommitError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync fetch(\n\t\trepoPath: string,\n\t\toptions?:\n\t\t\t| {\n\t\t\t\t\tall?: boolean;\n\t\t\t\t\tbranch?: GitBranchReference;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote?: string;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: undefined;\n\t\t\t\t\tremote: string;\n\t\t\t\t\trefspecs: readonly string[];\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { branch, ...opts } = options ?? {};\n\t\tlet ran = false;\n\t\tlet fetched: FetchedRemotes | undefined;\n\t\tlet snapshot: { patterns: string[]; before: Map<string, string> | undefined } | undefined;\n\t\ttry {\n\t\t\tif (isBranchReference(branch)) {\n\t\t\t\tconst resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\t\tif (resolved.remote == null) return;\n\n\t\t\t\t// A pull fetch stores the upstream into the local branch (see `fetchCore`)\n\t\t\t\tconst patterns = await this.getFetchSnapshotPatterns(\n\t\t\t\t\trepoPath,\n\t\t\t\t\tresolved.remote,\n\t\t\t\t\toptions?.pull ? [`${resolved.upstream}:${resolved.name}`] : undefined,\n\t\t\t\t);\n\t\t\t\tsnapshot = { patterns: patterns, before: await this.snapshotRefs(repoPath, patterns) };\n\t\t\t\tran = true;\n\t\t\t\tawait this.fetchCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tbranch: resolved.name,\n\t\t\t\t\t\tremote: resolved.remote,\n\t\t\t\t\t\tupstream: resolved.upstream!,\n\t\t\t\t\t\tpull: options?.pull,\n\t\t\t\t\t\tpreserveFetchHead: options?.preserveFetchHead,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// A bare fetch reads its default remote, or all of them: every remote's refspecs cover either\n\t\t\t\tconst patterns = await this.getFetchSnapshotPatterns(repoPath, opts.remote, opts.refspecs);\n\t\t\t\tsnapshot = { patterns: patterns, before: await this.snapshotRefs(repoPath, patterns) };\n\t\t\t\tran = true;\n\t\t\t\tawait this.fetchCore(repoPath, opts, runOptions);\n\t\t\t\tif (!opts.refspecs?.length) {\n\t\t\t\t\tfetched = opts.remote != null ? { remote: opts.remote } : opts.all ? 'all' : 'default';\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\t// A rejected fetch may have stored some of its refs before it failed\n\t\t\tif (ran) {\n\t\t\t\tawait this.announceFetch(repoPath, snapshot, () => this.getFetchChanges(branch, options));\n\t\t\t}\n\t\t\tif (fetched != null) {\n\t\t\t\tvoid this.followRemoteHeads(repoPath, fetched);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Writes the missing `refs/remotes/<remote>/HEAD` (the default branch the base reads) of each remote a fetch just\n\t * read with its configured refspecs, once per remote, on git < 2.48 — newer git's fetch creates it itself. A bare\n\t * fetch/pull reads every remote when `fetch.all` is set (git 2.44+), else its default remote. Right after the\n\t * fetch, so the credentials it used are still cached. Never awaited; never rejects, failures not retried.\n\t */\n\tprivate async followRemoteHeads(repoPath: string, fetched: FetchedRemotes): Promise<void> {\n\t\ttry {\n\t\t\tif (await this.git.supports('git:fetch:follow-remote-head')) return;\n\n\t\t\tconst commonPath = this.cache.getCommonPath(repoPath);\n\t\t\tconst pending = (names: string[]): string[] =>\n\t\t\t\tnames.filter(r => !this.followedRemoteHeads.has(`${commonPath}\\0${r}`));\n\n\t\t\t// One cached read for everything that picks the remotes\n\t\t\tconst config = await this.provider.config.getConfigRegex(\n\t\t\t\trepoPath,\n\t\t\t\t'^(fetch\\\\.all|remote\\\\..+\\\\.skipfetchall|branch\\\\..+\\\\.remote)$',\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\tfetched === 'default' &&\n\t\t\t\tparseGitBoolean(config.get('fetch.all')) &&\n\t\t\t\t(await this.git.supports('git:fetch:all-config'))\n\t\t\t) {\n\t\t\t\tfetched = 'all';\n\t\t\t}\n\n\t\t\tlet remotes: string[];\n\t\t\tif (fetched === 'all') {\n\t\t\t\t// `fetch --all` skips the remotes marked `skipFetchAll`\n\t\t\t\tremotes = pending(\n\t\t\t\t\t(await this.provider.remotes.getRemotes(repoPath))\n\t\t\t\t\t\t.map(r => r.name)\n\t\t\t\t\t\t.filter(r => !parseGitBoolean(config.get(`remote.${r}.skipfetchall`))),\n\t\t\t\t);\n\t\t\t} else if (fetched === 'default') {\n\t\t\t\tconst remote = await this.getDefaultFetchRemote(repoPath, config);\n\t\t\t\tremotes = pending(remote != null ? [remote] : []);\n\t\t\t} else {\n\t\t\t\tremotes = pending([fetched.remote]);\n\t\t\t}\n\t\t\tif (!remotes.length) return;\n\n\t\t\tfor (const remote of remotes) {\n\t\t\t\tthis.followedRemoteHeads.add(`${commonPath}\\0${remote}`);\n\t\t\t}\n\t\t\tfor (const remote of remotes) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.provider.branches.setRemoteHeadIfMissing(repoPath, remote);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\t/**\n\t * The remote a bare `fetch`/`pull` reads: the current branch's `branch.<name>.remote` (none for `.`, the local\n\t * repository), else the sole remote, else `origin`\n\t */\n\tprivate async getDefaultFetchRemote(repoPath: string, config: Map<string, string>): Promise<string | undefined> {\n\t\tconst current = await this.provider.branches.getBranch(repoPath);\n\t\tconst configured = current != null ? config.get(`branch.${current.name}.remote`) : undefined;\n\t\tif (configured) return configured === '.' ? undefined : configured;\n\n\t\tconst remotes = await this.provider.remotes.getRemotes(repoPath);\n\t\treturn remotes.length === 1 ? remotes[0].name : 'origin';\n\t}\n\n\t/**\n\t * The for-each-ref patterns covering every ref a fetch from `remote` (`undefined`: from any remote) may write: the\n\t * destinations of `refspecs`, those of the remote's configured `remote.<name>.fetch` refspecs (which a fetch of\n\t * explicit refspecs still updates opportunistically, and which may store into local branches, as a mirror's do),\n\t * and tags. A `remote` with no refspecs of its own may be a remote group (`remotes.<group>`), which fetches each of\n\t * its remotes, so every remote's destinations stand for it. When the configuration can't be read, all local and\n\t * remote-tracking branches stand for the configured destinations.\n\t */\n\tprivate async getFetchSnapshotPatterns(\n\t\trepoPath: string,\n\t\tremote: string | undefined,\n\t\trefspecs: readonly string[] | undefined,\n\t): Promise<string[]> {\n\t\tconst destinations: string[] = [];\n\t\tconst add = (refspec: string): void => {\n\t\t\tconst destination = getRefspecDestination(refspec);\n\t\t\tif (destination != null) {\n\t\t\t\tdestinations.push(destination);\n\t\t\t}\n\t\t};\n\n\t\tfor (const refspec of refspecs ?? []) {\n\t\t\tadd(refspec);\n\t\t}\n\n\t\tlet configured: Map<string, string[]> | undefined;\n\t\ttry {\n\t\t\tconfigured = await this.provider.config.getConfigRegexAll(repoPath, '^remote\\\\..+\\\\.fetch$');\n\t\t} catch {\n\t\t\tdestinations.unshift(...broadFetchDestinations);\n\t\t}\n\t\tconst ownKey = remote != null ? `remote.${remote}.fetch` : undefined;\n\t\tconst onlyKey = ownKey != null && configured?.has(ownKey) ? ownKey : undefined;\n\t\tfor (const [key, values] of configured ?? []) {\n\t\t\tif (onlyKey != null && key !== onlyKey) continue;\n\n\t\t\tfor (const refspec of values) {\n\t\t\t\tadd(refspec);\n\t\t\t}\n\t\t}\n\t\treturn getFetchSnapshotPatterns(destinations);\n\t}\n\n\t/**\n\t * Announces what a fetch moved. Its refs are compared with the snapshot taken before it ran, so a fetch that\n\t * brought nothing new announces nothing (and resets nothing), and one that did names exactly the refs it moved,\n\t * letting every worktree that doesn't track them skip its refresh. When either snapshot is missing, it announces\n\t * `fallback()`'s kinds unnamed, as if every ref of them may have moved; when a ref moved outside the kinds an\n\t * announcement can name (`refs/notes/*`), the kinds it did see, together with `fallback()`'s, unnamed.\n\t */\n\tprivate async announceFetch(\n\t\trepoPath: string,\n\t\tsnapshot: { patterns: string[]; before: Map<string, string> | undefined } | undefined,\n\t\tfallback: () => RepositoryChange[],\n\t): Promise<void> {\n\t\tconst after = snapshot?.before != null ? await this.snapshotRefs(repoPath, snapshot.patterns) : undefined;\n\n\t\tlet changes: RepositoryChange[] | undefined;\n\t\tlet moved: string[] | undefined;\n\t\tif (snapshot?.before != null && after != null) {\n\t\t\tmoved = getMovedRefs(snapshot.before, after);\n\t\t\tif (!moved.length) return;\n\n\t\t\tconst kinds = new Set<RepositoryChange>();\n\t\t\tlet unnameable = false;\n\t\t\tfor (const ref of moved) {\n\t\t\t\tconst kind = ref.startsWith('refs/') ? getRefChangeKind(ref) : undefined;\n\t\t\t\tif (kind != null) {\n\t\t\t\t\tkinds.add(kind);\n\t\t\t\t} else {\n\t\t\t\t\tunnameable = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unnameable) {\n\t\t\t\tfor (const kind of fallback()) {\n\t\t\t\t\tkinds.add(kind);\n\t\t\t\t}\n\t\t\t\tmoved = undefined;\n\t\t\t}\n\t\t\tchanges = fetchRefChangeKinds.filter(k => kinds.has(k));\n\t\t}\n\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\tif (changes != null && moved != null) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, moved);\n\t\t} else {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes ?? fallback());\n\t\t}\n\t}\n\n\t/**\n\t * Each ref under `patterns` (for-each-ref patterns) with its object and, for a symbolic ref, its target (a remote's\n\t * `HEAD` can move to another branch at the same commit), or `undefined` when git couldn't answer. A read, so it\n\t * announces nothing.\n\t */\n\tprivate async snapshotRefs(\n\t\trepoPath: string,\n\t\tpatterns: readonly string[],\n\t): Promise<Map<string, string> | undefined> {\n\t\ttry {\n\t\t\tconst result = await this.git.run(\n\t\t\t\t{ cwd: repoPath, errors: 'ignore' },\n\t\t\t\t'for-each-ref',\n\t\t\t\t'--format=%(refname)%00%(objectname)%00%(symref)',\n\t\t\t\t...patterns,\n\t\t\t);\n\t\t\t// `errors: 'ignore'` resolves a failed read empty, which would read as every ref deleted\n\t\t\tif (result.completion.status !== 'exited' || result.exitCode !== 0) return undefined;\n\n\t\t\tconst refs = new Map<string, string>();\n\t\t\tfor (const line of result.stdout.split('\\n')) {\n\t\t\t\tconst index = line.indexOf('\\0');\n\t\t\t\tif (index === -1) continue;\n\n\t\t\t\trefs.set(line.substring(0, index), line.substring(index + 1).trim());\n\t\t\t}\n\t\t\treturn refs;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/** `remotes`, plus `heads`/`tags` for any local branch or tag the fetch writes — a `pull` fetch writes `<upstream>:<branch>` */\n\tprivate getFetchChanges(\n\t\tbranch: GitBranchReference | undefined,\n\t\toptions: { pull?: boolean; refspecs?: readonly string[] } | undefined,\n\t): RepositoryChange[] {\n\t\tif (isBranchReference(branch)) {\n\t\t\treturn options?.pull ? ['heads', 'remotes'] : ['remotes'];\n\t\t}\n\t\tif (!options?.refspecs?.length) return ['remotes'];\n\n\t\tconst changes: RepositoryChange[] = ['remotes'];\n\t\tfor (const refspec of options.refspecs) {\n\t\t\tconst destination = getRefspecDestination(refspec);\n\t\t\tif (destination == null) continue;\n\n\t\t\tif (destination.startsWith('refs/tags/')) {\n\t\t\t\tif (!changes.includes('tags')) {\n\t\t\t\t\tchanges.push('tags');\n\t\t\t\t}\n\t\t\t} else if (destination.startsWith('refs/heads/')) {\n\t\t\t\tif (!changes.includes('heads')) {\n\t\t\t\t\tchanges.push('heads');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn changes;\n\t}\n\n\tprivate async fetchCore(\n\t\trepoPath: string,\n\t\toptions:\n\t\t\t| {\n\t\t\t\t\tall?: boolean;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote?: string;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tprune?: undefined;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tupstream: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * `-u` (`--update-head-ok`, the default) lets a `pull` fetch move a branch even where it is\n\t\t\t\t\t * checked out; `false` keeps git's own refusal as a guard against a stale worktree lookup.\n\t\t\t\t\t */\n\t\t\t\t\tupdateHeadOk?: boolean;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: undefined;\n\t\t\t\t\tremote: string;\n\t\t\t\t\trefspecs: readonly string[];\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['fetch'];\n\n\t\tif (options.prune) {\n\t\t\tparams.push('--prune');\n\t\t}\n\n\t\tif (options.preserveFetchHead && (await this.git.supports('git:fetch:no-write-fetch-head'))) {\n\t\t\tparams.push('--no-write-fetch-head');\n\t\t}\n\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream && options.pull) {\n\t\t\t\tif (options.updateHeadOk !== false) {\n\t\t\t\t\tparams.push('-u');\n\t\t\t\t}\n\t\t\t\tparams.push(options.remote, `${options.upstream}:${options.branch}`);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.upstream || options.branch);\n\t\t\t}\n\t\t} else if (options.refspecs?.length) {\n\t\t\tparams.push(options.remote, ...options.refspecs);\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'fetch',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew FetchError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tbranch: options?.branch,\n\t\t\t\t\t\t\tremote: options?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync merge(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { fastForward?: boolean | 'only'; noCommit?: boolean; squash?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['merge'];\n\n\t\tif (options?.fastForward === 'only') {\n\t\t\targs.push('--ff-only');\n\t\t} else if (options?.fastForward === true) {\n\t\t\targs.push('--ff');\n\t\t} else if (options?.fastForward === false) {\n\t\t\targs.push('--no-ff');\n\t\t}\n\t\tif (options?.squash) {\n\t\t\targs.push('--squash');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('--no-commit');\n\t\t}\n\n\t\targs.push(ref);\n\n\t\ttry {\n\t\t\tawait this.runMovingHeadBranch(repoPath, () =>\n\t\t\t\tthis.git.run(\n\t\t\t\t\t// Avoid a timeout since merges can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'merge',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew MergeError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (MergeError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'merge');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync pull(\n\t\trepoPath: string,\n\t\toptions?: {\n\t\t\tbranch?: GitBranchReference;\n\t\t\tfastForward?: 'only';\n\t\t\trebase?: boolean;\n\t\t\ttags?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\t// Set once a git command is about to run, so a pull that fails partway (a merge or rebase stopping on a\n\t\t// conflict, a fetch that stored some refs) announces what it changed the way a finished one does\n\t\tlet announce: (() => void) | undefined;\n\t\t// A `pull` with no arguments fetches the branch's remote with its configured refspecs\n\t\tlet fetched: { repoPath: string; remotes: FetchedRemotes } | undefined;\n\t\ttry {\n\t\t\tif (isBranchReference(options?.branch)) {\n\t\t\t\tconst branch = options.branch;\n\t\t\t\t// Find the worktree where this branch is checked out (if any)\n\t\t\t\tconst worktree = await this.provider.worktrees?.getWorktree(\n\t\t\t\t\trepoPath,\n\t\t\t\t\twt => wt.branch?.name === branch.name,\n\t\t\t\t);\n\t\t\t\tif (worktree != null) {\n\t\t\t\t\t// Branch is checked out in a worktree — run git pull in that worktree's directory\n\t\t\t\t\t// Any rebase state (e.g. from `pull.rebase=true`) appears under the worktree path\n\t\t\t\t\tconst worktreePath = normalizePath(worktree.uri.fsPath);\n\t\t\t\t\t// Its HEAD, index and any paused merge or rebase belong to that worktree, not to `repoPath`\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.announcePull(repoPath);\n\t\t\t\t\t\tif (worktreePath !== normalizePath(repoPath)) {\n\t\t\t\t\t\t\tthis.announcePull(worktreePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'started');\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.pullCore(\n\t\t\t\t\t\t\tworktreePath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfetched = { repoPath: worktreePath, remotes: 'default' };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'ended');\n\t\t\t\t\t}\n\t\t\t\t} else if (options?.fastForward === 'only') {\n\t\t\t\t\t// Not checked out anywhere, so there is no working tree to merge into — but a fast-forward\n\t\t\t\t\t// needs none: fetching `<upstream>:<branch>` advances the local branch, and git refuses that\n\t\t\t\t\t// non-forced refspec unless it fast-forwards. A plain fetch would leave the branch unmoved\n\t\t\t\t\t// and report success.\n\t\t\t\t\t// Fetched without `-u`: the worktree lookup above is cached and can miss a worktree added\n\t\t\t\t\t// outside core, and then git's own refusal is what keeps a checked-out branch from moving.\n\t\t\t\t\tconst {\n\t\t\t\t\t\tname: branchName,\n\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\tupstream,\n\t\t\t\t\t} = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\t\t\tif (remoteName == null || upstream == null) {\n\t\t\t\t\t\tthrow new PullError({\n\t\t\t\t\t\t\treason: 'noUpstream',\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: ['pull', '--ff-only', branch.name] },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// A `pull` fetch writes `<upstream>:<branch>`, moving the local branch too — same\n\t\t\t\t\t// hooks `fetch()` fires for a pull fetch with a branch reference.\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['heads', 'remotes']);\n\t\t\t\t\t};\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.fetchCore(\n\t\t\t\t\t\t\trepoPath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbranch: branchName,\n\t\t\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\t\tpull: true,\n\t\t\t\t\t\t\t\tupdateHeadOk: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tif (FetchError.is(ex, 'noFastForward')) {\n\t\t\t\t\t\t\tthrow new PullError(\n\t\t\t\t\t\t\t\t{ reason: 'noFastForward', gitCommand: ex.details.gitCommand },\n\t\t\t\t\t\t\t\tex.original,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow ex;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Branch is not checked out anywhere — can only fetch (no working tree to merge into)\n\t\t\t\t\tawait this.fetch(repoPath, { branch: branch }, runOptions);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tannounce = () => this.announcePull(repoPath);\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'started');\n\t\t\ttry {\n\t\t\t\tawait this.pullCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t\tfetched = { repoPath: repoPath, remotes: 'default' };\n\t\t\t} finally {\n\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'ended');\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\tannounce?.();\n\t\t\tif (fetched != null) {\n\t\t\t\tvoid this.followRemoteHeads(fetched.repoPath, fetched.remotes);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate announcePull(repoPath: string): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\n\t}\n\n\tprivate async pullCore(\n\t\trepoPath: string,\n\t\toptions: { fastForward?: 'only'; rebase?: boolean; tags?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['pull'];\n\n\t\tif (options.tags) {\n\t\t\tparams.push('--tags');\n\t\t}\n\n\t\tif (options.rebase) {\n\t\t\tparams.push('-r');\n\t\t}\n\n\t\tif (options.fastForward === 'only') {\n\t\t\tparams.push('--ff-only');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsPull, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'pull',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PullError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync push(\n\t\trepoPath: string,\n\t\toptions?: { reference?: GitReference; force?: boolean; publish?: { remote: string } },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tlet branchName: string;\n\t\tlet remoteName: string | undefined;\n\t\tlet upstreamName: string | undefined;\n\t\t// Whether the push itself writes `branch.<n>.remote/merge` (`-u`): only when it establishes tracking,\n\t\t// never to rewrite what a branch with a live upstream already has\n\t\tlet trackUpstream = options?.publish != null;\n\t\tlet setUpstream:\n\t\t\t| {\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tremoteBranch: string;\n\t\t\t }\n\t\t\t| undefined;\n\n\t\tif (isBranchReference(options?.reference)) {\n\t\t\tconst resolved = await resolveBranchRemote(\n\t\t\t\tthis.provider,\n\t\t\t\trepoPath,\n\t\t\t\toptions.reference,\n\t\t\t\trunOptions?.cancellation,\n\t\t\t);\n\t\t\tif (options.publish != null) {\n\t\t\t\tbranchName = options.reference.name;\n\t\t\t\tremoteName = options.publish.remote;\n\t\t\t} else {\n\t\t\t\tbranchName = resolved.name;\n\t\t\t\tremoteName = resolved.remote;\n\t\t\t}\n\t\t\t// A local upstream names a branch in this repository, never a branch on the remote being published to\n\t\t\tupstreamName = options.publish != null && resolved.local ? undefined : resolved.upstream;\n\t\t\ttrackUpstream ||= options.reference.upstream?.missing === true;\n\n\t\t\t// Without a remote, a bare `git push` would follow `push.default` somewhere the caller didn't pick\n\t\t\tif (options.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: options.reference.name });\n\t\t\t}\n\t\t} else {\n\t\t\tconst branch = await this.provider.branches.getBranch(repoPath);\n\t\t\tif (branch == null) return;\n\n\t\t\tconst resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\tif (options?.reference != null) {\n\t\t\t\t// Onto the upstream's remote-side name, which a custom fetch refspec or a renamed upstream can make differ\n\t\t\t\tbranchName = `${options.reference.ref}:${\n\t\t\t\t\toptions?.publish != null ? `refs/heads/${resolved.name}` : (resolved.upstream ?? resolved.name)\n\t\t\t\t}`;\n\t\t\t} else {\n\t\t\t\tconst tracking = options?.publish == null ? resolved.upstream : undefined;\n\t\t\t\tbranchName =\n\t\t\t\t\ttracking != null && tracking !== resolved.name ? `${branch.name}:${tracking}` : branch.name;\n\t\t\t}\n\t\t\tremoteName = resolved.remote ?? options?.publish?.remote;\n\t\t\tif (options?.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: branch.name });\n\t\t\t}\n\n\t\t\tupstreamName = options?.reference == null && options?.publish != null ? branch.name : undefined;\n\n\t\t\t// Git can't setup upstream tracking when publishing a new branch to a specific commit, so we'll need to do it after the push\n\t\t\tif (options?.publish?.remote != null && options?.reference != null) {\n\t\t\t\tsetUpstream = {\n\t\t\t\t\tbranch: resolved.name,\n\t\t\t\t\tremote: remoteName!,\n\t\t\t\t\tremoteBranch: resolved.name,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tlet forceOpts: PushForceOptions | undefined;\n\t\tif (options?.force) {\n\t\t\t// Honor the host's force-push preferences (e.g. VS Code's `git.useForcePushWithLease` /\n\t\t\t// `git.useForcePushIfIncludes`); fall back to the safer `--force-with-lease` behavior.\n\t\t\tconst useForceWithLease = this.context.config?.push?.useForceWithLease ?? true;\n\t\t\tforceOpts = useForceWithLease\n\t\t\t\t? { withLease: true, ifIncludes: this.context.config?.push?.useForceIfIncludes ?? true }\n\t\t\t\t: { withLease: false };\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.pushCore(\n\t\t\t\trepoPath,\n\t\t\t\t{\n\t\t\t\t\tbranch: branchName,\n\t\t\t\t\tremote: remoteName,\n\t\t\t\t\tupstream: upstreamName,\n\t\t\t\t\tforce: forceOpts,\n\t\t\t\t\tsetUpstream: trackUpstream,\n\t\t\t\t},\n\t\t\t\trunOptions,\n\t\t\t);\n\n\t\t\t// Since Git can't setup upstream tracking when publishing a new branch to a specific commit, do it now.\n\t\t\t// Soft-fail: the push already succeeded, so don't let a local upstream-tracking failure (cancellation\n\t\t\t// arriving mid-spawn, transient git error) suppress the post-push hook fan-out below.\n\t\t\tif (setUpstream != null) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.git.run(\n\t\t\t\t\t\t{ cwd: repoPath, ...runOptions },\n\t\t\t\t\t\t'branch',\n\t\t\t\t\t\t'--set-upstream-to',\n\t\t\t\t\t\t`${setUpstream.remote}/${setUpstream.remoteBranch}`,\n\t\t\t\t\t\tsetUpstream.branch,\n\t\t\t\t\t);\n\t\t\t\t} catch (ex) {\n\t\t\t\t\tscope?.error(ex, 'Unable to set upstream tracking after publish');\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\t// A rejected push may have updated some of its remote-tracking refs before it failed\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches');\n\t\t\tconst changes: RepositoryChange[] = [];\n\t\t\tif (trackUpstream || setUpstream != null) {\n\t\t\t\tchanges.push('config');\n\t\t\t}\n\t\t\tif (options?.publish != null) {\n\t\t\t\tchanges.push('heads');\n\t\t\t}\n\t\t\tchanges.push('remotes');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes);\n\t\t}\n\t}\n\n\tprivate async pushCore(\n\t\trepoPath: string,\n\t\toptions: {\n\t\t\tbranch?: string;\n\t\t\tforce?: PushForceOptions;\n\t\t\tsetUpstream?: boolean;\n\t\t\tremote?: string;\n\t\t\tupstream?: string;\n\t\t\tdelete?: { remote: string; branch: string };\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['push'];\n\n\t\tif (options.force != null) {\n\t\t\tif (options.force.withLease) {\n\t\t\t\tparams.push('--force-with-lease');\n\t\t\t\tif (options.force.ifIncludes) {\n\t\t\t\t\tif (await this.git.supports('git:push:force-if-includes')) {\n\t\t\t\t\t\tparams.push('--force-if-includes');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams.push('--force');\n\t\t\t}\n\t\t}\n\n\t\t// `push` refuses a branch without a remote before reaching here, as this would drop the branch\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream) {\n\t\t\t\tif (options.setUpstream) {\n\t\t\t\t\tparams.push('-u');\n\t\t\t\t}\n\t\t\t\tparams.push(options.remote, `${options.branch}:${options.upstream}`);\n\t\t\t} else if (options.setUpstream) {\n\t\t\t\tparams.push('--set-upstream', options.remote, options.branch);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.branch);\n\t\t\t}\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.delete) {\n\t\t\tparams.push(options.delete.remote, `:${options.delete.branch}`);\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tconst error = getGitCommandError(\n\t\t\t\t'push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason,\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (options?.force?.withLease && error.details.reason === 'rejected') {\n\t\t\t\tif (ex.stderr && /! \\[rejected\\].*\\(stale info\\)/m.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLease',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\toptions.force.ifIncludes &&\n\t\t\t\t\tex.stderr &&\n\t\t\t\t\t/! \\[rejected\\].*\\(remote ref updated since checkout\\)/m.test(ex.stderr)\n\t\t\t\t) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLeaseIfIncludes',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (ex.stderr && GitErrors.pushRejectedRefDoesNotExists.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedRefDoesNotExist',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync rebase(\n\t\trepoPath: string,\n\t\tupstream: string,\n\t\toptions?: {\n\t\t\tautoStash?: boolean;\n\t\t\tbranch?: string;\n\t\t\teditor?: string;\n\t\t\tinteractive?: boolean;\n\t\t\tprogrammaticEditor?: boolean;\n\t\t\tautosquash?: boolean;\n\t\t\tmessageEditor?: string;\n\t\t\tonto?: string;\n\t\t\tupdateRefs?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['rebase'];\n\t\tconst configs: string[] = [];\n\n\t\tif (options?.autoStash !== false) {\n\t\t\targs.push('--autostash');\n\t\t}\n\n\t\tif (options?.interactive) {\n\t\t\targs.push('--interactive');\n\n\t\t\tif (options.editor) {\n\t\t\t\tconfigs.push('-c', `sequence.editor=${options.editor}`);\n\t\t\t}\n\n\t\t\t// A script-based sequence editor rewrites the todo by command word + SHA, so git must emit a\n\t\t\t// plain, natural-order todo regardless of the user's rebase config: `rebase.autosquash` would\n\t\t\t// reorder commits and rewrite `pick`→`fixup`, and `rebase.abbreviateCommands` would emit `p`.\n\t\t\tif (options.programmaticEditor) {\n\t\t\t\tconfigs.push('-c', 'rebase.autosquash=false', '-c', 'rebase.abbreviateCommands=false');\n\t\t\t}\n\t\t}\n\n\t\tif (options?.autosquash != null) {\n\t\t\tif (options.autosquash && options.programmaticEditor) {\n\t\t\t\tthrow new Error(l10n.t('rebase: autosquash cannot be combined with programmaticEditor'));\n\t\t\t}\n\n\t\t\t// `--no-autosquash` is passed explicitly when `false` — omitting the flag would let a\n\t\t\t// `rebase.autosquash=true` git config fold fixups anyway.\n\t\t\targs.push(options.autosquash ? '--autosquash' : '--no-autosquash');\n\t\t}\n\n\t\t// Drive per-commit message editing (the combined message a `squash` produces, or a `reword`).\n\t\t// `GIT_EDITOR` (not `core.editor`) is what git's interactive-rebase backend honors for the `reword`\n\t\t// amend step, so set it on the environment; also set `core.editor` config as a fallback.\n\t\tlet env = runOptions?.env;\n\t\tif (options?.messageEditor) {\n\t\t\tconfigs.push('-c', `core.editor=${options.messageEditor}`);\n\t\t\tenv = { ...env, GIT_EDITOR: options.messageEditor };\n\t\t}\n\n\t\tif (options?.updateRefs === true) {\n\t\t\targs.push('--update-refs');\n\t\t} else if (options?.updateRefs === false) {\n\t\t\targs.push('--no-update-refs');\n\t\t}\n\n\t\tif (options?.onto) {\n\t\t\targs.push('--onto', options.onto);\n\t\t}\n\n\t\targs.push(upstream);\n\n\t\tif (options?.branch) {\n\t\t\targs.push(options.branch);\n\t\t}\n\n\t\t// Fired before the process runs — `git rebase` exits 0 when stopping at `edit`/`break`,\n\t\t// so the result can't be used to detect that a rebase started\n\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'started');\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since rebases can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', configs: configs, timeout: 0, ...runOptions, env: env },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'rebase',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RebaseError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: args },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RebaseError.is(mapped, 'conflicts')) {\n\t\t\t\treturn await this.createConflictResult(repoPath, 'rebase');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t} finally {\n\t\t\t// The command exited (success, pause, or failure) — any rebase it left behind is on disk now\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'ended');\n\t\t}\n\t}\n\n\t@debug()\n\tasync reset(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: { mode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tawait this.runMovingHeadBranch(repoPath, () => this.resetCore(repoPath, rev, options?.mode, runOptions));\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async resetCore(\n\t\trepoPath: string,\n\t\trev: string,\n\t\tmode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['reset', '-q'];\n\t\tif (mode) {\n\t\t\tparams.push(`--${mode}`);\n\t\t}\n\t\tparams.push(rev, '--');\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'reset',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew ResetError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync restore(\n\t\trepoPath: string,\n\t\tpath: string | string[],\n\t\toptions?: { ref?: string; side?: 'ours' | 'theirs' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst paths = Array.isArray(path) ? path : [path];\n\t\tif (!paths.length) return;\n\n\t\tconst scope = getScopedLogger();\n\t\tconst normalized = paths.map(p => splitPath(p, repoPath, true)[0]);\n\n\t\t// `side` and `ref` are mutually exclusive in git (--ours/--theirs apply during conflict\n\t\t// resolution and take no source ref); side takes precedence if both are somehow supplied.\n\t\t// Use a truthy check on `ref` so an empty string falls through to index-restore rather than\n\t\t// producing a malformed `git checkout '' -- …`. Implemented via `checkout` rather than\n\t\t// `git restore` for compatibility with the minimum supported git (2.7.2); `git restore`\n\t\t// only landed in 2.23.\n\t\tconst selector = options?.side != null ? `--${options.side}` : options?.ref || undefined;\n\t\tconst prefix = selector != null ? ['checkout', selector, '--'] : ['checkout', '--'];\n\n\t\tlet ran = false;\n\t\ttry {\n\t\t\tif (await this.git.supports('git:checkout:pathspec-from-file')) {\n\t\t\t\t// Git ≥ 2.26: stream all pathspecs via stdin (NUL-separated) in a single invocation —\n\t\t\t\t// no CLI-length limit (so no batching), and robust for paths with spaces/newlines.\n\t\t\t\t// Pathspecs come from the file rather than argv, so `--` isn't used.\n\t\t\t\tconst args = ['checkout'];\n\t\t\t\tif (selector != null) {\n\t\t\t\t\targs.push(selector);\n\t\t\t\t}\n\t\t\t\targs.push('--pathspec-from-file=-', '--pathspec-file-nul');\n\t\t\t\tran = true;\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', ...runOptions, stdin: normalized.join('\\0') },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Older git: pass pathspecs as args, one git invocation per chunk (collapsing N\n\t\t\t\t// path-mode checkouts into ⌈N / chunk⌉ spawns). Reserve the command prefix length and\n\t\t\t\t// a per-arg overhead (separator + possible quoting) so the assembled command line\n\t\t\t\t// can't exceed the OS limit even with many short paths.\n\t\t\t\tconst perArgOverhead = 3;\n\t\t\t\tconst prefixLength = prefix.reduce((sum, arg) => sum + arg.length + perArgOverhead, 0);\n\t\t\t\tfor (const batch of chunkByStringLength(normalized, maxGitCliLength - prefixLength, perArgOverhead)) {\n\t\t\t\t\tran = true;\n\t\t\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...prefix, ...batch);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tref: options?.side ?? options?.ref,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: [...prefix, ...normalized] },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tif (ran) {\n\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'status');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['index']);\n\t\t\t}\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync revert(\n\t\trepoPath: string,\n\t\trefs: string[],\n\t\toptions?: { editMessage?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['revert'];\n\n\t\tif (options?.editMessage === true) {\n\t\t\targs.push('--edit');\n\t\t} else if (options?.editMessage === false) {\n\t\t\targs.push('--no-edit');\n\t\t}\n\n\t\targs.push(...refs);\n\n\t\ttry {\n\t\t\tawait this.runMovingHeadBranch(repoPath, () =>\n\t\t\t\tthis.git.run(\n\t\t\t\t\t// Avoid a timeout since reverts can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'revert',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RevertError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', refs: refs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RevertError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'revert');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t/**\n\t * Classifies `ex` as a signing failure; if so, fires the `commits.onSigningFailed`\n\t * hook and throws a typed {@link SigningError}. Callers should invoke this first\n\t * in their catch blocks, before falling through to command-specific error mapping\n\t * via {@link getGitCommandError}.\n\t *\n\t * `SigningFormat` is read opportunistically from `config.getSigningConfig`, with\n\t * {@link inferSigningFormatFromError} as a stderr-based fallback and `'gpg'` as\n\t * the final default.\n\t */\n\tprivate async throwIfSigningError(\n\t\trepoPath: string,\n\t\targs: readonly (string | undefined)[],\n\t\tex: unknown,\n\t\tsource?: unknown,\n\t): Promise<void> {\n\t\tconst reason = classifySigningError(ex);\n\t\tif (reason == null) return;\n\n\t\tlet format: SigningFormat | undefined;\n\t\ttry {\n\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t} catch {\n\t\t\t// Fall through — config read failed; use stderr-inferred format or gpg default\n\t\t}\n\t\tformat ??= inferSigningFormatFromError(ex) ?? 'gpg';\n\n\t\tthis.context.hooks?.commits?.onSigningFailed?.(reason, format, source);\n\t\tthrow new SigningError(\n\t\t\t{ reason: reason, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\tex instanceof Error ? ex : undefined,\n\t\t);\n\t}\n\n\t/**\n\t * Called once git has run, success or not — a rejected write can still have moved HEAD or left state behind.\n\t * `moved` is the one branch the write could have moved, when it knows it, or `'detached'` when it moved a detached\n\t * HEAD and so no branch; `wroteTracking` says it wrote that branch's tracking, to its own config section.\n\t */\n\tprivate announceHeadChanged(repoPath: string, moved?: HeadState, wroteTracking?: boolean): void {\n\t\tif (moved === 'detached') {\n\t\t\t// The worktree list carries this worktree's HEAD, which `heads` would otherwise have reset\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'worktrees');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'index']);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\n\t\tconst changes: RepositoryChange[] = wroteTracking\n\t\t\t? ['config', 'head', 'heads', 'index']\n\t\t\t: ['head', 'heads', 'index'];\n\t\tif (moved == null) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes);\n\t\t} else if (wroteTracking) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, [moved.branch], {\n\t\t\t\tconfigConfinedToRefs: true,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, [moved.branch]);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a write that moves only the branch HEAD is on (or no branch, on a detached HEAD), then announces it, success\n\t * or not. HEAD is read on both sides of the run: a hook or an outside `git switch` that moves it meanwhile leaves the\n\t * moved branch unknown, so then none is named.\n\t */\n\tprivate async runMovingHeadBranch<T>(repoPath: string, write: () => Promise<T>): Promise<T> {\n\t\tconst before = await readHeadState(repoPath, this.context.fs, this.cache);\n\t\ttry {\n\t\t\treturn await write();\n\t\t} finally {\n\t\t\tthis.announceHeadChanged(\n\t\t\t\trepoPath,\n\t\t\t\tgetMovedHead(before, await readHeadState(repoPath, this.context.fs, this.cache)),\n\t\t\t);\n\t\t}\n\t}\n\n\t/** The caller has already announced the change — the conflict is what the failed run left behind */\n\tprivate async createConflictResult(repoPath: string, command: GitConflictCommand): Promise<GitOperationResult> {\n\t\tlet conflicts: GitConflictFile[] | undefined;\n\t\ttry {\n\t\t\tconflicts = await this.provider.status.getConflictingFiles(repoPath);\n\t\t} catch (ex) {\n\t\t\t// Don't let a secondary status-read failure mask the original conflict signal\n\t\t\tLogger.warn(`Unable to read conflicting files after ${command}: ${ex}`);\n\t\t}\n\t\tthis.context.hooks?.operations?.onConflicted?.(command, conflicts);\n\t\treturn { conflicted: true, conflicts: conflicts };\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -75,7 +75,10 @@ export declare class RefsGitSubProvider implements GitRefsSubProvider {
|
|
|
75
75
|
updateReference(repoPath: string, ref: string, sha: string, options?: {
|
|
76
76
|
expected?: string | 'absent';
|
|
77
77
|
}, cancellation?: AbortSignal): Promise<void>;
|
|
78
|
-
/**
|
|
78
|
+
/**
|
|
79
|
+
* Announces a ref mutation to the cache and repository hooks. `deref` says git followed a symbolic `ref` (no
|
|
80
|
+
* `--no-deref`), so a remote's `HEAD` moved the branch it points to and stays unnamed.
|
|
81
|
+
*/
|
|
79
82
|
private fireReferenceChanged;
|
|
80
83
|
}
|
|
81
84
|
//#endregion
|