@gitkraken/core-gitlens 0.15.4 → 0.15.6

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 (61) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/git/cache.d.ts +9 -12
  3. package/dist/git/cache.js +34 -16
  4. package/dist/git/cache.js.map +1 -1
  5. package/dist/git/context.d.ts +19 -2
  6. package/dist/git/context.js.map +1 -1
  7. package/dist/git/providers/provider.d.ts +7 -0
  8. package/dist/git/service.d.ts +5 -1
  9. package/dist/git/service.js +8 -4
  10. package/dist/git/service.js.map +1 -1
  11. package/dist/git/watching/changeEvent.d.ts +25 -1
  12. package/dist/git/watching/changeEvent.js +36 -2
  13. package/dist/git/watching/changeEvent.js.map +1 -1
  14. package/dist/git/watching/configSections.d.ts +35 -0
  15. package/dist/git/watching/configSections.js +210 -0
  16. package/dist/git/watching/configSections.js.map +1 -0
  17. package/dist/git/watching/watchGroup.d.ts +36 -3
  18. package/dist/git/watching/watchGroup.js +107 -2
  19. package/dist/git/watching/watchGroup.js.map +1 -1
  20. package/dist/git/watching/watchService.d.ts +14 -3
  21. package/dist/git/watching/watchService.js +10 -7
  22. package/dist/git/watching/watchService.js.map +1 -1
  23. package/dist/git/watching/watchSession.d.ts +52 -21
  24. package/dist/git/watching/watchSession.js +164 -42
  25. package/dist/git/watching/watchSession.js.map +1 -1
  26. package/dist/git/watching/worktreeSummary.d.ts +9 -7
  27. package/dist/git/watching/worktreeSummary.js +21 -10
  28. package/dist/git/watching/worktreeSummary.js.map +1 -1
  29. package/dist/git-cli/cliGitProvider.d.ts +6 -1
  30. package/dist/git-cli/cliGitProvider.js +45 -5
  31. package/dist/git-cli/cliGitProvider.js.map +1 -1
  32. package/dist/git-cli/providers/branches.d.ts +2 -2
  33. package/dist/git-cli/providers/branches.js +17 -15
  34. package/dist/git-cli/providers/branches.js.map +1 -1
  35. package/dist/git-cli/providers/config.d.ts +13 -0
  36. package/dist/git-cli/providers/config.js +38 -1
  37. package/dist/git-cli/providers/config.js.map +1 -1
  38. package/dist/git-cli/providers/operations.d.ts +35 -1
  39. package/dist/git-cli/providers/operations.js +175 -16
  40. package/dist/git-cli/providers/operations.js.map +1 -1
  41. package/dist/git-cli/providers/stash.d.ts +1 -0
  42. package/dist/git-cli/providers/stash.js +9 -3
  43. package/dist/git-cli/providers/stash.js.map +1 -1
  44. package/dist/git-cli/providers/worktrees.js +11 -4
  45. package/dist/git-cli/providers/worktrees.js.map +1 -1
  46. package/dist/git-cli/service.js +5 -1
  47. package/dist/git-cli/service.js.map +1 -1
  48. package/dist/plus/integrations/collectionMetadata.js +4 -2
  49. package/dist/plus/integrations/collectionMetadata.js.map +1 -1
  50. package/dist/plus/integrations/providers/issueSorts.d.ts +0 -1
  51. package/dist/plus/integrations/providers/providerErrors.d.ts +22 -0
  52. package/dist/plus/integrations/providers/providerErrors.js +43 -2
  53. package/dist/plus/integrations/providers/providerErrors.js.map +1 -1
  54. package/dist/plus/integrations/providers/providersApi.js +12 -8
  55. package/dist/plus/integrations/providers/providersApi.js.map +1 -1
  56. package/dist/plus/integrations/reads/drains.d.ts +0 -1
  57. package/dist/plus/integrations/results.d.ts +13 -3
  58. package/dist/plus/integrations/results.js +12 -2
  59. package/dist/plus/integrations/results.js.map +1 -1
  60. package/docs/integrations.md +14 -0
  61. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"operations.js","names":[],"sources":["../../../../git-cli/src/providers/operations.ts"],"sourcesContent":["import * as l10n from '@vscode/l10n';\nimport type { Cache } from '@gitlens/git/cache.js';\nimport type { GitConflictCommand, GitServiceContext } from '@gitlens/git/context.js';\nimport {\n\tCheckoutError,\n\tCherryPickError,\n\tCommitError,\n\tFetchError,\n\tMergeError,\n\tPullError,\n\tPushError,\n\tRebaseError,\n\tResetError,\n\tRevertError,\n\tSigningError,\n} from '@gitlens/git/errors.js';\nimport type { GitBranchReference, GitReference } from '@gitlens/git/models/reference.js';\nimport type { RepositoryChange } from '@gitlens/git/models/repository.js';\nimport type { SigningFormat } from '@gitlens/git/models/signature.js';\nimport type { GitConflictFile } from '@gitlens/git/models/staging.js';\nimport type {\n\tGitOperationResult,\n\tGitOperationRunOptions,\n\tGitOperationsSubProvider,\n} from '@gitlens/git/providers/operations.js';\nimport { isBranchReference } from '@gitlens/git/utils/reference.utils.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { sequentialize } from '@gitlens/utils/decorators/sequentialize.js';\nimport { chunkByStringLength } from '@gitlens/utils/iterable.js';\nimport { Logger } from '@gitlens/utils/logger.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { mayWriteTracking } from '../exec/commandClassifier.js';\nimport type { Git, PushForceOptions } from '../exec/git.js';\nimport {\n\tclassifySigningError,\n\tgetGitCommandError,\n\tgitConfigsPull,\n\tGitErrors,\n\tinferSigningFormatFromError,\n\tisRunHookFailure,\n\tmaxGitCliLength,\n} from '../exec/git.js';\nimport { 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\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\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\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'cherry-pick',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CherryPickError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', revs: revs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (CherryPickError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'cherry-pick');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync commit(\n\t\trepoPath: string,\n\t\tmessage: string,\n\t\toptions?: {\n\t\t\tall?: boolean;\n\t\t\tallowEmpty?: boolean;\n\t\t\tamend?: boolean;\n\t\t\tauthor?: string;\n\t\t\tdate?: string;\n\t\t\tsignoff?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['commit'];\n\t\tif (options?.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\t\tif (options?.allowEmpty) {\n\t\t\tparams.push('--allow-empty');\n\t\t}\n\t\tif (options?.amend) {\n\t\t\tparams.push('--amend');\n\t\t}\n\t\tif (options?.signoff) {\n\t\t\tparams.push('--signoff');\n\t\t}\n\t\tif (options?.author) {\n\t\t\tparams.push(`--author=${options.author}`);\n\t\t}\n\t\tif (options?.date) {\n\t\t\tparams.push(`--date=${options.date}`);\n\t\t}\n\t\t// Host-level override (e.g. VS Code's `git.enableCommitSigning`) — request signing explicitly\n\t\t// via `-S`. Implicit repo-config signing (`commit.gpgsign=true`) needs no flag, and `-S`\n\t\t// alongside it is harmless, so the override can only enable signing, never force it off.\n\t\tconst sign = this.context.config?.signing?.enabled === true;\n\t\tif (sign) {\n\t\t\tparams.push('-S');\n\t\t}\n\t\t// Read commit message from stdin via -F - to avoid shell escaping issues\n\t\tparams.push('-F', '-');\n\n\t\ttry {\n\t\t\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\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options?.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'commit',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CommitError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync fetch(\n\t\trepoPath: string,\n\t\toptions?:\n\t\t\t| {\n\t\t\t\t\tall?: boolean;\n\t\t\t\t\tbranch?: GitBranchReference;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote?: string;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: undefined;\n\t\t\t\t\tremote: string;\n\t\t\t\t\trefspecs: readonly string[];\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { branch, ...opts } = options ?? {};\n\t\tlet ran = false;\n\t\tlet fetched: FetchedRemotes | undefined;\n\t\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\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'fetch',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew FetchError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tbranch: options?.branch,\n\t\t\t\t\t\t\tremote: options?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync merge(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { fastForward?: boolean | 'only'; noCommit?: boolean; squash?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['merge'];\n\n\t\tif (options?.fastForward === 'only') {\n\t\t\targs.push('--ff-only');\n\t\t} else if (options?.fastForward === true) {\n\t\t\targs.push('--ff');\n\t\t} else if (options?.fastForward === false) {\n\t\t\targs.push('--no-ff');\n\t\t}\n\t\tif (options?.squash) {\n\t\t\targs.push('--squash');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('--no-commit');\n\t\t}\n\n\t\targs.push(ref);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since merges can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'merge',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew MergeError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (MergeError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'merge');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync pull(\n\t\trepoPath: string,\n\t\toptions?: {\n\t\t\tbranch?: GitBranchReference;\n\t\t\tfastForward?: 'only';\n\t\t\trebase?: boolean;\n\t\t\ttags?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\t// Set once a git command is about to run, so a pull that fails partway (a merge or rebase stopping on a\n\t\t// conflict, a fetch that stored some refs) announces what it changed the way a finished one does\n\t\tlet announce: (() => void) | undefined;\n\t\t// A `pull` with no arguments fetches the branch's remote with its configured refspecs\n\t\tlet fetched: { repoPath: string; remotes: FetchedRemotes } | undefined;\n\t\ttry {\n\t\t\tif (isBranchReference(options?.branch)) {\n\t\t\t\tconst branch = options.branch;\n\t\t\t\t// Find the worktree where this branch is checked out (if any)\n\t\t\t\tconst worktree = await this.provider.worktrees?.getWorktree(\n\t\t\t\t\trepoPath,\n\t\t\t\t\twt => wt.branch?.name === branch.name,\n\t\t\t\t);\n\t\t\t\tif (worktree != null) {\n\t\t\t\t\t// Branch is checked out in a worktree — run git pull in that worktree's directory\n\t\t\t\t\t// Any rebase state (e.g. from `pull.rebase=true`) appears under the worktree path\n\t\t\t\t\tconst worktreePath = normalizePath(worktree.uri.fsPath);\n\t\t\t\t\t// Its HEAD, index and any paused merge or rebase belong to that worktree, not to `repoPath`\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.announcePull(repoPath);\n\t\t\t\t\t\tif (worktreePath !== normalizePath(repoPath)) {\n\t\t\t\t\t\t\tthis.announcePull(worktreePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'started');\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.pullCore(\n\t\t\t\t\t\t\tworktreePath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfetched = { repoPath: worktreePath, remotes: 'default' };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'ended');\n\t\t\t\t\t}\n\t\t\t\t} else if (options?.fastForward === 'only') {\n\t\t\t\t\t// Not checked out anywhere, so there is no working tree to merge into — but a fast-forward\n\t\t\t\t\t// needs none: fetching `<upstream>:<branch>` advances the local branch, and git refuses that\n\t\t\t\t\t// non-forced refspec unless it fast-forwards. A plain fetch would leave the branch unmoved\n\t\t\t\t\t// and report success.\n\t\t\t\t\t// Fetched without `-u`: the worktree lookup above is cached and can miss a worktree added\n\t\t\t\t\t// outside core, and then git's own refusal is what keeps a checked-out branch from moving.\n\t\t\t\t\tconst {\n\t\t\t\t\t\tname: branchName,\n\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\tupstream,\n\t\t\t\t\t} = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\t\t\tif (remoteName == null || upstream == null) {\n\t\t\t\t\t\tthrow new PullError({\n\t\t\t\t\t\t\treason: 'noUpstream',\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: ['pull', '--ff-only', branch.name] },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// A `pull` fetch writes `<upstream>:<branch>`, moving the local branch too — same\n\t\t\t\t\t// hooks `fetch()` fires for a pull fetch with a branch reference.\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['heads', 'remotes']);\n\t\t\t\t\t};\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.fetchCore(\n\t\t\t\t\t\t\trepoPath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbranch: branchName,\n\t\t\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\t\tpull: true,\n\t\t\t\t\t\t\t\tupdateHeadOk: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tif (FetchError.is(ex, 'noFastForward')) {\n\t\t\t\t\t\t\tthrow new PullError(\n\t\t\t\t\t\t\t\t{ reason: 'noFastForward', gitCommand: ex.details.gitCommand },\n\t\t\t\t\t\t\t\tex.original,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow ex;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Branch is not checked out anywhere — can only fetch (no working tree to merge into)\n\t\t\t\t\tawait this.fetch(repoPath, { branch: branch }, runOptions);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tannounce = () => this.announcePull(repoPath);\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'started');\n\t\t\ttry {\n\t\t\t\tawait this.pullCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t\tfetched = { repoPath: repoPath, remotes: 'default' };\n\t\t\t} finally {\n\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'ended');\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\tannounce?.();\n\t\t\tif (fetched != null) {\n\t\t\t\tvoid this.followRemoteHeads(fetched.repoPath, fetched.remotes);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate announcePull(repoPath: string): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\n\t}\n\n\tprivate async pullCore(\n\t\trepoPath: string,\n\t\toptions: { fastForward?: 'only'; rebase?: boolean; tags?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['pull'];\n\n\t\tif (options.tags) {\n\t\t\tparams.push('--tags');\n\t\t}\n\n\t\tif (options.rebase) {\n\t\t\tparams.push('-r');\n\t\t}\n\n\t\tif (options.fastForward === 'only') {\n\t\t\tparams.push('--ff-only');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsPull, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'pull',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PullError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync push(\n\t\trepoPath: string,\n\t\toptions?: { reference?: GitReference; force?: boolean; publish?: { remote: string } },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tlet branchName: string;\n\t\tlet remoteName: string | undefined;\n\t\tlet upstreamName: string | undefined;\n\t\t// Whether the push itself writes `branch.<n>.remote/merge` (`-u`): only when it establishes tracking,\n\t\t// never to rewrite what a branch with a live upstream already has\n\t\tlet trackUpstream = options?.publish != null;\n\t\tlet setUpstream:\n\t\t\t| {\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tremoteBranch: string;\n\t\t\t }\n\t\t\t| undefined;\n\n\t\tif (isBranchReference(options?.reference)) {\n\t\t\tconst resolved = await resolveBranchRemote(\n\t\t\t\tthis.provider,\n\t\t\t\trepoPath,\n\t\t\t\toptions.reference,\n\t\t\t\trunOptions?.cancellation,\n\t\t\t);\n\t\t\tif (options.publish != null) {\n\t\t\t\tbranchName = options.reference.name;\n\t\t\t\tremoteName = options.publish.remote;\n\t\t\t} else {\n\t\t\t\tbranchName = resolved.name;\n\t\t\t\tremoteName = resolved.remote;\n\t\t\t}\n\t\t\t// A local upstream names a branch in this repository, never a branch on the remote being published to\n\t\t\tupstreamName = options.publish != null && resolved.local ? undefined : resolved.upstream;\n\t\t\ttrackUpstream ||= options.reference.upstream?.missing === true;\n\n\t\t\t// Without a remote, a bare `git push` would follow `push.default` somewhere the caller didn't pick\n\t\t\tif (options.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: options.reference.name });\n\t\t\t}\n\t\t} else {\n\t\t\tconst branch = await this.provider.branches.getBranch(repoPath);\n\t\t\tif (branch == null) return;\n\n\t\t\tconst resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\tif (options?.reference != null) {\n\t\t\t\t// Onto the upstream's remote-side name, which a custom fetch refspec or a renamed upstream can make differ\n\t\t\t\tbranchName = `${options.reference.ref}:${\n\t\t\t\t\toptions?.publish != null ? `refs/heads/${resolved.name}` : (resolved.upstream ?? resolved.name)\n\t\t\t\t}`;\n\t\t\t} else {\n\t\t\t\tconst tracking = options?.publish == null ? resolved.upstream : undefined;\n\t\t\t\tbranchName =\n\t\t\t\t\ttracking != null && tracking !== resolved.name ? `${branch.name}:${tracking}` : branch.name;\n\t\t\t}\n\t\t\tremoteName = resolved.remote ?? options?.publish?.remote;\n\t\t\tif (options?.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: branch.name });\n\t\t\t}\n\n\t\t\tupstreamName = options?.reference == null && options?.publish != null ? branch.name : undefined;\n\n\t\t\t// Git can't setup upstream tracking when publishing a new branch to a specific commit, so we'll need to do it after the push\n\t\t\tif (options?.publish?.remote != null && options?.reference != null) {\n\t\t\t\tsetUpstream = {\n\t\t\t\t\tbranch: resolved.name,\n\t\t\t\t\tremote: remoteName!,\n\t\t\t\t\tremoteBranch: resolved.name,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tlet forceOpts: PushForceOptions | undefined;\n\t\tif (options?.force) {\n\t\t\t// Honor the host's force-push preferences (e.g. VS Code's `git.useForcePushWithLease` /\n\t\t\t// `git.useForcePushIfIncludes`); fall back to the safer `--force-with-lease` behavior.\n\t\t\tconst useForceWithLease = this.context.config?.push?.useForceWithLease ?? true;\n\t\t\tforceOpts = useForceWithLease\n\t\t\t\t? { withLease: true, ifIncludes: this.context.config?.push?.useForceIfIncludes ?? true }\n\t\t\t\t: { withLease: false };\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.pushCore(\n\t\t\t\trepoPath,\n\t\t\t\t{\n\t\t\t\t\tbranch: branchName,\n\t\t\t\t\tremote: remoteName,\n\t\t\t\t\tupstream: upstreamName,\n\t\t\t\t\tforce: forceOpts,\n\t\t\t\t\tsetUpstream: trackUpstream,\n\t\t\t\t},\n\t\t\t\trunOptions,\n\t\t\t);\n\n\t\t\t// Since Git can't setup upstream tracking when publishing a new branch to a specific commit, do it now.\n\t\t\t// Soft-fail: the push already succeeded, so don't let a local upstream-tracking failure (cancellation\n\t\t\t// arriving mid-spawn, transient git error) suppress the post-push hook fan-out below.\n\t\t\tif (setUpstream != null) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.git.run(\n\t\t\t\t\t\t{ cwd: repoPath, ...runOptions },\n\t\t\t\t\t\t'branch',\n\t\t\t\t\t\t'--set-upstream-to',\n\t\t\t\t\t\t`${setUpstream.remote}/${setUpstream.remoteBranch}`,\n\t\t\t\t\t\tsetUpstream.branch,\n\t\t\t\t\t);\n\t\t\t\t} catch (ex) {\n\t\t\t\t\tscope?.error(ex, 'Unable to set upstream tracking after publish');\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\t// A rejected push may have updated some of its remote-tracking refs before it failed\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches');\n\t\t\tconst changes: RepositoryChange[] = [];\n\t\t\tif (trackUpstream || setUpstream != null) {\n\t\t\t\tchanges.push('config');\n\t\t\t}\n\t\t\tif (options?.publish != null) {\n\t\t\t\tchanges.push('heads');\n\t\t\t}\n\t\t\tchanges.push('remotes');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes);\n\t\t}\n\t}\n\n\tprivate async pushCore(\n\t\trepoPath: string,\n\t\toptions: {\n\t\t\tbranch?: string;\n\t\t\tforce?: PushForceOptions;\n\t\t\tsetUpstream?: boolean;\n\t\t\tremote?: string;\n\t\t\tupstream?: string;\n\t\t\tdelete?: { remote: string; branch: string };\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['push'];\n\n\t\tif (options.force != null) {\n\t\t\tif (options.force.withLease) {\n\t\t\t\tparams.push('--force-with-lease');\n\t\t\t\tif (options.force.ifIncludes) {\n\t\t\t\t\tif (await this.git.supports('git:push:force-if-includes')) {\n\t\t\t\t\t\tparams.push('--force-if-includes');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams.push('--force');\n\t\t\t}\n\t\t}\n\n\t\t// `push` refuses a branch without a remote before reaching here, as this would drop the branch\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream) {\n\t\t\t\tif (options.setUpstream) {\n\t\t\t\t\tparams.push('-u');\n\t\t\t\t}\n\t\t\t\tparams.push(options.remote, `${options.branch}:${options.upstream}`);\n\t\t\t} else if (options.setUpstream) {\n\t\t\t\tparams.push('--set-upstream', options.remote, options.branch);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.branch);\n\t\t\t}\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.delete) {\n\t\t\tparams.push(options.delete.remote, `:${options.delete.branch}`);\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tconst error = getGitCommandError(\n\t\t\t\t'push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason,\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (options?.force?.withLease && error.details.reason === 'rejected') {\n\t\t\t\tif (ex.stderr && /! \\[rejected\\].*\\(stale info\\)/m.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLease',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\toptions.force.ifIncludes &&\n\t\t\t\t\tex.stderr &&\n\t\t\t\t\t/! \\[rejected\\].*\\(remote ref updated since checkout\\)/m.test(ex.stderr)\n\t\t\t\t) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLeaseIfIncludes',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (ex.stderr && GitErrors.pushRejectedRefDoesNotExists.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedRefDoesNotExist',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync rebase(\n\t\trepoPath: string,\n\t\tupstream: string,\n\t\toptions?: {\n\t\t\tautoStash?: boolean;\n\t\t\tbranch?: string;\n\t\t\teditor?: string;\n\t\t\tinteractive?: boolean;\n\t\t\tprogrammaticEditor?: boolean;\n\t\t\tautosquash?: boolean;\n\t\t\tmessageEditor?: string;\n\t\t\tonto?: string;\n\t\t\tupdateRefs?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['rebase'];\n\t\tconst configs: string[] = [];\n\n\t\tif (options?.autoStash !== false) {\n\t\t\targs.push('--autostash');\n\t\t}\n\n\t\tif (options?.interactive) {\n\t\t\targs.push('--interactive');\n\n\t\t\tif (options.editor) {\n\t\t\t\tconfigs.push('-c', `sequence.editor=${options.editor}`);\n\t\t\t}\n\n\t\t\t// A script-based sequence editor rewrites the todo by command word + SHA, so git must emit a\n\t\t\t// plain, natural-order todo regardless of the user's rebase config: `rebase.autosquash` would\n\t\t\t// reorder commits and rewrite `pick`→`fixup`, and `rebase.abbreviateCommands` would emit `p`.\n\t\t\tif (options.programmaticEditor) {\n\t\t\t\tconfigs.push('-c', 'rebase.autosquash=false', '-c', 'rebase.abbreviateCommands=false');\n\t\t\t}\n\t\t}\n\n\t\tif (options?.autosquash != null) {\n\t\t\tif (options.autosquash && options.programmaticEditor) {\n\t\t\t\tthrow new Error(l10n.t('rebase: autosquash cannot be combined with programmaticEditor'));\n\t\t\t}\n\n\t\t\t// `--no-autosquash` is passed explicitly when `false` — omitting the flag would let a\n\t\t\t// `rebase.autosquash=true` git config fold fixups anyway.\n\t\t\targs.push(options.autosquash ? '--autosquash' : '--no-autosquash');\n\t\t}\n\n\t\t// Drive per-commit message editing (the combined message a `squash` produces, or a `reword`).\n\t\t// `GIT_EDITOR` (not `core.editor`) is what git's interactive-rebase backend honors for the `reword`\n\t\t// amend step, so set it on the environment; also set `core.editor` config as a fallback.\n\t\tlet env = runOptions?.env;\n\t\tif (options?.messageEditor) {\n\t\t\tconfigs.push('-c', `core.editor=${options.messageEditor}`);\n\t\t\tenv = { ...env, GIT_EDITOR: options.messageEditor };\n\t\t}\n\n\t\tif (options?.updateRefs === true) {\n\t\t\targs.push('--update-refs');\n\t\t} else if (options?.updateRefs === false) {\n\t\t\targs.push('--no-update-refs');\n\t\t}\n\n\t\tif (options?.onto) {\n\t\t\targs.push('--onto', options.onto);\n\t\t}\n\n\t\targs.push(upstream);\n\n\t\tif (options?.branch) {\n\t\t\targs.push(options.branch);\n\t\t}\n\n\t\t// Fired before the process runs — `git rebase` exits 0 when stopping at `edit`/`break`,\n\t\t// so the result can't be used to detect that a rebase started\n\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'started');\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since rebases can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', configs: configs, timeout: 0, ...runOptions, env: env },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'rebase',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RebaseError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: args },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RebaseError.is(mapped, 'conflicts')) {\n\t\t\t\treturn await this.createConflictResult(repoPath, 'rebase');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t} finally {\n\t\t\t// The command exited (success, pause, or failure) — any rebase it left behind is on disk now\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'ended');\n\t\t}\n\t}\n\n\t@debug()\n\tasync reset(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: { mode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tawait this.resetCore(repoPath, rev, options?.mode, runOptions);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\tthis.announceHeadChanged(repoPath);\n\t\t}\n\t}\n\n\tprivate async resetCore(\n\t\trepoPath: string,\n\t\trev: string,\n\t\tmode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['reset', '-q'];\n\t\tif (mode) {\n\t\t\tparams.push(`--${mode}`);\n\t\t}\n\t\tparams.push(rev, '--');\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'reset',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew ResetError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync restore(\n\t\trepoPath: string,\n\t\tpath: string | string[],\n\t\toptions?: { ref?: string; side?: 'ours' | 'theirs' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst paths = Array.isArray(path) ? path : [path];\n\t\tif (!paths.length) return;\n\n\t\tconst scope = getScopedLogger();\n\t\tconst normalized = paths.map(p => splitPath(p, repoPath, true)[0]);\n\n\t\t// `side` and `ref` are mutually exclusive in git (--ours/--theirs apply during conflict\n\t\t// resolution and take no source ref); side takes precedence if both are somehow supplied.\n\t\t// Use a truthy check on `ref` so an empty string falls through to index-restore rather than\n\t\t// producing a malformed `git checkout '' -- …`. Implemented via `checkout` rather than\n\t\t// `git restore` for compatibility with the minimum supported git (2.7.2); `git restore`\n\t\t// only landed in 2.23.\n\t\tconst selector = options?.side != null ? `--${options.side}` : options?.ref || undefined;\n\t\tconst prefix = selector != null ? ['checkout', selector, '--'] : ['checkout', '--'];\n\n\t\tlet ran = false;\n\t\ttry {\n\t\t\tif (await this.git.supports('git:checkout:pathspec-from-file')) {\n\t\t\t\t// Git ≥ 2.26: stream all pathspecs via stdin (NUL-separated) in a single invocation —\n\t\t\t\t// no CLI-length limit (so no batching), and robust for paths with spaces/newlines.\n\t\t\t\t// Pathspecs come from the file rather than argv, so `--` isn't used.\n\t\t\t\tconst args = ['checkout'];\n\t\t\t\tif (selector != null) {\n\t\t\t\t\targs.push(selector);\n\t\t\t\t}\n\t\t\t\targs.push('--pathspec-from-file=-', '--pathspec-file-nul');\n\t\t\t\tran = true;\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', ...runOptions, stdin: normalized.join('\\0') },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Older git: pass pathspecs as args, one git invocation per chunk (collapsing N\n\t\t\t\t// path-mode checkouts into ⌈N / chunk⌉ spawns). Reserve the command prefix length and\n\t\t\t\t// a per-arg overhead (separator + possible quoting) so the assembled command line\n\t\t\t\t// can't exceed the OS limit even with many short paths.\n\t\t\t\tconst perArgOverhead = 3;\n\t\t\t\tconst prefixLength = prefix.reduce((sum, arg) => sum + arg.length + perArgOverhead, 0);\n\t\t\t\tfor (const batch of chunkByStringLength(normalized, maxGitCliLength - prefixLength, perArgOverhead)) {\n\t\t\t\t\tran = true;\n\t\t\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...prefix, ...batch);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tref: options?.side ?? options?.ref,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: [...prefix, ...normalized] },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tif (ran) {\n\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'status');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['index']);\n\t\t\t}\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync revert(\n\t\trepoPath: string,\n\t\trefs: string[],\n\t\toptions?: { editMessage?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['revert'];\n\n\t\tif (options?.editMessage === true) {\n\t\t\targs.push('--edit');\n\t\t} else if (options?.editMessage === false) {\n\t\t\targs.push('--no-edit');\n\t\t}\n\n\t\targs.push(...refs);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since reverts can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'revert',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RevertError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', refs: refs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RevertError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'revert');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t/**\n\t * Classifies `ex` as a signing failure; if so, fires the `commits.onSigningFailed`\n\t * hook and throws a typed {@link SigningError}. Callers should invoke this first\n\t * in their catch blocks, before falling through to command-specific error mapping\n\t * via {@link getGitCommandError}.\n\t *\n\t * `SigningFormat` is read opportunistically from `config.getSigningConfig`, with\n\t * {@link inferSigningFormatFromError} as a stderr-based fallback and `'gpg'` as\n\t * the final default.\n\t */\n\tprivate async throwIfSigningError(\n\t\trepoPath: string,\n\t\targs: readonly (string | undefined)[],\n\t\tex: unknown,\n\t\tsource?: unknown,\n\t): Promise<void> {\n\t\tconst reason = classifySigningError(ex);\n\t\tif (reason == null) return;\n\n\t\tlet format: SigningFormat | undefined;\n\t\ttry {\n\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t} catch {\n\t\t\t// Fall through — config read failed; use stderr-inferred format or gpg default\n\t\t}\n\t\tformat ??= inferSigningFormatFromError(ex) ?? 'gpg';\n\n\t\tthis.context.hooks?.commits?.onSigningFailed?.(reason, format, source);\n\t\tthrow new SigningError(\n\t\t\t{ reason: reason, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\tex instanceof Error ? ex : undefined,\n\t\t);\n\t}\n\n\t/** 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 { getRefChangeKind } from '@gitlens/git/watching/changeEvent.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { sequentialize } from '@gitlens/utils/decorators/sequentialize.js';\nimport { chunkByStringLength } from '@gitlens/utils/iterable.js';\nimport { Logger } from '@gitlens/utils/logger.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport { joinUriPath } from '@gitlens/utils/uri.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { mayWriteTracking } from '../exec/commandClassifier.js';\nimport type { Git, PushForceOptions } from '../exec/git.js';\nimport {\n\tclassifySigningError,\n\tgetGitCommandError,\n\tgitConfigsPull,\n\tGitErrors,\n\tinferSigningFormatFromError,\n\tisRunHookFailure,\n\tmaxGitCliLength,\n} from '../exec/git.js';\nimport { resolveBranchRemote } from './branchRemote.js';\nimport { parseGitBoolean } from './config.js';\n\n/** The remotes a fetch read with their configured refspecs: one named remote, all of them, or a bare fetch's default */\ntype FetchedRemotes = { remote: string } | 'all' | 'default';\n\n/** The ref kinds a fetch can move, in the order its announcement lists them */\nconst fetchRefChangeKinds: readonly RepositoryChange[] = ['remotes', 'heads', 'tags', 'stash'];\n\n/** The destinations a fetch's snapshot covers when the remotes' configured refspecs can't be read */\nconst broadFetchDestinations: readonly string[] = ['refs/heads', 'refs/remotes'];\n\n/**\n * The ref a fetch refspec stores into, qualified as git's fetch does — `heads/`, `tags/` and `remotes/` get `refs/`,\n * and any other unqualified name is a local branch — or `undefined` when it stores nothing (no `:`, or nothing after\n * it). A glob destination keeps its glob.\n */\nfunction getRefspecDestination(refspec: string): string | undefined {\n\tconst stripped = refspec.startsWith('+') ? refspec.slice(1) : refspec;\n\tconst colonIndex = stripped.indexOf(':');\n\tif (colonIndex === -1) return undefined;\n\n\tconst destination = stripped.slice(colonIndex + 1);\n\tif (!destination) return undefined;\n\tif (destination.startsWith('refs/')) return destination;\n\n\treturn /^(?:heads|tags|remotes)\\//.test(destination) ? `refs/${destination}` : `refs/heads/${destination}`;\n}\n\n/**\n * The for-each-ref patterns covering `destinations` (the refs a fetch may store into) and tags, which a fetch follows\n * into what it fetched. A pattern's `*` doesn't match across `/`, so a glob destination is widened to the directory\n * above its first glob.\n */\nfunction getFetchSnapshotPatterns(destinations: Iterable<string>): string[] {\n\tconst patterns = ['refs/tags'];\n\tfor (let destination of destinations) {\n\t\tconst globIndex = destination.search(/[*?[]/);\n\t\tif (globIndex !== -1) {\n\t\t\tdestination = destination.substring(0, destination.lastIndexOf('/', globIndex));\n\t\t}\n\t\tif (patterns.some(p => destination === p || destination.startsWith(`${p}/`))) continue;\n\n\t\tpatterns.push(destination);\n\t}\n\treturn patterns;\n}\n\n/** The refs created, moved, retargeted or deleted between two snapshots */\nfunction getMovedRefs(before: ReadonlyMap<string, string>, after: ReadonlyMap<string, string>): string[] {\n\tconst moved: string[] = [];\n\tfor (const [ref, sha] of after) {\n\t\tif (before.get(ref) !== sha) {\n\t\t\tmoved.push(ref);\n\t\t}\n\t}\n\tfor (const ref of before.keys()) {\n\t\tif (!after.has(ref)) {\n\t\t\tmoved.push(ref);\n\t\t}\n\t}\n\treturn moved;\n}\n\nexport class OperationsGitSubProvider implements GitOperationsSubProvider {\n\t/** The `commonPath\\0remote` pairs {@link followRemoteHeads} has handled */\n\tprivate readonly followedRemoteHeads = new Set<string>();\n\n\tconstructor(\n\t\tprivate readonly context: GitServiceContext,\n\t\tprivate readonly git: Git,\n\t\tprivate readonly cache: Cache,\n\t\tprivate readonly provider: CliGitProviderInternal,\n\t) {}\n\n\t@debug()\n\tasync checkout(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { createBranch?: string; noTracking?: boolean },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['checkout'];\n\t\tif (options?.createBranch) {\n\t\t\tparams.push('-b', options.createBranch);\n\t\t\tif (options.noTracking) {\n\t\t\t\tparams.push('--no-track');\n\t\t\t}\n\t\t\tparams.push(ref, '--');\n\t\t} else {\n\t\t\tparams.push(ref, '--');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t\tif (options?.createBranch) {\n\t\t\t\t// Evict the cached base only — see `createBranch` on why the persisted keys stay.\n\t\t\t\tthis.cache.deleteBaseBranchName(repoPath, options.createBranch);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\t// `-b` moves only the branch it creates, and writes tracking to that branch's own config section\n\t\t\tthis.announceHeadChanged(\n\t\t\t\trepoPath,\n\t\t\t\toptions?.createBranch ? `refs/heads/${options.createBranch}` : undefined,\n\t\t\t\tBoolean(options?.createBranch) && mayWriteTracking(ref, options?.noTracking),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync cherryPick(\n\t\trepoPath: string,\n\t\trevs: string[],\n\t\toptions?: { edit?: boolean; noCommit?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['cherry-pick'];\n\t\tif (options?.edit) {\n\t\t\targs.push('-e');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('-n');\n\t\t}\n\n\t\tif (revs.length > 1) {\n\t\t\t// Sort commits in topological order (oldest ancestor first) so cherry-pick applies them correctly.\n\t\t\t// This is a local read-only pre-flight, not the user-initiated op — don't subject it to caller env/timeout.\n\t\t\tconst revsSet = new Set(revs);\n\t\t\tconst result = await this.git.run({ cwd: repoPath }, 'rev-list', '--topo-order', '--reverse', ...revs);\n\n\t\t\tconst ordered: string[] = [];\n\t\t\tfor (const sha of result.stdout.trim().split('\\n')) {\n\t\t\t\tif (sha && revsSet.has(sha)) {\n\t\t\t\t\tordered.push(sha);\n\t\t\t\t\tif (ordered.length === revs.length) break; // Early exit once we have all\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ordered.length === revs.length) {\n\t\t\t\trevs = ordered;\n\t\t\t}\n\t\t\t// If we didn't get all commits (shouldn't happen), keep original order\n\t\t}\n\n\t\targs.push(...revs);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...args);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'cherry-pick',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CherryPickError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', revs: revs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (CherryPickError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'cherry-pick');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync commit(\n\t\trepoPath: string,\n\t\tmessage: string,\n\t\toptions?: {\n\t\t\tall?: boolean;\n\t\t\tallowEmpty?: boolean;\n\t\t\tamend?: boolean;\n\t\t\tauthor?: string;\n\t\t\tdate?: string;\n\t\t\tsignoff?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['commit'];\n\t\tif (options?.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\t\tif (options?.allowEmpty) {\n\t\t\tparams.push('--allow-empty');\n\t\t}\n\t\tif (options?.amend) {\n\t\t\tparams.push('--amend');\n\t\t}\n\t\tif (options?.signoff) {\n\t\t\tparams.push('--signoff');\n\t\t}\n\t\tif (options?.author) {\n\t\t\tparams.push(`--author=${options.author}`);\n\t\t}\n\t\tif (options?.date) {\n\t\t\tparams.push(`--date=${options.date}`);\n\t\t}\n\t\t// Host-level override (e.g. VS Code's `git.enableCommitSigning`) — request signing explicitly\n\t\t// via `-S`. Implicit repo-config signing (`commit.gpgsign=true`) needs no flag, and `-S`\n\t\t// alongside it is harmless, so the override can only enable signing, never force it off.\n\t\tconst sign = this.context.config?.signing?.enabled === true;\n\t\tif (sign) {\n\t\t\tparams.push('-S');\n\t\t}\n\t\t// Read commit message from stdin via -F - to avoid shell escaping issues\n\t\tparams.push('-F', '-');\n\n\t\t// A commit moves only the branch HEAD is on. HEAD is read on both sides of the run: a hook or an outside\n\t\t// `git switch` that moves it meanwhile leaves the moved branch unknown, so then none is named\n\t\tconst headBranchBefore = await this.readHeadBranchRef(repoPath);\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t{ cwd: repoPath, stdin: message, stdinEncoding: 'utf8', errors: 'throw', ...runOptions },\n\t\t\t\t\t...params,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\t// A commit refused by a hook can still have restaged files\n\t\t\t\tconst headBranch = await this.readHeadBranchRef(repoPath);\n\t\t\t\tthis.announceHeadChanged(repoPath, headBranch === headBranchBefore ? headBranch : undefined);\n\t\t\t}\n\t\t\tif (sign) {\n\t\t\t\t// `-S` was passed and the commit succeeded, so signing is confirmed — fire the\n\t\t\t\t// explicit-sign hook (same contract as the patch provider's `commit-tree -S` path).\n\t\t\t\tlet format: SigningFormat | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t\t\t} catch {}\n\t\t\t\tthis.context.hooks?.commits?.onSigned?.(format ?? 'gpg', options?.source);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options?.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'commit',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CommitError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync fetch(\n\t\trepoPath: string,\n\t\toptions?:\n\t\t\t| {\n\t\t\t\t\tall?: boolean;\n\t\t\t\t\tbranch?: GitBranchReference;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote?: string;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: undefined;\n\t\t\t\t\tremote: string;\n\t\t\t\t\trefspecs: readonly string[];\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { branch, ...opts } = options ?? {};\n\t\tlet ran = false;\n\t\tlet fetched: FetchedRemotes | undefined;\n\t\tlet snapshot: { patterns: string[]; before: Map<string, string> | undefined } | undefined;\n\t\ttry {\n\t\t\tif (isBranchReference(branch)) {\n\t\t\t\tconst resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\t\tif (resolved.remote == null) return;\n\n\t\t\t\t// A pull fetch stores the upstream into the local branch (see `fetchCore`)\n\t\t\t\tconst patterns = await this.getFetchSnapshotPatterns(\n\t\t\t\t\trepoPath,\n\t\t\t\t\tresolved.remote,\n\t\t\t\t\toptions?.pull ? [`${resolved.upstream}:${resolved.name}`] : undefined,\n\t\t\t\t);\n\t\t\t\tsnapshot = { patterns: patterns, before: await this.snapshotRefs(repoPath, patterns) };\n\t\t\t\tran = true;\n\t\t\t\tawait this.fetchCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tbranch: resolved.name,\n\t\t\t\t\t\tremote: resolved.remote,\n\t\t\t\t\t\tupstream: resolved.upstream!,\n\t\t\t\t\t\tpull: options?.pull,\n\t\t\t\t\t\tpreserveFetchHead: options?.preserveFetchHead,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// A bare fetch reads its default remote, or all of them: every remote's refspecs cover either\n\t\t\t\tconst patterns = await this.getFetchSnapshotPatterns(repoPath, opts.remote, opts.refspecs);\n\t\t\t\tsnapshot = { patterns: patterns, before: await this.snapshotRefs(repoPath, patterns) };\n\t\t\t\tran = true;\n\t\t\t\tawait this.fetchCore(repoPath, opts, runOptions);\n\t\t\t\tif (!opts.refspecs?.length) {\n\t\t\t\t\tfetched = opts.remote != null ? { remote: opts.remote } : opts.all ? 'all' : 'default';\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\t// A rejected fetch may have stored some of its refs before it failed\n\t\t\tif (ran) {\n\t\t\t\tawait this.announceFetch(repoPath, snapshot, () => this.getFetchChanges(branch, options));\n\t\t\t}\n\t\t\tif (fetched != null) {\n\t\t\t\tvoid this.followRemoteHeads(repoPath, fetched);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Writes the missing `refs/remotes/<remote>/HEAD` (the default branch the base reads) of each remote a fetch just\n\t * read with its configured refspecs, once per remote, on git < 2.48 — newer git's fetch creates it itself. A bare\n\t * fetch/pull reads every remote when `fetch.all` is set (git 2.44+), else its default remote. Right after the\n\t * fetch, so the credentials it used are still cached. Never awaited; never rejects, failures not retried.\n\t */\n\tprivate async followRemoteHeads(repoPath: string, fetched: FetchedRemotes): Promise<void> {\n\t\ttry {\n\t\t\tif (await this.git.supports('git:fetch:follow-remote-head')) return;\n\n\t\t\tconst commonPath = this.cache.getCommonPath(repoPath);\n\t\t\tconst pending = (names: string[]): string[] =>\n\t\t\t\tnames.filter(r => !this.followedRemoteHeads.has(`${commonPath}\\0${r}`));\n\n\t\t\t// One cached read for everything that picks the remotes\n\t\t\tconst config = await this.provider.config.getConfigRegex(\n\t\t\t\trepoPath,\n\t\t\t\t'^(fetch\\\\.all|remote\\\\..+\\\\.skipfetchall|branch\\\\..+\\\\.remote)$',\n\t\t\t);\n\n\t\t\tif (\n\t\t\t\tfetched === 'default' &&\n\t\t\t\tparseGitBoolean(config.get('fetch.all')) &&\n\t\t\t\t(await this.git.supports('git:fetch:all-config'))\n\t\t\t) {\n\t\t\t\tfetched = 'all';\n\t\t\t}\n\n\t\t\tlet remotes: string[];\n\t\t\tif (fetched === 'all') {\n\t\t\t\t// `fetch --all` skips the remotes marked `skipFetchAll`\n\t\t\t\tremotes = pending(\n\t\t\t\t\t(await this.provider.remotes.getRemotes(repoPath))\n\t\t\t\t\t\t.map(r => r.name)\n\t\t\t\t\t\t.filter(r => !parseGitBoolean(config.get(`remote.${r}.skipfetchall`))),\n\t\t\t\t);\n\t\t\t} else if (fetched === 'default') {\n\t\t\t\tconst remote = await this.getDefaultFetchRemote(repoPath, config);\n\t\t\t\tremotes = pending(remote != null ? [remote] : []);\n\t\t\t} else {\n\t\t\t\tremotes = pending([fetched.remote]);\n\t\t\t}\n\t\t\tif (!remotes.length) return;\n\n\t\t\tfor (const remote of remotes) {\n\t\t\t\tthis.followedRemoteHeads.add(`${commonPath}\\0${remote}`);\n\t\t\t}\n\t\t\tfor (const remote of remotes) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.provider.branches.setRemoteHeadIfMissing(repoPath, remote);\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\t/**\n\t * The remote a bare `fetch`/`pull` reads: the current branch's `branch.<name>.remote` (none for `.`, the local\n\t * repository), else the sole remote, else `origin`\n\t */\n\tprivate async getDefaultFetchRemote(repoPath: string, config: Map<string, string>): Promise<string | undefined> {\n\t\tconst current = await this.provider.branches.getBranch(repoPath);\n\t\tconst configured = current != null ? config.get(`branch.${current.name}.remote`) : undefined;\n\t\tif (configured) return configured === '.' ? undefined : configured;\n\n\t\tconst remotes = await this.provider.remotes.getRemotes(repoPath);\n\t\treturn remotes.length === 1 ? remotes[0].name : 'origin';\n\t}\n\n\t/**\n\t * The for-each-ref patterns covering every ref a fetch from `remote` (`undefined`: from any remote) may write: the\n\t * destinations of `refspecs`, those of the remote's configured `remote.<name>.fetch` refspecs (which a fetch of\n\t * explicit refspecs still updates opportunistically, and which may store into local branches, as a mirror's do),\n\t * and tags. A `remote` with no refspecs of its own may be a remote group (`remotes.<group>`), which fetches each of\n\t * its remotes, so every remote's destinations stand for it. When the configuration can't be read, all local and\n\t * remote-tracking branches stand for the configured destinations.\n\t */\n\tprivate async getFetchSnapshotPatterns(\n\t\trepoPath: string,\n\t\tremote: string | undefined,\n\t\trefspecs: readonly string[] | undefined,\n\t): Promise<string[]> {\n\t\tconst destinations: string[] = [];\n\t\tconst add = (refspec: string): void => {\n\t\t\tconst destination = getRefspecDestination(refspec);\n\t\t\tif (destination != null) {\n\t\t\t\tdestinations.push(destination);\n\t\t\t}\n\t\t};\n\n\t\tfor (const refspec of refspecs ?? []) {\n\t\t\tadd(refspec);\n\t\t}\n\n\t\tlet configured: Map<string, string[]> | undefined;\n\t\ttry {\n\t\t\tconfigured = await this.provider.config.getConfigRegexAll(repoPath, '^remote\\\\..+\\\\.fetch$');\n\t\t} catch {\n\t\t\tdestinations.unshift(...broadFetchDestinations);\n\t\t}\n\t\tconst ownKey = remote != null ? `remote.${remote}.fetch` : undefined;\n\t\tconst onlyKey = ownKey != null && configured?.has(ownKey) ? ownKey : undefined;\n\t\tfor (const [key, values] of configured ?? []) {\n\t\t\tif (onlyKey != null && key !== onlyKey) continue;\n\n\t\t\tfor (const refspec of values) {\n\t\t\t\tadd(refspec);\n\t\t\t}\n\t\t}\n\t\treturn getFetchSnapshotPatterns(destinations);\n\t}\n\n\t/**\n\t * Announces what a fetch moved. Its refs are compared with the snapshot taken before it ran, so a fetch that\n\t * brought nothing new announces nothing (and resets nothing), and one that did names exactly the refs it moved,\n\t * letting every worktree that doesn't track them skip its refresh. When either snapshot is missing, it announces\n\t * `fallback()`'s kinds unnamed, as if every ref of them may have moved; when a ref moved outside the kinds an\n\t * announcement can name (`refs/notes/*`), the kinds it did see, together with `fallback()`'s, unnamed.\n\t */\n\tprivate async announceFetch(\n\t\trepoPath: string,\n\t\tsnapshot: { patterns: string[]; before: Map<string, string> | undefined } | undefined,\n\t\tfallback: () => RepositoryChange[],\n\t): Promise<void> {\n\t\tconst after = snapshot?.before != null ? await this.snapshotRefs(repoPath, snapshot.patterns) : undefined;\n\n\t\tlet changes: RepositoryChange[] | undefined;\n\t\tlet moved: string[] | undefined;\n\t\tif (snapshot?.before != null && after != null) {\n\t\t\tmoved = getMovedRefs(snapshot.before, after);\n\t\t\tif (!moved.length) return;\n\n\t\t\tconst kinds = new Set<RepositoryChange>();\n\t\t\tlet unnameable = false;\n\t\t\tfor (const ref of moved) {\n\t\t\t\tconst kind = ref.startsWith('refs/') ? getRefChangeKind(ref) : undefined;\n\t\t\t\tif (kind != null) {\n\t\t\t\t\tkinds.add(kind);\n\t\t\t\t} else {\n\t\t\t\t\tunnameable = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unnameable) {\n\t\t\t\tfor (const kind of fallback()) {\n\t\t\t\t\tkinds.add(kind);\n\t\t\t\t}\n\t\t\t\tmoved = undefined;\n\t\t\t}\n\t\t\tchanges = fetchRefChangeKinds.filter(k => kinds.has(k));\n\t\t}\n\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\tif (changes != null && moved != null) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, moved);\n\t\t} else {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes ?? fallback());\n\t\t}\n\t}\n\n\t/**\n\t * Each ref under `patterns` (for-each-ref patterns) with its object and, for a symbolic ref, its target (a remote's\n\t * `HEAD` can move to another branch at the same commit), or `undefined` when git couldn't answer. A read, so it\n\t * announces nothing.\n\t */\n\tprivate async snapshotRefs(\n\t\trepoPath: string,\n\t\tpatterns: readonly string[],\n\t): Promise<Map<string, string> | undefined> {\n\t\ttry {\n\t\t\tconst result = await this.git.run(\n\t\t\t\t{ cwd: repoPath, errors: 'ignore' },\n\t\t\t\t'for-each-ref',\n\t\t\t\t'--format=%(refname)%00%(objectname)%00%(symref)',\n\t\t\t\t...patterns,\n\t\t\t);\n\t\t\t// `errors: 'ignore'` resolves a failed read empty, which would read as every ref deleted\n\t\t\tif (result.completion.status !== 'exited' || result.exitCode !== 0) return undefined;\n\n\t\t\tconst refs = new Map<string, string>();\n\t\t\tfor (const line of result.stdout.split('\\n')) {\n\t\t\t\tconst index = line.indexOf('\\0');\n\t\t\t\tif (index === -1) continue;\n\n\t\t\t\trefs.set(line.substring(0, index), line.substring(index + 1).trim());\n\t\t\t}\n\t\t\treturn refs;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/** `remotes`, plus `heads`/`tags` for any local branch or tag the fetch writes — a `pull` fetch writes `<upstream>:<branch>` */\n\tprivate getFetchChanges(\n\t\tbranch: GitBranchReference | undefined,\n\t\toptions: { pull?: boolean; refspecs?: readonly string[] } | undefined,\n\t): RepositoryChange[] {\n\t\tif (isBranchReference(branch)) {\n\t\t\treturn options?.pull ? ['heads', 'remotes'] : ['remotes'];\n\t\t}\n\t\tif (!options?.refspecs?.length) return ['remotes'];\n\n\t\tconst changes: RepositoryChange[] = ['remotes'];\n\t\tfor (const refspec of options.refspecs) {\n\t\t\tconst destination = getRefspecDestination(refspec);\n\t\t\tif (destination == null) continue;\n\n\t\t\tif (destination.startsWith('refs/tags/')) {\n\t\t\t\tif (!changes.includes('tags')) {\n\t\t\t\t\tchanges.push('tags');\n\t\t\t\t}\n\t\t\t} else if (destination.startsWith('refs/heads/')) {\n\t\t\t\tif (!changes.includes('heads')) {\n\t\t\t\t\tchanges.push('heads');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn changes;\n\t}\n\n\tprivate async fetchCore(\n\t\trepoPath: string,\n\t\toptions:\n\t\t\t| {\n\t\t\t\t\tall?: boolean;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote?: string;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tprune?: undefined;\n\t\t\t\t\tpull?: boolean;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tupstream: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * `-u` (`--update-head-ok`, the default) lets a `pull` fetch move a branch even where it is\n\t\t\t\t\t * checked out; `false` keeps git's own refusal as a guard against a stale worktree lookup.\n\t\t\t\t\t */\n\t\t\t\t\tupdateHeadOk?: boolean;\n\t\t\t\t\trefspecs?: undefined;\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tall?: undefined;\n\t\t\t\t\tbranch?: undefined;\n\t\t\t\t\tprune?: boolean;\n\t\t\t\t\tpull?: undefined;\n\t\t\t\t\tremote: string;\n\t\t\t\t\trefspecs: readonly string[];\n\t\t\t\t\tpreserveFetchHead?: boolean;\n\t\t\t },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['fetch'];\n\n\t\tif (options.prune) {\n\t\t\tparams.push('--prune');\n\t\t}\n\n\t\tif (options.preserveFetchHead && (await this.git.supports('git:fetch:no-write-fetch-head'))) {\n\t\t\tparams.push('--no-write-fetch-head');\n\t\t}\n\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream && options.pull) {\n\t\t\t\tif (options.updateHeadOk !== false) {\n\t\t\t\t\tparams.push('-u');\n\t\t\t\t}\n\t\t\t\tparams.push(options.remote, `${options.upstream}:${options.branch}`);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.upstream || options.branch);\n\t\t\t}\n\t\t} else if (options.refspecs?.length) {\n\t\t\tparams.push(options.remote, ...options.refspecs);\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'fetch',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew FetchError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tbranch: options?.branch,\n\t\t\t\t\t\t\tremote: options?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync merge(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { fastForward?: boolean | 'only'; noCommit?: boolean; squash?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['merge'];\n\n\t\tif (options?.fastForward === 'only') {\n\t\t\targs.push('--ff-only');\n\t\t} else if (options?.fastForward === true) {\n\t\t\targs.push('--ff');\n\t\t} else if (options?.fastForward === false) {\n\t\t\targs.push('--no-ff');\n\t\t}\n\t\tif (options?.squash) {\n\t\t\targs.push('--squash');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('--no-commit');\n\t\t}\n\n\t\targs.push(ref);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since merges can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'merge',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew MergeError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (MergeError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'merge');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync pull(\n\t\trepoPath: string,\n\t\toptions?: {\n\t\t\tbranch?: GitBranchReference;\n\t\t\tfastForward?: 'only';\n\t\t\trebase?: boolean;\n\t\t\ttags?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\t// Set once a git command is about to run, so a pull that fails partway (a merge or rebase stopping on a\n\t\t// conflict, a fetch that stored some refs) announces what it changed the way a finished one does\n\t\tlet announce: (() => void) | undefined;\n\t\t// A `pull` with no arguments fetches the branch's remote with its configured refspecs\n\t\tlet fetched: { repoPath: string; remotes: FetchedRemotes } | undefined;\n\t\ttry {\n\t\t\tif (isBranchReference(options?.branch)) {\n\t\t\t\tconst branch = options.branch;\n\t\t\t\t// Find the worktree where this branch is checked out (if any)\n\t\t\t\tconst worktree = await this.provider.worktrees?.getWorktree(\n\t\t\t\t\trepoPath,\n\t\t\t\t\twt => wt.branch?.name === branch.name,\n\t\t\t\t);\n\t\t\t\tif (worktree != null) {\n\t\t\t\t\t// Branch is checked out in a worktree — run git pull in that worktree's directory\n\t\t\t\t\t// Any rebase state (e.g. from `pull.rebase=true`) appears under the worktree path\n\t\t\t\t\tconst worktreePath = normalizePath(worktree.uri.fsPath);\n\t\t\t\t\t// Its HEAD, index and any paused merge or rebase belong to that worktree, not to `repoPath`\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.announcePull(repoPath);\n\t\t\t\t\t\tif (worktreePath !== normalizePath(repoPath)) {\n\t\t\t\t\t\t\tthis.announcePull(worktreePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'started');\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.pullCore(\n\t\t\t\t\t\t\tworktreePath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfetched = { repoPath: worktreePath, remotes: 'default' };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'ended');\n\t\t\t\t\t}\n\t\t\t\t} else if (options?.fastForward === 'only') {\n\t\t\t\t\t// Not checked out anywhere, so there is no working tree to merge into — but a fast-forward\n\t\t\t\t\t// needs none: fetching `<upstream>:<branch>` advances the local branch, and git refuses that\n\t\t\t\t\t// non-forced refspec unless it fast-forwards. A plain fetch would leave the branch unmoved\n\t\t\t\t\t// and report success.\n\t\t\t\t\t// Fetched without `-u`: the worktree lookup above is cached and can miss a worktree added\n\t\t\t\t\t// outside core, and then git's own refusal is what keeps a checked-out branch from moving.\n\t\t\t\t\tconst {\n\t\t\t\t\t\tname: branchName,\n\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\tupstream,\n\t\t\t\t\t} = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\t\t\tif (remoteName == null || upstream == null) {\n\t\t\t\t\t\tthrow new PullError({\n\t\t\t\t\t\t\treason: 'noUpstream',\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: ['pull', '--ff-only', branch.name] },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// A `pull` fetch writes `<upstream>:<branch>`, moving the local branch too — same\n\t\t\t\t\t// hooks `fetch()` fires for a pull fetch with a branch reference.\n\t\t\t\t\tannounce = () => {\n\t\t\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['heads', 'remotes']);\n\t\t\t\t\t};\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.fetchCore(\n\t\t\t\t\t\t\trepoPath,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbranch: branchName,\n\t\t\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\t\tpull: true,\n\t\t\t\t\t\t\t\tupdateHeadOk: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trunOptions,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tif (FetchError.is(ex, 'noFastForward')) {\n\t\t\t\t\t\t\tthrow new PullError(\n\t\t\t\t\t\t\t\t{ reason: 'noFastForward', gitCommand: ex.details.gitCommand },\n\t\t\t\t\t\t\t\tex.original,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow ex;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Branch is not checked out anywhere — can only fetch (no working tree to merge into)\n\t\t\t\t\tawait this.fetch(repoPath, { branch: branch }, runOptions);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tannounce = () => this.announcePull(repoPath);\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'started');\n\t\t\ttry {\n\t\t\t\tawait this.pullCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tfastForward: options?.fastForward,\n\t\t\t\t\t\trebase: options?.rebase,\n\t\t\t\t\t\ttags: options?.tags,\n\t\t\t\t\t\tsource: options?.source,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t\tfetched = { repoPath: repoPath, remotes: 'default' };\n\t\t\t} finally {\n\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'ended');\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\tannounce?.();\n\t\t\tif (fetched != null) {\n\t\t\t\tvoid this.followRemoteHeads(fetched.repoPath, fetched.remotes);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate announcePull(repoPath: string): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\n\t}\n\n\tprivate async pullCore(\n\t\trepoPath: string,\n\t\toptions: { fastForward?: 'only'; rebase?: boolean; tags?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['pull'];\n\n\t\tif (options.tags) {\n\t\t\tparams.push('--tags');\n\t\t}\n\n\t\tif (options.rebase) {\n\t\t\tparams.push('-r');\n\t\t}\n\n\t\tif (options.fastForward === 'only') {\n\t\t\tparams.push('--ff-only');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsPull, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'pull',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PullError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync push(\n\t\trepoPath: string,\n\t\toptions?: { reference?: GitReference; force?: boolean; publish?: { remote: string } },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tlet branchName: string;\n\t\tlet remoteName: string | undefined;\n\t\tlet upstreamName: string | undefined;\n\t\t// Whether the push itself writes `branch.<n>.remote/merge` (`-u`): only when it establishes tracking,\n\t\t// never to rewrite what a branch with a live upstream already has\n\t\tlet trackUpstream = options?.publish != null;\n\t\tlet setUpstream:\n\t\t\t| {\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tremoteBranch: string;\n\t\t\t }\n\t\t\t| undefined;\n\n\t\tif (isBranchReference(options?.reference)) {\n\t\t\tconst resolved = await resolveBranchRemote(\n\t\t\t\tthis.provider,\n\t\t\t\trepoPath,\n\t\t\t\toptions.reference,\n\t\t\t\trunOptions?.cancellation,\n\t\t\t);\n\t\t\tif (options.publish != null) {\n\t\t\t\tbranchName = options.reference.name;\n\t\t\t\tremoteName = options.publish.remote;\n\t\t\t} else {\n\t\t\t\tbranchName = resolved.name;\n\t\t\t\tremoteName = resolved.remote;\n\t\t\t}\n\t\t\t// A local upstream names a branch in this repository, never a branch on the remote being published to\n\t\t\tupstreamName = options.publish != null && resolved.local ? undefined : resolved.upstream;\n\t\t\ttrackUpstream ||= options.reference.upstream?.missing === true;\n\n\t\t\t// Without a remote, a bare `git push` would follow `push.default` somewhere the caller didn't pick\n\t\t\tif (options.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: options.reference.name });\n\t\t\t}\n\t\t} else {\n\t\t\tconst branch = await this.provider.branches.getBranch(repoPath);\n\t\t\tif (branch == null) return;\n\n\t\t\tconst resolved = await resolveBranchRemote(this.provider, repoPath, branch, runOptions?.cancellation);\n\t\t\tif (options?.reference != null) {\n\t\t\t\t// Onto the upstream's remote-side name, which a custom fetch refspec or a renamed upstream can make differ\n\t\t\t\tbranchName = `${options.reference.ref}:${\n\t\t\t\t\toptions?.publish != null ? `refs/heads/${resolved.name}` : (resolved.upstream ?? resolved.name)\n\t\t\t\t}`;\n\t\t\t} else {\n\t\t\t\tconst tracking = options?.publish == null ? resolved.upstream : undefined;\n\t\t\t\tbranchName =\n\t\t\t\t\ttracking != null && tracking !== resolved.name ? `${branch.name}:${tracking}` : branch.name;\n\t\t\t}\n\t\t\tremoteName = resolved.remote ?? options?.publish?.remote;\n\t\t\tif (options?.publish == null && remoteName == null) {\n\t\t\t\tthrow new PushError({ reason: 'noUpstream', branch: branch.name });\n\t\t\t}\n\n\t\t\tupstreamName = options?.reference == null && options?.publish != null ? branch.name : undefined;\n\n\t\t\t// Git can't setup upstream tracking when publishing a new branch to a specific commit, so we'll need to do it after the push\n\t\t\tif (options?.publish?.remote != null && options?.reference != null) {\n\t\t\t\tsetUpstream = {\n\t\t\t\t\tbranch: resolved.name,\n\t\t\t\t\tremote: remoteName!,\n\t\t\t\t\tremoteBranch: resolved.name,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tlet forceOpts: PushForceOptions | undefined;\n\t\tif (options?.force) {\n\t\t\t// Honor the host's force-push preferences (e.g. VS Code's `git.useForcePushWithLease` /\n\t\t\t// `git.useForcePushIfIncludes`); fall back to the safer `--force-with-lease` behavior.\n\t\t\tconst useForceWithLease = this.context.config?.push?.useForceWithLease ?? true;\n\t\t\tforceOpts = useForceWithLease\n\t\t\t\t? { withLease: true, ifIncludes: this.context.config?.push?.useForceIfIncludes ?? true }\n\t\t\t\t: { withLease: false };\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.pushCore(\n\t\t\t\trepoPath,\n\t\t\t\t{\n\t\t\t\t\tbranch: branchName,\n\t\t\t\t\tremote: remoteName,\n\t\t\t\t\tupstream: upstreamName,\n\t\t\t\t\tforce: forceOpts,\n\t\t\t\t\tsetUpstream: trackUpstream,\n\t\t\t\t},\n\t\t\t\trunOptions,\n\t\t\t);\n\n\t\t\t// Since Git can't setup upstream tracking when publishing a new branch to a specific commit, do it now.\n\t\t\t// Soft-fail: the push already succeeded, so don't let a local upstream-tracking failure (cancellation\n\t\t\t// arriving mid-spawn, transient git error) suppress the post-push hook fan-out below.\n\t\t\tif (setUpstream != null) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.git.run(\n\t\t\t\t\t\t{ cwd: repoPath, ...runOptions },\n\t\t\t\t\t\t'branch',\n\t\t\t\t\t\t'--set-upstream-to',\n\t\t\t\t\t\t`${setUpstream.remote}/${setUpstream.remoteBranch}`,\n\t\t\t\t\t\tsetUpstream.branch,\n\t\t\t\t\t);\n\t\t\t\t} catch (ex) {\n\t\t\t\t\tscope?.error(ex, 'Unable to set upstream tracking after publish');\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\t// A rejected push may have updated some of its remote-tracking refs before it failed\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches');\n\t\t\tconst changes: RepositoryChange[] = [];\n\t\t\tif (trackUpstream || setUpstream != null) {\n\t\t\t\tchanges.push('config');\n\t\t\t}\n\t\t\tif (options?.publish != null) {\n\t\t\t\tchanges.push('heads');\n\t\t\t}\n\t\t\tchanges.push('remotes');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes);\n\t\t}\n\t}\n\n\tprivate async pushCore(\n\t\trepoPath: string,\n\t\toptions: {\n\t\t\tbranch?: string;\n\t\t\tforce?: PushForceOptions;\n\t\t\tsetUpstream?: boolean;\n\t\t\tremote?: string;\n\t\t\tupstream?: string;\n\t\t\tdelete?: { remote: string; branch: string };\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['push'];\n\n\t\tif (options.force != null) {\n\t\t\tif (options.force.withLease) {\n\t\t\t\tparams.push('--force-with-lease');\n\t\t\t\tif (options.force.ifIncludes) {\n\t\t\t\t\tif (await this.git.supports('git:push:force-if-includes')) {\n\t\t\t\t\t\tparams.push('--force-if-includes');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams.push('--force');\n\t\t\t}\n\t\t}\n\n\t\t// `push` refuses a branch without a remote before reaching here, as this would drop the branch\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream) {\n\t\t\t\tif (options.setUpstream) {\n\t\t\t\t\tparams.push('-u');\n\t\t\t\t}\n\t\t\t\tparams.push(options.remote, `${options.branch}:${options.upstream}`);\n\t\t\t} else if (options.setUpstream) {\n\t\t\t\tparams.push('--set-upstream', options.remote, options.branch);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.branch);\n\t\t\t}\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.delete) {\n\t\t\tparams.push(options.delete.remote, `:${options.delete.branch}`);\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tconst error = getGitCommandError(\n\t\t\t\t'push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason,\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (options?.force?.withLease && error.details.reason === 'rejected') {\n\t\t\t\tif (ex.stderr && /! \\[rejected\\].*\\(stale info\\)/m.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLease',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\toptions.force.ifIncludes &&\n\t\t\t\t\tex.stderr &&\n\t\t\t\t\t/! \\[rejected\\].*\\(remote ref updated since checkout\\)/m.test(ex.stderr)\n\t\t\t\t) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLeaseIfIncludes',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (ex.stderr && GitErrors.pushRejectedRefDoesNotExists.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedRefDoesNotExist',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync rebase(\n\t\trepoPath: string,\n\t\tupstream: string,\n\t\toptions?: {\n\t\t\tautoStash?: boolean;\n\t\t\tbranch?: string;\n\t\t\teditor?: string;\n\t\t\tinteractive?: boolean;\n\t\t\tprogrammaticEditor?: boolean;\n\t\t\tautosquash?: boolean;\n\t\t\tmessageEditor?: string;\n\t\t\tonto?: string;\n\t\t\tupdateRefs?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['rebase'];\n\t\tconst configs: string[] = [];\n\n\t\tif (options?.autoStash !== false) {\n\t\t\targs.push('--autostash');\n\t\t}\n\n\t\tif (options?.interactive) {\n\t\t\targs.push('--interactive');\n\n\t\t\tif (options.editor) {\n\t\t\t\tconfigs.push('-c', `sequence.editor=${options.editor}`);\n\t\t\t}\n\n\t\t\t// A script-based sequence editor rewrites the todo by command word + SHA, so git must emit a\n\t\t\t// plain, natural-order todo regardless of the user's rebase config: `rebase.autosquash` would\n\t\t\t// reorder commits and rewrite `pick`→`fixup`, and `rebase.abbreviateCommands` would emit `p`.\n\t\t\tif (options.programmaticEditor) {\n\t\t\t\tconfigs.push('-c', 'rebase.autosquash=false', '-c', 'rebase.abbreviateCommands=false');\n\t\t\t}\n\t\t}\n\n\t\tif (options?.autosquash != null) {\n\t\t\tif (options.autosquash && options.programmaticEditor) {\n\t\t\t\tthrow new Error(l10n.t('rebase: autosquash cannot be combined with programmaticEditor'));\n\t\t\t}\n\n\t\t\t// `--no-autosquash` is passed explicitly when `false` — omitting the flag would let a\n\t\t\t// `rebase.autosquash=true` git config fold fixups anyway.\n\t\t\targs.push(options.autosquash ? '--autosquash' : '--no-autosquash');\n\t\t}\n\n\t\t// Drive per-commit message editing (the combined message a `squash` produces, or a `reword`).\n\t\t// `GIT_EDITOR` (not `core.editor`) is what git's interactive-rebase backend honors for the `reword`\n\t\t// amend step, so set it on the environment; also set `core.editor` config as a fallback.\n\t\tlet env = runOptions?.env;\n\t\tif (options?.messageEditor) {\n\t\t\tconfigs.push('-c', `core.editor=${options.messageEditor}`);\n\t\t\tenv = { ...env, GIT_EDITOR: options.messageEditor };\n\t\t}\n\n\t\tif (options?.updateRefs === true) {\n\t\t\targs.push('--update-refs');\n\t\t} else if (options?.updateRefs === false) {\n\t\t\targs.push('--no-update-refs');\n\t\t}\n\n\t\tif (options?.onto) {\n\t\t\targs.push('--onto', options.onto);\n\t\t}\n\n\t\targs.push(upstream);\n\n\t\tif (options?.branch) {\n\t\t\targs.push(options.branch);\n\t\t}\n\n\t\t// Fired before the process runs — `git rebase` exits 0 when stopping at `edit`/`break`,\n\t\t// so the result can't be used to detect that a rebase started\n\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'started');\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since rebases can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', configs: configs, timeout: 0, ...runOptions, env: env },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'rebase',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RebaseError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: args },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RebaseError.is(mapped, 'conflicts')) {\n\t\t\t\treturn await this.createConflictResult(repoPath, 'rebase');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t} finally {\n\t\t\t// The command exited (success, pause, or failure) — any rebase it left behind is on disk now\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'ended');\n\t\t}\n\t}\n\n\t@debug()\n\tasync reset(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: { mode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tawait this.resetCore(repoPath, rev, options?.mode, runOptions);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t} finally {\n\t\t\tthis.announceHeadChanged(repoPath);\n\t\t}\n\t}\n\n\tprivate async resetCore(\n\t\trepoPath: string,\n\t\trev: string,\n\t\tmode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['reset', '-q'];\n\t\tif (mode) {\n\t\t\tparams.push(`--${mode}`);\n\t\t}\n\t\tparams.push(rev, '--');\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'reset',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew ResetError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync restore(\n\t\trepoPath: string,\n\t\tpath: string | string[],\n\t\toptions?: { ref?: string; side?: 'ours' | 'theirs' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst paths = Array.isArray(path) ? path : [path];\n\t\tif (!paths.length) return;\n\n\t\tconst scope = getScopedLogger();\n\t\tconst normalized = paths.map(p => splitPath(p, repoPath, true)[0]);\n\n\t\t// `side` and `ref` are mutually exclusive in git (--ours/--theirs apply during conflict\n\t\t// resolution and take no source ref); side takes precedence if both are somehow supplied.\n\t\t// Use a truthy check on `ref` so an empty string falls through to index-restore rather than\n\t\t// producing a malformed `git checkout '' -- …`. Implemented via `checkout` rather than\n\t\t// `git restore` for compatibility with the minimum supported git (2.7.2); `git restore`\n\t\t// only landed in 2.23.\n\t\tconst selector = options?.side != null ? `--${options.side}` : options?.ref || undefined;\n\t\tconst prefix = selector != null ? ['checkout', selector, '--'] : ['checkout', '--'];\n\n\t\tlet ran = false;\n\t\ttry {\n\t\t\tif (await this.git.supports('git:checkout:pathspec-from-file')) {\n\t\t\t\t// Git ≥ 2.26: stream all pathspecs via stdin (NUL-separated) in a single invocation —\n\t\t\t\t// no CLI-length limit (so no batching), and robust for paths with spaces/newlines.\n\t\t\t\t// Pathspecs come from the file rather than argv, so `--` isn't used.\n\t\t\t\tconst args = ['checkout'];\n\t\t\t\tif (selector != null) {\n\t\t\t\t\targs.push(selector);\n\t\t\t\t}\n\t\t\t\targs.push('--pathspec-from-file=-', '--pathspec-file-nul');\n\t\t\t\tran = true;\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', ...runOptions, stdin: normalized.join('\\0') },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Older git: pass pathspecs as args, one git invocation per chunk (collapsing N\n\t\t\t\t// path-mode checkouts into ⌈N / chunk⌉ spawns). Reserve the command prefix length and\n\t\t\t\t// a per-arg overhead (separator + possible quoting) so the assembled command line\n\t\t\t\t// can't exceed the OS limit even with many short paths.\n\t\t\t\tconst perArgOverhead = 3;\n\t\t\t\tconst prefixLength = prefix.reduce((sum, arg) => sum + arg.length + perArgOverhead, 0);\n\t\t\t\tfor (const batch of chunkByStringLength(normalized, maxGitCliLength - prefixLength, perArgOverhead)) {\n\t\t\t\t\tran = true;\n\t\t\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...prefix, ...batch);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tref: options?.side ?? options?.ref,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: [...prefix, ...normalized] },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tif (ran) {\n\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'status');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['index']);\n\t\t\t}\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync revert(\n\t\trepoPath: string,\n\t\trefs: string[],\n\t\toptions?: { editMessage?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['revert'];\n\n\t\tif (options?.editMessage === true) {\n\t\t\targs.push('--edit');\n\t\t} else if (options?.editMessage === false) {\n\t\t\targs.push('--no-edit');\n\t\t}\n\n\t\targs.push(...refs);\n\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tawait this.git.run(\n\t\t\t\t\t// Avoid a timeout since reverts can take a long time (set to 0 to disable)\n\t\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t\t...args,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tthis.announceHeadChanged(repoPath);\n\t\t\t}\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tif (isRunHookFailure(ex)) throw ex;\n\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'revert',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RevertError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', refs: refs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RevertError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'revert');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t/**\n\t * Classifies `ex` as a signing failure; if so, fires the `commits.onSigningFailed`\n\t * hook and throws a typed {@link SigningError}. Callers should invoke this first\n\t * in their catch blocks, before falling through to command-specific error mapping\n\t * via {@link getGitCommandError}.\n\t *\n\t * `SigningFormat` is read opportunistically from `config.getSigningConfig`, with\n\t * {@link inferSigningFormatFromError} as a stderr-based fallback and `'gpg'` as\n\t * the final default.\n\t */\n\tprivate async throwIfSigningError(\n\t\trepoPath: string,\n\t\targs: readonly (string | undefined)[],\n\t\tex: unknown,\n\t\tsource?: unknown,\n\t): Promise<void> {\n\t\tconst reason = classifySigningError(ex);\n\t\tif (reason == null) return;\n\n\t\tlet format: SigningFormat | undefined;\n\t\ttry {\n\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t} catch {\n\t\t\t// Fall through — config read failed; use stderr-inferred format or gpg default\n\t\t}\n\t\tformat ??= inferSigningFormatFromError(ex) ?? 'gpg';\n\n\t\tthis.context.hooks?.commits?.onSigningFailed?.(reason, format, source);\n\t\tthrow new SigningError(\n\t\t\t{ reason: reason, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\tex instanceof Error ? ex : undefined,\n\t\t);\n\t}\n\n\t/**\n\t * Called once git has run, success or not — a rejected write can still have moved HEAD or left state behind.\n\t * `branchRef` is the full name of the one branch the write could have moved, when it knows it; `wroteTracking`\n\t * says it wrote that branch's tracking, to its own config section.\n\t */\n\tprivate announceHeadChanged(repoPath: string, branchRef?: string, wroteTracking?: boolean): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\tconst changes: RepositoryChange[] = wroteTracking\n\t\t\t? ['config', 'head', 'heads', 'index']\n\t\t\t: ['head', 'heads', 'index'];\n\t\tif (branchRef == null) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes);\n\t\t} else if (wroteTracking) {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, [branchRef], {\n\t\t\t\tconfigConfinedToRefs: true,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, changes, [branchRef]);\n\t\t}\n\t}\n\n\t/**\n\t * The full name of the branch HEAD is on, from the worktree's own `HEAD` file (`ref: refs/heads/main`): read around\n\t * a write, so it names the branch that write moved, whatever a switch outside core left in the caches; no git\n\t * runs. `undefined` when HEAD is detached, unreadable, or not a branch name git allows — a reftable repository's\n\t * `HEAD` file holds the placeholder `refs/heads/.invalid`, and its real HEAD is in the tables.\n\t */\n\tprivate async readHeadBranchRef(repoPath: string): Promise<string | undefined> {\n\t\ttry {\n\t\t\tconst gitDir = await this.provider.config.getGitDir(repoPath);\n\t\t\tconst head = new TextDecoder().decode(await this.context.fs.readFile(joinUriPath(gitDir.uri, 'HEAD')));\n\t\t\tconst ref = /^ref:\\s*(refs\\/heads\\/\\S+)\\s*$/.exec(head)?.[1];\n\t\t\treturn ref != null && !ref.split('/').some(part => part.startsWith('.')) ? ref : undefined;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/** The caller has already announced the change — the conflict is what the failed run left behind */\n\tprivate async createConflictResult(repoPath: string, command: GitConflictCommand): Promise<GitOperationResult> {\n\t\tlet conflicts: GitConflictFile[] | undefined;\n\t\ttry {\n\t\t\tconflicts = await this.provider.status.getConflictingFiles(repoPath);\n\t\t} catch (ex) {\n\t\t\t// Don't let a secondary status-read failure mask the original conflict signal\n\t\t\tLogger.warn(`Unable to read conflicting files after ${command}: ${ex}`);\n\t\t}\n\t\tthis.context.hooks?.operations?.onConflicted?.(command, conflicts);\n\t\treturn { conflicted: true, conflicts: conflicts };\n\t}\n}\n"],"mappings":"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"}
