@gitkraken/core-gitlens 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -1
- package/dist/git/cache.d.ts +18 -5
- package/dist/git/cache.js +26 -8
- package/dist/git/cache.js.map +1 -1
- package/dist/git/context.d.ts +5 -1
- package/dist/git/context.js.map +1 -1
- package/dist/git/errors.d.ts +28 -1
- package/dist/git/errors.js +45 -1
- package/dist/git/errors.js.map +1 -1
- package/dist/git/providers/branches.d.ts +5 -1
- package/dist/git/providers/commits.d.ts +24 -1
- package/dist/git/providers/config.d.ts +7 -1
- package/dist/git/providers/operations.d.ts +6 -0
- package/dist/git/providers/provider.d.ts +17 -0
- package/dist/git/providers/refs.d.ts +38 -3
- package/dist/git/providers/revision.d.ts +5 -1
- package/dist/git/providers/staging.d.ts +12 -0
- package/dist/git/providers/worktrees.d.ts +23 -3
- package/dist/git/run.types.d.ts +6 -0
- package/dist/git-cli/cliGitProvider.d.ts +17 -1
- package/dist/git-cli/cliGitProvider.js +37 -1
- package/dist/git-cli/cliGitProvider.js.map +1 -1
- package/dist/git-cli/exec/git.d.ts +12 -2
- package/dist/git-cli/exec/git.js +48 -17
- package/dist/git-cli/exec/git.js.map +1 -1
- package/dist/git-cli/exec/gitQueue.d.ts +4 -1
- package/dist/git-cli/exec/gitQueue.js +1 -1
- package/dist/git-cli/exec/gitQueue.js.map +1 -1
- package/dist/git-cli/providers/branches.d.ts +10 -1
- package/dist/git-cli/providers/branches.js +15 -8
- package/dist/git-cli/providers/branches.js.map +1 -1
- package/dist/git-cli/providers/commits.d.ts +23 -1
- package/dist/git-cli/providers/commits.js +57 -8
- package/dist/git-cli/providers/commits.js.map +1 -1
- package/dist/git-cli/providers/config.js +4 -3
- package/dist/git-cli/providers/config.js.map +1 -1
- package/dist/git-cli/providers/operations.d.ts +1 -0
- package/dist/git-cli/providers/operations.js +39 -3
- package/dist/git-cli/providers/operations.js.map +1 -1
- package/dist/git-cli/providers/patch.js +20 -41
- package/dist/git-cli/providers/patch.js.map +1 -1
- package/dist/git-cli/providers/pausedOperations.js +2 -2
- package/dist/git-cli/providers/pausedOperations.js.map +1 -1
- package/dist/git-cli/providers/refs.d.ts +15 -3
- package/dist/git-cli/providers/refs.js +115 -10
- package/dist/git-cli/providers/refs.js.map +1 -1
- package/dist/git-cli/providers/revision.d.ts +3 -1
- package/dist/git-cli/providers/revision.js +9 -5
- package/dist/git-cli/providers/revision.js.map +1 -1
- package/dist/git-cli/providers/staging.d.ts +8 -0
- package/dist/git-cli/providers/staging.js +59 -7
- package/dist/git-cli/providers/staging.js.map +1 -1
- package/dist/git-cli/providers/worktrees.d.ts +31 -2
- package/dist/git-cli/providers/worktrees.js +75 -7
- package/dist/git-cli/providers/worktrees.js.map +1 -1
- package/dist/ipc/discovery.js +1 -1
- package/dist/plus/agents/providers/claudeCodeTranscript.js +6 -6
- package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
- package/dist/plus/ai/providers/openAICompatibleProviderBase.js +1 -1
- package/dist/plus/git-github/api/github.d.ts +64 -3
- package/dist/plus/git-github/api/github.js +237 -24
- package/dist/plus/git-github/api/github.js.map +1 -1
- package/dist/plus/git-github/providers/github/branches.d.ts +3 -1
- package/dist/plus/git-github/providers/github/branches.js +2 -1
- package/dist/plus/git-github/providers/github/branches.js.map +1 -1
- package/dist/plus/git-github/providers/github/refs.d.ts +10 -3
- package/dist/plus/git-github/providers/github/refs.js +4 -4
- package/dist/plus/git-github/providers/github/refs.js.map +1 -1
- package/dist/plus/git-github/providers/github/revision.d.ts +3 -1
- package/dist/plus/git-github/providers/github/revision.js +1 -1
- package/dist/plus/git-github/providers/github/revision.js.map +1 -1
- package/dist/plus/integrations/collectionMetadata.d.ts +48 -3
- package/dist/plus/integrations/collectionMetadata.js +138 -8
- package/dist/plus/integrations/collectionMetadata.js.map +1 -1
- package/dist/plus/integrations/errors.d.ts +3 -1
- package/dist/plus/integrations/errors.js +7 -3
- package/dist/plus/integrations/errors.js.map +1 -1
- package/dist/plus/integrations/index.d.ts +6 -3
- package/dist/plus/integrations/index.js.map +1 -1
- package/dist/plus/integrations/integrationService.d.ts +36 -10
- package/dist/plus/integrations/integrationService.js +16 -3
- package/dist/plus/integrations/integrationService.js.map +1 -1
- package/dist/plus/integrations/manager.d.ts +107 -37
- package/dist/plus/integrations/models/gitHostIntegration.d.ts +129 -14
- package/dist/plus/integrations/models/gitHostIntegration.js +142 -18
- package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
- package/dist/plus/integrations/models/integration.d.ts +117 -11
- package/dist/plus/integrations/models/integration.js +175 -13
- package/dist/plus/integrations/models/integration.js.map +1 -1
- package/dist/plus/integrations/models/issuesIntegration.d.ts +18 -5
- package/dist/plus/integrations/models/issuesIntegration.js +42 -10
- package/dist/plus/integrations/models/issuesIntegration.js.map +1 -1
- package/dist/plus/integrations/providers/azure/azure.d.ts +1 -1
- package/dist/plus/integrations/providers/azure/azure.js +14 -18
- package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
- package/dist/plus/integrations/providers/azure/models.d.ts +29 -0
- package/dist/plus/integrations/providers/azure/models.js +112 -1
- package/dist/plus/integrations/providers/azure/models.js.map +1 -1
- package/dist/plus/integrations/providers/azureDevOps.d.ts +73 -3
- package/dist/plus/integrations/providers/azureDevOps.js +117 -3
- package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
- package/dist/plus/integrations/providers/azureDevOpsServer.js +2 -1
- package/dist/plus/integrations/providers/azureDevOpsServer.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +61 -0
- package/dist/plus/integrations/providers/bitbucket/bitbucket.js +165 -23
- package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket/models.d.ts +6 -1
- package/dist/plus/integrations/providers/bitbucket/models.js +4 -3
- package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js +2 -2
- package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket-server.d.ts +48 -2
- package/dist/plus/integrations/providers/bitbucket-server.js +51 -1
- package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket.d.ts +45 -2
- package/dist/plus/integrations/providers/bitbucket.js +41 -2
- package/dist/plus/integrations/providers/bitbucket.js.map +1 -1
- package/dist/plus/integrations/providers/github.d.ts +49 -5
- package/dist/plus/integrations/providers/github.js +102 -7
- package/dist/plus/integrations/providers/github.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +35 -0
- package/dist/plus/integrations/providers/gitlab/gitlab.js +132 -15
- package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab/models.d.ts +1 -0
- package/dist/plus/integrations/providers/gitlab/models.js +1 -1
- package/dist/plus/integrations/providers/gitlab/models.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab.d.ts +49 -2
- package/dist/plus/integrations/providers/gitlab.js +80 -4
- package/dist/plus/integrations/providers/gitlab.js.map +1 -1
- package/dist/plus/integrations/providers/jira-server.d.ts +3 -3
- package/dist/plus/integrations/providers/jira-server.js +5 -8
- package/dist/plus/integrations/providers/jira-server.js.map +1 -1
- package/dist/plus/integrations/providers/jira.d.ts +9 -0
- package/dist/plus/integrations/providers/jira.js +13 -1
- package/dist/plus/integrations/providers/jira.js.map +1 -1
- package/dist/plus/integrations/providers/linear.js +1 -1
- package/dist/plus/integrations/providers/models.d.ts +13 -2
- package/dist/plus/integrations/providers/models.js +11 -1
- package/dist/plus/integrations/providers/models.js.map +1 -1
- package/dist/plus/integrations/providers/providerErrors.d.ts +9 -1
- package/dist/plus/integrations/providers/providerErrors.js +10 -1
- package/dist/plus/integrations/providers/providerErrors.js.map +1 -1
- package/dist/plus/integrations/providers/providersApi.d.ts +60 -1
- package/dist/plus/integrations/providers/providersApi.js +137 -2
- package/dist/plus/integrations/providers/providersApi.js.map +1 -1
- package/dist/plus/integrations/providers/utils/providerPaging.d.ts +42 -0
- package/dist/plus/integrations/providers/utils/providerPaging.js +58 -1
- package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -1
- package/dist/plus/integrations/providers/utils.d.ts +1 -1
- package/dist/plus/integrations/reads/broaden.js +1 -1
- package/dist/plus/integrations/reads/context.d.ts +1 -1
- package/dist/plus/integrations/reads/counts.js +1 -1
- package/dist/plus/integrations/reads/currentAccount.d.ts +35 -0
- package/dist/plus/integrations/reads/currentAccount.js +46 -0
- package/dist/plus/integrations/reads/currentAccount.js.map +1 -0
- package/dist/plus/integrations/reads/drains.d.ts +5 -2
- package/dist/plus/integrations/reads/drains.js +8 -4
- package/dist/plus/integrations/reads/drains.js.map +1 -1
- package/dist/plus/integrations/reads/hierarchy.js +1 -1
- package/dist/plus/integrations/reads/hierarchy.utils.js +1 -1
- package/dist/plus/integrations/reads/issueBatch.d.ts +72 -12
- package/dist/plus/integrations/reads/issueBatch.js +193 -48
- package/dist/plus/integrations/reads/issueBatch.js.map +1 -1
- package/dist/plus/integrations/reads/issueTracker.js +1 -1
- package/dist/plus/integrations/reads/issues.js +1 -1
- package/dist/plus/integrations/reads/pullRequestBatch.d.ts +57 -0
- package/dist/plus/integrations/reads/pullRequestBatch.js +80 -0
- package/dist/plus/integrations/reads/pullRequestBatch.js.map +1 -0
- package/dist/plus/integrations/reads/pullRequestBranches.d.ts +58 -0
- package/dist/plus/integrations/reads/pullRequestBranches.js +111 -0
- package/dist/plus/integrations/reads/pullRequestBranches.js.map +1 -0
- package/dist/plus/integrations/reads/pullRequests.js +3 -3
- package/dist/plus/integrations/reads/pullRequests.js.map +1 -1
- package/dist/plus/integrations/reads/resolveRepository.js +1 -1
- package/dist/plus/integrations/reads/sweeps.js +4 -4
- package/dist/plus/integrations/reads/sweeps.js.map +1 -1
- package/dist/plus/integrations/results.d.ts +87 -6
- package/dist/plus/integrations/results.js +9 -2
- package/dist/plus/integrations/results.js.map +1 -1
- package/dist/utils/env/node/exec.js +3 -3
- package/dist/utils/env/node/exec.js.map +1 -1
- package/docs/integrations.md +175 -35
- package/docs/kepler-git-write-api-parity.md +239 -0
- package/docs/kepler-read-api-parity.md +75 -28
- package/package.json +1 -1
- package/dist/plus/integrations/reads/trackerIssue.d.ts +0 -33
- package/dist/plus/integrations/reads/trackerIssue.js +0 -60
- package/dist/plus/integrations/reads/trackerIssue.js.map +0 -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 { SigningFormat } from '@gitlens/git/models/signature.js';\nimport type { GitConflictFile } from '@gitlens/git/models/staging.js';\nimport type {\n\tGitOperationResult,\n\tGitOperationRunOptions,\n\tGitOperationsSubProvider,\n} from '@gitlens/git/providers/operations.js';\nimport { getBranchNameAndRemote, getBranchTrackingWithoutRemote } from '@gitlens/git/utils/branch.utils.js';\nimport { isBranchReference } from '@gitlens/git/utils/reference.utils.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { sequentialize } from '@gitlens/utils/decorators/sequentialize.js';\nimport { chunkByStringLength } from '@gitlens/utils/iterable.js';\nimport { Logger } from '@gitlens/utils/logger.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport type { Git, PushForceOptions } from '../exec/git.js';\nimport {\n\tclassifySigningError,\n\tgetGitCommandError,\n\tgitConfigsPull,\n\tGitErrors,\n\tinferSigningFormatFromError,\n\tmaxGitCliLength,\n} from '../exec/git.js';\n\nexport class OperationsGitSubProvider implements GitOperationsSubProvider {\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\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync cherryPick(\n\t\trepoPath: string,\n\t\trevs: string[],\n\t\toptions?: { edit?: boolean; noCommit?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['cherry-pick'];\n\t\tif (options?.edit) {\n\t\t\targs.push('-e');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('-n');\n\t\t}\n\n\t\tif (revs.length > 1) {\n\t\t\t// Sort commits in topological order (oldest ancestor first) so cherry-pick applies them correctly.\n\t\t\t// This is a local read-only pre-flight, not the user-initiated op — don't subject it to caller env/timeout.\n\t\t\tconst revsSet = new Set(revs);\n\t\t\tconst result = await this.git.run({ cwd: repoPath }, 'rev-list', '--topo-order', '--reverse', ...revs);\n\n\t\t\tconst ordered: string[] = [];\n\t\t\tfor (const sha of result.stdout.trim().split('\\n')) {\n\t\t\t\tif (sha && revsSet.has(sha)) {\n\t\t\t\t\tordered.push(sha);\n\t\t\t\t\tif (ordered.length === revs.length) break; // Early exit once we have all\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ordered.length === revs.length) {\n\t\t\t\trevs = ordered;\n\t\t\t}\n\t\t\t// If we didn't get all commits (shouldn't happen), keep original order\n\t\t}\n\n\t\targs.push(...revs);\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...args);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'cherry-pick',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CherryPickError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', revs: revs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (CherryPickError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'cherry-pick');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync commit(\n\t\trepoPath: string,\n\t\tmessage: string,\n\t\toptions?: {\n\t\t\tall?: boolean;\n\t\t\tallowEmpty?: boolean;\n\t\t\tamend?: boolean;\n\t\t\tauthor?: string;\n\t\t\tdate?: string;\n\t\t\tsignoff?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['commit'];\n\t\tif (options?.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\t\tif (options?.allowEmpty) {\n\t\t\tparams.push('--allow-empty');\n\t\t}\n\t\tif (options?.amend) {\n\t\t\tparams.push('--amend');\n\t\t}\n\t\tif (options?.signoff) {\n\t\t\tparams.push('--signoff');\n\t\t}\n\t\tif (options?.author) {\n\t\t\tparams.push(`--author=${options.author}`);\n\t\t}\n\t\tif (options?.date) {\n\t\t\tparams.push(`--date=${options.date}`);\n\t\t}\n\t\t// Host-level override (e.g. VS Code's `git.enableCommitSigning`) — request signing explicitly\n\t\t// via `-S`. Implicit repo-config signing (`commit.gpgsign=true`) needs no flag, and `-S`\n\t\t// alongside it is harmless, so the override can only enable signing, never force it off.\n\t\tconst sign = this.context.config?.signing?.enabled === true;\n\t\tif (sign) {\n\t\t\tparams.push('-S');\n\t\t}\n\t\t// Read commit message from stdin via -F - to avoid shell escaping issues\n\t\tparams.push('-F', '-');\n\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t{ cwd: repoPath, stdin: message, stdinEncoding: 'utf8', errors: 'throw', ...runOptions },\n\t\t\t\t...params,\n\t\t\t);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\tif (sign) {\n\t\t\t\t// `-S` was passed and the commit succeeded, so signing is confirmed — fire the\n\t\t\t\t// explicit-sign hook (same contract as the patch provider's `commit-tree -S` path).\n\t\t\t\tlet format: SigningFormat | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t\t\t} catch {}\n\t\t\t\tthis.context.hooks?.commits?.onSigned?.(format ?? 'gpg', options?.source);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options?.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'commit',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CommitError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync fetch(\n\t\trepoPath: string,\n\t\toptions?: { all?: boolean; branch?: GitBranchReference; prune?: boolean; pull?: boolean; remote?: string },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { branch, ...opts } = options ?? {};\n\t\ttry {\n\t\t\tif (isBranchReference(branch)) {\n\t\t\t\tconst [branchName, remoteName] = getBranchNameAndRemote(branch);\n\t\t\t\tif (remoteName == null) return;\n\n\t\t\t\tawait this.fetchCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tbranch: branchName,\n\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\tupstream: getBranchTrackingWithoutRemote(branch)!,\n\t\t\t\t\t\tpull: options?.pull,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait this.fetchCore(repoPath, opts, runOptions);\n\t\t\t}\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['remotes']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async fetchCore(\n\t\trepoPath: string,\n\t\toptions:\n\t\t\t| { all?: boolean; branch?: undefined; prune?: boolean; pull?: boolean; remote?: string }\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 },\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.branch && options.remote) {\n\t\t\tif (options.upstream && options.pull) {\n\t\t\t\tparams.push('-u', 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.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'fetch',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew FetchError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tbranch: options?.branch,\n\t\t\t\t\t\t\tremote: options?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync merge(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { fastForward?: boolean | 'only'; noCommit?: boolean; squash?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['merge'];\n\n\t\tif (options?.fastForward === 'only') {\n\t\t\targs.push('--ff-only');\n\t\t} else if (options?.fastForward === true) {\n\t\t\targs.push('--ff');\n\t\t} else if (options?.fastForward === false) {\n\t\t\targs.push('--no-ff');\n\t\t}\n\t\tif (options?.squash) {\n\t\t\targs.push('--squash');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('--no-commit');\n\t\t}\n\n\t\targs.push(ref);\n\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t// Avoid a timeout since merges can take a long time (set to 0 to disable)\n\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t...args,\n\t\t\t);\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'merge',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew MergeError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (MergeError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'merge');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync pull(\n\t\trepoPath: string,\n\t\toptions?: { branch?: GitBranchReference; rebase?: boolean; tags?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\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\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\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} finally {\n\t\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'ended');\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\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\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\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} finally {\n\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'ended');\n\t\t\t}\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async pullCore(\n\t\trepoPath: string,\n\t\toptions: { 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\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsPull, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'pull',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PullError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync push(\n\t\trepoPath: string,\n\t\toptions?: { reference?: GitReference; force?: boolean; publish?: { remote: string } },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tlet branchName: string;\n\t\tlet remoteName: string | undefined;\n\t\tlet upstreamName: string | undefined;\n\t\tlet setUpstream:\n\t\t\t| {\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tremoteBranch: string;\n\t\t\t }\n\t\t\t| undefined;\n\n\t\tif (isBranchReference(options?.reference)) {\n\t\t\tif (options.publish != null) {\n\t\t\t\tbranchName = options.reference.name;\n\t\t\t\tremoteName = options.publish.remote;\n\t\t\t} else {\n\t\t\t\t[branchName, remoteName] = getBranchNameAndRemote(options.reference);\n\t\t\t}\n\t\t\tupstreamName = getBranchTrackingWithoutRemote(options.reference);\n\t\t} else {\n\t\t\tconst branch = await this.provider.branches.getBranch(repoPath);\n\t\t\tif (branch == null) return;\n\n\t\t\tif (options?.reference != null) {\n\t\t\t\tbranchName = `${options.reference.ref}:${\n\t\t\t\t\toptions?.publish != null ? 'refs/heads/' : ''\n\t\t\t\t}${branch.nameWithoutRemote}`;\n\t\t\t} else {\n\t\t\t\tconst tracking = options?.publish == null ? branch.trackingWithoutRemote : undefined;\n\t\t\t\tbranchName =\n\t\t\t\t\ttracking != null && tracking !== branch.nameWithoutRemote\n\t\t\t\t\t\t? `${branch.name}:${tracking}`\n\t\t\t\t\t\t: branch.name;\n\t\t\t}\n\t\t\tremoteName = branch.remoteName ?? options?.publish?.remote;\n\t\t\tupstreamName = options?.reference == null && options?.publish != null ? branch.name : undefined;\n\n\t\t\t// Git can't setup upstream tracking when publishing a new branch to a specific commit, so we'll need to do it after the push\n\t\t\tif (options?.publish?.remote != null && options?.reference != null) {\n\t\t\t\tsetUpstream = {\n\t\t\t\t\tbranch: branch.nameWithoutRemote,\n\t\t\t\t\tremote: remoteName!,\n\t\t\t\t\tremoteBranch: branch.nameWithoutRemote,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (options?.publish == null && remoteName == null && upstreamName == null) {\n\t\t\tthrow new PushError({ reason: 'other' });\n\t\t}\n\n\t\tlet forceOpts: PushForceOptions | undefined;\n\t\tif (options?.force) {\n\t\t\t// Honor the host's force-push preferences (e.g. VS Code's `git.useForcePushWithLease` /\n\t\t\t// `git.useForcePushIfIncludes`); fall back to the safer `--force-with-lease` behavior.\n\t\t\tconst useForceWithLease = this.context.config?.push?.useForceWithLease ?? true;\n\t\t\tforceOpts = useForceWithLease\n\t\t\t\t? { withLease: true, ifIncludes: this.context.config?.push?.useForceIfIncludes ?? true }\n\t\t\t\t: { withLease: false };\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.pushCore(\n\t\t\t\trepoPath,\n\t\t\t\t{\n\t\t\t\t\tbranch: branchName,\n\t\t\t\t\tremote: remoteName,\n\t\t\t\t\tupstream: upstreamName,\n\t\t\t\t\tforce: forceOpts,\n\t\t\t\t\tpublish: options?.publish != null,\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\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(\n\t\t\t\trepoPath,\n\t\t\t\toptions?.publish != null ? ['config', 'heads', 'remotes'] : ['remotes'],\n\t\t\t);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async pushCore(\n\t\trepoPath: string,\n\t\toptions: {\n\t\t\tbranch?: string;\n\t\t\tforce?: PushForceOptions;\n\t\t\tpublish?: boolean;\n\t\t\tremote?: string;\n\t\t\tupstream?: string;\n\t\t\tdelete?: { remote: string; branch: string };\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['push'];\n\n\t\tif (options.force != null) {\n\t\t\tif (options.force.withLease) {\n\t\t\t\tparams.push('--force-with-lease');\n\t\t\t\tif (options.force.ifIncludes) {\n\t\t\t\t\tif (await this.git.supports('git:push:force-if-includes')) {\n\t\t\t\t\t\tparams.push('--force-if-includes');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams.push('--force');\n\t\t\t}\n\t\t}\n\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream) {\n\t\t\t\tparams.push('-u', options.remote, `${options.branch}:${options.upstream}`);\n\t\t\t} else if (options.publish) {\n\t\t\t\tparams.push('--set-upstream', options.remote, options.branch);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.branch);\n\t\t\t}\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.delete) {\n\t\t\tparams.push(options.delete.remote, `:${options.delete.branch}`);\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tconst error = getGitCommandError(\n\t\t\t\t'push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason,\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (options?.force?.withLease && error.details.reason === 'rejected') {\n\t\t\t\tif (ex.stderr && /! \\[rejected\\].*\\(stale info\\)/m.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLease',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\toptions.force.ifIncludes &&\n\t\t\t\t\tex.stderr &&\n\t\t\t\t\t/! \\[rejected\\].*\\(remote ref updated since checkout\\)/m.test(ex.stderr)\n\t\t\t\t) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLeaseIfIncludes',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (ex.stderr && GitErrors.pushRejectedRefDoesNotExists.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedRefDoesNotExist',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync rebase(\n\t\trepoPath: string,\n\t\tupstream: string,\n\t\toptions?: {\n\t\t\tautoStash?: boolean;\n\t\t\tbranch?: string;\n\t\t\teditor?: string;\n\t\t\tinteractive?: boolean;\n\t\t\tprogrammaticEditor?: boolean;\n\t\t\tautosquash?: boolean;\n\t\t\tmessageEditor?: string;\n\t\t\tonto?: string;\n\t\t\tupdateRefs?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['rebase'];\n\t\tconst configs: string[] = [];\n\n\t\tif (options?.autoStash !== false) {\n\t\t\targs.push('--autostash');\n\t\t}\n\n\t\tif (options?.interactive) {\n\t\t\targs.push('--interactive');\n\n\t\t\tif (options.editor) {\n\t\t\t\tconfigs.push('-c', `sequence.editor=${options.editor}`);\n\t\t\t}\n\n\t\t\t// A script-based sequence editor rewrites the todo by command word + SHA, so git must emit a\n\t\t\t// plain, natural-order todo regardless of the user's rebase config: `rebase.autosquash` would\n\t\t\t// reorder commits and rewrite `pick`→`fixup`, and `rebase.abbreviateCommands` would emit `p`.\n\t\t\tif (options.programmaticEditor) {\n\t\t\t\tconfigs.push('-c', 'rebase.autosquash=false', '-c', 'rebase.abbreviateCommands=false');\n\t\t\t}\n\t\t}\n\n\t\tif (options?.autosquash != null) {\n\t\t\tif (options.autosquash && options.programmaticEditor) {\n\t\t\t\tthrow new Error(l10n.t('rebase: autosquash cannot be combined with programmaticEditor'));\n\t\t\t}\n\n\t\t\t// `--no-autosquash` is passed explicitly when `false` — omitting the flag would let a\n\t\t\t// `rebase.autosquash=true` git config fold fixups anyway.\n\t\t\targs.push(options.autosquash ? '--autosquash' : '--no-autosquash');\n\t\t}\n\n\t\t// Drive per-commit message editing (the combined message a `squash` produces, or a `reword`).\n\t\t// `GIT_EDITOR` (not `core.editor`) is what git's interactive-rebase backend honors for the `reword`\n\t\t// amend step, so set it on the environment; also set `core.editor` config as a fallback.\n\t\tlet env = runOptions?.env;\n\t\tif (options?.messageEditor) {\n\t\t\tconfigs.push('-c', `core.editor=${options.messageEditor}`);\n\t\t\tenv = { ...env, GIT_EDITOR: options.messageEditor };\n\t\t}\n\n\t\tif (options?.updateRefs === true) {\n\t\t\targs.push('--update-refs');\n\t\t} else if (options?.updateRefs === false) {\n\t\t\targs.push('--no-update-refs');\n\t\t}\n\n\t\tif (options?.onto) {\n\t\t\targs.push('--onto', options.onto);\n\t\t}\n\n\t\targs.push(upstream);\n\n\t\tif (options?.branch) {\n\t\t\targs.push(options.branch);\n\t\t}\n\n\t\t// Fired before the process runs — `git rebase` exits 0 when stopping at `edit`/`break`,\n\t\t// so the result can't be used to detect that a rebase started\n\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'started');\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t// Avoid a timeout since rebases can take a long time (set to 0 to disable)\n\t\t\t\t{ cwd: repoPath, errors: 'throw', configs: configs, timeout: 0, ...runOptions, env: env },\n\t\t\t\t...args,\n\t\t\t);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'rebase',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RebaseError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: args },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RebaseError.is(mapped, 'conflicts')) {\n\t\t\t\treturn await this.createConflictResult(repoPath, 'rebase');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t} finally {\n\t\t\t// The command exited (success, pause, or failure) — any rebase it left behind is on disk now\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'ended');\n\t\t}\n\t}\n\n\t@debug()\n\tasync reset(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: { mode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tawait this.resetCore(repoPath, rev, options?.mode, runOptions);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async resetCore(\n\t\trepoPath: string,\n\t\trev: string,\n\t\tmode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['reset', '-q'];\n\t\tif (mode) {\n\t\t\tparams.push(`--${mode}`);\n\t\t}\n\t\tparams.push(rev, '--');\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\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\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\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\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...prefix, ...batch);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tref: options?.side ?? options?.ref,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: [...prefix, ...normalized] },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync revert(\n\t\trepoPath: string,\n\t\trefs: string[],\n\t\toptions?: { editMessage?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['revert'];\n\n\t\tif (options?.editMessage === true) {\n\t\t\targs.push('--edit');\n\t\t} else if (options?.editMessage === false) {\n\t\t\targs.push('--no-edit');\n\t\t}\n\n\t\targs.push(...refs);\n\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t// Avoid a timeout since reverts can take a long time (set to 0 to disable)\n\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t...args,\n\t\t\t);\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'revert',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RevertError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', refs: refs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RevertError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'revert');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t/**\n\t * Classifies `ex` as a signing failure; if so, fires the `commits.onSigningFailed`\n\t * hook and throws a typed {@link SigningError}. Callers should invoke this first\n\t * in their catch blocks, before falling through to command-specific error mapping\n\t * via {@link getGitCommandError}.\n\t *\n\t * `SigningFormat` is read opportunistically from `config.getSigningConfig`, with\n\t * {@link inferSigningFormatFromError} as a stderr-based fallback and `'gpg'` as\n\t * the final default.\n\t */\n\tprivate async throwIfSigningError(\n\t\trepoPath: string,\n\t\targs: readonly (string | undefined)[],\n\t\tex: unknown,\n\t\tsource?: unknown,\n\t): Promise<void> {\n\t\tconst reason = classifySigningError(ex);\n\t\tif (reason == null) return;\n\n\t\tlet format: SigningFormat | undefined;\n\t\ttry {\n\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t} catch {\n\t\t\t// Fall through — config read failed; use stderr-inferred format or gpg default\n\t\t}\n\t\tformat ??= inferSigningFormatFromError(ex) ?? 'gpg';\n\n\t\tthis.context.hooks?.commits?.onSigningFailed?.(reason, format, source);\n\t\tthrow new SigningError(\n\t\t\t{ reason: reason, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\tex instanceof Error ? ex : undefined,\n\t\t);\n\t}\n\n\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\t// A conflicted op mutates the working tree, index, and paused-op state — invalidate caches\n\t\t// and fire repository-change the same way the success path does, so downstream views refresh.\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\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 { SigningFormat } from '@gitlens/git/models/signature.js';\nimport type { GitConflictFile } from '@gitlens/git/models/staging.js';\nimport type {\n\tGitOperationResult,\n\tGitOperationRunOptions,\n\tGitOperationsSubProvider,\n} from '@gitlens/git/providers/operations.js';\nimport { getBranchNameAndRemote, getBranchTrackingWithoutRemote } from '@gitlens/git/utils/branch.utils.js';\nimport { isBranchReference } from '@gitlens/git/utils/reference.utils.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { sequentialize } from '@gitlens/utils/decorators/sequentialize.js';\nimport { chunkByStringLength } from '@gitlens/utils/iterable.js';\nimport { Logger } from '@gitlens/utils/logger.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport type { Git, PushForceOptions } from '../exec/git.js';\nimport {\n\tclassifySigningError,\n\tgetGitCommandError,\n\tgitConfigsPull,\n\tGitErrors,\n\tinferSigningFormatFromError,\n\tmaxGitCliLength,\n} from '../exec/git.js';\n\nexport class OperationsGitSubProvider implements GitOperationsSubProvider {\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\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync cherryPick(\n\t\trepoPath: string,\n\t\trevs: string[],\n\t\toptions?: { edit?: boolean; noCommit?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['cherry-pick'];\n\t\tif (options?.edit) {\n\t\t\targs.push('-e');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('-n');\n\t\t}\n\n\t\tif (revs.length > 1) {\n\t\t\t// Sort commits in topological order (oldest ancestor first) so cherry-pick applies them correctly.\n\t\t\t// This is a local read-only pre-flight, not the user-initiated op — don't subject it to caller env/timeout.\n\t\t\tconst revsSet = new Set(revs);\n\t\t\tconst result = await this.git.run({ cwd: repoPath }, 'rev-list', '--topo-order', '--reverse', ...revs);\n\n\t\t\tconst ordered: string[] = [];\n\t\t\tfor (const sha of result.stdout.trim().split('\\n')) {\n\t\t\t\tif (sha && revsSet.has(sha)) {\n\t\t\t\t\tordered.push(sha);\n\t\t\t\t\tif (ordered.length === revs.length) break; // Early exit once we have all\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ordered.length === revs.length) {\n\t\t\t\trevs = ordered;\n\t\t\t}\n\t\t\t// If we didn't get all commits (shouldn't happen), keep original order\n\t\t}\n\n\t\targs.push(...revs);\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...args);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'cherry-pick',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CherryPickError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', revs: revs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (CherryPickError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'cherry-pick');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync commit(\n\t\trepoPath: string,\n\t\tmessage: string,\n\t\toptions?: {\n\t\t\tall?: boolean;\n\t\t\tallowEmpty?: boolean;\n\t\t\tamend?: boolean;\n\t\t\tauthor?: string;\n\t\t\tdate?: string;\n\t\t\tsignoff?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst params = ['commit'];\n\t\tif (options?.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\t\tif (options?.allowEmpty) {\n\t\t\tparams.push('--allow-empty');\n\t\t}\n\t\tif (options?.amend) {\n\t\t\tparams.push('--amend');\n\t\t}\n\t\tif (options?.signoff) {\n\t\t\tparams.push('--signoff');\n\t\t}\n\t\tif (options?.author) {\n\t\t\tparams.push(`--author=${options.author}`);\n\t\t}\n\t\tif (options?.date) {\n\t\t\tparams.push(`--date=${options.date}`);\n\t\t}\n\t\t// Host-level override (e.g. VS Code's `git.enableCommitSigning`) — request signing explicitly\n\t\t// via `-S`. Implicit repo-config signing (`commit.gpgsign=true`) needs no flag, and `-S`\n\t\t// alongside it is harmless, so the override can only enable signing, never force it off.\n\t\tconst sign = this.context.config?.signing?.enabled === true;\n\t\tif (sign) {\n\t\t\tparams.push('-S');\n\t\t}\n\t\t// Read commit message from stdin via -F - to avoid shell escaping issues\n\t\tparams.push('-F', '-');\n\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t{ cwd: repoPath, stdin: message, stdinEncoding: 'utf8', errors: 'throw', ...runOptions },\n\t\t\t\t...params,\n\t\t\t);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\tif (sign) {\n\t\t\t\t// `-S` was passed and the commit succeeded, so signing is confirmed — fire the\n\t\t\t\t// explicit-sign hook (same contract as the patch provider's `commit-tree -S` path).\n\t\t\t\tlet format: SigningFormat | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t\t\t} catch {}\n\t\t\t\tthis.context.hooks?.commits?.onSigned?.(format ?? 'gpg', options?.source);\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options?.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'commit',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CommitError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } },\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync fetch(\n\t\trepoPath: string,\n\t\toptions?: { all?: boolean; branch?: GitBranchReference; prune?: boolean; pull?: boolean; remote?: string },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { branch, ...opts } = options ?? {};\n\t\ttry {\n\t\t\tif (isBranchReference(branch)) {\n\t\t\t\tconst [branchName, remoteName] = getBranchNameAndRemote(branch);\n\t\t\t\tif (remoteName == null) return;\n\n\t\t\t\tawait this.fetchCore(\n\t\t\t\t\trepoPath,\n\t\t\t\t\t{\n\t\t\t\t\t\tbranch: branchName,\n\t\t\t\t\t\tremote: remoteName,\n\t\t\t\t\t\tupstream: getBranchTrackingWithoutRemote(branch)!,\n\t\t\t\t\t\tpull: options?.pull,\n\t\t\t\t\t},\n\t\t\t\t\trunOptions,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tawait this.fetchCore(repoPath, opts, runOptions);\n\t\t\t}\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\n\t\t\t// A `pull` fetch writes `<upstream>:<branch>`, moving the local branch too\n\t\t\tthis.context.hooks?.repository?.onChanged?.(\n\t\t\t\trepoPath,\n\t\t\t\tisBranchReference(branch) && options?.pull ? ['heads', 'remotes'] : ['remotes'],\n\t\t\t);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async fetchCore(\n\t\trepoPath: string,\n\t\toptions:\n\t\t\t| { all?: boolean; branch?: undefined; prune?: boolean; pull?: boolean; remote?: string }\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 },\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.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.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.all) {\n\t\t\tparams.push('--all');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'fetch',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew FetchError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tbranch: options?.branch,\n\t\t\t\t\t\t\tremote: options?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync merge(\n\t\trepoPath: string,\n\t\tref: string,\n\t\toptions?: { fastForward?: boolean | 'only'; noCommit?: boolean; squash?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['merge'];\n\n\t\tif (options?.fastForward === 'only') {\n\t\t\targs.push('--ff-only');\n\t\t} else if (options?.fastForward === true) {\n\t\t\targs.push('--ff');\n\t\t} else if (options?.fastForward === false) {\n\t\t\targs.push('--no-ff');\n\t\t}\n\t\tif (options?.squash) {\n\t\t\targs.push('--squash');\n\t\t}\n\t\tif (options?.noCommit) {\n\t\t\targs.push('--no-commit');\n\t\t}\n\n\t\targs.push(ref);\n\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t// Avoid a timeout since merges can take a long time (set to 0 to disable)\n\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t...args,\n\t\t\t);\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'merge',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew MergeError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', ref: ref, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (MergeError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'merge');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync pull(\n\t\trepoPath: string,\n\t\toptions?: {\n\t\t\tbranch?: GitBranchReference;\n\t\t\tfastForward?: 'only';\n\t\t\trebase?: boolean;\n\t\t\ttags?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\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\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} finally {\n\t\t\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(worktreePath, 'pull', 'ended');\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\t\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\n\t\t\t\t} else if (options?.fastForward === 'only') {\n\t\t\t\t\t// Not checked out anywhere, so there is no working tree to merge into — but a fast-forward\n\t\t\t\t\t// needs none: fetching `<upstream>:<branch>` advances the local branch, and git refuses that\n\t\t\t\t\t// non-forced refspec unless it fast-forwards. A plain fetch would leave the branch unmoved\n\t\t\t\t\t// and report success.\n\t\t\t\t\t// Fetched without `-u`: the worktree lookup above is cached and can miss a worktree added\n\t\t\t\t\t// outside core, and then git's own refusal is what keeps a checked-out branch from moving.\n\t\t\t\t\tconst [branchName, remoteName] = getBranchNameAndRemote(branch);\n\t\t\t\t\tconst upstream = getBranchTrackingWithoutRemote(branch);\n\t\t\t\t\tif (remoteName == null || upstream == null) {\n\t\t\t\t\t\tthrow new PullError({\n\t\t\t\t\t\t\treason: 'noUpstream',\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: ['pull', '--ff-only', branch.name] },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\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\n\t\t\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'tags');\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\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['heads', 'remotes']);\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\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} finally {\n\t\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'pull', 'ended');\n\t\t\t}\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status', 'tags');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'remotes', 'index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async pullCore(\n\t\trepoPath: string,\n\t\toptions: { fastForward?: 'only'; rebase?: boolean; tags?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['pull'];\n\n\t\tif (options.tags) {\n\t\t\tparams.push('--tags');\n\t\t}\n\n\t\tif (options.rebase) {\n\t\t\tparams.push('-r');\n\t\t}\n\n\t\tif (options.fastForward === 'only') {\n\t\t\tparams.push('--ff-only');\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsPull, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tawait this.throwIfSigningError(repoPath, params, ex, options.source);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'pull',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PullError({ reason: reason ?? 'other', gitCommand: { repoPath: repoPath, args: params } }, ex),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync push(\n\t\trepoPath: string,\n\t\toptions?: { reference?: GitReference; force?: boolean; publish?: { remote: string } },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tlet branchName: string;\n\t\tlet remoteName: string | undefined;\n\t\tlet upstreamName: string | undefined;\n\t\tlet setUpstream:\n\t\t\t| {\n\t\t\t\t\tbranch: string;\n\t\t\t\t\tremote: string;\n\t\t\t\t\tremoteBranch: string;\n\t\t\t }\n\t\t\t| undefined;\n\n\t\tif (isBranchReference(options?.reference)) {\n\t\t\tif (options.publish != null) {\n\t\t\t\tbranchName = options.reference.name;\n\t\t\t\tremoteName = options.publish.remote;\n\t\t\t} else {\n\t\t\t\t[branchName, remoteName] = getBranchNameAndRemote(options.reference);\n\t\t\t}\n\t\t\tupstreamName = getBranchTrackingWithoutRemote(options.reference);\n\t\t} else {\n\t\t\tconst branch = await this.provider.branches.getBranch(repoPath);\n\t\t\tif (branch == null) return;\n\n\t\t\tif (options?.reference != null) {\n\t\t\t\tbranchName = `${options.reference.ref}:${\n\t\t\t\t\toptions?.publish != null ? 'refs/heads/' : ''\n\t\t\t\t}${branch.nameWithoutRemote}`;\n\t\t\t} else {\n\t\t\t\tconst tracking = options?.publish == null ? branch.trackingWithoutRemote : undefined;\n\t\t\t\tbranchName =\n\t\t\t\t\ttracking != null && tracking !== branch.nameWithoutRemote\n\t\t\t\t\t\t? `${branch.name}:${tracking}`\n\t\t\t\t\t\t: branch.name;\n\t\t\t}\n\t\t\tremoteName = branch.remoteName ?? options?.publish?.remote;\n\t\t\tupstreamName = options?.reference == null && options?.publish != null ? branch.name : undefined;\n\n\t\t\t// Git can't setup upstream tracking when publishing a new branch to a specific commit, so we'll need to do it after the push\n\t\t\tif (options?.publish?.remote != null && options?.reference != null) {\n\t\t\t\tsetUpstream = {\n\t\t\t\t\tbranch: branch.nameWithoutRemote,\n\t\t\t\t\tremote: remoteName!,\n\t\t\t\t\tremoteBranch: branch.nameWithoutRemote,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (options?.publish == null && remoteName == null && upstreamName == null) {\n\t\t\tthrow new PushError({ reason: 'other' });\n\t\t}\n\n\t\tlet forceOpts: PushForceOptions | undefined;\n\t\tif (options?.force) {\n\t\t\t// Honor the host's force-push preferences (e.g. VS Code's `git.useForcePushWithLease` /\n\t\t\t// `git.useForcePushIfIncludes`); fall back to the safer `--force-with-lease` behavior.\n\t\t\tconst useForceWithLease = this.context.config?.push?.useForceWithLease ?? true;\n\t\t\tforceOpts = useForceWithLease\n\t\t\t\t? { withLease: true, ifIncludes: this.context.config?.push?.useForceIfIncludes ?? true }\n\t\t\t\t: { withLease: false };\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.pushCore(\n\t\t\t\trepoPath,\n\t\t\t\t{\n\t\t\t\t\tbranch: branchName,\n\t\t\t\t\tremote: remoteName,\n\t\t\t\t\tupstream: upstreamName,\n\t\t\t\t\tforce: forceOpts,\n\t\t\t\t\tpublish: options?.publish != null,\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\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(\n\t\t\t\trepoPath,\n\t\t\t\toptions?.publish != null ? ['config', 'heads', 'remotes'] : ['remotes'],\n\t\t\t);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async pushCore(\n\t\trepoPath: string,\n\t\toptions: {\n\t\t\tbranch?: string;\n\t\t\tforce?: PushForceOptions;\n\t\t\tpublish?: boolean;\n\t\t\tremote?: string;\n\t\t\tupstream?: string;\n\t\t\tdelete?: { remote: string; branch: string };\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['push'];\n\n\t\tif (options.force != null) {\n\t\t\tif (options.force.withLease) {\n\t\t\t\tparams.push('--force-with-lease');\n\t\t\t\tif (options.force.ifIncludes) {\n\t\t\t\t\tif (await this.git.supports('git:push:force-if-includes')) {\n\t\t\t\t\t\tparams.push('--force-if-includes');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams.push('--force');\n\t\t\t}\n\t\t}\n\n\t\tif (options.branch && options.remote) {\n\t\t\tif (options.upstream) {\n\t\t\t\tparams.push('-u', options.remote, `${options.branch}:${options.upstream}`);\n\t\t\t} else if (options.publish) {\n\t\t\t\tparams.push('--set-upstream', options.remote, options.branch);\n\t\t\t} else {\n\t\t\t\tparams.push(options.remote, options.branch);\n\t\t\t}\n\t\t} else if (options.remote) {\n\t\t\tparams.push(options.remote);\n\t\t} else if (options.delete) {\n\t\t\tparams.push(options.delete.remote, `:${options.delete.branch}`);\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\tconst error = getGitCommandError(\n\t\t\t\t'push',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason,\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (options?.force?.withLease && error.details.reason === 'rejected') {\n\t\t\t\tif (ex.stderr && /! \\[rejected\\].*\\(stale info\\)/m.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLease',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\toptions.force.ifIncludes &&\n\t\t\t\t\tex.stderr &&\n\t\t\t\t\t/! \\[rejected\\].*\\(remote ref updated since checkout\\)/m.test(ex.stderr)\n\t\t\t\t) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedWithLeaseIfIncludes',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (ex.stderr && GitErrors.pushRejectedRefDoesNotExists.test(ex.stderr)) {\n\t\t\t\t\tthrow new PushError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: 'rejectedRefDoesNotExist',\n\t\t\t\t\t\t\tbranch: options?.branch || options?.delete?.branch,\n\t\t\t\t\t\t\tremote: options?.remote || options?.delete?.remote,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: params },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync rebase(\n\t\trepoPath: string,\n\t\tupstream: string,\n\t\toptions?: {\n\t\t\tautoStash?: boolean;\n\t\t\tbranch?: string;\n\t\t\teditor?: string;\n\t\t\tinteractive?: boolean;\n\t\t\tprogrammaticEditor?: boolean;\n\t\t\tautosquash?: boolean;\n\t\t\tmessageEditor?: string;\n\t\t\tonto?: string;\n\t\t\tupdateRefs?: boolean;\n\t\t\tsource?: unknown;\n\t\t},\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['rebase'];\n\t\tconst configs: string[] = [];\n\n\t\tif (options?.autoStash !== false) {\n\t\t\targs.push('--autostash');\n\t\t}\n\n\t\tif (options?.interactive) {\n\t\t\targs.push('--interactive');\n\n\t\t\tif (options.editor) {\n\t\t\t\tconfigs.push('-c', `sequence.editor=${options.editor}`);\n\t\t\t}\n\n\t\t\t// A script-based sequence editor rewrites the todo by command word + SHA, so git must emit a\n\t\t\t// plain, natural-order todo regardless of the user's rebase config: `rebase.autosquash` would\n\t\t\t// reorder commits and rewrite `pick`→`fixup`, and `rebase.abbreviateCommands` would emit `p`.\n\t\t\tif (options.programmaticEditor) {\n\t\t\t\tconfigs.push('-c', 'rebase.autosquash=false', '-c', 'rebase.abbreviateCommands=false');\n\t\t\t}\n\t\t}\n\n\t\tif (options?.autosquash != null) {\n\t\t\tif (options.autosquash && options.programmaticEditor) {\n\t\t\t\tthrow new Error(l10n.t('rebase: autosquash cannot be combined with programmaticEditor'));\n\t\t\t}\n\n\t\t\t// `--no-autosquash` is passed explicitly when `false` — omitting the flag would let a\n\t\t\t// `rebase.autosquash=true` git config fold fixups anyway.\n\t\t\targs.push(options.autosquash ? '--autosquash' : '--no-autosquash');\n\t\t}\n\n\t\t// Drive per-commit message editing (the combined message a `squash` produces, or a `reword`).\n\t\t// `GIT_EDITOR` (not `core.editor`) is what git's interactive-rebase backend honors for the `reword`\n\t\t// amend step, so set it on the environment; also set `core.editor` config as a fallback.\n\t\tlet env = runOptions?.env;\n\t\tif (options?.messageEditor) {\n\t\t\tconfigs.push('-c', `core.editor=${options.messageEditor}`);\n\t\t\tenv = { ...env, GIT_EDITOR: options.messageEditor };\n\t\t}\n\n\t\tif (options?.updateRefs === true) {\n\t\t\targs.push('--update-refs');\n\t\t} else if (options?.updateRefs === false) {\n\t\t\targs.push('--no-update-refs');\n\t\t}\n\n\t\tif (options?.onto) {\n\t\t\targs.push('--onto', options.onto);\n\t\t}\n\n\t\targs.push(upstream);\n\n\t\tif (options?.branch) {\n\t\t\targs.push(options.branch);\n\t\t}\n\n\t\t// Fired before the process runs — `git rebase` exits 0 when stopping at `edit`/`break`,\n\t\t// so the result can't be used to detect that a rebase started\n\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'started');\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t// Avoid a timeout since rebases can take a long time (set to 0 to disable)\n\t\t\t\t{ cwd: repoPath, errors: 'throw', configs: configs, timeout: 0, ...runOptions, env: env },\n\t\t\t\t...args,\n\t\t\t);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'rebase',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RebaseError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tupstream: upstream,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: args },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RebaseError.is(mapped, 'conflicts')) {\n\t\t\t\treturn await this.createConflictResult(repoPath, 'rebase');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t} finally {\n\t\t\t// The command exited (success, pause, or failure) — any rebase it left behind is on disk now\n\t\t\tthis.context.hooks?.operations?.onRebaseCapableOperation?.(repoPath, 'rebase', 'ended');\n\t\t}\n\t}\n\n\t@debug()\n\tasync reset(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: { mode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft' },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tawait this.resetCore(repoPath, rev, options?.mode, runOptions);\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tprivate async resetCore(\n\t\trepoPath: string,\n\t\trev: string,\n\t\tmode?: 'hard' | 'keep' | 'merge' | 'mixed' | 'soft',\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<void> {\n\t\tconst params = ['reset', '-q'];\n\t\tif (mode) {\n\t\t\tparams.push(`--${mode}`);\n\t\t}\n\t\tparams.push(rev, '--');\n\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...params);\n\t\t} catch (ex) {\n\t\t\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\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\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\tawait this.git.run({ cwd: repoPath, errors: 'throw', ...runOptions }, ...prefix, ...batch);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['index']);\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow getGitCommandError(\n\t\t\t\t'checkout',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew CheckoutError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treason: reason ?? 'other',\n\t\t\t\t\t\t\tref: options?.side ?? options?.ref,\n\t\t\t\t\t\t\tgitCommand: { repoPath: repoPath, args: [...prefix, ...normalized] },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tex,\n\t\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t@sequentialize({ getQueueKey: rp => rp })\n\t@debug()\n\tasync revert(\n\t\trepoPath: string,\n\t\trefs: string[],\n\t\toptions?: { editMessage?: boolean; source?: unknown },\n\t\trunOptions?: GitOperationRunOptions,\n\t): Promise<GitOperationResult> {\n\t\tconst scope = getScopedLogger();\n\n\t\tconst args = ['revert'];\n\n\t\tif (options?.editMessage === true) {\n\t\t\targs.push('--edit');\n\t\t} else if (options?.editMessage === false) {\n\t\t\targs.push('--no-edit');\n\t\t}\n\n\t\targs.push(...refs);\n\n\t\ttry {\n\t\t\tawait this.git.run(\n\t\t\t\t// Avoid a timeout since reverts can take a long time (set to 0 to disable)\n\t\t\t\t{ cwd: repoPath, errors: 'throw', timeout: 0, ...runOptions },\n\t\t\t\t...args,\n\t\t\t);\n\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\n\t\t\treturn { conflicted: false };\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tawait this.throwIfSigningError(repoPath, args, ex, options?.source);\n\n\t\t\tconst mapped = getGitCommandError(\n\t\t\t\t'revert',\n\t\t\t\tex,\n\t\t\t\treason =>\n\t\t\t\t\tnew RevertError(\n\t\t\t\t\t\t{ reason: reason ?? 'other', refs: refs, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\t\t\t\tex as Error,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tif (RevertError.is(mapped, 'conflicts')) {\n\t\t\t\treturn this.createConflictResult(repoPath, 'revert');\n\t\t\t}\n\t\t\tthrow mapped;\n\t\t}\n\t}\n\n\t/**\n\t * Classifies `ex` as a signing failure; if so, fires the `commits.onSigningFailed`\n\t * hook and throws a typed {@link SigningError}. Callers should invoke this first\n\t * in their catch blocks, before falling through to command-specific error mapping\n\t * via {@link getGitCommandError}.\n\t *\n\t * `SigningFormat` is read opportunistically from `config.getSigningConfig`, with\n\t * {@link inferSigningFormatFromError} as a stderr-based fallback and `'gpg'` as\n\t * the final default.\n\t */\n\tprivate async throwIfSigningError(\n\t\trepoPath: string,\n\t\targs: readonly (string | undefined)[],\n\t\tex: unknown,\n\t\tsource?: unknown,\n\t): Promise<void> {\n\t\tconst reason = classifySigningError(ex);\n\t\tif (reason == null) return;\n\n\t\tlet format: SigningFormat | undefined;\n\t\ttry {\n\t\t\tformat = (await this.provider.config.getSigningConfig?.(repoPath))?.format;\n\t\t} catch {\n\t\t\t// Fall through — config read failed; use stderr-inferred format or gpg default\n\t\t}\n\t\tformat ??= inferSigningFormatFromError(ex) ?? 'gpg';\n\n\t\tthis.context.hooks?.commits?.onSigningFailed?.(reason, format, source);\n\t\tthrow new SigningError(\n\t\t\t{ reason: reason, gitCommand: { repoPath: repoPath, args: args } },\n\t\t\tex instanceof Error ? ex : undefined,\n\t\t);\n\t}\n\n\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\t// A conflicted op mutates the working tree, index, and paused-op state — invalidate caches\n\t\t// and fire repository-change the same way the success path does, so downstream views refresh.\n\t\tthis.context.hooks?.cache?.onReset?.(repoPath, 'branches', 'status');\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, ['head', 'heads', 'index']);\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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"}
|
|
@@ -2,9 +2,9 @@ import { getScopedLogger } from "../../utils/logger.scoped.js";
|
|
|
2
2
|
import { getSettledValue } from "../../utils/promise.js";
|
|
3
3
|
import { debug } from "../../utils/decorators/log.js";
|
|
4
4
|
import __decorate from "../../_virtual/@oxc-project+runtime/helpers/esm/decorate.js";
|
|
5
|
-
import { ApplyPatchCommitError, CherryPickError
|
|
5
|
+
import { ApplyPatchCommitError, CherryPickError } from "../../git/errors.js";
|
|
6
6
|
import { RunError } from "../../utils/env/node/exec.js";
|
|
7
|
-
import { GitError,
|
|
7
|
+
import { GitError, gitConfigsLog } from "../exec/git.js";
|
|
8
8
|
import _usingCtx from "../../_virtual/@oxc-project+runtime/helpers/esm/usingCtx.js";
|
|
9
9
|
//#region ../git-cli/src/providers/patch.ts
|
|
10
10
|
var PatchGitSubProvider = class {
|
|
@@ -108,7 +108,6 @@ var PatchGitSubProvider = class {
|
|
|
108
108
|
const scope = getScopedLogger();
|
|
109
109
|
if (!patch.endsWith("\n")) patch += "\n";
|
|
110
110
|
let shouldSign = options?.sign;
|
|
111
|
-
let _signingFormat = "gpg";
|
|
112
111
|
try {
|
|
113
112
|
const [signingConfigResult, applyResult] = await Promise.allSettled([this.provider.config.getSigningConfig?.(repoPath), this.git.run({
|
|
114
113
|
cwd: repoPath,
|
|
@@ -119,45 +118,22 @@ var PatchGitSubProvider = class {
|
|
|
119
118
|
if (applyResult.status === "rejected") throw applyResult.reason;
|
|
120
119
|
const signingConfig = getSettledValue(signingConfigResult);
|
|
121
120
|
shouldSign ??= signingConfig?.enabled ?? false;
|
|
122
|
-
|
|
123
|
-
let result = await this.git.run({
|
|
121
|
+
const tree = (await this.git.run({
|
|
124
122
|
cwd: repoPath,
|
|
125
123
|
env
|
|
126
|
-
}, "write-tree");
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
args.push("-m", message);
|
|
138
|
-
result = await this.git.run({
|
|
139
|
-
cwd: repoPath,
|
|
140
|
-
env: finalEnv
|
|
141
|
-
}, ...args);
|
|
142
|
-
const sha = result.stdout.trim();
|
|
143
|
-
if (shouldSign) this.context.hooks?.commits?.onSigned?.(_signingFormat, options?.source);
|
|
144
|
-
return sha;
|
|
124
|
+
}, "write-tree")).stdout.trim();
|
|
125
|
+
return await this.provider.commits.createCommitFromTree(repoPath, tree, {
|
|
126
|
+
parents: base ? [base] : [],
|
|
127
|
+
message,
|
|
128
|
+
author: author ? {
|
|
129
|
+
name: author.name,
|
|
130
|
+
email: author.email || ""
|
|
131
|
+
} : void 0,
|
|
132
|
+
sign: shouldSign,
|
|
133
|
+
source: options?.source
|
|
134
|
+
});
|
|
145
135
|
} catch (ex) {
|
|
146
136
|
scope?.error(ex);
|
|
147
|
-
if (shouldSign && ex instanceof Error) {
|
|
148
|
-
const reason = classifySigningError(ex);
|
|
149
|
-
if (reason != null) {
|
|
150
|
-
const signingError = new SigningError({
|
|
151
|
-
reason,
|
|
152
|
-
gitCommand: {
|
|
153
|
-
repoPath,
|
|
154
|
-
args: ["commit-tree"]
|
|
155
|
-
}
|
|
156
|
-
}, ex);
|
|
157
|
-
this.context.hooks?.commits?.onSigningFailed?.(reason, _signingFormat, options?.source);
|
|
158
|
-
throw signingError;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
137
|
throw ex;
|
|
162
138
|
}
|
|
163
139
|
}
|
|
@@ -166,10 +142,13 @@ var PatchGitSubProvider = class {
|
|
|
166
142
|
cwd: repoPath,
|
|
167
143
|
stdin: ""
|
|
168
144
|
}, "hash-object", "-t", "tree", "--stdin");
|
|
169
|
-
const
|
|
170
|
-
|
|
145
|
+
const sha = await this.provider.commits.createCommitFromTree(repoPath, emptyTree.stdout.trim(), {
|
|
146
|
+
parents: [],
|
|
147
|
+
message: "temp"
|
|
148
|
+
});
|
|
171
149
|
await this.git.run({ cwd: repoPath }, "symbolic-ref", "HEAD", "refs/heads/main");
|
|
172
|
-
|
|
150
|
+
await this.provider.refs.updateReference(repoPath, "HEAD", sha);
|
|
151
|
+
return sha;
|
|
173
152
|
}
|
|
174
153
|
async validatePatch(repoPath, contents) {
|
|
175
154
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","names":[],"sources":["../../../../git-cli/src/providers/patch.ts"],"sourcesContent":["import type { Cache } from '@gitlens/git/cache.js';\nimport type { GitServiceContext } from '@gitlens/git/context.js';\nimport type { GitCommandContext } from '@gitlens/git/errors.js';\nimport { ApplyPatchCommitError, CherryPickError, SigningError } from '@gitlens/git/errors.js';\nimport type { GitCommit, GitCommitIdentityShape } from '@gitlens/git/models/commit.js';\nimport type { SigningFormat } from '@gitlens/git/models/signature.js';\nimport type { GitPatchSubProvider } from '@gitlens/git/providers/patch.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { getSettledValue } from '@gitlens/utils/promise.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { RunError } from '../exec/exec.errors.js';\nimport type { Git } from '../exec/git.js';\nimport { classifySigningError, gitConfigsLog, GitError } from '../exec/git.js';\n\nexport class PatchGitSubProvider implements GitPatchSubProvider {\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 apply(repoPath: string, patch: string, options?: { threeWay?: boolean }): Promise<void> {\n\t\tconst args = ['apply', '--whitespace=warn'];\n\t\tif (options?.threeWay) {\n\t\t\targs.push('--3way');\n\t\t}\n\t\tawait this.git.run({ cwd: repoPath, stdin: patch }, ...args);\n\t}\n\n\t@debug()\n\tasync applyUnreachableCommitForPatch(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: {\n\t\t\tbranchName?: string;\n\t\t\tcreateBranchIfNeeded?: boolean;\n\t\t\tcreateWorktreePath?: string;\n\t\t\tstash?: boolean;\n\t\t},\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tif (options?.stash) {\n\t\t\t// Stash any changes first\n\t\t\tconst hasChanges = await this.provider.status?.hasWorkingChanges(repoPath);\n\t\t\tif (hasChanges) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.provider.stash.saveStash(repoPath, undefined, undefined, {\n\t\t\t\t\t\tincludeUntracked: true,\n\t\t\t\t\t});\n\t\t\t\t} catch (ex) {\n\t\t\t\t\tscope?.error(ex);\n\t\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'stashFailed' }, ex as Error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet targetPath = repoPath;\n\t\tconst currentBranch = await this.provider.branches.getBranch(repoPath);\n\t\tconst branchExists =\n\t\t\toptions?.branchName == null ||\n\t\t\tcurrentBranch?.name === options.branchName ||\n\t\t\t(await this.provider.branches.getBranches(repoPath, { filter: b => b.name === options.branchName }))?.values\n\t\t\t\t?.length > 0;\n\t\tconst shouldCreate = options?.branchName != null && !branchExists && options.createBranchIfNeeded;\n\n\t\tif (options?.createWorktreePath != null) {\n\t\t\tif (options?.branchName === null || options.branchName === currentBranch?.name) {\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'createWorktreeFailed' });\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst worktree = await this.provider.worktrees?.createWorktreeWithResult(\n\t\t\t\t\trepoPath,\n\t\t\t\t\toptions.createWorktreePath,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitish:\n\t\t\t\t\t\t\toptions?.branchName != null && branchExists ? options.branchName : currentBranch?.name,\n\t\t\t\t\t\tcreateBranch: shouldCreate ? options.branchName : undefined,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (worktree == null) {\n\t\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'createWorktreeFailed' });\n\t\t\t\t}\n\n\t\t\t\ttargetPath = worktree.path;\n\t\t\t} catch (ex) {\n\t\t\t\tscope?.error(ex);\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'createWorktreeFailed' }, ex as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (options?.branchName != null && currentBranch?.name !== options.branchName) {\n\t\t\tconst checkoutRef = shouldCreate ? (currentBranch?.ref ?? 'HEAD') : options.branchName;\n\t\t\ttry {\n\t\t\t\tawait this.provider.ops?.checkout(targetPath, checkoutRef, {\n\t\t\t\t\tcreateBranch: shouldCreate ? options.branchName : undefined,\n\t\t\t\t});\n\t\t\t} catch (ex) {\n\t\t\t\tscope?.error(ex);\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'checkoutFailed', branch: options.branchName }, ex as Error);\n\t\t\t}\n\t\t}\n\n\t\t// Apply the patch using a cherry pick without committing\n\t\ttry {\n\t\t\tconst result = await this.provider.ops?.cherryPick(targetPath, [rev], { noCommit: true });\n\t\t\tif (result?.conflicted) {\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'appliedWithConflicts' });\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tif (ex instanceof ApplyPatchCommitError) throw ex;\n\n\t\t\tscope?.error(ex);\n\n\t\t\tif (CherryPickError.is(ex, 'wouldOverwriteChanges')) {\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'wouldOverwriteChanges' }, ex);\n\t\t\t}\n\n\t\t\tthrow new ApplyPatchCommitError({ reason: 'applyFailed' }, ex as Error);\n\t\t}\n\t}\n\n\t@debug({\n\t\targs: (repoPath, base, _message, _patch) => ({\n\t\t\trepoPath: repoPath,\n\t\t\tbase: base,\n\t\t\tmessage: '<message>',\n\t\t\tpatch: '<patch>',\n\t\t}),\n\t})\n\tasync createUnreachableCommitForPatch(\n\t\trepoPath: string,\n\t\tbase: string,\n\t\tmessage: string,\n\t\tpatch: string,\n\t\toptions?: { sign?: boolean; source?: unknown },\n\t): Promise<GitCommit | undefined> {\n\t\t// Create a temporary index file from the base ref\n\t\tawait using disposableIndex = await this.provider.staging.createTemporaryIndex(repoPath, 'ref', base);\n\t\tconst { env } = disposableIndex;\n\n\t\tconst sha = await this.createUnreachableCommitForPatchCore(\n\t\t\tenv,\n\t\t\trepoPath,\n\t\t\tbase,\n\t\t\tmessage,\n\t\t\tpatch,\n\t\t\tundefined,\n\t\t\toptions,\n\t\t);\n\t\t// await is needed for the disposableIndex to be disposed properly after\n\t\treturn await this.provider.commits.getCommit(repoPath, sha);\n\t}\n\n\t@debug({ args: (repoPath, base, patches) => ({ repoPath: repoPath, base: base, patches: patches.length }) })\n\tasync createUnreachableCommitsFromPatches(\n\t\trepoPath: string,\n\t\tbase: string | undefined,\n\t\tpatches: { message: string; patch: string; author?: GitCommitIdentityShape }[],\n\t\toptions?: { sign?: boolean; source?: unknown },\n\t): Promise<string[]> {\n\t\t// Create a temporary index file - use empty index if no base (orphan commits)\n\t\tawait using disposableIndex = base\n\t\t\t? await this.provider.staging.createTemporaryIndex(repoPath, 'ref', base)\n\t\t\t: await this.provider.staging.createTemporaryIndex(repoPath, 'empty');\n\t\tconst { env } = disposableIndex;\n\n\t\tconst shas: string[] = [];\n\n\t\tfor (const { message, patch, author } of patches) {\n\t\t\tconst sha = await this.createUnreachableCommitForPatchCore(\n\t\t\t\tenv,\n\t\t\t\trepoPath,\n\t\t\t\tbase,\n\t\t\t\tmessage,\n\t\t\t\tpatch,\n\t\t\t\tauthor,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\tshas.push(sha);\n\t\t\tbase = sha;\n\t\t}\n\n\t\treturn shas;\n\t}\n\n\tprivate async createUnreachableCommitForPatchCore(\n\t\tenv: Record<string, string>,\n\t\trepoPath: string,\n\t\tbase: string | undefined,\n\t\tmessage: string,\n\t\tpatch: string,\n\t\tauthor?: GitCommitIdentityShape,\n\t\toptions?: { sign?: boolean; source?: unknown },\n\t): Promise<string> {\n\t\tconst scope = getScopedLogger();\n\n\t\tif (!patch.endsWith('\\n')) {\n\t\t\tpatch += '\\n';\n\t\t}\n\n\t\tlet shouldSign = options?.sign;\n\t\tlet _signingFormat: SigningFormat = 'gpg';\n\n\t\ttry {\n\t\t\tconst [signingConfigResult, applyResult] = await Promise.allSettled([\n\t\t\t\tthis.provider.config.getSigningConfig?.(repoPath),\n\t\t\t\t// Apply the patch to our temp index, without touching the working directory\n\t\t\t\tthis.git.run(\n\t\t\t\t\t{ cwd: repoPath, configs: gitConfigsLog, env: env, stdin: patch },\n\t\t\t\t\t'apply',\n\t\t\t\t\t'--cached',\n\t\t\t\t\t'-',\n\t\t\t\t),\n\t\t\t]);\n\t\t\tif (applyResult.status === 'rejected') throw applyResult.reason;\n\n\t\t\t// Check if we should sign\n\t\t\tconst signingConfig = getSettledValue(signingConfigResult);\n\t\t\tshouldSign ??= signingConfig?.enabled ?? false;\n\t\t\t_signingFormat = signingConfig?.format ?? 'gpg';\n\n\t\t\t// Create a new tree from our patched index\n\t\t\tlet result = await this.git.run({ cwd: repoPath, env: env }, 'write-tree');\n\t\t\tconst tree = result.stdout.trim();\n\n\t\t\t// Set the author if provided\n\t\t\tlet finalEnv = env;\n\t\t\tif (author) {\n\t\t\t\tfinalEnv = { ...env, GIT_AUTHOR_NAME: author.name, GIT_AUTHOR_EMAIL: author.email || '' };\n\t\t\t}\n\n\t\t\t// Create new commit from the tree\n\t\t\tconst args = ['commit-tree', tree];\n\t\t\tif (base) {\n\t\t\t\targs.push('-p', base);\n\t\t\t}\n\n\t\t\t// Add signing flag if enabled\n\t\t\tif (shouldSign) {\n\t\t\t\targs.push('-S');\n\t\t\t}\n\n\t\t\targs.push('-m', message);\n\n\t\t\t// Create new commit from the tree\n\t\t\tresult = await this.git.run({ cwd: repoPath, env: finalEnv }, ...args);\n\t\t\tconst sha = result.stdout.trim();\n\n\t\t\tif (shouldSign) {\n\t\t\t\tthis.context.hooks?.commits?.onSigned?.(_signingFormat, options?.source);\n\t\t\t}\n\n\t\t\treturn sha;\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\n\t\t\t// Handle signing-specific errors\n\t\t\tif (shouldSign && ex instanceof Error) {\n\t\t\t\tconst reason = classifySigningError(ex);\n\t\t\t\tif (reason != null) {\n\t\t\t\t\tconst gitCommand: GitCommandContext = { repoPath: repoPath, args: ['commit-tree'] };\n\t\t\t\t\tconst signingError = new SigningError({ reason: reason, gitCommand: gitCommand }, ex);\n\t\t\t\t\tthis.context.hooks?.commits?.onSigningFailed?.(reason, _signingFormat, options?.source);\n\t\t\t\t\tthrow signingError;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tasync createEmptyInitialCommit(repoPath: string): Promise<string> {\n\t\tconst emptyTree = await this.git.run({ cwd: repoPath, stdin: '' }, 'hash-object', '-t', 'tree', '--stdin');\n\t\tconst result = await this.git.run({ cwd: repoPath }, 'commit-tree', emptyTree.stdout.trim(), '-m', 'temp');\n\t\t// create refs/heads/main and point to it\n\t\tawait this.git.run({ cwd: repoPath }, 'update-ref', 'refs/heads/main', result.stdout.trim());\n\t\t// point HEAD to the branch\n\t\tawait this.git.run({ cwd: repoPath }, 'symbolic-ref', 'HEAD', 'refs/heads/main');\n\t\treturn result.stdout.trim();\n\t}\n\n\t@debug({ args: repoPath => ({ repoPath: repoPath }) })\n\tasync validatePatch(repoPath: string | undefined, contents: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsLog, stdin: contents }, 'apply', '--check', '-');\n\t\t\treturn true;\n\t\t} catch (ex) {\n\t\t\tif (ex instanceof RunError || ex instanceof GitError) {\n\t\t\t\tif ((ex.stderr ?? '').includes('No valid patches in input')) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Other git errors mean the patch had content but couldn't apply cleanly\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"patch.js","names":[],"sources":["../../../../git-cli/src/providers/patch.ts"],"sourcesContent":["import type { Cache } from '@gitlens/git/cache.js';\nimport type { GitServiceContext } from '@gitlens/git/context.js';\nimport { ApplyPatchCommitError, CherryPickError } from '@gitlens/git/errors.js';\nimport type { GitCommit, GitCommitIdentityShape } from '@gitlens/git/models/commit.js';\nimport type { GitPatchSubProvider } from '@gitlens/git/providers/patch.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { getSettledValue } from '@gitlens/utils/promise.js';\nimport type { CliGitProviderInternal } from '../cliGitProvider.js';\nimport { RunError } from '../exec/exec.errors.js';\nimport type { Git } from '../exec/git.js';\nimport { gitConfigsLog, GitError } from '../exec/git.js';\n\nexport class PatchGitSubProvider implements GitPatchSubProvider {\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 apply(repoPath: string, patch: string, options?: { threeWay?: boolean }): Promise<void> {\n\t\tconst args = ['apply', '--whitespace=warn'];\n\t\tif (options?.threeWay) {\n\t\t\targs.push('--3way');\n\t\t}\n\t\tawait this.git.run({ cwd: repoPath, stdin: patch }, ...args);\n\t}\n\n\t@debug()\n\tasync applyUnreachableCommitForPatch(\n\t\trepoPath: string,\n\t\trev: string,\n\t\toptions?: {\n\t\t\tbranchName?: string;\n\t\t\tcreateBranchIfNeeded?: boolean;\n\t\t\tcreateWorktreePath?: string;\n\t\t\tstash?: boolean;\n\t\t},\n\t): Promise<void> {\n\t\tconst scope = getScopedLogger();\n\n\t\tif (options?.stash) {\n\t\t\t// Stash any changes first\n\t\t\tconst hasChanges = await this.provider.status?.hasWorkingChanges(repoPath);\n\t\t\tif (hasChanges) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.provider.stash.saveStash(repoPath, undefined, undefined, {\n\t\t\t\t\t\tincludeUntracked: true,\n\t\t\t\t\t});\n\t\t\t\t} catch (ex) {\n\t\t\t\t\tscope?.error(ex);\n\t\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'stashFailed' }, ex as Error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet targetPath = repoPath;\n\t\tconst currentBranch = await this.provider.branches.getBranch(repoPath);\n\t\tconst branchExists =\n\t\t\toptions?.branchName == null ||\n\t\t\tcurrentBranch?.name === options.branchName ||\n\t\t\t(await this.provider.branches.getBranches(repoPath, { filter: b => b.name === options.branchName }))?.values\n\t\t\t\t?.length > 0;\n\t\tconst shouldCreate = options?.branchName != null && !branchExists && options.createBranchIfNeeded;\n\n\t\tif (options?.createWorktreePath != null) {\n\t\t\tif (options?.branchName === null || options.branchName === currentBranch?.name) {\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'createWorktreeFailed' });\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst worktree = await this.provider.worktrees?.createWorktreeWithResult(\n\t\t\t\t\trepoPath,\n\t\t\t\t\toptions.createWorktreePath,\n\t\t\t\t\t{\n\t\t\t\t\t\tcommitish:\n\t\t\t\t\t\t\toptions?.branchName != null && branchExists ? options.branchName : currentBranch?.name,\n\t\t\t\t\t\tcreateBranch: shouldCreate ? options.branchName : undefined,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (worktree == null) {\n\t\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'createWorktreeFailed' });\n\t\t\t\t}\n\n\t\t\t\ttargetPath = worktree.path;\n\t\t\t} catch (ex) {\n\t\t\t\tscope?.error(ex);\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'createWorktreeFailed' }, ex as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (options?.branchName != null && currentBranch?.name !== options.branchName) {\n\t\t\tconst checkoutRef = shouldCreate ? (currentBranch?.ref ?? 'HEAD') : options.branchName;\n\t\t\ttry {\n\t\t\t\tawait this.provider.ops?.checkout(targetPath, checkoutRef, {\n\t\t\t\t\tcreateBranch: shouldCreate ? options.branchName : undefined,\n\t\t\t\t});\n\t\t\t} catch (ex) {\n\t\t\t\tscope?.error(ex);\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'checkoutFailed', branch: options.branchName }, ex as Error);\n\t\t\t}\n\t\t}\n\n\t\t// Apply the patch using a cherry pick without committing\n\t\ttry {\n\t\t\tconst result = await this.provider.ops?.cherryPick(targetPath, [rev], { noCommit: true });\n\t\t\tif (result?.conflicted) {\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'appliedWithConflicts' });\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tif (ex instanceof ApplyPatchCommitError) throw ex;\n\n\t\t\tscope?.error(ex);\n\n\t\t\tif (CherryPickError.is(ex, 'wouldOverwriteChanges')) {\n\t\t\t\tthrow new ApplyPatchCommitError({ reason: 'wouldOverwriteChanges' }, ex);\n\t\t\t}\n\n\t\t\tthrow new ApplyPatchCommitError({ reason: 'applyFailed' }, ex as Error);\n\t\t}\n\t}\n\n\t@debug({\n\t\targs: (repoPath, base, _message, _patch) => ({\n\t\t\trepoPath: repoPath,\n\t\t\tbase: base,\n\t\t\tmessage: '<message>',\n\t\t\tpatch: '<patch>',\n\t\t}),\n\t})\n\tasync createUnreachableCommitForPatch(\n\t\trepoPath: string,\n\t\tbase: string,\n\t\tmessage: string,\n\t\tpatch: string,\n\t\toptions?: { sign?: boolean; source?: unknown },\n\t): Promise<GitCommit | undefined> {\n\t\t// Create a temporary index file from the base ref\n\t\tawait using disposableIndex = await this.provider.staging.createTemporaryIndex(repoPath, 'ref', base);\n\t\tconst { env } = disposableIndex;\n\n\t\tconst sha = await this.createUnreachableCommitForPatchCore(\n\t\t\tenv,\n\t\t\trepoPath,\n\t\t\tbase,\n\t\t\tmessage,\n\t\t\tpatch,\n\t\t\tundefined,\n\t\t\toptions,\n\t\t);\n\t\t// await is needed for the disposableIndex to be disposed properly after\n\t\treturn await this.provider.commits.getCommit(repoPath, sha);\n\t}\n\n\t@debug({ args: (repoPath, base, patches) => ({ repoPath: repoPath, base: base, patches: patches.length }) })\n\tasync createUnreachableCommitsFromPatches(\n\t\trepoPath: string,\n\t\tbase: string | undefined,\n\t\tpatches: { message: string; patch: string; author?: GitCommitIdentityShape }[],\n\t\toptions?: { sign?: boolean; source?: unknown },\n\t): Promise<string[]> {\n\t\t// Create a temporary index file - use empty index if no base (orphan commits)\n\t\tawait using disposableIndex = base\n\t\t\t? await this.provider.staging.createTemporaryIndex(repoPath, 'ref', base)\n\t\t\t: await this.provider.staging.createTemporaryIndex(repoPath, 'empty');\n\t\tconst { env } = disposableIndex;\n\n\t\tconst shas: string[] = [];\n\n\t\tfor (const { message, patch, author } of patches) {\n\t\t\tconst sha = await this.createUnreachableCommitForPatchCore(\n\t\t\t\tenv,\n\t\t\t\trepoPath,\n\t\t\t\tbase,\n\t\t\t\tmessage,\n\t\t\t\tpatch,\n\t\t\t\tauthor,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\tshas.push(sha);\n\t\t\tbase = sha;\n\t\t}\n\n\t\treturn shas;\n\t}\n\n\tprivate async createUnreachableCommitForPatchCore(\n\t\tenv: Record<string, string>,\n\t\trepoPath: string,\n\t\tbase: string | undefined,\n\t\tmessage: string,\n\t\tpatch: string,\n\t\tauthor?: GitCommitIdentityShape,\n\t\toptions?: { sign?: boolean; source?: unknown },\n\t): Promise<string> {\n\t\tconst scope = getScopedLogger();\n\n\t\tif (!patch.endsWith('\\n')) {\n\t\t\tpatch += '\\n';\n\t\t}\n\n\t\tlet shouldSign = options?.sign;\n\n\t\ttry {\n\t\t\tconst [signingConfigResult, applyResult] = await Promise.allSettled([\n\t\t\t\tthis.provider.config.getSigningConfig?.(repoPath),\n\t\t\t\t// Apply the patch to our temp index, without touching the working directory\n\t\t\t\tthis.git.run(\n\t\t\t\t\t{ cwd: repoPath, configs: gitConfigsLog, env: env, stdin: patch },\n\t\t\t\t\t'apply',\n\t\t\t\t\t'--cached',\n\t\t\t\t\t'-',\n\t\t\t\t),\n\t\t\t]);\n\t\t\tif (applyResult.status === 'rejected') throw applyResult.reason;\n\n\t\t\t// Check if we should sign\n\t\t\tconst signingConfig = getSettledValue(signingConfigResult);\n\t\t\tshouldSign ??= signingConfig?.enabled ?? false;\n\n\t\t\t// Create a new tree from our patched index\n\t\t\tconst result = await this.git.run({ cwd: repoPath, env: env }, 'write-tree');\n\t\t\tconst tree = result.stdout.trim();\n\n\t\t\treturn await this.provider.commits.createCommitFromTree(repoPath, tree, {\n\t\t\t\tparents: base ? [base] : [],\n\t\t\t\tmessage: message,\n\t\t\t\tauthor: author ? { name: author.name, email: author.email || '' } : undefined,\n\t\t\t\tsign: shouldSign,\n\t\t\t\tsource: options?.source,\n\t\t\t});\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\tasync createEmptyInitialCommit(repoPath: string): Promise<string> {\n\t\tconst emptyTree = await this.git.run({ cwd: repoPath, stdin: '' }, 'hash-object', '-t', 'tree', '--stdin');\n\t\tconst sha = await this.provider.commits.createCommitFromTree(repoPath, emptyTree.stdout.trim(), {\n\t\t\tparents: [],\n\t\t\tmessage: 'temp',\n\t\t});\n\t\t// Point HEAD at the still-unborn `main` first, then create the branch through HEAD, so the one write\n\t\t// that announces anything does so after both changes, announcing the head and the branch together\n\t\tawait this.git.run({ cwd: repoPath }, 'symbolic-ref', 'HEAD', 'refs/heads/main');\n\t\tawait this.provider.refs.updateReference(repoPath, 'HEAD', sha);\n\t\treturn sha;\n\t}\n\n\t@debug({ args: repoPath => ({ repoPath: repoPath }) })\n\tasync validatePatch(repoPath: string | undefined, contents: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.git.run({ cwd: repoPath, configs: gitConfigsLog, stdin: contents }, 'apply', '--check', '-');\n\t\t\treturn true;\n\t\t} catch (ex) {\n\t\t\tif (ex instanceof RunError || ex instanceof GitError) {\n\t\t\t\tif ((ex.stderr ?? '').includes('No valid patches in input')) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Other git errors mean the patch had content but couldn't apply cleanly\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ import { PausedOperationAbortError, PausedOperationContinueError } from "../../g
|
|
|
9
9
|
import { getGitCommandError } from "../exec/git.js";
|
|
10
10
|
import { gate } from "../../utils/decorators/gate.js";
|
|
11
11
|
import * as l10n from "@vscode/l10n";
|
|
12
|
+
import { readdir } from "fs";
|
|
12
13
|
import { readFile, stat } from "fs/promises";
|
|
13
|
-
import { readdir as readdir$1 } from "fs";
|
|
14
14
|
//#region ../git-cli/src/providers/pausedOperations.ts
|
|
15
15
|
const todoCommitRegex = /^(?:p(?:ick)?|revert)\s+([a-f0-9]+)(?:\s+(.+))?$/i;
|
|
16
16
|
const orderedOperations = [
|
|
@@ -38,7 +38,7 @@ var PausedOperationsGitSubProvider = class {
|
|
|
38
38
|
return this.cache.pausedOperationStatus.getOrCreate(repoPath, async (_cancellable) => {
|
|
39
39
|
const gitDir = await this.provider.config.getGitDir(repoPath);
|
|
40
40
|
const operations = await new Promise((resolve, _) => {
|
|
41
|
-
readdir
|
|
41
|
+
readdir(gitDir.uri.fsPath, { withFileTypes: true }, (err, entries) => {
|
|
42
42
|
const operations = /* @__PURE__ */ new Set();
|
|
43
43
|
if (err != null) {
|
|
44
44
|
resolve(operations);
|