@gitkraken/core-gitlens 0.13.0 → 0.15.0

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.
Files changed (127) hide show
  1. package/CHANGELOG.md +43 -2
  2. package/dist/git/features.d.ts +1 -1
  3. package/dist/git/features.js +1 -0
  4. package/dist/git/features.js.map +1 -1
  5. package/dist/git/models/branch.d.ts +5 -0
  6. package/dist/git/models/branch.js +1 -1
  7. package/dist/git/models/branch.js.map +1 -1
  8. package/dist/git/models/reference.d.ts +3 -0
  9. package/dist/git/models/status.js +1 -1
  10. package/dist/git/parsers/diffParser.js +1 -1
  11. package/dist/git/providers/operations.d.ts +3 -2
  12. package/dist/git/providers/provider.d.ts +15 -4
  13. package/dist/git/providers/revision.d.ts +17 -3
  14. package/dist/git/run.types.d.ts +12 -0
  15. package/dist/git/utils/branch.utils.d.ts +4 -1
  16. package/dist/git/utils/branch.utils.js +20 -5
  17. package/dist/git/utils/branch.utils.js.map +1 -1
  18. package/dist/git/utils/reference.utils.d.ts +1 -0
  19. package/dist/git/utils/reference.utils.js.map +1 -1
  20. package/dist/git-cli/cliGitProvider.d.ts +8 -2
  21. package/dist/git-cli/cliGitProvider.js +75 -13
  22. package/dist/git-cli/cliGitProvider.js.map +1 -1
  23. package/dist/git-cli/exec/git.d.ts +5 -0
  24. package/dist/git-cli/exec/git.js +28 -5
  25. package/dist/git-cli/exec/git.js.map +1 -1
  26. package/dist/git-cli/exec/indexLock.d.ts +3 -2
  27. package/dist/git-cli/exec/indexLock.js +16 -6
  28. package/dist/git-cli/exec/indexLock.js.map +1 -1
  29. package/dist/git-cli/parsers/blameParser.js +2 -2
  30. package/dist/git-cli/parsers/refParser.js +4 -2
  31. package/dist/git-cli/parsers/refParser.js.map +1 -1
  32. package/dist/git-cli/parsers/statusParser.d.ts +6 -0
  33. package/dist/git-cli/parsers/statusParser.js +33 -3
  34. package/dist/git-cli/parsers/statusParser.js.map +1 -1
  35. package/dist/git-cli/providers/branchRemote.d.ts +14 -0
  36. package/dist/git-cli/providers/branchRemote.js +36 -0
  37. package/dist/git-cli/providers/branchRemote.js.map +1 -0
  38. package/dist/git-cli/providers/branches.js +6 -3
  39. package/dist/git-cli/providers/branches.js.map +1 -1
  40. package/dist/git-cli/providers/commits.js +2 -2
  41. package/dist/git-cli/providers/config.js +2 -2
  42. package/dist/git-cli/providers/contributors.js +1 -1
  43. package/dist/git-cli/providers/graph.js +9 -6
  44. package/dist/git-cli/providers/graph.js.map +1 -1
  45. package/dist/git-cli/providers/operations.js +20 -16
  46. package/dist/git-cli/providers/operations.js.map +1 -1
  47. package/dist/git-cli/providers/pausedOperations.js +2 -2
  48. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  49. package/dist/git-cli/providers/revision.d.ts +6 -2
  50. package/dist/git-cli/providers/revision.js +38 -12
  51. package/dist/git-cli/providers/revision.js.map +1 -1
  52. package/dist/git-cli/providers/staging.js +1 -1
  53. package/dist/git-cli/providers/status.js +2 -2
  54. package/dist/ipc/discovery.js +1 -1
  55. package/dist/plus/agents/providers/claudeCodeTranscript.js +6 -6
  56. package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
  57. package/dist/plus/ai/providers/openAICompatibleProviderBase.js +1 -1
  58. package/dist/plus/git-github/providers/github/revision.d.ts +6 -2
  59. package/dist/plus/git-github/providers/github/revision.js +15 -10
  60. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  61. package/dist/plus/git-github/providers/github/status.js +1 -1
  62. package/dist/plus/integrations/collectionMetadata.d.ts +7 -0
  63. package/dist/plus/integrations/collectionMetadata.js +10 -1
  64. package/dist/plus/integrations/collectionMetadata.js.map +1 -1
  65. package/dist/plus/integrations/errors.d.ts +5 -0
  66. package/dist/plus/integrations/errors.js +10 -1
  67. package/dist/plus/integrations/errors.js.map +1 -1
  68. package/dist/plus/integrations/index.d.ts +2 -2
  69. package/dist/plus/integrations/index.js.map +1 -1
  70. package/dist/plus/integrations/models/gitHostIntegration.d.ts +6 -2
  71. package/dist/plus/integrations/models/gitHostIntegration.js +37 -7
  72. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
  73. package/dist/plus/integrations/models/issueReads.d.ts +1 -1
  74. package/dist/plus/integrations/models/issuesIntegration.d.ts +33 -3
  75. package/dist/plus/integrations/models/issuesIntegration.js +76 -5
  76. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -1
  77. package/dist/plus/integrations/providers/azure/azure.js +1 -1
  78. package/dist/plus/integrations/providers/azure/workItemStateCategories.d.ts +5 -0
  79. package/dist/plus/integrations/providers/azure/workItemStateCategories.js +5 -0
  80. package/dist/plus/integrations/providers/azure/workItemStateCategories.js.map +1 -1
  81. package/dist/plus/integrations/providers/azureDevOpsServer.d.ts +9 -1
  82. package/dist/plus/integrations/providers/azureDevOpsServer.js +17 -9
  83. package/dist/plus/integrations/providers/azureDevOpsServer.js.map +1 -1
  84. package/dist/plus/integrations/providers/bitbucket-server.js +3 -2
  85. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
  86. package/dist/plus/integrations/providers/jira-server.d.ts +3 -0
  87. package/dist/plus/integrations/providers/jira-server.js +15 -7
  88. package/dist/plus/integrations/providers/jira-server.js.map +1 -1
  89. package/dist/plus/integrations/providers/jira.d.ts +8 -0
  90. package/dist/plus/integrations/providers/jira.js +88 -58
  91. package/dist/plus/integrations/providers/jira.js.map +1 -1
  92. package/dist/plus/integrations/providers/linear.d.ts +4 -0
  93. package/dist/plus/integrations/providers/linear.js +23 -2
  94. package/dist/plus/integrations/providers/linear.js.map +1 -1
  95. package/dist/plus/integrations/providers/providerErrors.d.ts +24 -0
  96. package/dist/plus/integrations/providers/providerErrors.js +41 -4
  97. package/dist/plus/integrations/providers/providerErrors.js.map +1 -1
  98. package/dist/plus/integrations/providers/providersApi.d.ts +1 -1
  99. package/dist/plus/integrations/providers/providersApi.js +15 -4
  100. package/dist/plus/integrations/providers/providersApi.js.map +1 -1
  101. package/dist/plus/integrations/providers/trello.d.ts +1 -0
  102. package/dist/plus/integrations/providers/trello.js +3 -0
  103. package/dist/plus/integrations/providers/trello.js.map +1 -1
  104. package/dist/plus/integrations/reads/cursors.js +23 -5
  105. package/dist/plus/integrations/reads/cursors.js.map +1 -1
  106. package/dist/plus/integrations/reads/drains.d.ts +16 -0
  107. package/dist/plus/integrations/reads/drains.js +19 -1
  108. package/dist/plus/integrations/reads/drains.js.map +1 -1
  109. package/dist/plus/integrations/reads/hierarchy.js +5 -3
  110. package/dist/plus/integrations/reads/hierarchy.js.map +1 -1
  111. package/dist/plus/integrations/reads/hierarchy.utils.d.ts +3 -2
  112. package/dist/plus/integrations/reads/hierarchy.utils.js +4 -7
  113. package/dist/plus/integrations/reads/hierarchy.utils.js.map +1 -1
  114. package/dist/plus/integrations/reads/issueTracker.js +71 -7
  115. package/dist/plus/integrations/reads/issueTracker.js.map +1 -1
  116. package/dist/plus/integrations/reads/selectionConfirmation.d.ts +69 -0
  117. package/dist/plus/integrations/reads/selectionConfirmation.js +79 -0
  118. package/dist/plus/integrations/reads/selectionConfirmation.js.map +1 -0
  119. package/dist/plus/integrations/reads/warnings.d.ts +9 -3
  120. package/dist/plus/integrations/reads/warnings.js +19 -3
  121. package/dist/plus/integrations/reads/warnings.js.map +1 -1
  122. package/dist/plus/integrations/results.d.ts +30 -3
  123. package/dist/plus/integrations/results.js +2 -1
  124. package/dist/plus/integrations/results.js.map +1 -1
  125. package/dist/utils/env/node/exec.js +2 -2
  126. package/docs/integrations.md +59 -6
  127. package/package.json +1 -1