@@ -41,6 +41,7 @@ export declare class StashGitSubProvider implements GitStashSubProvider {
41
41
  }, runOptions?: GitOperationRunOptions): Promise<void>;
42
42
  private stashPushCore;
43
43
  saveSnapshot(repoPath: string, message?: string): Promise<void>;
44
+ /** For a drop or store, which move `refs/stash` (or its reflog, the rest of the list) */
44
45
  private announceStashChanged;
45
46
  }
46
47
  export declare function convertStashesToStdin(stashOrStashes: GitStash | ReadonlyMap<string, GitStashCommit> | undefined): {
@@ -17,6 +17,8 @@ import { createCommitFileset } from "./commitFilesetUtils.js";
17
17
  import { gate } from "../../utils/decorators/gate.js";
18
18
  import * as l10n from "@vscode/l10n";
19
19
  //#region ../git-cli/src/providers/stash.ts
20
+ /** The one ref a stash write moves: a push, pop, drop or store changes `refs/stash` or its reflog, never another ref */
21
+ const stashRefs = ["refs/stash"];
20
22
  var StashGitSubProvider = class {
21
23
  context;
22
24
  git;
@@ -36,11 +38,13 @@ var StashGitSubProvider = class {
36
38
  return this.applyStashCore(repoPath, args, options?.deleteAfter ? "stash-pop" : "stash-apply", runOptions);
37
39
  }
38
40
  async applyStashCore(repoPath, args, conflictCommand, runOptions) {
41
+ let dropped = false;
39
42
  try {
40
43
  await this.git.run({
41
44
  cwd: repoPath,
42
45
  ...runOptions
43
46
  }, ...args);
47
+ dropped = conflictCommand === "stash-pop";
44
48
  return { conflicted: false };
45
49
  } catch (ex) {
46
50
  if (isCancellationError(ex) || isRunHookFailure(ex)) throw ex;
@@ -60,7 +64,8 @@ var StashGitSubProvider = class {
60
64
  }, ex));
61
65
  } finally {
62
66
  this.context.hooks?.cache?.onReset?.(repoPath, "stashes", "status");
63
- this.context.hooks?.repository?.onChanged?.(repoPath, ["stash"]);
67
+ if (dropped) this.context.hooks?.repository?.onChanged?.(repoPath, ["stash"], stashRefs);
68
+ else this.context.hooks?.repository?.onChanged?.(repoPath, ["stash"]);
64
69
  }
65
70
  }