@@ -3,12 +3,12 @@ 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
5
  import { normalizePath, splitPath } from "../../utils/path.js";
6
- import { getBranchNameAndRemote, getBranchTrackingWithoutRemote } from "../../git/utils/branch.utils.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 { mayWriteTracking } from "../exec/commandClassifier.js";
11
10
  import { GitErrors, classifySigningError, getGitCommandError, gitConfigsPull, inferSigningFormatFromError, maxGitCliLength } from "../exec/git.js";
11
+ import { resolveBranchRemote } from "./branchRemote.js";
12
12
  import { parseGitBoolean } from "./config.js";
13
13
  import { sequentialize } from "../../utils/decorators/sequentialize.js";
14
14
  import * as l10n from "@vscode/l10n";
@@ -147,13 +147,13 @@ var OperationsGitSubProvider = class {
147
147
  let fetched;
148
148
  try {
149
149
  if (isBranchReference(branch)) {
150
- const [branchName, remoteName] = getBranchNameAndRemote(branch);
151
- if (remoteName == null) return;
150
+ const resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);
151
+ if (resolved.remote == null) return;
152
152
  ran = true;
153
153
  await this.fetchCore(repoPath, {
154
- branch: branchName,
155
- remote: remoteName,
156
- upstream: getBranchTrackingWithoutRemote(branch),
154
+ branch: resolved.name,
155
+ remote: resolved.remote,
156
+ upstream: resolved.upstream,
157
157
  pull: options?.pull,
158
158
  preserveFetchHead: options?.preserveFetchHead
159
159
  }, runOptions);
@@ -326,8 +326,7 @@ var OperationsGitSubProvider = class {
326
326
  this.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, "pull", "ended");
327
327
  }
328
328
  } else if (options?.fastForward === "only") {
329
- const [branchName, remoteName] = getBranchNameAndRemote(branch);
330
- const upstream = getBranchTrackingWithoutRemote(branch);
329
+ const { name: branchName, remote: remoteName, upstream } = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);
331
330
  if (remoteName == null || upstream == null) throw new PullError({
332
331
  reason: "noUpstream",
333
332
  gitCommand: {
@@ -425,26 +424,31 @@ var OperationsGitSubProvider = class {
425
424
  let trackUpstream = options?.publish != null;
426
425
  let setUpstream;
427
426
  if (isBranchReference(options?.reference)) {
427
+ const resolved = await resolveBranchRemote(this.provider, repoPath, options.reference, runOptions?.cancellation);
428
428
  if (options.publish != null) {
429
429
  branchName = options.reference.name;
430
430
  remoteName = options.publish.remote;
431
- } else [branchName, remoteName] = getBranchNameAndRemote(options.reference);
432
- upstreamName = getBranchTrackingWithoutRemote(options.reference);
431
+ } else {
432
+ branchName = resolved.name;
433
+ remoteName = resolved.remote;
434
+ }
435
+ upstreamName = resolved.upstream;
433
436
  trackUpstream ||= options.reference.upstream?.missing === true;
434
437
  } else {
435
438
  const branch = await this.provider.branches.getBranch(repoPath);
436
439
  if (branch == null) return;
437
- if (options?.reference != null) branchName = `${options.reference.ref}:${options?.publish != null ? "refs/heads/" : ""}${branch.nameWithoutRemote}`;
440
+ const resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);
441
+ if (options?.reference != null) branchName = `${options.reference.ref}:${options?.publish != null ? "refs/heads/" : ""}${resolved.name}`;
438
442
  else {
439
- const tracking = options?.publish == null ? branch.trackingWithoutRemote : void 0;
440
- branchName = tracking != null && tracking !== branch.nameWithoutRemote ? `${branch.name}:${tracking}` : branch.name;
443
+ const tracking = options?.publish == null ? resolved.upstream : void 0;
444
+ branchName = tracking != null && tracking !== resolved.name ? `${branch.name}:${tracking}` : branch.name;
441
445
  }
442
- remoteName = branch.remoteName ?? options?.publish?.remote;
446
+ remoteName = resolved.remote ?? options?.publish?.remote;
443
447
  upstreamName = options?.reference == null && options?.publish != null ? branch.name : void 0;
444
448
  if (options?.publish?.remote != null && options?.reference != null) setUpstream = {
445
- branch: branch.nameWithoutRemote,
449
+ branch: resolved.name,
446
450
  remote: remoteName,
447
- remoteBranch: branch.nameWithoutRemote
451
+ remoteBranch: resolved.name
448
452
  };
449
453
  }
450
454
  if (options?.publish == null && remoteName == null && upstreamName == null) throw new PushError({ reason: "other" });
@@ -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 { getBranchNameAndRemote, getBranchTrackingWithoutRemote } from '@gitlens/git/utils/branch.utils.js';\nimport { isBranchReference } from '@gitlens/git/utils/reference.utils.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\tmaxGitCliLength,\n} from '../exec/git.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\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\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\tthis.announceHeadChanged(\n\t\t\t\trepoPath,\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\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\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\tthis.announceHeadChanged(repoPath);\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\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\ttry {\n\t\t\tif (isBranchReference(branch)) {\n\t\t\t\tconst [branchName, remoteName] = getBranchNameAndRemote(branch);\n\t\t\t\tif (remoteName == null) return;\n\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: branchName,\n\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\tupstream: getBranchTrackingWithoutRemote(branch)!,\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\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\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, 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/** `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 stripped = refspec.startsWith('+') ? refspec.slice(1) : refspec;\n\t\t\tconst colonIndex = stripped.indexOf(':');\n\t\t\tif (colonIndex === -1) continue;\n\n\t\t\t// Qualified as git's fetch does: an empty destination stores nothing, `heads/`/`tags/`/`remotes/`\n\t\t\t// get `refs/`, and any other unqualified name is a local branch\n\t\t\tlet destination = stripped.slice(colonIndex + 1);\n\t\t\tif (!destination) continue;\n\n\t\t\tif (!destination.startsWith('refs/')) {\n\t\t\t\tdestination = /^(?:heads|tags|remotes)\\//.test(destination)\n\t\t\t\t\t? `refs/${destination}`\n\t\t\t\t\t: `refs/heads/${destination}`;\n\t\t\t}\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\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\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 [branchName, remoteName] = getBranchNameAndRemote(branch);\n\t\t\t\t\tconst upstream = getBranchTrackingWithoutRemote(branch);\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\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\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\t[branchName, remoteName] = getBranchNameAndRemote(options.reference);\n\t\t\t}\n\t\t\tupstreamName = getBranchTrackingWithoutRemote(options.reference);\n\t\t\ttrackUpstream ||= options.reference.upstream?.missing === true;\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\tif (options?.reference != null) {\n\t\t\t\tbranchName = `${options.reference.ref}:${\n\t\t\t\t\toptions?.publish != null ? 'refs/heads/' : ''\n\t\t\t\t}${branch.nameWithoutRemote}`;\n\t\t\t} else {\n\t\t\t\tconst tracking = options?.publish == null ? branch.trackingWithoutRemote : undefined;\n\t\t\t\tbranchName =\n\t\t\t\t\ttracking != null && tracking !== branch.nameWithoutRemote\n\t\t\t\t\t\t? `${branch.name}:${tracking}`\n\t\t\t\t\t\t: branch.name;\n\t\t\t}\n\t\t\tremoteName = branch.remoteName ?? options?.publish?.remote;\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: branch.nameWithoutRemote,\n\t\t\t\t\tremote: remoteName!,\n\t\t\t\t\tremoteBranch: branch.nameWithoutRemote,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (options?.publish == null && remoteName == null && upstreamName == null) {\n\t\t\tthrow new PushError({ reason: 'other' });\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\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\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\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\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\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\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/** Called once git has run, success or not — a rejected write can still have moved HEAD or left state behind */\n\tprivate announceHeadChanged(repoPath: string, wroteTracking?: boolean): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\tthis.context.hooks?.repository?.onChanged?.(\n\t\t\trepoPath,\n\t\t\twroteTracking ? ['config', 'head', 'heads', 'index'] : ['head', 'heads', 'index'],\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 { 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\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\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\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\tthis.announceHeadChanged(\n\t\t\t\trepoPath,\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\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\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\tthis.announceHeadChanged(repoPath);\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\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\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\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\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\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, 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/** `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 stripped = refspec.startsWith('+') ? refspec.slice(1) : refspec;\n\t\t\tconst colonIndex = stripped.indexOf(':');\n\t\t\tif (colonIndex === -1) continue;\n\n\t\t\t// Qualified as git's fetch does: an empty destination stores nothing, `heads/`/`tags/`/`remotes/`\n\t\t\t// get `refs/`, and any other unqualified name is a local branch\n\t\t\tlet destination = stripped.slice(colonIndex + 1);\n\t\t\tif (!destination) continue;\n\n\t\t\tif (!destination.startsWith('refs/')) {\n\t\t\t\tdestination = /^(?:heads|tags|remotes)\\//.test(destination)\n\t\t\t\t\t? `refs/${destination}`\n\t\t\t\t\t: `refs/heads/${destination}`;\n\t\t\t}\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\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\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\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\tupstreamName = resolved.upstream;\n\t\t\ttrackUpstream ||= options.reference.upstream?.missing === true;\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\tbranchName = `${options.reference.ref}:${options?.publish != null ? 'refs/heads/' : ''}${resolved.name}`;\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\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\tif (options?.publish == null && remoteName == null && upstreamName == null) {\n\t\t\tthrow new PushError({ reason: 'other' });\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\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\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\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\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\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\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/** Called once git has run, success or not — a rejected write can still have moved HEAD or left state behind */\n\tprivate announceHeadChanged(repoPath: string, wroteTracking?: boolean): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\tthis.context.hooks?.repository?.onChanged?.(\n\t\t\trepoPath,\n\t\t\twroteTracking ? ['config', 'head', 'heads', 'index'] : ['head', 'heads', 'index'],\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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"}
@@ -9,8 +9,8 @@ import { PausedOperationAbortError, PausedOperationContinueError } from "../../g
9
9
  import { getGitCommandError } from "../exec/git.js";
10
10
  import { gate } from "../../utils/decorators/gate.js";
11
11
  import * as l10n from "@vscode/l10n";
12
+ import { readdir } from "fs";
12
13
  import { readFile, stat } from "fs/promises";
13
- import { readdir as readdir$1 } from "fs";
14
14
  //#region ../git-cli/src/providers/pausedOperations.ts
15
15
  const todoCommitRegex = /^(?:p(?:ick)?|revert)\s+([a-f0-9]+)(?:\s+(.+))?$/i;
16
16
  const orderedOperations = [
@@ -54,7 +54,7 @@ var PausedOperationsGitSubProvider = class {
54
54
  /** Lists the operation sentinels in git's dir; rejects if the dir can't be read */
55
55
  scanGitDir(gitDir) {
56
56
  return new Promise((resolve, reject) => {
57
- readdir$1(gitDir.uri.fsPath, { withFileTypes: true }, (err, entries) => {
57
+ readdir(gitDir.uri.fsPath, { withFileTypes: true }, (err, entries) => {
58
58
  if (err != null) {
59
59
  reject(err);
60
60
  return;