66
71
  async createStash(repoPath, message) {
@@ -236,7 +241,7 @@ var StashGitSubProvider = class {
236
241
  } finally {
237
242
  if (!nothingToSave) {
238
243
  this.context.hooks?.cache?.onReset?.(repoPath, "stashes", "status");
239
- this.context.hooks?.repository?.onChanged?.(repoPath, ["stash"]);
244
+ this.context.hooks?.repository?.onChanged?.(repoPath, ["stash"], stashRefs);
240
245
  }
241
246
  }
242
247
  }
@@ -251,9 +256,10 @@ var StashGitSubProvider = class {
251
256
  this.announceStashChanged(repoPath);
252
257
  }
253
258
  }
259
+ /** For a drop or store, which move `refs/stash` (or its reflog, the rest of the list) */
254
260
  announceStashChanged(repoPath) {
255
261
  this.context.hooks?.cache?.onReset?.(repoPath, "stashes");
256
- this.context.hooks?.repository?.onChanged?.(repoPath, ["stash"]);
262
+ this.context.hooks?.repository?.onChanged?.(repoPath, ["stash"], stashRefs);
257
263
  }
258
264
  };
259
265
  __decorate([gate(), debug()], StashGitSubProvider.prototype, "applyStash", null);
@@ -1 +1 @@
1
- {"version":3,"file":"stash.js","names":[],"sources":["../../../../git-cli/src/providers/stash.ts"],"sourcesContent":["import * as l10n from '@vscode/l10n';\nimport type { Cache } from '@gitlens/git/cache.js';\nimport type { GitServiceContext } from '@gitlens/git/context.js';\nimport { StashApplyError, StashPushError } from '@gitlens/git/errors.js';\nimport type { GitStashCommit } from '@gitlens/git/models/commit.js';\nimport { GitCommit, GitCommitIdentity } from '@gitlens/git/models/commit.js';\nimport { GitFileChange } from '@gitlens/git/models/fileChange.js';\nimport type { GitFileStatus } from '@gitlens/git/models/fileStatus.js';\nimport { GitFileWorkingTreeStatus } from '@gitlens/git/models/fileStatus.js';\nimport type { GitStash } from '@gitlens/git/models/stash.js';\nimport type { GitUser } from '@gitlens/git/models/user.js';\nimport type { GitOperationRunOptions } from '@gitlens/git/providers/operations.js';\nimport type { GitStashSubProvider, StashApplyResult } from '@gitlens/git/providers/stash.js';\nimport { countStringLength } from '@gitlens/utils/array.js';\nimport { isCancellationError } from '@gitlens/utils/cancellation.js';\nimport { gate } from '@gitlens/utils/decorators/gate.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { skip } from '@gitlens/utils/iterable.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport { getSettledValue } from '@gitlens/utils/promise.js';\nimport type { Uri } from '@gitlens/utils/uri.js';\nimport { fileUri, joinUriPath, toFsPath } from '@gitlens/utils/uri.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { gitFeaturesByVersion } from '../exec/features.js';\nimport type { Git } from '../exec/git.js';\nimport { getGitCommandError, GitError, GitErrors, isRunHookFailure, maxGitCliLength } from '../exec/git.js';\nimport type { ParsedStash, ParsedStashWithFiles } from '../parsers/logParser.js';\nimport { getStashFilesOnlyLogParser, getStashLogParser } from '../parsers/logParser.js';\nimport { createCommitFileset } from './commitFilesetUtils.js';\n\nexport class StashGitSubProvider implements GitStashSubProvider {\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@gate()\n\t@debug()\n\tasync applyStash(\n\t\trepoPath: string,\n\t\tstashNameOrSha: string,\n\t\toptions?: { deleteAfter?: boolean; index?: boolean },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<StashApplyResult> {\n\t\tif (!stashNameOrSha) return { conflicted: false };\n\n\t\tconst args = ['stash', options?.deleteAfter ? 'pop' : 'apply'];\n\t\tif (options?.index) {\n\t\t\targs.push('--index');\n\t\t}\n\t\targs.push(stashNameOrSha);\n\t\treturn this.applyStashCore(repoPath, args, options?.deleteAfter ? 'stash-pop' : 'stash-apply', runOptions);\n\t}\n\n\tprivate async applyStashCore(\n\t\trepoPath: string,\n\t\targs: string[],\n\t\tconflictCommand: 'stash-apply' | 'stash-pop',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<StashApplyResult> {\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, ...runOptions }, ...args);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tif (isCancellationError(ex) || isRunHookFailure(ex)) throw ex;\n\n\t\t\tif (ex instanceof Error) {\n\t\t\t\tconst msg: string = ex.message ?? '';\n\t\t\t\tif (\n\t\t\t\t\t(msg.includes('Auto-merging') && msg.includes('CONFLICT')) ||\n\t\t\t\t\t(ex instanceof GitError &&\n\t\t\t\t\t\t((ex.stdout?.includes('Auto-merging') && ex.stdout.includes('CONFLICT')) ||\n\t\t\t\t\t\t\tex.stdout?.includes('needs merge')))\n\t\t\t\t) {\n\t\t\t\t\tthis.context.hooks?.operations?.onConflicted?.(conflictCommand);\n\t\t\t\t\treturn { conflicted: true };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'stash-apply',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew StashApplyError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\t// A conflicted, failed or cancelled apply may already have changed the stash list or working tree\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'stashes', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['stash']);\n\t\t}\n\t}\n\n\t@debug()\n\tasync createStash(repoPath: string, message?: string): Promise<string | undefined> {\n\t\tconst args = ['stash', 'create'];\n\t\tif (message) {\n\t\t\targs.push(message);\n\t\t}\n\n\t\tconst result = await this.git.run({ cwd: repoPath }, ...args);\n\t\treturn result.stdout.trim() || undefined;\n\t}\n\n\t@debug()\n\tasync getStash(\n\t\trepoPath: string,\n\t\toptions?: {\n\t\t\tincludeFiles?: boolean;\n\t\t\treachableFrom?: string;\n\t\t\tsimilarityThreshold?: number | null;\n\t\t},\n\t\tcancellation?: AbortSignal,\n\t): Promise<GitStash | undefined> {\n\t\tif (repoPath == null) return undefined;\n\n\t\t// Resolve options against config up front so the cache key reflects the actual values used\n\t\t// to produce the cached payload — undefined inputs aren't conflated across config changes.\n\t\tconst cfg = this.context.config;\n\t\tconst includeFiles = options?.includeFiles ?? cfg?.commits.includeFileDetails?.(repoPath) ?? true;\n\t\tconst similarityThreshold = includeFiles\n\t\t\t? (options?.similarityThreshold ?? cfg?.commits.similarityThreshold ?? null)\n\t\t\t: null;\n\t\tconst reachableFrom = options?.reachableFrom;\n\n\t\t// Cache only the unfiltered stash list; reachability projection runs below by testing each\n\t\t// distinct stash parent against `reachableFrom` directly, so re-projecting is cheap\n\t\tconst cacheKey = `f${includeFiles ? 1 : 0}|s${similarityThreshold ?? ''}`;\n\n\t\tconst stash = await this.cache.getStash(\n\t\t\trepoPath,\n\t\t\tcacheKey,\n\t\t\tasync (commonPath, _cacheable, signal) => {\n\t\t\t\t// Prefer the aggregate signal from the cache; fall back to the caller's cancellation.\n\t\t\t\tsignal ??= cancellation;\n\t\t\t\tconst parser = getStashLogParser(includeFiles);\n\t\t\t\tconst args = [...parser.arguments];\n\n\t\t\t\tif (includeFiles) {\n\t\t\t\t\targs.push(`-M${similarityThreshold == null ? '' : `${similarityThreshold}%`}`);\n\t\t\t\t}\n\n\t\t\t\tconst result = await this.git.run({ cwd: repoPath, cancellation: signal }, 'stash', 'list', ...args);\n\n\t\t\t\tconst currentUser = await this.provider.config.getCurrentUser(repoPath);\n\n\t\t\t\tconst stashes = new Map<string, GitStashCommit>();\n\t\t\t\tfor (const s of parser.parse(result.stdout)) {\n\t\t\t\t\tstashes.set(s.sha, createStash(s, commonPath, currentUser));\n\t\t\t\t}\n\n\t\t\t\treturn { repoPath: commonPath, stashes: stashes };\n\t\t\t},\n\t\t\t{ cancellation: cancellation },\n\t\t);\n\n\t\tif (stash == null || !reachableFrom || !stash.stashes.size) return stash;\n\n\t\t// Copy because the cached `stash.stashes` map is shared and must not be mutated.\n\t\tconst stashes = new Map(stash.stashes);\n\n\t\tconst reachableStashes = new Set<string>();\n\n\t\t// Metadata pass: a stash belongs on `reachableFrom` iff git's auto-prepended\n\t\t// `On <branch>: …` (or `WIP on <branch>: …`) prefix in the stash commit subject names\n\t\t// this branch. `stashOnRef` is parsed from %s in createStash, so this covers autostashes\n\t\t// and custom-reflog stashes too.\n\t\tfor (const [sha, s] of stash.stashes) {\n\t\t\tif (s.stashOnRef === reachableFrom) {\n\t\t\t\treachableStashes.add(sha);\n\t\t\t}\n\t\t}\n\n\t\t// Transitive pass for the rare detached-HEAD-on-stash chain (stash B created while HEAD\n\t\t// pointed at stash A). Such stashes have no `stashOnRef`, but if their parent is a stash\n\t\t// already marked reachable they should follow.\n\t\tlet changed;\n\t\tdo {\n\t\t\tchanged = false;\n\t\t\tfor (const [sha, s] of stash.stashes) {\n\t\t\t\tif (!reachableStashes.has(sha) && s.parents.some(p => reachableStashes.has(p))) {\n\t\t\t\t\treachableStashes.add(sha);\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} while (changed);\n\n\t\tfor (const [sha] of stash.stashes) {\n\t\t\tif (!reachableStashes.has(sha)) {\n\t\t\t\tstashes.delete(sha);\n\t\t\t}\n\t\t}\n\n\t\treturn { ...stash, stashes: stashes };\n\t}\n\n\t@debug()\n\tasync getStashCommitFiles(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { similarityThreshold?: number | null },\n\t\tcancellation?: AbortSignal,\n\t): Promise<GitFileChange[]> {\n\t\tconst [stashFilesResult, stashUntrackedFilesResult] = await Promise.allSettled([\n\t\t\t// Don't include untracked files here, because we won't be able to tell them apart from added (and we need the untracked status)\n\t\t\tthis.getStashCommitFilesCore(repoPath, ref, { untracked: false, ...options }, cancellation),\n\t\t\t// Check for any untracked files -- since git doesn't return them via `git stash list` :(\n\t\t\t// See https://stackoverflow.com/questions/12681529/\n\t\t\tthis.getStashCommitFilesCore(repoPath, ref, { untracked: 'only', ...options }, cancellation),\n\t\t]);\n\n\t\tlet files = getSettledValue(stashFilesResult);\n\t\tconst untrackedFiles = getSettledValue(stashUntrackedFilesResult);\n\n\t\tif (files?.length && untrackedFiles?.length) {\n\t\t\tfiles.push(...untrackedFiles);\n\t\t} else {\n\t\t\tfiles = files ?? untrackedFiles;\n\t\t}\n\n\t\treturn files ?? [];\n\t}\n\n\tprivate async getStashCommitFilesCore(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { similarityThreshold?: number | null; untracked?: boolean | 'only' },\n\t\tcancellation?: AbortSignal,\n\t): Promise<GitFileChange[] | undefined> {\n\t\tconst args = [];\n\t\tif (options?.untracked) {\n\t\t\targs.push(options?.untracked === 'only' ? '--only-untracked' : '--include-untracked');\n\t\t}\n\n\t\tconst similarityThreshold = options?.similarityThreshold ?? this.context.config?.commits.similarityThreshold;\n\t\tif (similarityThreshold != null) {\n\t\t\targs.push(`-M${similarityThreshold}%`);\n\t\t}\n\n\t\tconst parser = getStashFilesOnlyLogParser();\n\t\tconst result = await this.git.run(\n\t\t\t{ cwd: repoPath, cancellation: cancellation },\n\t\t\t'stash',\n\t\t\t'show',\n\t\t\t...args,\n\t\t\t...parser.arguments,\n\t\t\tref,\n\t\t);\n\n\t\tconst repoUri = fileUri(normalizePath(repoPath));\n\t\tfor (const s of parser.parse(result.stdout)) {\n\t\t\treturn (\n\t\t\t\ts.files?.map(\n\t\t\t\t\tf =>\n\t\t\t\t\t\tnew GitFileChange(\n\t\t\t\t\t\t\trepoPath,\n\t\t\t\t\t\t\tf.path,\n\t\t\t\t\t\t\t(options?.untracked === 'only'\n\t\t\t\t\t\t\t\t? GitFileWorkingTreeStatus.Untracked\n\t\t\t\t\t\t\t\t: f.status) as GitFileStatus,\n\t\t\t\t\t\t\tjoinUriPath(repoUri, normalizePath(f.path)),\n\t\t\t\t\t\t\tf.originalPath,\n\t\t\t\t\t\t\tf.originalPath != null ? joinUriPath(repoUri, normalizePath(f.originalPath)) : undefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tf.additions || f.deletions\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tadditions: f.additions ?? 0,\n\t\t\t\t\t\t\t\t\t\tdeletions: f.deletions ?? 0,\n\t\t\t\t\t\t\t\t\t\tchanges: 0,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tf.mode,\n\t\t\t\t\t\t),\n\t\t\t\t) ?? []\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t@debug()\n\tasync deleteStash(repoPath: string, stashName: string, sha?: string): Promise<void> {\n\t\tawait this.deleteStashCore(repoPath, stashName, sha, { announce: true });\n\t}\n\n\t// Keyed without `options`, so a delete and a rename of the same stash share one drop: a second drop would take\n\t// the stash that moved up into its place\n\t@gate((rp, name, sha) => `${rp}\\0${name}\\0${sha ?? ''}`)\n\tprivate async deleteStashCore(\n\t\trepoPath: string,\n\t\tstashName: string,\n\t\tsha: string | undefined,\n\t\toptions: { announce: boolean; verified?: boolean },\n\t): Promise<string | undefined> {\n\t\tif (!stashName) return undefined;\n\n\t\tif (!options.verified) {\n\t\t\tawait this.verifyStashSha(repoPath, stashName, sha);\n\t\t}\n\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await this.git.run({ cwd: repoPath }, 'stash', 'drop', stashName);\n\t\t} finally {\n\t\t\tif (options.announce) {\n\t\t\t\tthis.announceStashChanged(repoPath);\n\t\t\t}\n\t\t}\n\t\treturn result.stdout;\n\t}\n\n\tprivate async verifyStashSha(repoPath: string, stashName: string, sha: string | undefined): Promise<void> {\n\t\tif (!sha) return;\n\n\t\tconst result = await this.git.run(\n\t\t\t{ cwd: repoPath, errors: 'ignore' },\n\t\t\t'show',\n\t\t\t'--format=%H',\n\t\t\t'--no-patch',\n\t\t\tstashName,\n\t\t);\n\t\tif (result.stdout.trim() !== sha) {\n\t\t\tthrow new Error(l10n.t('Unable to delete stash; mismatch with stash number'));\n\t\t}\n\t}\n\n\t@debug()\n\tasync renameStash(\n\t\trepoPath: string,\n\t\tstashName: string,\n\t\tsha: string,\n\t\tmessage: string,\n\t\tstashOnRef?: string,\n\t): Promise<void> {\n\t\tif (stashName) {\n\t\t\tawait this.verifyStashSha(repoPath, stashName, sha);\n\t\t}\n\n\t\t// The drop and the store announce once, after both ran, even if the store fails\n\t\ttry {\n\t\t\tawait this.deleteStashCore(repoPath, stashName, sha, { announce: false, verified: true });\n\t\t\tawait this.git.run(\n\t\t\t\t{ cwd: repoPath },\n\t\t\t\t'stash',\n\t\t\t\t'store',\n\t\t\t\t'-m',\n\t\t\t\tstashOnRef ? `On ${stashOnRef}: ${message}` : message,\n\t\t\t\tsha,\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.announceStashChanged(repoPath);\n\t\t}\n\t}\n\n\t@debug({ args: (repoPath, message, paths) => ({ repoPath: repoPath, message: message, paths: paths?.length }) })\n\tasync saveStash(\n\t\trepoPath: string,\n\t\tmessage?: string,\n\t\tpathsOrUris?: (string | Uri)[],\n\t\toptions?: { includeUntracked?: boolean; keepIndex?: boolean; onlyStaged?: boolean },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst paths = pathsOrUris?.map(toFsPath);\n\t\tif (!paths?.length) {\n\t\t\tawait this.stashPushCore(repoPath, message, options, runOptions);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.git.ensureSupports('git:stash:push:pathspecs', (requiredVersion, installedVersion) =>\n\t\t\tl10n.t(\n\t\t\t\t'Stashing individual files requires a newer version of Git (>= {0}) than is currently installed ({1}). Please retry by stashing everything or install a more recent version of Git and try again.',\n\t\t\t\trequiredVersion,\n\t\t\t\tinstalledVersion,\n\t\t\t),\n\t\t);\n\n\t\tconst pathspecs = paths.map(p => `./${splitPath(p, repoPath)[0]}`);\n\n\t\tlet stdin = await this.git.supports('git:stash:push:stdin');\n\t\tif (stdin && options?.onlyStaged && paths.length) {\n\t\t\t// Since Git doesn't support --staged with --pathspec-from-file try to pass them in directly\n\t\t\tstdin = false;\n\t\t}\n\n\t\t// If we don't support stdin, then error out if we are over the maximum allowed git cli length\n\t\tif (!stdin && countStringLength(pathspecs) > maxGitCliLength) {\n\t\t\tawait this.git.ensureSupports('git:stash:push:stdin', (requiredVersion, installedVersion) =>\n\t\t\t\tl10n.t(\n\t\t\t\t\t'Stashing so many files ({0}) at once requires a newer version of Git (>= {1}) than is currently installed ({2}). Please retry by stashing fewer files or install a more recent version of Git and try again.',\n\t\t\t\t\tpathspecs.length,\n\t\t\t\t\trequiredVersion,\n\t\t\t\t\tinstalledVersion,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tawait this.stashPushCore(\n\t\t\trepoPath,\n\t\t\tmessage,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\tpathspecs: pathspecs,\n\t\t\t\tstdin: stdin,\n\t\t\t},\n\t\t\trunOptions,\n\t\t);\n\t}\n\n\tprivate async stashPushCore(\n\t\trepoPath: string,\n\t\tmessage?: string,\n\t\toptions?: {\n\t\t\tincludeUntracked?: boolean;\n\t\t\tkeepIndex?: boolean;\n\t\t\tonlyStaged?: boolean;\n\t\t\tpathspecs?: string[];\n\t\t\tstdin?: boolean;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['stash', 'push'];\n\n\t\tif ((options?.includeUntracked || options?.pathspecs?.length) && !options?.onlyStaged) {\n\t\t\tparams.push('--include-untracked');\n\t\t}\n\n\t\t// `git stash push --keep-index --include-untracked -- <pathspec>` hits a bug in git when the\n\t\t// pathspec names an untracked file: the restoring checkout can't match an untracked path in the\n\t\t// index tree, so it fails and the staged changes are lost.\n\t\t//\n\t\t// $ mkdir stash-test && cd stash-test && git init\n\t\t// $ echo a > a.txt\n\t\t// $ git add a.txt\n\t\t// $ git commit -m init\n\t\t// $ echo b > b.txt\n\t\t// $ git stash push --keep-index --include-untracked -- b.txt\n\t\t// Saved working directory and index state WIP on main: 8a280fe init\n\t\t// error: pathspec ':(prefix:0)b.txt' did not match any file(s) known to git\n\t\t//\n\t\t// Only suppress --keep-index for that case — when the selection actually includes untracked\n\t\t// files (`includeUntracked`) AND we're stashing by pathspec. Keying off `includeUntracked` (the\n\t\t// caller's intent) rather than the `--include-untracked` flag is deliberate: we add\n\t\t// `--include-untracked` to every pathspec push above as a safety net, but a tracked-only\n\t\t// selection can — and must — still keep the index intact.\n\t\tif (options?.keepIndex && !(options?.includeUntracked && options?.pathspecs?.length)) {\n\t\t\tparams.push('--keep-index');\n\t\t}\n\n\t\tif (options?.onlyStaged) {\n\t\t\tif (await this.git.supports('git:stash:push:staged')) {\n\t\t\t\tparams.push('--staged');\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tl10n.t(\n\t\t\t\t\t\t'Git version {0} or higher is required for --staged',\n\t\t\t\t\t\tString(gitFeaturesByVersion.get('git:stash:push:staged')),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (message) {\n\t\t\tparams.push('-m', message);\n\t\t}\n\n\t\tlet stdin;\n\t\tif (options?.pathspecs?.length) {\n\t\t\tif (options.stdin) {\n\t\t\t\tstdin = options.pathspecs.join('\\0');\n\t\t\t\tparams.push('--pathspec-from-file=-', '--pathspec-file-nul', '--');\n\t\t\t} else {\n\t\t\t\tparams.push('--', ...options.pathspecs);\n\t\t\t}\n\t\t} else {\n\t\t\tparams.push('--');\n\t\t}\n\n\t\tlet nothingToSave = false;\n\t\ttry {\n\t\t\tconst result = await this.git.run({ cwd: repoPath, ...runOptions, stdin: stdin }, ...params);\n\t\t\tif (GitErrors.stashNothingToSave.test(result.stdout)) {\n\t\t\t\tnothingToSave = true;\n\t\t\t\tthrow new StashPushError({\n\t\t\t\t\treason: 'nothingToSave',\n\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tif (ex instanceof StashPushError || isCancellationError(ex) || isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'stash-push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew StashPushError(\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} finally {\n\t\t\t// A failed or cancelled push may already have stashed, and reset the working tree; one with nothing to\n\t\t\t// save changed nothing\n\t\t\tif (!nothingToSave) {\n\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'stashes', 'status');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['stash']);\n\t\t\t}\n\t\t}\n\t}\n\n\t@debug()\n\tasync saveSnapshot(repoPath: string, message?: string): Promise<void> {\n\t\tconst result = await this.git.run({ cwd: repoPath }, 'stash', 'create');\n\t\tconst id = result.stdout.trim() || undefined;\n\t\tif (id == null) return;\n\n\t\tconst args = [];\n\t\tif (message) {\n\t\t\targs.push('-m', message);\n\t\t}\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath }, 'stash', 'store', ...args, id);\n\t\t} finally {\n\t\t\tthis.announceStashChanged(repoPath);\n\t\t}\n\t}\n\n\tprivate announceStashChanged(repoPath: string): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'stashes');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['stash']);\n\t}\n}\n\nexport function convertStashesToStdin(stashOrStashes: GitStash | ReadonlyMap<string, GitStashCommit> | undefined): {\n\treadonly stdin: string | undefined;\n\treadonly stashes: Map<string, GitStashCommit>;\n\treadonly remappedIds: Map<string, string>;\n} {\n\tconst remappedIds = new Map<string, string>();\n\tif (stashOrStashes == null) return { stdin: undefined, stashes: new Map(), remappedIds: remappedIds };\n\n\tlet stdin: string | undefined;\n\tconst original = 'stashes' in stashOrStashes ? stashOrStashes.stashes : stashOrStashes;\n\tconst stashes = new Map<string, GitStashCommit>(original);\n\n\tif (original.size) {\n\t\tstdin = '';\n\t\tfor (const stash of original.values()) {\n\t\t\tstdin += `${stash.sha.substring(0, 9)}\\n`;\n\t\t\t// Include the stash's 2nd (index files) and 3rd (untracked files) parents (if they aren't already in the map)\n\t\t\tfor (const p of skip(stash.parents, 1)) {\n\t\t\t\tremappedIds.set(p, stash.sha);\n\n\t\t\t\tif (!stashes.has(p)) {\n\t\t\t\t\tstashes.set(p, stash);\n\t\t\t\t\tstdin += `${p.substring(0, 9)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { stdin: stdin || undefined, stashes: stashes, remappedIds: remappedIds };\n}\n\nconst stashSummaryRegex =\n\t// oxlint-disable-next-line no-control-regex\n\t/(?:(?:(?<wip>WIP) on|On) (?<onref>[^/](?!.*\\/\\.)(?!.*\\.\\.)(?!.*\\/\\/)(?!.*@\\{)[^\\x00-\\x1F\\x7F ~^:?*[\\\\]+[^./]):\\s*)?(?<summary>.*)$/s;\n\nfunction createStash(\n\ts: ParsedStash | ParsedStashWithFiles,\n\trepoPath: string,\n\tcurrentUser: GitUser | undefined,\n): GitStashCommit {\n\t// `onRef` comes from the commit subject (%s), which git always prefixes with `On <branch>: …`\n\t// or `WIP on <branch>: …`. This holds even when the reflog message was customized\n\t// (autostash, `git stash store -m \"…\"`), so it's a reliable source\n\tlet onRef: string | undefined;\n\tconst subjectMatch = stashSummaryRegex.exec((s.commitSubject ?? '').trim());\n\tif (subjectMatch?.groups?.onref) {\n\t\tonRef = subjectMatch.groups.onref;\n\t}\n\n\t// The user-visible display message is derived from the reflog subject (%gs) so that short\n\t// custom messages like \"wip\", \"q\", or \"show args\" stay as the user wrote them instead of\n\t// being replaced by the verbose git-auto subject\n\tlet message = s.summary.trim();\n\tconst reflogMatch = stashSummaryRegex.exec(message);\n\tif (reflogMatch?.groups != null) {\n\t\tconst summary = reflogMatch.groups.summary.trim();\n\t\tif (summary.length === 0) {\n\t\t\tmessage = 'WIP';\n\t\t} else if (reflogMatch.groups.wip) {\n\t\t\tmessage = `WIP: ${summary}`;\n\t\t} else {\n\t\t\tmessage = summary;\n\t\t}\n\t}\n\n\tconst index = message.indexOf('\\n');\n\n\treturn new GitCommit(\n\t\trepoPath,\n\t\ts.sha,\n\t\tnew GitCommitIdentity(\n\t\t\tcurrentUser?.name ?? '',\n\t\t\tcurrentUser?.email,\n\t\t\tnew Date(Number(s.authorDate) * 1000),\n\t\t\tundefined,\n\t\t\ttrue,\n\t\t),\n\t\tnew GitCommitIdentity(\n\t\t\tcurrentUser?.name ?? '',\n\t\t\tcurrentUser?.email,\n\t\t\tnew Date(Number(s.committedDate) * 1000),\n\t\t\tundefined,\n\t\t\ttrue,\n\t\t),\n\t\tindex !== -1 ? message.substring(0, index) : message,\n\t\ts.parents.split(' ') ?? [],\n\t\tmessage,\n\t\tcreateCommitFileset(s, repoPath, undefined),\n\t\ts.stats,\n\t\tundefined,\n\t\tundefined,\n\t\ts.stashName,\n\t\tonRef,\n\t) as GitStashCommit;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stash.js","names":[],"sources":["../../../../git-cli/src/providers/stash.ts"],"sourcesContent":["import * as l10n from '@vscode/l10n';\nimport type { Cache } from '@gitlens/git/cache.js';\nimport type { GitServiceContext } from '@gitlens/git/context.js';\nimport { StashApplyError, StashPushError } from '@gitlens/git/errors.js';\nimport type { GitStashCommit } from '@gitlens/git/models/commit.js';\nimport { GitCommit, GitCommitIdentity } from '@gitlens/git/models/commit.js';\nimport { GitFileChange } from '@gitlens/git/models/fileChange.js';\nimport type { GitFileStatus } from '@gitlens/git/models/fileStatus.js';\nimport { GitFileWorkingTreeStatus } from '@gitlens/git/models/fileStatus.js';\nimport type { GitStash } from '@gitlens/git/models/stash.js';\nimport type { GitUser } from '@gitlens/git/models/user.js';\nimport type { GitOperationRunOptions } from '@gitlens/git/providers/operations.js';\nimport type { GitStashSubProvider, StashApplyResult } from '@gitlens/git/providers/stash.js';\nimport { countStringLength } from '@gitlens/utils/array.js';\nimport { isCancellationError } from '@gitlens/utils/cancellation.js';\nimport { gate } from '@gitlens/utils/decorators/gate.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { skip } from '@gitlens/utils/iterable.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport { getSettledValue } from '@gitlens/utils/promise.js';\nimport type { Uri } from '@gitlens/utils/uri.js';\nimport { fileUri, joinUriPath, toFsPath } from '@gitlens/utils/uri.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { gitFeaturesByVersion } from '../exec/features.js';\nimport type { Git } from '../exec/git.js';\nimport { getGitCommandError, GitError, GitErrors, isRunHookFailure, maxGitCliLength } from '../exec/git.js';\nimport type { ParsedStash, ParsedStashWithFiles } from '../parsers/logParser.js';\nimport { getStashFilesOnlyLogParser, getStashLogParser } from '../parsers/logParser.js';\nimport { createCommitFileset } from './commitFilesetUtils.js';\n\n/** The one ref a stash write moves: a push, pop, drop or store changes `refs/stash` or its reflog, never another ref */\nconst stashRefs: readonly string[] = ['refs/stash'];\n\nexport class StashGitSubProvider implements GitStashSubProvider {\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@gate()\n\t@debug()\n\tasync applyStash(\n\t\trepoPath: string,\n\t\tstashNameOrSha: string,\n\t\toptions?: { deleteAfter?: boolean; index?: boolean },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<StashApplyResult> {\n\t\tif (!stashNameOrSha) return { conflicted: false };\n\n\t\tconst args = ['stash', options?.deleteAfter ? 'pop' : 'apply'];\n\t\tif (options?.index) {\n\t\t\targs.push('--index');\n\t\t}\n\t\targs.push(stashNameOrSha);\n\t\treturn this.applyStashCore(repoPath, args, options?.deleteAfter ? 'stash-pop' : 'stash-apply', runOptions);\n\t}\n\n\tprivate async applyStashCore(\n\t\trepoPath: string,\n\t\targs: string[],\n\t\tconflictCommand: 'stash-apply' | 'stash-pop',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<StashApplyResult> {\n\t\t// Only a clean pop is known to have moved `refs/stash`: a conflicted one keeps the entry\n\t\tlet dropped = false;\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, ...runOptions }, ...args);\n\t\t\tdropped = conflictCommand === 'stash-pop';\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tif (isCancellationError(ex) || isRunHookFailure(ex)) throw ex;\n\n\t\t\tif (ex instanceof Error) {\n\t\t\t\tconst msg: string = ex.message ?? '';\n\t\t\t\tif (\n\t\t\t\t\t(msg.includes('Auto-merging') && msg.includes('CONFLICT')) ||\n\t\t\t\t\t(ex instanceof GitError &&\n\t\t\t\t\t\t((ex.stdout?.includes('Auto-merging') && ex.stdout.includes('CONFLICT')) ||\n\t\t\t\t\t\t\tex.stdout?.includes('needs merge')))\n\t\t\t\t) {\n\t\t\t\t\tthis.context.hooks?.operations?.onConflicted?.(conflictCommand);\n\t\t\t\t\treturn { conflicted: true };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'stash-apply',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew StashApplyError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\t// A conflicted, failed or cancelled apply may already have changed the stash list or working tree\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'stashes', 'status');\n\t\t\tif (dropped) {\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['stash'], stashRefs);\n\t\t\t} else {\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['stash']);\n\t\t\t}\n\t\t}\n\t}\n\n\t@debug()\n\tasync createStash(repoPath: string, message?: string): Promise<string | undefined> {\n\t\tconst args = ['stash', 'create'];\n\t\tif (message) {\n\t\t\targs.push(message);\n\t\t}\n\n\t\tconst result = await this.git.run({ cwd: repoPath }, ...args);\n\t\treturn result.stdout.trim() || undefined;\n\t}\n\n\t@debug()\n\tasync getStash(\n\t\trepoPath: string,\n\t\toptions?: {\n\t\t\tincludeFiles?: boolean;\n\t\t\treachableFrom?: string;\n\t\t\tsimilarityThreshold?: number | null;\n\t\t},\n\t\tcancellation?: AbortSignal,\n\t): Promise<GitStash | undefined> {\n\t\tif (repoPath == null) return undefined;\n\n\t\t// Resolve options against config up front so the cache key reflects the actual values used\n\t\t// to produce the cached payload — undefined inputs aren't conflated across config changes.\n\t\tconst cfg = this.context.config;\n\t\tconst includeFiles = options?.includeFiles ?? cfg?.commits.includeFileDetails?.(repoPath) ?? true;\n\t\tconst similarityThreshold = includeFiles\n\t\t\t? (options?.similarityThreshold ?? cfg?.commits.similarityThreshold ?? null)\n\t\t\t: null;\n\t\tconst reachableFrom = options?.reachableFrom;\n\n\t\t// Cache only the unfiltered stash list; reachability projection runs below by testing each\n\t\t// distinct stash parent against `reachableFrom` directly, so re-projecting is cheap\n\t\tconst cacheKey = `f${includeFiles ? 1 : 0}|s${similarityThreshold ?? ''}`;\n\n\t\tconst stash = await this.cache.getStash(\n\t\t\trepoPath,\n\t\t\tcacheKey,\n\t\t\tasync (commonPath, _cacheable, signal) => {\n\t\t\t\t// Prefer the aggregate signal from the cache; fall back to the caller's cancellation.\n\t\t\t\tsignal ??= cancellation;\n\t\t\t\tconst parser = getStashLogParser(includeFiles);\n\t\t\t\tconst args = [...parser.arguments];\n\n\t\t\t\tif (includeFiles) {\n\t\t\t\t\targs.push(`-M${similarityThreshold == null ? '' : `${similarityThreshold}%`}`);\n\t\t\t\t}\n\n\t\t\t\tconst result = await this.git.run({ cwd: repoPath, cancellation: signal }, 'stash', 'list', ...args);\n\n\t\t\t\tconst currentUser = await this.provider.config.getCurrentUser(repoPath);\n\n\t\t\t\tconst stashes = new Map<string, GitStashCommit>();\n\t\t\t\tfor (const s of parser.parse(result.stdout)) {\n\t\t\t\t\tstashes.set(s.sha, createStash(s, commonPath, currentUser));\n\t\t\t\t}\n\n\t\t\t\treturn { repoPath: commonPath, stashes: stashes };\n\t\t\t},\n\t\t\t{ cancellation: cancellation },\n\t\t);\n\n\t\tif (stash == null || !reachableFrom || !stash.stashes.size) return stash;\n\n\t\t// Copy because the cached `stash.stashes` map is shared and must not be mutated.\n\t\tconst stashes = new Map(stash.stashes);\n\n\t\tconst reachableStashes = new Set<string>();\n\n\t\t// Metadata pass: a stash belongs on `reachableFrom` iff git's auto-prepended\n\t\t// `On <branch>: …` (or `WIP on <branch>: …`) prefix in the stash commit subject names\n\t\t// this branch. `stashOnRef` is parsed from %s in createStash, so this covers autostashes\n\t\t// and custom-reflog stashes too.\n\t\tfor (const [sha, s] of stash.stashes) {\n\t\t\tif (s.stashOnRef === reachableFrom) {\n\t\t\t\treachableStashes.add(sha);\n\t\t\t}\n\t\t}\n\n\t\t// Transitive pass for the rare detached-HEAD-on-stash chain (stash B created while HEAD\n\t\t// pointed at stash A). Such stashes have no `stashOnRef`, but if their parent is a stash\n\t\t// already marked reachable they should follow.\n\t\tlet changed;\n\t\tdo {\n\t\t\tchanged = false;\n\t\t\tfor (const [sha, s] of stash.stashes) {\n\t\t\t\tif (!reachableStashes.has(sha) && s.parents.some(p => reachableStashes.has(p))) {\n\t\t\t\t\treachableStashes.add(sha);\n\t\t\t\t\tchanged = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} while (changed);\n\n\t\tfor (const [sha] of stash.stashes) {\n\t\t\tif (!reachableStashes.has(sha)) {\n\t\t\t\tstashes.delete(sha);\n\t\t\t}\n\t\t}\n\n\t\treturn { ...stash, stashes: stashes };\n\t}\n\n\t@debug()\n\tasync getStashCommitFiles(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { similarityThreshold?: number | null },\n\t\tcancellation?: AbortSignal,\n\t): Promise<GitFileChange[]> {\n\t\tconst [stashFilesResult, stashUntrackedFilesResult] = await Promise.allSettled([\n\t\t\t// Don't include untracked files here, because we won't be able to tell them apart from added (and we need the untracked status)\n\t\t\tthis.getStashCommitFilesCore(repoPath, ref, { untracked: false, ...options }, cancellation),\n\t\t\t// Check for any untracked files -- since git doesn't return them via `git stash list` :(\n\t\t\t// See https://stackoverflow.com/questions/12681529/\n\t\t\tthis.getStashCommitFilesCore(repoPath, ref, { untracked: 'only', ...options }, cancellation),\n\t\t]);\n\n\t\tlet files = getSettledValue(stashFilesResult);\n\t\tconst untrackedFiles = getSettledValue(stashUntrackedFilesResult);\n\n\t\tif (files?.length && untrackedFiles?.length) {\n\t\t\tfiles.push(...untrackedFiles);\n\t\t} else {\n\t\t\tfiles = files ?? untrackedFiles;\n\t\t}\n\n\t\treturn files ?? [];\n\t}\n\n\tprivate async getStashCommitFilesCore(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { similarityThreshold?: number | null; untracked?: boolean | 'only' },\n\t\tcancellation?: AbortSignal,\n\t): Promise<GitFileChange[] | undefined> {\n\t\tconst args = [];\n\t\tif (options?.untracked) {\n\t\t\targs.push(options?.untracked === 'only' ? '--only-untracked' : '--include-untracked');\n\t\t}\n\n\t\tconst similarityThreshold = options?.similarityThreshold ?? this.context.config?.commits.similarityThreshold;\n\t\tif (similarityThreshold != null) {\n\t\t\targs.push(`-M${similarityThreshold}%`);\n\t\t}\n\n\t\tconst parser = getStashFilesOnlyLogParser();\n\t\tconst result = await this.git.run(\n\t\t\t{ cwd: repoPath, cancellation: cancellation },\n\t\t\t'stash',\n\t\t\t'show',\n\t\t\t...args,\n\t\t\t...parser.arguments,\n\t\t\tref,\n\t\t);\n\n\t\tconst repoUri = fileUri(normalizePath(repoPath));\n\t\tfor (const s of parser.parse(result.stdout)) {\n\t\t\treturn (\n\t\t\t\ts.files?.map(\n\t\t\t\t\tf =>\n\t\t\t\t\t\tnew GitFileChange(\n\t\t\t\t\t\t\trepoPath,\n\t\t\t\t\t\t\tf.path,\n\t\t\t\t\t\t\t(options?.untracked === 'only'\n\t\t\t\t\t\t\t\t? GitFileWorkingTreeStatus.Untracked\n\t\t\t\t\t\t\t\t: f.status) as GitFileStatus,\n\t\t\t\t\t\t\tjoinUriPath(repoUri, normalizePath(f.path)),\n\t\t\t\t\t\t\tf.originalPath,\n\t\t\t\t\t\t\tf.originalPath != null ? joinUriPath(repoUri, normalizePath(f.originalPath)) : undefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tf.additions || f.deletions\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tadditions: f.additions ?? 0,\n\t\t\t\t\t\t\t\t\t\tdeletions: f.deletions ?? 0,\n\t\t\t\t\t\t\t\t\t\tchanges: 0,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tf.mode,\n\t\t\t\t\t\t),\n\t\t\t\t) ?? []\n\t\t\t);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t@debug()\n\tasync deleteStash(repoPath: string, stashName: string, sha?: string): Promise<void> {\n\t\tawait this.deleteStashCore(repoPath, stashName, sha, { announce: true });\n\t}\n\n\t// Keyed without `options`, so a delete and a rename of the same stash share one drop: a second drop would take\n\t// the stash that moved up into its place\n\t@gate((rp, name, sha) => `${rp}\\0${name}\\0${sha ?? ''}`)\n\tprivate async deleteStashCore(\n\t\trepoPath: string,\n\t\tstashName: string,\n\t\tsha: string | undefined,\n\t\toptions: { announce: boolean; verified?: boolean },\n\t): Promise<string | undefined> {\n\t\tif (!stashName) return undefined;\n\n\t\tif (!options.verified) {\n\t\t\tawait this.verifyStashSha(repoPath, stashName, sha);\n\t\t}\n\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = await this.git.run({ cwd: repoPath }, 'stash', 'drop', stashName);\n\t\t} finally {\n\t\t\tif (options.announce) {\n\t\t\t\tthis.announceStashChanged(repoPath);\n\t\t\t}\n\t\t}\n\t\treturn result.stdout;\n\t}\n\n\tprivate async verifyStashSha(repoPath: string, stashName: string, sha: string | undefined): Promise<void> {\n\t\tif (!sha) return;\n\n\t\tconst result = await this.git.run(\n\t\t\t{ cwd: repoPath, errors: 'ignore' },\n\t\t\t'show',\n\t\t\t'--format=%H',\n\t\t\t'--no-patch',\n\t\t\tstashName,\n\t\t);\n\t\tif (result.stdout.trim() !== sha) {\n\t\t\tthrow new Error(l10n.t('Unable to delete stash; mismatch with stash number'));\n\t\t}\n\t}\n\n\t@debug()\n\tasync renameStash(\n\t\trepoPath: string,\n\t\tstashName: string,\n\t\tsha: string,\n\t\tmessage: string,\n\t\tstashOnRef?: string,\n\t): Promise<void> {\n\t\tif (stashName) {\n\t\t\tawait this.verifyStashSha(repoPath, stashName, sha);\n\t\t}\n\n\t\t// The drop and the store announce once, after both ran, even if the store fails\n\t\ttry {\n\t\t\tawait this.deleteStashCore(repoPath, stashName, sha, { announce: false, verified: true });\n\t\t\tawait this.git.run(\n\t\t\t\t{ cwd: repoPath },\n\t\t\t\t'stash',\n\t\t\t\t'store',\n\t\t\t\t'-m',\n\t\t\t\tstashOnRef ? `On ${stashOnRef}: ${message}` : message,\n\t\t\t\tsha,\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.announceStashChanged(repoPath);\n\t\t}\n\t}\n\n\t@debug({ args: (repoPath, message, paths) => ({ repoPath: repoPath, message: message, paths: paths?.length }) })\n\tasync saveStash(\n\t\trepoPath: string,\n\t\tmessage?: string,\n\t\tpathsOrUris?: (string | Uri)[],\n\t\toptions?: { includeUntracked?: boolean; keepIndex?: boolean; onlyStaged?: boolean },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst paths = pathsOrUris?.map(toFsPath);\n\t\tif (!paths?.length) {\n\t\t\tawait this.stashPushCore(repoPath, message, options, runOptions);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.git.ensureSupports('git:stash:push:pathspecs', (requiredVersion, installedVersion) =>\n\t\t\tl10n.t(\n\t\t\t\t'Stashing individual files requires a newer version of Git (>= {0}) than is currently installed ({1}). Please retry by stashing everything or install a more recent version of Git and try again.',\n\t\t\t\trequiredVersion,\n\t\t\t\tinstalledVersion,\n\t\t\t),\n\t\t);\n\n\t\tconst pathspecs = paths.map(p => `./${splitPath(p, repoPath)[0]}`);\n\n\t\tlet stdin = await this.git.supports('git:stash:push:stdin');\n\t\tif (stdin && options?.onlyStaged && paths.length) {\n\t\t\t// Since Git doesn't support --staged with --pathspec-from-file try to pass them in directly\n\t\t\tstdin = false;\n\t\t}\n\n\t\t// If we don't support stdin, then error out if we are over the maximum allowed git cli length\n\t\tif (!stdin && countStringLength(pathspecs) > maxGitCliLength) {\n\t\t\tawait this.git.ensureSupports('git:stash:push:stdin', (requiredVersion, installedVersion) =>\n\t\t\t\tl10n.t(\n\t\t\t\t\t'Stashing so many files ({0}) at once requires a newer version of Git (>= {1}) than is currently installed ({2}). Please retry by stashing fewer files or install a more recent version of Git and try again.',\n\t\t\t\t\tpathspecs.length,\n\t\t\t\t\trequiredVersion,\n\t\t\t\t\tinstalledVersion,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tawait this.stashPushCore(\n\t\t\trepoPath,\n\t\t\tmessage,\n\t\t\t{\n\t\t\t\t...options,\n\t\t\t\tpathspecs: pathspecs,\n\t\t\t\tstdin: stdin,\n\t\t\t},\n\t\t\trunOptions,\n\t\t);\n\t}\n\n\tprivate async stashPushCore(\n\t\trepoPath: string,\n\t\tmessage?: string,\n\t\toptions?: {\n\t\t\tincludeUntracked?: boolean;\n\t\t\tkeepIndex?: boolean;\n\t\t\tonlyStaged?: boolean;\n\t\t\tpathspecs?: string[];\n\t\t\tstdin?: boolean;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['stash', 'push'];\n\n\t\tif ((options?.includeUntracked || options?.pathspecs?.length) && !options?.onlyStaged) {\n\t\t\tparams.push('--include-untracked');\n\t\t}\n\n\t\t// `git stash push --keep-index --include-untracked -- <pathspec>` hits a bug in git when the\n\t\t// pathspec names an untracked file: the restoring checkout can't match an untracked path in the\n\t\t// index tree, so it fails and the staged changes are lost.\n\t\t//\n\t\t// $ mkdir stash-test && cd stash-test && git init\n\t\t// $ echo a > a.txt\n\t\t// $ git add a.txt\n\t\t// $ git commit -m init\n\t\t// $ echo b > b.txt\n\t\t// $ git stash push --keep-index --include-untracked -- b.txt\n\t\t// Saved working directory and index state WIP on main: 8a280fe init\n\t\t// error: pathspec ':(prefix:0)b.txt' did not match any file(s) known to git\n\t\t//\n\t\t// Only suppress --keep-index for that case — when the selection actually includes untracked\n\t\t// files (`includeUntracked`) AND we're stashing by pathspec. Keying off `includeUntracked` (the\n\t\t// caller's intent) rather than the `--include-untracked` flag is deliberate: we add\n\t\t// `--include-untracked` to every pathspec push above as a safety net, but a tracked-only\n\t\t// selection can — and must — still keep the index intact.\n\t\tif (options?.keepIndex && !(options?.includeUntracked && options?.pathspecs?.length)) {\n\t\t\tparams.push('--keep-index');\n\t\t}\n\n\t\tif (options?.onlyStaged) {\n\t\t\tif (await this.git.supports('git:stash:push:staged')) {\n\t\t\t\tparams.push('--staged');\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\tl10n.t(\n\t\t\t\t\t\t'Git version {0} or higher is required for --staged',\n\t\t\t\t\t\tString(gitFeaturesByVersion.get('git:stash:push:staged')),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (message) {\n\t\t\tparams.push('-m', message);\n\t\t}\n\n\t\tlet stdin;\n\t\tif (options?.pathspecs?.length) {\n\t\t\tif (options.stdin) {\n\t\t\t\tstdin = options.pathspecs.join('\\0');\n\t\t\t\tparams.push('--pathspec-from-file=-', '--pathspec-file-nul', '--');\n\t\t\t} else {\n\t\t\t\tparams.push('--', ...options.pathspecs);\n\t\t\t}\n\t\t} else {\n\t\t\tparams.push('--');\n\t\t}\n\n\t\tlet nothingToSave = false;\n\t\ttry {\n\t\t\tconst result = await this.git.run({ cwd: repoPath, ...runOptions, stdin: stdin }, ...params);\n\t\t\tif (GitErrors.stashNothingToSave.test(result.stdout)) {\n\t\t\t\tnothingToSave = true;\n\t\t\t\tthrow new StashPushError({\n\t\t\t\t\treason: 'nothingToSave',\n\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tif (ex instanceof StashPushError || isCancellationError(ex) || isRunHookFailure(ex)) throw ex;\n\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'stash-push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew StashPushError(\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} finally {\n\t\t\t// A failed or cancelled push may already have stashed, and reset the working tree; one with nothing to\n\t\t\t// save changed nothing\n\t\t\tif (!nothingToSave) {\n\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'stashes', 'status');\n\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['stash'], stashRefs);\n\t\t\t}\n\t\t}\n\t}\n\n\t@debug()\n\tasync saveSnapshot(repoPath: string, message?: string): Promise<void> {\n\t\tconst result = await this.git.run({ cwd: repoPath }, 'stash', 'create');\n\t\tconst id = result.stdout.trim() || undefined;\n\t\tif (id == null) return;\n\n\t\tconst args = [];\n\t\tif (message) {\n\t\t\targs.push('-m', message);\n\t\t}\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath }, 'stash', 'store', ...args, id);\n\t\t} finally {\n\t\t\tthis.announceStashChanged(repoPath);\n\t\t}\n\t}\n\n\t/** For a drop or store, which move `refs/stash` (or its reflog, the rest of the list) */\n\tprivate announceStashChanged(repoPath: string): void {\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'stashes');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['stash'], stashRefs);\n\t}\n}\n\nexport function convertStashesToStdin(stashOrStashes: GitStash | ReadonlyMap<string, GitStashCommit> | undefined): {\n\treadonly stdin: string | undefined;\n\treadonly stashes: Map<string, GitStashCommit>;\n\treadonly remappedIds: Map<string, string>;\n} {\n\tconst remappedIds = new Map<string, string>();\n\tif (stashOrStashes == null) return { stdin: undefined, stashes: new Map(), remappedIds: remappedIds };\n\n\tlet stdin: string | undefined;\n\tconst original = 'stashes' in stashOrStashes ? stashOrStashes.stashes : stashOrStashes;\n\tconst stashes = new Map<string, GitStashCommit>(original);\n\n\tif (original.size) {\n\t\tstdin = '';\n\t\tfor (const stash of original.values()) {\n\t\t\tstdin += `${stash.sha.substring(0, 9)}\\n`;\n\t\t\t// Include the stash's 2nd (index files) and 3rd (untracked files) parents (if they aren't already in the map)\n\t\t\tfor (const p of skip(stash.parents, 1)) {\n\t\t\t\tremappedIds.set(p, stash.sha);\n\n\t\t\t\tif (!stashes.has(p)) {\n\t\t\t\t\tstashes.set(p, stash);\n\t\t\t\t\tstdin += `${p.substring(0, 9)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { stdin: stdin || undefined, stashes: stashes, remappedIds: remappedIds };\n}\n\nconst stashSummaryRegex =\n\t// oxlint-disable-next-line no-control-regex\n\t/(?:(?:(?<wip>WIP) on|On) (?<onref>[^/](?!.*\\/\\.)(?!.*\\.\\.)(?!.*\\/\\/)(?!.*@\\{)[^\\x00-\\x1F\\x7F ~^:?*[\\\\]+[^./]):\\s*)?(?<summary>.*)$/s;\n\nfunction createStash(\n\ts: ParsedStash | ParsedStashWithFiles,\n\trepoPath: string,\n\tcurrentUser: GitUser | undefined,\n): GitStashCommit {\n\t// `onRef` comes from the commit subject (%s), which git always prefixes with `On <branch>: …`\n\t// or `WIP on <branch>: …`. This holds even when the reflog message was customized\n\t// (autostash, `git stash store -m \"…\"`), so it's a reliable source\n\tlet onRef: string | undefined;\n\tconst subjectMatch = stashSummaryRegex.exec((s.commitSubject ?? '').trim());\n\tif (subjectMatch?.groups?.onref) {\n\t\tonRef = subjectMatch.groups.onref;\n\t}\n\n\t// The user-visible display message is derived from the reflog subject (%gs) so that short\n\t// custom messages like \"wip\", \"q\", or \"show args\" stay as the user wrote them instead of\n\t// being replaced by the verbose git-auto subject\n\tlet message = s.summary.trim();\n\tconst reflogMatch = stashSummaryRegex.exec(message);\n\tif (reflogMatch?.groups != null) {\n\t\tconst summary = reflogMatch.groups.summary.trim();\n\t\tif (summary.length === 0) {\n\t\t\tmessage = 'WIP';\n\t\t} else if (reflogMatch.groups.wip) {\n\t\t\tmessage = `WIP: ${summary}`;\n\t\t} else {\n\t\t\tmessage = summary;\n\t\t}\n\t}\n\n\tconst index = message.indexOf('\\n');\n\n\treturn new GitCommit(\n\t\trepoPath,\n\t\ts.sha,\n\t\tnew GitCommitIdentity(\n\t\t\tcurrentUser?.name ?? '',\n\t\t\tcurrentUser?.email,\n\t\t\tnew Date(Number(s.authorDate) * 1000),\n\t\t\tundefined,\n\t\t\ttrue,\n\t\t),\n\t\tnew GitCommitIdentity(\n\t\t\tcurrentUser?.name ?? '',\n\t\t\tcurrentUser?.email,\n\t\t\tnew Date(Number(s.committedDate) * 1000),\n\t\t\tundefined,\n\t\t\ttrue,\n\t\t),\n\t\tindex !== -1 ? message.substring(0, index) : message,\n\t\ts.parents.split(' ') ?? [],\n\t\tmessage,\n\t\tcreateCommitFileset(s, repoPath, undefined),\n\t\ts.stats,\n\t\tundefined,\n\t\tundefined,\n\t\ts.stashName,\n\t\tonRef,\n\t) as GitStashCommit;\n}\n"],"mappings":"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"}