@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.
Files changed (188) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/dist/git/cache.d.ts +18 -5
  3. package/dist/git/cache.js +26 -8
  4. package/dist/git/cache.js.map +1 -1
  5. package/dist/git/context.d.ts +5 -1
  6. package/dist/git/context.js.map +1 -1
  7. package/dist/git/errors.d.ts +28 -1
  8. package/dist/git/errors.js +45 -1
  9. package/dist/git/errors.js.map +1 -1
  10. package/dist/git/providers/branches.d.ts +5 -1
  11. package/dist/git/providers/commits.d.ts +24 -1
  12. package/dist/git/providers/config.d.ts +7 -1
  13. package/dist/git/providers/operations.d.ts +6 -0
  14. package/dist/git/providers/provider.d.ts +17 -0
  15. package/dist/git/providers/refs.d.ts +38 -3
  16. package/dist/git/providers/revision.d.ts +5 -1
  17. package/dist/git/providers/staging.d.ts +12 -0
  18. package/dist/git/providers/worktrees.d.ts +23 -3
  19. package/dist/git/run.types.d.ts +6 -0
  20. package/dist/git-cli/cliGitProvider.d.ts +17 -1
  21. package/dist/git-cli/cliGitProvider.js +37 -1
  22. package/dist/git-cli/cliGitProvider.js.map +1 -1
  23. package/dist/git-cli/exec/git.d.ts +12 -2
  24. package/dist/git-cli/exec/git.js +48 -17
  25. package/dist/git-cli/exec/git.js.map +1 -1
  26. package/dist/git-cli/exec/gitQueue.d.ts +4 -1
  27. package/dist/git-cli/exec/gitQueue.js +1 -1
  28. package/dist/git-cli/exec/gitQueue.js.map +1 -1
  29. package/dist/git-cli/providers/branches.d.ts +10 -1
  30. package/dist/git-cli/providers/branches.js +15 -8
  31. package/dist/git-cli/providers/branches.js.map +1 -1
  32. package/dist/git-cli/providers/commits.d.ts +23 -1
  33. package/dist/git-cli/providers/commits.js +57 -8
  34. package/dist/git-cli/providers/commits.js.map +1 -1
  35. package/dist/git-cli/providers/config.js +4 -3
  36. package/dist/git-cli/providers/config.js.map +1 -1
  37. package/dist/git-cli/providers/operations.d.ts +1 -0
  38. package/dist/git-cli/providers/operations.js +39 -3
  39. package/dist/git-cli/providers/operations.js.map +1 -1
  40. package/dist/git-cli/providers/patch.js +20 -41
  41. package/dist/git-cli/providers/patch.js.map +1 -1
  42. package/dist/git-cli/providers/pausedOperations.js +2 -2
  43. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  44. package/dist/git-cli/providers/refs.d.ts +15 -3
  45. package/dist/git-cli/providers/refs.js +115 -10
  46. package/dist/git-cli/providers/refs.js.map +1 -1
  47. package/dist/git-cli/providers/revision.d.ts +3 -1
  48. package/dist/git-cli/providers/revision.js +9 -5
  49. package/dist/git-cli/providers/revision.js.map +1 -1
  50. package/dist/git-cli/providers/staging.d.ts +8 -0
  51. package/dist/git-cli/providers/staging.js +59 -7
  52. package/dist/git-cli/providers/staging.js.map +1 -1
  53. package/dist/git-cli/providers/worktrees.d.ts +31 -2
  54. package/dist/git-cli/providers/worktrees.js +75 -7
  55. package/dist/git-cli/providers/worktrees.js.map +1 -1
  56. package/dist/ipc/discovery.js +1 -1
  57. package/dist/plus/agents/providers/claudeCodeTranscript.js +6 -6
  58. package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
  59. package/dist/plus/ai/providers/openAICompatibleProviderBase.js +1 -1
  60. package/dist/plus/git-github/api/github.d.ts +64 -3
  61. package/dist/plus/git-github/api/github.js +237 -24
  62. package/dist/plus/git-github/api/github.js.map +1 -1
  63. package/dist/plus/git-github/providers/github/branches.d.ts +3 -1
  64. package/dist/plus/git-github/providers/github/branches.js +2 -1
  65. package/dist/plus/git-github/providers/github/branches.js.map +1 -1
  66. package/dist/plus/git-github/providers/github/refs.d.ts +10 -3
  67. package/dist/plus/git-github/providers/github/refs.js +4 -4
  68. package/dist/plus/git-github/providers/github/refs.js.map +1 -1
  69. package/dist/plus/git-github/providers/github/revision.d.ts +3 -1
  70. package/dist/plus/git-github/providers/github/revision.js +1 -1
  71. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  72. package/dist/plus/integrations/collectionMetadata.d.ts +48 -3
  73. package/dist/plus/integrations/collectionMetadata.js +138 -8
  74. package/dist/plus/integrations/collectionMetadata.js.map +1 -1
  75. package/dist/plus/integrations/errors.d.ts +3 -1
  76. package/dist/plus/integrations/errors.js +7 -3
  77. package/dist/plus/integrations/errors.js.map +1 -1
  78. package/dist/plus/integrations/index.d.ts +6 -3
  79. package/dist/plus/integrations/index.js.map +1 -1
  80. package/dist/plus/integrations/integrationService.d.ts +36 -10
  81. package/dist/plus/integrations/integrationService.js +16 -3
  82. package/dist/plus/integrations/integrationService.js.map +1 -1
  83. package/dist/plus/integrations/manager.d.ts +107 -37
  84. package/dist/plus/integrations/models/gitHostIntegration.d.ts +129 -14
  85. package/dist/plus/integrations/models/gitHostIntegration.js +142 -18
  86. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
  87. package/dist/plus/integrations/models/integration.d.ts +117 -11
  88. package/dist/plus/integrations/models/integration.js +175 -13
  89. package/dist/plus/integrations/models/integration.js.map +1 -1
  90. package/dist/plus/integrations/models/issuesIntegration.d.ts +18 -5
  91. package/dist/plus/integrations/models/issuesIntegration.js +42 -10
  92. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -1
  93. package/dist/plus/integrations/providers/azure/azure.d.ts +1 -1
  94. package/dist/plus/integrations/providers/azure/azure.js +14 -18
  95. package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
  96. package/dist/plus/integrations/providers/azure/models.d.ts +29 -0
  97. package/dist/plus/integrations/providers/azure/models.js +112 -1
  98. package/dist/plus/integrations/providers/azure/models.js.map +1 -1
  99. package/dist/plus/integrations/providers/azureDevOps.d.ts +73 -3
  100. package/dist/plus/integrations/providers/azureDevOps.js +117 -3
  101. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
  102. package/dist/plus/integrations/providers/azureDevOpsServer.js +2 -1
  103. package/dist/plus/integrations/providers/azureDevOpsServer.js.map +1 -1
  104. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +61 -0
  105. package/dist/plus/integrations/providers/bitbucket/bitbucket.js +165 -23
  106. package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -1
  107. package/dist/plus/integrations/providers/bitbucket/models.d.ts +6 -1
  108. package/dist/plus/integrations/providers/bitbucket/models.js +4 -3
  109. package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -1
  110. package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js +2 -2
  111. package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js.map +1 -1
  112. package/dist/plus/integrations/providers/bitbucket-server.d.ts +48 -2
  113. package/dist/plus/integrations/providers/bitbucket-server.js +51 -1
  114. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
  115. package/dist/plus/integrations/providers/bitbucket.d.ts +45 -2
  116. package/dist/plus/integrations/providers/bitbucket.js +41 -2
  117. package/dist/plus/integrations/providers/bitbucket.js.map +1 -1
  118. package/dist/plus/integrations/providers/github.d.ts +49 -5
  119. package/dist/plus/integrations/providers/github.js +102 -7
  120. package/dist/plus/integrations/providers/github.js.map +1 -1
  121. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +35 -0
  122. package/dist/plus/integrations/providers/gitlab/gitlab.js +132 -15
  123. package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -1
  124. package/dist/plus/integrations/providers/gitlab/models.d.ts +1 -0
  125. package/dist/plus/integrations/providers/gitlab/models.js +1 -1
  126. package/dist/plus/integrations/providers/gitlab/models.js.map +1 -1
  127. package/dist/plus/integrations/providers/gitlab.d.ts +49 -2
  128. package/dist/plus/integrations/providers/gitlab.js +80 -4
  129. package/dist/plus/integrations/providers/gitlab.js.map +1 -1
  130. package/dist/plus/integrations/providers/jira-server.d.ts +3 -3
  131. package/dist/plus/integrations/providers/jira-server.js +5 -8
  132. package/dist/plus/integrations/providers/jira-server.js.map +1 -1
  133. package/dist/plus/integrations/providers/jira.d.ts +9 -0
  134. package/dist/plus/integrations/providers/jira.js +13 -1
  135. package/dist/plus/integrations/providers/jira.js.map +1 -1
  136. package/dist/plus/integrations/providers/linear.js +1 -1
  137. package/dist/plus/integrations/providers/models.d.ts +13 -2
  138. package/dist/plus/integrations/providers/models.js +11 -1
  139. package/dist/plus/integrations/providers/models.js.map +1 -1
  140. package/dist/plus/integrations/providers/providerErrors.d.ts +9 -1
  141. package/dist/plus/integrations/providers/providerErrors.js +10 -1
  142. package/dist/plus/integrations/providers/providerErrors.js.map +1 -1
  143. package/dist/plus/integrations/providers/providersApi.d.ts +60 -1
  144. package/dist/plus/integrations/providers/providersApi.js +137 -2
  145. package/dist/plus/integrations/providers/providersApi.js.map +1 -1
  146. package/dist/plus/integrations/providers/utils/providerPaging.d.ts +42 -0
  147. package/dist/plus/integrations/providers/utils/providerPaging.js +58 -1
  148. package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -1
  149. package/dist/plus/integrations/providers/utils.d.ts +1 -1
  150. package/dist/plus/integrations/reads/broaden.js +1 -1
  151. package/dist/plus/integrations/reads/context.d.ts +1 -1
  152. package/dist/plus/integrations/reads/counts.js +1 -1
  153. package/dist/plus/integrations/reads/currentAccount.d.ts +35 -0
  154. package/dist/plus/integrations/reads/currentAccount.js +46 -0
  155. package/dist/plus/integrations/reads/currentAccount.js.map +1 -0
  156. package/dist/plus/integrations/reads/drains.d.ts +5 -2
  157. package/dist/plus/integrations/reads/drains.js +8 -4
  158. package/dist/plus/integrations/reads/drains.js.map +1 -1
  159. package/dist/plus/integrations/reads/hierarchy.js +1 -1
  160. package/dist/plus/integrations/reads/hierarchy.utils.js +1 -1
  161. package/dist/plus/integrations/reads/issueBatch.d.ts +72 -12
  162. package/dist/plus/integrations/reads/issueBatch.js +193 -48
  163. package/dist/plus/integrations/reads/issueBatch.js.map +1 -1
  164. package/dist/plus/integrations/reads/issueTracker.js +1 -1
  165. package/dist/plus/integrations/reads/issues.js +1 -1
  166. package/dist/plus/integrations/reads/pullRequestBatch.d.ts +57 -0
  167. package/dist/plus/integrations/reads/pullRequestBatch.js +80 -0
  168. package/dist/plus/integrations/reads/pullRequestBatch.js.map +1 -0
  169. package/dist/plus/integrations/reads/pullRequestBranches.d.ts +58 -0
  170. package/dist/plus/integrations/reads/pullRequestBranches.js +111 -0
  171. package/dist/plus/integrations/reads/pullRequestBranches.js.map +1 -0
  172. package/dist/plus/integrations/reads/pullRequests.js +3 -3
  173. package/dist/plus/integrations/reads/pullRequests.js.map +1 -1
  174. package/dist/plus/integrations/reads/resolveRepository.js +1 -1
  175. package/dist/plus/integrations/reads/sweeps.js +4 -4
  176. package/dist/plus/integrations/reads/sweeps.js.map +1 -1
  177. package/dist/plus/integrations/results.d.ts +87 -6
  178. package/dist/plus/integrations/results.js +9 -2
  179. package/dist/plus/integrations/results.js.map +1 -1
  180. package/dist/utils/env/node/exec.js +3 -3
  181. package/dist/utils/env/node/exec.js.map +1 -1
  182. package/docs/integrations.md +175 -35
  183. package/docs/kepler-git-write-api-parity.md +239 -0
  184. package/docs/kepler-read-api-parity.md +75 -28
  185. package/package.json +1 -1
  186. package/dist/plus/integrations/reads/trackerIssue.d.ts +0 -33
  187. package/dist/plus/integrations/reads/trackerIssue.js +0 -60
  188. package/dist/plus/integrations/reads/trackerIssue.js.map +0 -1
@@ -30,7 +30,11 @@ export type GitBranchMergedStatus = {
30
30
  localBranchOnly?: GitBranchReference;
31
31
  };
32
32
  export interface GitBranchesSubProvider {
33
- getBranch(repoPath: string, name?: string, cancellation?: AbortSignal): Promise<GitBranch | undefined>;
33
+ getBranch(repoPath: string, name?: string,
34
+ /** `force`: skips the cached answer and any in-flight read that started before this call, and stores the fresh answer. */
35
+ options?: {
36
+ force?: boolean;
37
+ }, cancellation?: AbortSignal): Promise<GitBranch | undefined>;
34
38
  getBranches(repoPath: string, options?: {
35
39
  filter?: ((b: GitBranch) => boolean) | undefined;
36
40
  ordering?: 'date' | 'author-date' | 'topo' | null;
@@ -112,7 +112,30 @@ export interface GitCommitsSubProvider {
112
112
  isAncestorOf(repoPath: string, rev1: string, rev2: string, cancellation?: AbortSignal): Promise<boolean>;
113
113
  hasCommitBeenPushed(repoPath: string, rev: string, cancellation?: AbortSignal): Promise<boolean>;
114
114
  searchCommits(repoPath: string, search: SearchQuery, options?: GitSearchCommitsOptions, cancellation?: AbortSignal): Promise<SearchCommitsResult>;
115
- createUnreachableCommitFromTree?(repoPath: string, tree: string, parent: string, message: string, cancellation?: AbortSignal): Promise<string>;
115
+ /**
116
+ * Creates a commit object from a tree via `commit-tree`, with explicit (zero or more) parents and an
117
+ * optional explicit author/committer — e.g. for merge commits assembled from multiple parents, or a
118
+ * commit authored on behalf of someone else. Writes the commit object only; it updates no ref, so the
119
+ * result is unreachable until a caller points a branch/ref at it.
120
+ *
121
+ * Signs the commit when `sign` is true, reporting a signing failure as a `SigningError`.
122
+ */
123
+ createCommitFromTree?(repoPath: string, tree: string, options: {
124
+ parents: string[];
125
+ message: string;
126
+ author?: {
127
+ name: string;
128
+ email: string;
129
+ date?: Date | string;
130
+ };
131
+ committer?: {
132
+ name: string;
133
+ email: string;
134
+ date?: Date | string;
135
+ };
136
+ sign?: boolean;
137
+ source?: unknown;
138
+ }, cancellation?: AbortSignal): Promise<string>;
116
139
  getCommitReachability?(repoPath: string, rev: string, cancellation?: AbortSignal): Promise<GitCommitReachability | undefined>;
117
140
  getCommitSignature?(repoPath: string, sha: string): Promise<CommitSignature | undefined>;
118
141
  /**
@@ -3,7 +3,9 @@ import { SigningConfig, ValidationResult } from "../models/signature.js";
3
3
  import { GitUser } from "../models/user.js";
4
4
  import { GkConfigInvalidationTarget } from "../cache.js";
5
5
  //#region ../git/src/providers/config.d.ts
6
- export type GitCoreConfigKeys = 'commit.gpgsign' | 'core.excludesFile' | 'diff.guitool' | 'diff.tool' |
6
+ export type GitCoreConfigKeys = 'commit.gpgsign' | 'core.excludesFile' |
7
+ /** `core.hooksPath` — the directory git runs hooks from instead of `$GIT_DIR/hooks` */
8
+ 'core.hooksPath' | 'diff.guitool' | 'diff.tool' |
7
9
  /** `fetch.prune` — whether `git fetch` removes remote-tracking branches that no longer exist on the remote */
8
10
  'fetch.prune' | 'gpg.format' | 'gpg.program' | 'gpg.ssh.program' | 'gpg.ssh.allowedSignersFile' | 'init.defaultBranch' |
9
11
  /** `merge.autoStash` — whether `git merge` (and so a merging `git pull`) stashes and reapplies uncommitted changes */
@@ -23,6 +25,10 @@ export type GitCoreConfigKeys = 'commit.gpgsign' | 'core.excludesFile' | 'diff.g
23
25
  /** `remote.pushDefault` — the remote `git push` targets when a branch has no explicit push remote configured */
24
26
  'remote.pushDefault' | 'user.email' | 'user.name' | 'user.signingkey';
25
27
  export type GitConfigKeys = GitCoreConfigKeys |
28
+ /** `remote` — the branch's upstream remote */
29
+ `branch.${string}.remote` |
30
+ /** `merge` — the upstream ref on that remote, e.g. `refs/heads/main`; together with `remote`, this is what `--set-upstream-to` writes, and writing them directly sets an upstream whose remote ref does not exist yet */
31
+ `branch.${string}.merge` |
26
32
  /** `vscode-merge-base` — value determined by VS Code that is used to determine the merge base for the current branch. Once `gk-merge-base` is determined, we stop using `vscode-merge-base` */
27
33
  `branch.${string}.vscode-merge-base` |
28
34
  /** `github-pr-owner-number` — value determined by VS Code/GitHub PR extension that is used to determine the PR number for the current branch */
@@ -56,6 +56,12 @@ export interface GitOperationsSubProvider {
56
56
  }, runOptions?: GitOperationRunOptions): Promise<GitOperationResult>;
57
57
  pull(repoPath: string, options?: {
58
58
  branch?: GitBranchReference | undefined;
59
+ /**
60
+ * `'only'` requires a fast-forward (`--ff-only`) and refuses rather than merging or rebasing — a
61
+ * `branch` checked out nowhere is then fast-forwarded by fetching `<upstream>:<branch>`. Spelled as
62
+ * `merge`'s option; `--ff`/`--no-ff` are left out because a pull configured to rebase ignores them.
63
+ */
64
+ fastForward?: 'only' | undefined;
59
65
  rebase?: boolean | undefined;
60
66
  tags?: boolean | undefined;
61
67
  source?: unknown;
@@ -1,11 +1,13 @@
1
1
  import { Uri } from "../../utils/uri.js";
2
2
  import { GitProviderDescriptor } from "./types.js";
3
3
  import { GitIgnoreFilter } from "../watching/gitIgnoreFilter.js";
4
+ import { RepositoryChange } from "../models/repository.js";
4
5
  import { GitMaintenanceSubProvider } from "./maintenance.js";
5
6
  import { GitCommitsSubProvider } from "./commits.js";
6
7
  import { GitBranchesSubProvider } from "./branches.js";
7
8
  import { GitContributorsSubProvider } from "./contributors.js";
8
9
  import { GitRevisionSubProvider } from "./revision.js";
10
+ import { CachedGitTypes } from "../cache.js";
9
11
  import { GitBlameSubProvider } from "./blame.js";
10
12
  import { GitConfigSubProvider } from "./config.js";
11
13
  import { GitStagingSubProvider } from "./staging.js";
@@ -36,6 +38,21 @@ export interface GitProvider {
36
38
  getIgnoreFilter?(repoPath: string, gitDirPath: string): GitIgnoreFilter;
37
39
  getIgnoredUrisFilter?(repoPath: string): Promise<(uri: Uri) => boolean>;
38
40
  getLastFetchedTimestamp?(repoPath: string): Promise<number | undefined>;
41
+ /** Creates a new repository at `path` (`git init`), creating `path` itself if it doesn't yet exist. */
42
+ init?(path: string, options?: {
43
+ defaultBranch?: string;
44
+ bare?: boolean;
45
+ }): Promise<void>;
46
+ /**
47
+ * Notifies the provider that `repoPath` was mutated outside of a typed sub-provider method — e.g. a
48
+ * consumer that ran a command through the raw `git.run`/`provider.git.run` escape hatch. Fires the same
49
+ * `cache.onReset`/`repository.onChanged` hooks a typed mutator would, so, exactly as after a typed write,
50
+ * the provider clears its own caches for `repoPath` (every type, or just `options.cache` when given) and
51
+ * its pending commands before the host's handlers run.
52
+ */
53
+ notifyChanged?(repoPath: string, changes: readonly RepositoryChange[], options?: {
54
+ cache?: readonly CachedGitTypes[] | 'all';
55
+ }): void;
39
56
  readonly branches: GitBranchesSubProvider;
40
57
  readonly commits: GitCommitsSubProvider;
41
58
  readonly config: GitConfigSubProvider;
@@ -10,7 +10,11 @@ export interface GitRefsSubProvider {
10
10
  forkPoint?: boolean | undefined;
11
11
  priority?: GitCommandPriority;
12
12
  }, cancellation?: AbortSignal): Promise<string | undefined>;
13
- getReference(repoPath: string, ref: string, cancellation?: AbortSignal): Promise<GitReference | undefined>;
13
+ getReference(repoPath: string, ref: string,
14
+ /** `force`: skips the cached answer and any in-flight read that started before this call, and stores the fresh answer. */
15
+ options?: {
16
+ force?: boolean;
17
+ }, cancellation?: AbortSignal): Promise<GitReference | undefined>;
14
18
  /**
15
19
  * Lightweight enumeration of ref tips (heads/remotes/tags) — no enrichment.
16
20
  * Use this when you need a SHA-to-refs map; use `getBranches`/`getTags` for full models.
@@ -38,8 +42,39 @@ export interface GitRefsSubProvider {
38
42
  } | undefined;
39
43
  }, cancellation?: AbortSignal): Promise<boolean>;
40
44
  isValidReference(repoPath: string, ref: string, pathOrUri?: string | Uri, cancellation?: AbortSignal): Promise<boolean>;
41
- validateReference(repoPath: string, ref: string, relativePath?: string, cancellation?: AbortSignal): Promise<string | undefined>;
42
- updateReference(repoPath: string, ref: string, newRef: string, cancellation?: AbortSignal): Promise<void>;
45
+ validateReference(repoPath: string, ref: string, options?: {
46
+ relativePath?: string;
47
+ /** Skips the cached answer and any in-flight read that started before this call, and stores the fresh answer. */
48
+ force?: boolean;
49
+ }, cancellation?: AbortSignal): Promise<string | undefined>;
50
+ /**
51
+ * Deletes `ref` — a symbolic ref itself, never the ref it points to; `HEAD` is refused. `expected` makes
52
+ * it a compare-and-swap: the delete is refused unless the ref is at that sha. Without `expected`,
53
+ * deleting a ref that doesn't exist succeeds — git treats it as already-done rather than an error.
54
+ *
55
+ * A local branch (`refs/heads/<name>`) is deleted the way `git branch -d` would leave things, minus its
56
+ * merged check: refused while checked out in any worktree, and its `branch.<name>` config section and
57
+ * GitLens's per-branch metadata go with it. Prefer `branches.deleteLocalBranch` unless you need the
58
+ * compare-and-swap.
59
+ *
60
+ * Optional because only a real git host can offer it.
61
+ *
62
+ * @throws {ReferenceUpdateError} `'conflict'` when the ref is elsewhere, `'notFound'` when
63
+ * `expected` was given and the ref doesn't exist, `'checkedOut'` for a branch checked out in a worktree.
64
+ */
65
+ deleteReference?(repoPath: string, ref: string, options?: {
66
+ expected?: string;
67
+ }, cancellation?: AbortSignal): Promise<void>;
68
+ /**
69
+ * Points `ref` at `sha`. `expected` makes it a compare-and-swap: a sha requires the ref to be there
70
+ * already, `'absent'` requires it not to exist at all (create-only).
71
+ *
72
+ * @throws {ReferenceUpdateError} `'conflict'` when the compare-and-swap lost, `'invalidRef'` for a
73
+ * malformed name, `'invalidObject'` when `sha` is unknown.
74
+ */
75
+ updateReference(repoPath: string, ref: string, sha: string, options?: {
76
+ expected?: string | 'absent';
77
+ }, cancellation?: AbortSignal): Promise<void>;
43
78
  }
44
79
  //#endregion
45
80
  //# sourceMappingURL=refs.d.ts.map
@@ -24,7 +24,11 @@ export interface GitRevisionSubProvider {
24
24
  getTrackedFiles(repoPath: string): Promise<string[]>;
25
25
  getTreeEntryForRevision(repoPath: string, path: string, rev: string): Promise<GitTreeEntry | undefined>;
26
26
  getTreeForRevision(repoPath: string, rev: string): Promise<GitTreeEntry[]>;
27
- resolveRevision(repoPath: string, ref: string, pathOrUri?: string | Uri): Promise<ResolvedRevision>;
27
+ resolveRevision(repoPath: string, ref: string, pathOrUri?: string | Uri,
28
+ /** `force`: skips the cached answer and any in-flight read that started before this call, and stores the fresh answer. */
29
+ options?: {
30
+ force?: boolean;
31
+ }): Promise<ResolvedRevision>;
28
32
  }
29
33
  //#endregion
30
34
  //# sourceMappingURL=revision.d.ts.map
@@ -37,6 +37,18 @@ export interface GitStagingSubProvider {
37
37
  }): Promise<void>;
38
38
  stageAll(repoPath: string): Promise<void>;
39
39
  unstageAll(repoPath: string): Promise<void>;
40
+ /**
41
+ * Removes untracked files from the working tree (`git clean`). `force` defaults to `true`, since git
42
+ * refuses to clean without `-f` unless `clean.requireForce` is `false`. Pass
43
+ * `directories: true` to also remove untracked directories, `ignored: true` to also remove files git
44
+ * would otherwise skip (gitignored), and `paths` to restrict the clean to specific files/directories.
45
+ */
46
+ clean(repoPath: string, options?: {
47
+ paths?: (string | Uri)[];
48
+ directories?: boolean;
49
+ force?: boolean;
50
+ ignored?: boolean;
51
+ }): Promise<void>;
40
52
  }
41
53
  //#endregion
42
54
  //# sourceMappingURL=staging.d.ts.map
@@ -1,5 +1,6 @@
1
1
  import { Uri } from "../../utils/uri.js";
2
2
  import { GitWorktree } from "../models/worktree.js";
3
+ import { GitOperationRunOptions } from "./operations.js";
3
4
  //#region ../git/src/providers/worktrees.d.ts
4
5
  export interface GitWorktreesSubProvider {
5
6
  createWorktree(repoPath: string, path: string, options?: {
@@ -8,20 +9,39 @@ export interface GitWorktreesSubProvider {
8
9
  detach?: boolean;
9
10
  force?: boolean;
10
11
  noTracking?: boolean;
11
- }): Promise<void>;
12
+ }, runOptions?: GitOperationRunOptions): Promise<void>;
12
13
  createWorktreeWithResult(repoPath: string, path: string, options?: {
13
14
  commitish?: string;
14
15
  createBranch?: string;
15
16
  detach?: boolean;
16
17
  force?: boolean;
17
18
  noTracking?: boolean;
18
- }): Promise<GitWorktree | undefined>;
19
+ }, runOptions?: GitOperationRunOptions): Promise<GitWorktree | undefined>;
19
20
  getWorktree(repoPath: string, predicate: (w: GitWorktree) => boolean, cancellation?: AbortSignal): Promise<GitWorktree | undefined>;
20
21
  getWorktrees(repoPath: string, cancellation?: AbortSignal): Promise<GitWorktree[]>;
21
22
  getWorktreesDefaultUri(repoPath: string): Uri | undefined;
22
- /** Pass `force: 'locked'` to also override a locked worktree */
23
+ /**
24
+ * Deletes a worktree. Pass `force: 'locked'` to also override a locked worktree.
25
+ *
26
+ * `runOptions` are spread into the underlying git invocation (e.g. `{ timeout: 0 }` for a large
27
+ * worktree whose removal may exceed the default command timeout).
28
+ *
29
+ * On failure, the thrown error's `original` property carries the raw underlying error (stderr/stdout
30
+ * included) untouched, for a caller that needs to classify a platform-specific failure itself.
31
+ */
23
32
  deleteWorktree(repoPath: string, path: string | Uri, options?: {
24
33
  force?: boolean | 'locked';
34
+ }, runOptions?: GitOperationRunOptions): Promise<void>;
35
+ /**
36
+ * Removes administrative files for worktrees whose working directory no longer exists
37
+ * (`git worktree prune`). Pass `expire` to only prune worktrees that have been inaccessible for longer than the given time.
38
+ */
39
+ pruneWorktrees(repoPath: string, options?: {
40
+ expire?: string;
41
+ }): Promise<void>;
42
+ /** Locks a worktree against removal/pruning, optionally recording a reason. */
43
+ lockWorktree(repoPath: string, path: string | Uri, options?: {
44
+ reason?: string;
25
45
  }): Promise<void>;
26
46
  unlockWorktree(repoPath: string, path: string | Uri): Promise<void>;
27
47
  }
@@ -76,6 +76,7 @@ export interface GitResultCache {
76
76
  accessTTL?: number;
77
77
  cancellation?: AbortSignal;
78
78
  }): Promise<GitResult<unknown>>;
79
+ delete(repoPath: string, key: string): void;
79
80
  }
80
81
  /**
81
82
  * Priority levels for git commands.
@@ -119,6 +120,11 @@ export interface GitRunOptions {
119
120
  createTTL?: number;
120
121
  accessTTL?: number;
121
122
  };
123
+ /**
124
+ * Drops this command's cached result first, so the run neither returns the stale value nor joins
125
+ * an in-flight run of it, and stores the fresh result for later unforced reads.
126
+ */
127
+ force?: boolean;
122
128
  };
123
129
  cwd?: string;
124
130
  readonly env?: Record<string, string | undefined>;
@@ -1,8 +1,9 @@
1
1
  import { Uri } from "../utils/uri.js";
2
2
  import { GitProviderDescriptor } from "../git/providers/types.js";
3
3
  import { GitIgnoreFilter } from "../git/watching/gitIgnoreFilter.js";
4
+ import { RepositoryChange } from "../git/models/repository.js";
4
5
  import { GitServiceContext } from "../git/context.js";
5
- import { Cache } from "../git/cache.js";
6
+ import { Cache, CachedGitTypes } from "../git/cache.js";
6
7
  import { GitProvider } from "../git/providers/provider.js";
7
8
  import { FilteredGitFeatures, GitFeatureOrPrefix, GitFeatures } from "../git/features.js";
8
9
  import { GitLocation } from "./exec/locator.js";
@@ -96,6 +97,21 @@ export declare class CliGitProvider implements GitProvider {
96
97
  /** Returns the resolved git binary path. */
97
98
  path(): Promise<string>;
98
99
  clone(url: string, parentPath: string): Promise<string | undefined>;
100
+ /** Creates a new repository at `targetPath` (`git init`), creating it first if it doesn't yet exist. */
101
+ init(targetPath: string, options?: {
102
+ defaultBranch?: string;
103
+ bare?: boolean;
104
+ }): Promise<void>;
105
+ /**
106
+ * Notifies the provider that `repoPath` was mutated outside of a typed sub-provider method — e.g. a
107
+ * consumer that ran a command through the raw `git.run`/`provider.git.run` escape hatch. Fires the same
108
+ * `cache.onReset`/`repository.onChanged` hooks a typed mutator would, so, exactly as after a typed write,
109
+ * the provider clears its own caches for `repoPath` (every type, or just `options.cache` when given) and
110
+ * its pending commands before the host's handlers run.
111
+ */
112
+ notifyChanged(repoPath: string, changes: readonly RepositoryChange[], options?: {
113
+ cache?: readonly CachedGitTypes[] | 'all';
114
+ }): void;
99
115
  private _blame;
100
116
  get blame(): BlameGitSubProvider;
101
117
  private _branches;
@@ -27,6 +27,7 @@ import { StagingGitSubProvider } from "./providers/staging.js";
27
27
  import { StatusGitSubProvider } from "./providers/status.js";
28
28
  import { TagsGitSubProvider } from "./providers/tags.js";
29
29
  import { WorktreesGitSubProvider } from "./providers/worktrees.js";
30
+ import { promises } from "node:fs";
30
31
  import * as path from "node:path";
31
32
  //#region ../git-cli/src/cliGitProvider.ts
32
33
  /**
@@ -58,7 +59,21 @@ var CliGitProvider = class {
58
59
  context;
59
60
  _localRepositories;
60
61
  constructor(options) {
61
- this.context = options.context;
62
+ const hostHooks = options.context.hooks;
63
+ this.context = {
64
+ ...options.context,
65
+ hooks: {
66
+ ...hostHooks,
67
+ cache: {
68
+ ...hostHooks?.cache,
69
+ onReset: (repoPath, ...types) => {
70
+ this._cache.evictCaches(repoPath, ...types);
71
+ this._git.clearPendingCommands();
72
+ hostHooks?.cache?.onReset?.(repoPath, ...types);
73
+ }
74
+ }
75
+ }
76
+ };
62
77
  this._localRepositories = options.localRepositories ?? true;
63
78
  this._git = options.git ?? new Git(options.locator, {
64
79
  ...options.gitOptions,
@@ -107,6 +122,27 @@ var CliGitProvider = class {
107
122
  await this._git.run({ cwd: parentPath }, "clone", url, folderPath);
108
123
  return folderPath;
109
124
  }
125
+ /** Creates a new repository at `targetPath` (`git init`), creating it first if it doesn't yet exist. */
126
+ async init(targetPath, options) {
127
+ await promises.mkdir(targetPath, { recursive: true });
128
+ const args = ["init"];
129
+ if (options?.defaultBranch) args.push("-b", options.defaultBranch);
130
+ if (options?.bare) args.push("--bare");
131
+ await this._git.run({ cwd: targetPath }, ...args);
132
+ }
133
+ /**
134
+ * Notifies the provider that `repoPath` was mutated outside of a typed sub-provider method — e.g. a
135
+ * consumer that ran a command through the raw `git.run`/`provider.git.run` escape hatch. Fires the same
136
+ * `cache.onReset`/`repository.onChanged` hooks a typed mutator would, so, exactly as after a typed write,
137
+ * the provider clears its own caches for `repoPath` (every type, or just `options.cache` when given) and
138
+ * its pending commands before the host's handlers run.
139
+ */
140
+ notifyChanged(repoPath, changes, options) {
141
+ const types = options?.cache;
142
+ if (types == null || types === "all") this.context.hooks?.cache?.onReset?.(repoPath);
143
+ else if (types.length) this.context.hooks?.cache?.onReset?.(repoPath, ...types);
144
+ this.context.hooks?.repository?.onChanged?.(repoPath, [...changes]);
145
+ }
110
146
  _blame;
111
147
  get blame() {
112
148
  return this._blame ??= new BlameGitSubProvider(this._git, this._cache, this);
@@ -1 +1 @@
1
- {"version":3,"file":"cliGitProvider.js","names":[],"sources":["../../../git-cli/src/cliGitProvider.ts"],"sourcesContent":["import * as path from 'node:path';\nimport { Cache } from '@gitlens/git/cache.js';\nimport type { GitServiceContext } from '@gitlens/git/context.js';\nimport type { GitFileStatus } from '@gitlens/git/models/fileStatus.js';\nimport { deletedOrMissing } from '@gitlens/git/models/revision.js';\nimport type { GitProvider, GitProviderDescriptor } from '@gitlens/git/providers/provider.js';\nimport { parseGitRemoteUrl } from '@gitlens/git/utils/remote.utils.js';\nimport { isUncommitted } from '@gitlens/git/utils/revision.utils.js';\nimport { GitIgnoreFilter } from '@gitlens/git/watching/gitIgnoreFilter.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { joinPaths, maybeUri, normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport type { Uri } from '@gitlens/utils/uri.js';\nimport { fileUri, joinUriPath, parseUri, toFsPath } from '@gitlens/utils/uri.js';\nimport { fsExists } from './exec/exec.js';\nimport type { FilteredGitFeatures, GitFeatureOrPrefix, GitFeatures } from './exec/features.js';\nimport type { GitFeatureUnsupportedMessage, GitOptions } from './exec/git.js';\nimport { Git } from './exec/git.js';\nimport type { GitLocation } from './exec/locator.js';\nimport { BlameGitSubProvider } from './providers/blame.js';\nimport { BranchesGitSubProvider } from './providers/branches.js';\nimport { CommitsGitSubProvider } from './providers/commits.js';\nimport { ConfigGitSubProvider } from './providers/config.js';\nimport { ContributorsGitSubProvider } from './providers/contributors.js';\nimport { DiffGitSubProvider } from './providers/diff.js';\nimport { GraphGitSubProvider } from './providers/graph.js';\nimport { MaintenanceGitSubProvider } from './providers/maintenance.js';\nimport { OperationsGitSubProvider } from './providers/operations.js';\nimport { PatchGitSubProvider } from './providers/patch.js';\nimport { PausedOperationsGitSubProvider } from './providers/pausedOperations.js';\nimport { RefsGitSubProvider } from './providers/refs.js';\nimport { RemotesGitSubProvider } from './providers/remotes.js';\nimport { RevisionGitSubProvider } from './providers/revision.js';\nimport { StagingGitSubProvider } from './providers/staging.js';\nimport { StashGitSubProvider } from './providers/stash.js';\nimport { StatusGitSubProvider } from './providers/status.js';\nimport { TagsGitSubProvider } from './providers/tags.js';\nimport { WorktreesGitSubProvider } from './providers/worktrees.js';\n\nexport interface CliGitProviderOptions {\n\t/** Use an existing Cache instance, or one will be created */\n\tcache?: Cache;\n\t/** Context providing config and event bus hooks */\n\tcontext: GitServiceContext;\n\t/** Function that resolves the git binary location (path + version) */\n\tlocator: () => Promise<GitLocation>;\n\t/** Pre-built Git executor — when provided, used instead of creating a new Git from locator/options */\n\tgit?: Git;\n\t/** Git execution options (timeout, trust, queue config, hooks, etc.) */\n\tgitOptions?: GitOptions;\n\t/**\n\t * Whether repositories reached through this provider are on the LOCAL filesystem. `false` disables the\n\t * maintenance sub-provider entirely (Live Share): its probes stat local paths, and its writes are\n\t * rejected by the host's command allowlist, so inheriting it yields empty reports and swallowed\n\t * failures rather than an honest \"unsupported here\". Defaults to `true`.\n\t */\n\tlocalRepositories?: boolean;\n}\n\n/**\n * Exposes `isTrackedWithDetails` as a callable method for sub-providers.\n * The class declares it as a regular method, but TypeScript's structural\n * typing makes it inaccessible through the class type alone when consumed\n * internally — this type re-maps it to ensure sub-providers can call it.\n */\nexport type CliGitProviderInternal = Omit<CliGitProvider, 'isTrackedWithDetails'> & {\n\tisTrackedWithDetails: CliGitProvider['isTrackedWithDetails'];\n};\n\n/**\n * A fully-wired CLI-based git provider that executes git commands via `child_process`.\n * Implements both `CliGitProviderInternal` (for internal sub-provider wiring)\n * and `GitProvider` (for registration in a provider registry).\n *\n * @example\n * ```typescript\n * const provider = new CliGitProvider({\n * context: { events: myEvents },\n * locator: () => findGitPath(null),\n * gitOptions: { gitTimeout: 30000 },\n * });\n *\n * const branches = await provider.branches.getBranches(repoPath);\n * const status = await provider.status.getStatus(repoPath);\n * ```\n */\nexport class CliGitProvider implements GitProvider {\n\treadonly descriptor: GitProviderDescriptor = { id: 'git', name: 'Git', virtual: false };\n\n\tprivate readonly _cache: Cache;\n\tprivate readonly _cacheOwned: boolean;\n\tprivate readonly _git: Git;\n\n\treadonly context: GitServiceContext;\n\tprivate readonly _localRepositories: boolean;\n\n\tconstructor(options: CliGitProviderOptions) {\n\t\tthis.context = options.context;\n\t\tthis._localRepositories = options.localRepositories ?? true;\n\t\tthis._git =\n\t\t\toptions.git ??\n\t\t\tnew Git(options.locator, {\n\t\t\t\t...options.gitOptions,\n\t\t\t\tisTrusted:\n\t\t\t\t\toptions.context.workspace?.isTrusted != null\n\t\t\t\t\t\t? () => options.context.workspace!.isTrusted!\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\t\tthis._cacheOwned = !(options.cache instanceof Cache);\n\t\tthis._cache = options.cache instanceof Cache ? options.cache : new Cache();\n\t}\n\n\t/** The underlying cache instance (for repo path registration, etc.) */\n\tget cache(): Cache {\n\t\treturn this._cache;\n\t}\n\n\t/** The underlying git execution instance (for sub-providers that need direct exec/stream access) */\n\tget git(): Git {\n\t\treturn this._git;\n\t}\n\n\t/** Returns whether the installed git version supports the given feature. */\n\tsupports(feature: GitFeatures): boolean | Promise<boolean> {\n\t\treturn this._git.supports(feature);\n\t}\n\n\t/** Returns all features matching the prefix that the installed git version supports. */\n\tsupported<T extends GitFeatureOrPrefix>(feature: T): FilteredGitFeatures<T>[] | Promise<FilteredGitFeatures<T>[]> {\n\t\treturn this._git.supported(feature);\n\t}\n\n\t/** Throws if the installed git version does not support the given feature. */\n\tasync ensureSupports(feature: GitFeatures, prefix: string, suffix: string): Promise<void>;\n\tasync ensureSupports(feature: GitFeatures, message: GitFeatureUnsupportedMessage): Promise<void>;\n\tasync ensureSupports(\n\t\tfeature: GitFeatures,\n\t\tprefixOrMessage: string | GitFeatureUnsupportedMessage,\n\t\tsuffix?: string,\n\t): Promise<void> {\n\t\treturn typeof prefixOrMessage === 'function'\n\t\t\t? this._git.ensureSupports(feature, prefixOrMessage)\n\t\t\t: this._git.ensureSupports(feature, prefixOrMessage, suffix!);\n\t}\n\n\t/** Returns the installed git version string. */\n\tasync version(): Promise<string> {\n\t\treturn this._git.version();\n\t}\n\n\t/** Returns the resolved git binary path. */\n\tasync path(): Promise<string> {\n\t\treturn this._git.path();\n\t}\n\n\tasync clone(url: string, parentPath: string): Promise<string | undefined> {\n\t\tlet count = 0;\n\t\tconst [, , remotePath] = parseGitRemoteUrl(url);\n\t\tconst remoteName = remotePath.split('/').pop();\n\t\tif (!remoteName) return undefined;\n\n\t\tlet folderPath = joinPaths(parentPath, remoteName);\n\t\twhile ((await fsExists(folderPath)) && count < 20) {\n\t\t\tcount++;\n\t\t\tfolderPath = joinPaths(parentPath, `${remoteName}-${count}`);\n\t\t}\n\n\t\tawait this._git.run({ cwd: parentPath }, 'clone', url, folderPath);\n\n\t\treturn folderPath;\n\t}\n\n\tprivate _blame: BlameGitSubProvider | undefined;\n\tget blame(): BlameGitSubProvider {\n\t\treturn (this._blame ??= new BlameGitSubProvider(\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _branches: BranchesGitSubProvider | undefined;\n\tget branches(): BranchesGitSubProvider {\n\t\treturn (this._branches ??= new BranchesGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _commits: CommitsGitSubProvider | undefined;\n\tget commits(): CommitsGitSubProvider {\n\t\treturn (this._commits ??= new CommitsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _config: ConfigGitSubProvider | undefined;\n\tget config(): ConfigGitSubProvider {\n\t\treturn (this._config ??= new ConfigGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _contributors: ContributorsGitSubProvider | undefined;\n\tget contributors(): ContributorsGitSubProvider {\n\t\treturn (this._contributors ??= new ContributorsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _diff: DiffGitSubProvider | undefined;\n\tget diff(): DiffGitSubProvider {\n\t\treturn (this._diff ??= new DiffGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _graph: GraphGitSubProvider | undefined;\n\tget graph(): GraphGitSubProvider {\n\t\treturn (this._graph ??= new GraphGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _maintenance: MaintenanceGitSubProvider | undefined;\n\t// Optional so subclasses whose repos aren't local can report the capability as absent — see\n\t// `VslsGitProvider`. Consumers already treat `maintenance == null` as \"unsupported here\" (web builds\n\t// never register it at all).\n\tget maintenance(): MaintenanceGitSubProvider | undefined {\n\t\tif (!this._localRepositories) return undefined;\n\n\t\treturn (this._maintenance ??= new MaintenanceGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _ops: OperationsGitSubProvider | undefined;\n\tget ops(): OperationsGitSubProvider {\n\t\treturn (this._ops ??= new OperationsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _patch: PatchGitSubProvider | undefined;\n\tget patch(): PatchGitSubProvider {\n\t\treturn (this._patch ??= new PatchGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _pausedOps: PausedOperationsGitSubProvider | undefined;\n\tget pausedOps(): PausedOperationsGitSubProvider {\n\t\treturn (this._pausedOps ??= new PausedOperationsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _refs: RefsGitSubProvider | undefined;\n\tget refs(): RefsGitSubProvider {\n\t\treturn (this._refs ??= new RefsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _remotes: RemotesGitSubProvider | undefined;\n\tget remotes(): RemotesGitSubProvider {\n\t\treturn (this._remotes ??= new RemotesGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _revision: RevisionGitSubProvider | undefined;\n\tget revision(): RevisionGitSubProvider {\n\t\treturn (this._revision ??= new RevisionGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _staging: StagingGitSubProvider | undefined;\n\tget staging(): StagingGitSubProvider {\n\t\treturn (this._staging ??= new StagingGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _stash: StashGitSubProvider | undefined;\n\tget stash(): StashGitSubProvider {\n\t\treturn (this._stash ??= new StashGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _status: StatusGitSubProvider | undefined;\n\tget status(): StatusGitSubProvider {\n\t\treturn (this._status ??= new StatusGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _tags: TagsGitSubProvider | undefined;\n\tget tags(): TagsGitSubProvider {\n\t\treturn (this._tags ??= new TagsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _worktrees: WorktreesGitSubProvider | undefined;\n\tget worktrees(): WorktreesGitSubProvider {\n\t\treturn (this._worktrees ??= new WorktreesGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tgetAbsoluteUri(pathOrUri: string | Uri, base: string | Uri): Uri {\n\t\tconst baseUri = typeof base !== 'string' ? base : fileUri(base);\n\t\tif (typeof pathOrUri !== 'string') return pathOrUri;\n\t\tif (maybeUri(pathOrUri)) return parseUri(pathOrUri);\n\t\tif (path.isAbsolute(pathOrUri)) return fileUri(pathOrUri);\n\t\treturn joinUriPath(baseUri, pathOrUri);\n\t}\n\n\tgetRelativePath(pathOrUri: string | Uri, base: string | Uri): string {\n\t\tconst [relativePath] = splitPath(toFsPath(pathOrUri), toFsPath(base));\n\t\treturn relativePath;\n\t}\n\n\tasync excludeIgnoredUris(repoPath: string, uris: Uri[]): Promise<Uri[]> {\n\t\tconst filter = this.getIgnoreFilter(repoPath);\n\t\tawait filter.ready();\n\t\treturn uris.filter(uri => {\n\t\t\tconst relativePath = normalizePath(path.relative(repoPath, toFsPath(uri)));\n\t\t\treturn !relativePath || !filter.isIgnored(relativePath);\n\t\t});\n\t}\n\n\tasync getIgnoredUrisFilter(repoPath: string): Promise<(uri: Uri) => boolean> {\n\t\tconst filter = this.getIgnoreFilter(repoPath);\n\t\tawait filter.ready();\n\t\treturn (uri: Uri) => {\n\t\t\tconst relativePath = normalizePath(path.relative(repoPath, toFsPath(uri)));\n\t\t\treturn relativePath ? filter.isIgnored(relativePath) : false;\n\t\t};\n\t}\n\n\tasync getLastFetchedTimestamp(repoPath: string): Promise<number | undefined> {\n\t\treturn this._cache.getLastFetchedTimestamp(repoPath, async (commonPath): Promise<number | undefined> => {\n\t\t\tconst gitDir = await this.config.getGitDir?.(commonPath);\n\t\t\tif (gitDir == null) return undefined;\n\n\t\t\tconst gitDirUri = gitDir.commonUri ?? gitDir.uri;\n\t\t\tconst fetchHeadUri = joinUriPath(gitDirUri, 'FETCH_HEAD');\n\t\t\tconst stats = await this.context.fs.stat(fetchHeadUri);\n\t\t\t// If the file is empty, assume the fetch failed, and don't update the timestamp\n\t\t\tif (stats != null && stats.size > 0) return stats.mtime;\n\n\t\t\treturn undefined;\n\t\t});\n\t}\n\n\tgetIgnoreFilter(repoPath: string): GitIgnoreFilter {\n\t\tlet filter = this._cache.gitIgnore.get(repoPath);\n\t\tif (filter == null) {\n\t\t\tconst gitDir = this._cache.gitDir.get(repoPath);\n\t\t\tconst gitDirPath = gitDir?.uri.fsPath ?? `${repoPath}/.git`;\n\t\t\tfilter = new GitIgnoreFilter({\n\t\t\t\trepoPath: repoPath,\n\t\t\t\tgitDirPath: gitDirPath,\n\t\t\t\tfs: this.context.fs,\n\t\t\t\tgetGlobalExcludesPath:\n\t\t\t\t\tthis.config.getConfig != null\n\t\t\t\t\t\t? async () => this.config.getConfig(repoPath, 'core.excludesFile')\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tthis._cache.gitIgnore.set(repoPath, filter);\n\t\t}\n\t\treturn filter;\n\t}\n\n\tprivate async isTrackedWithDetails(\n\t\tfilePath: string,\n\t\trepoPath: string,\n\t\trev?: string,\n\t): Promise<{ path: string; status?: GitFileStatus; originalPath?: string } | undefined> {\n\t\tif (rev === deletedOrMissing) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tconst [relativePath, root] = splitPath(filePath, repoPath);\n\n\t\t\t// Check if the file exists in the working tree first (better cache reuse)\n\t\t\tlet tracked = await this.revision.exists(root, relativePath);\n\t\t\tif (tracked) return { path: relativePath };\n\n\t\t\t// If a specific revision was provided, check there too\n\t\t\tif (rev && !isUncommitted(rev)) {\n\t\t\t\ttracked = await this.revision.exists(root, relativePath, rev);\n\t\t\t\tif (!tracked) {\n\t\t\t\t\t// Check the parent revision (file might have been deleted in this rev)\n\t\t\t\t\ttracked = await this.revision.exists(root, relativePath, `${rev}^`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn tracked ? { path: relativePath } : undefined;\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis._git.dispose();\n\t\tif (this._cacheOwned) {\n\t\t\tthis._cache.dispose();\n\t\t}\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cliGitProvider.js","names":["fs"],"sources":["../../../git-cli/src/cliGitProvider.ts"],"sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type { CachedGitTypes } from '@gitlens/git/cache.js';\nimport { Cache } from '@gitlens/git/cache.js';\nimport type { GitServiceContext } from '@gitlens/git/context.js';\nimport type { GitFileStatus } from '@gitlens/git/models/fileStatus.js';\nimport type { RepositoryChange } from '@gitlens/git/models/repository.js';\nimport { deletedOrMissing } from '@gitlens/git/models/revision.js';\nimport type { GitProvider, GitProviderDescriptor } from '@gitlens/git/providers/provider.js';\nimport { parseGitRemoteUrl } from '@gitlens/git/utils/remote.utils.js';\nimport { isUncommitted } from '@gitlens/git/utils/revision.utils.js';\nimport { GitIgnoreFilter } from '@gitlens/git/watching/gitIgnoreFilter.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { joinPaths, maybeUri, normalizePath, splitPath } from '@gitlens/utils/path.js';\nimport type { Uri } from '@gitlens/utils/uri.js';\nimport { fileUri, joinUriPath, parseUri, toFsPath } from '@gitlens/utils/uri.js';\nimport { fsExists } from './exec/exec.js';\nimport type { FilteredGitFeatures, GitFeatureOrPrefix, GitFeatures } from './exec/features.js';\nimport type { GitFeatureUnsupportedMessage, GitOptions } from './exec/git.js';\nimport { Git } from './exec/git.js';\nimport type { GitLocation } from './exec/locator.js';\nimport { BlameGitSubProvider } from './providers/blame.js';\nimport { BranchesGitSubProvider } from './providers/branches.js';\nimport { CommitsGitSubProvider } from './providers/commits.js';\nimport { ConfigGitSubProvider } from './providers/config.js';\nimport { ContributorsGitSubProvider } from './providers/contributors.js';\nimport { DiffGitSubProvider } from './providers/diff.js';\nimport { GraphGitSubProvider } from './providers/graph.js';\nimport { MaintenanceGitSubProvider } from './providers/maintenance.js';\nimport { OperationsGitSubProvider } from './providers/operations.js';\nimport { PatchGitSubProvider } from './providers/patch.js';\nimport { PausedOperationsGitSubProvider } from './providers/pausedOperations.js';\nimport { RefsGitSubProvider } from './providers/refs.js';\nimport { RemotesGitSubProvider } from './providers/remotes.js';\nimport { RevisionGitSubProvider } from './providers/revision.js';\nimport { StagingGitSubProvider } from './providers/staging.js';\nimport { StashGitSubProvider } from './providers/stash.js';\nimport { StatusGitSubProvider } from './providers/status.js';\nimport { TagsGitSubProvider } from './providers/tags.js';\nimport { WorktreesGitSubProvider } from './providers/worktrees.js';\n\nexport interface CliGitProviderOptions {\n\t/** Use an existing Cache instance, or one will be created */\n\tcache?: Cache;\n\t/** Context providing config and event bus hooks */\n\tcontext: GitServiceContext;\n\t/** Function that resolves the git binary location (path + version) */\n\tlocator: () => Promise<GitLocation>;\n\t/** Pre-built Git executor — when provided, used instead of creating a new Git from locator/options */\n\tgit?: Git;\n\t/** Git execution options (timeout, trust, queue config, hooks, etc.) */\n\tgitOptions?: GitOptions;\n\t/**\n\t * Whether repositories reached through this provider are on the LOCAL filesystem. `false` disables the\n\t * maintenance sub-provider entirely (Live Share): its probes stat local paths, and its writes are\n\t * rejected by the host's command allowlist, so inheriting it yields empty reports and swallowed\n\t * failures rather than an honest \"unsupported here\". Defaults to `true`.\n\t */\n\tlocalRepositories?: boolean;\n}\n\n/**\n * Exposes `isTrackedWithDetails` as a callable method for sub-providers.\n * The class declares it as a regular method, but TypeScript's structural\n * typing makes it inaccessible through the class type alone when consumed\n * internally — this type re-maps it to ensure sub-providers can call it.\n */\nexport type CliGitProviderInternal = Omit<CliGitProvider, 'isTrackedWithDetails'> & {\n\tisTrackedWithDetails: CliGitProvider['isTrackedWithDetails'];\n};\n\n/**\n * A fully-wired CLI-based git provider that executes git commands via `child_process`.\n * Implements both `CliGitProviderInternal` (for internal sub-provider wiring)\n * and `GitProvider` (for registration in a provider registry).\n *\n * @example\n * ```typescript\n * const provider = new CliGitProvider({\n * context: { events: myEvents },\n * locator: () => findGitPath(null),\n * gitOptions: { gitTimeout: 30000 },\n * });\n *\n * const branches = await provider.branches.getBranches(repoPath);\n * const status = await provider.status.getStatus(repoPath);\n * ```\n */\nexport class CliGitProvider implements GitProvider {\n\treadonly descriptor: GitProviderDescriptor = { id: 'git', name: 'Git', virtual: false };\n\n\tprivate readonly _cache: Cache;\n\tprivate readonly _cacheOwned: boolean;\n\tprivate readonly _git: Git;\n\n\treadonly context: GitServiceContext;\n\tprivate readonly _localRepositories: boolean;\n\n\tconstructor(options: CliGitProviderOptions) {\n\t\t// Every typed write announces itself through `onReset`, so the provider clears its own state there\n\t\t// rather than trusting each host to: a host with no handler still reads fresh after a write. A write\n\t\t// hard-evicts, so a caller after it never joins a read that started before it; watcher-driven clears\n\t\t// reach `Cache.clearCaches` directly and keep sharing in-flight reads.\n\t\tconst hostHooks = options.context.hooks;\n\t\tthis.context = {\n\t\t\t...options.context,\n\t\t\thooks: {\n\t\t\t\t...hostHooks,\n\t\t\t\tcache: {\n\t\t\t\t\t...hostHooks?.cache,\n\t\t\t\t\tonReset: (repoPath, ...types) => {\n\t\t\t\t\t\tthis._cache.evictCaches(repoPath, ...types);\n\t\t\t\t\t\tthis._git.clearPendingCommands();\n\t\t\t\t\t\thostHooks?.cache?.onReset?.(repoPath, ...types);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\tthis._localRepositories = options.localRepositories ?? true;\n\t\tthis._git =\n\t\t\toptions.git ??\n\t\t\tnew Git(options.locator, {\n\t\t\t\t...options.gitOptions,\n\t\t\t\tisTrusted:\n\t\t\t\t\toptions.context.workspace?.isTrusted != null\n\t\t\t\t\t\t? () => options.context.workspace!.isTrusted!\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\t\tthis._cacheOwned = !(options.cache instanceof Cache);\n\t\tthis._cache = options.cache instanceof Cache ? options.cache : new Cache();\n\t}\n\n\t/** The underlying cache instance (for repo path registration, etc.) */\n\tget cache(): Cache {\n\t\treturn this._cache;\n\t}\n\n\t/** The underlying git execution instance (for sub-providers that need direct exec/stream access) */\n\tget git(): Git {\n\t\treturn this._git;\n\t}\n\n\t/** Returns whether the installed git version supports the given feature. */\n\tsupports(feature: GitFeatures): boolean | Promise<boolean> {\n\t\treturn this._git.supports(feature);\n\t}\n\n\t/** Returns all features matching the prefix that the installed git version supports. */\n\tsupported<T extends GitFeatureOrPrefix>(feature: T): FilteredGitFeatures<T>[] | Promise<FilteredGitFeatures<T>[]> {\n\t\treturn this._git.supported(feature);\n\t}\n\n\t/** Throws if the installed git version does not support the given feature. */\n\tasync ensureSupports(feature: GitFeatures, prefix: string, suffix: string): Promise<void>;\n\tasync ensureSupports(feature: GitFeatures, message: GitFeatureUnsupportedMessage): Promise<void>;\n\tasync ensureSupports(\n\t\tfeature: GitFeatures,\n\t\tprefixOrMessage: string | GitFeatureUnsupportedMessage,\n\t\tsuffix?: string,\n\t): Promise<void> {\n\t\treturn typeof prefixOrMessage === 'function'\n\t\t\t? this._git.ensureSupports(feature, prefixOrMessage)\n\t\t\t: this._git.ensureSupports(feature, prefixOrMessage, suffix!);\n\t}\n\n\t/** Returns the installed git version string. */\n\tasync version(): Promise<string> {\n\t\treturn this._git.version();\n\t}\n\n\t/** Returns the resolved git binary path. */\n\tasync path(): Promise<string> {\n\t\treturn this._git.path();\n\t}\n\n\tasync clone(url: string, parentPath: string): Promise<string | undefined> {\n\t\tlet count = 0;\n\t\tconst [, , remotePath] = parseGitRemoteUrl(url);\n\t\tconst remoteName = remotePath.split('/').pop();\n\t\tif (!remoteName) return undefined;\n\n\t\tlet folderPath = joinPaths(parentPath, remoteName);\n\t\twhile ((await fsExists(folderPath)) && count < 20) {\n\t\t\tcount++;\n\t\t\tfolderPath = joinPaths(parentPath, `${remoteName}-${count}`);\n\t\t}\n\n\t\tawait this._git.run({ cwd: parentPath }, 'clone', url, folderPath);\n\n\t\treturn folderPath;\n\t}\n\n\t/** Creates a new repository at `targetPath` (`git init`), creating it first if it doesn't yet exist. */\n\tasync init(targetPath: string, options?: { defaultBranch?: string; bare?: boolean }): Promise<void> {\n\t\tawait fs.mkdir(targetPath, { recursive: true });\n\n\t\tconst args = ['init'];\n\t\tif (options?.defaultBranch) {\n\t\t\targs.push('-b', options.defaultBranch);\n\t\t}\n\t\tif (options?.bare) {\n\t\t\targs.push('--bare');\n\t\t}\n\n\t\t// Run inside the target rather than naming it from its parent: a relative `targetPath` would otherwise\n\t\t// be resolved against the parent a second time\n\t\tawait this._git.run({ cwd: targetPath }, ...args);\n\t}\n\n\t/**\n\t * Notifies the provider that `repoPath` was mutated outside of a typed sub-provider method — e.g. a\n\t * consumer that ran a command through the raw `git.run`/`provider.git.run` escape hatch. Fires the same\n\t * `cache.onReset`/`repository.onChanged` hooks a typed mutator would, so, exactly as after a typed write,\n\t * the provider clears its own caches for `repoPath` (every type, or just `options.cache` when given) and\n\t * its pending commands before the host's handlers run.\n\t */\n\tnotifyChanged(\n\t\trepoPath: string,\n\t\tchanges: readonly RepositoryChange[],\n\t\toptions?: { cache?: readonly CachedGitTypes[] | 'all' },\n\t): void {\n\t\tconst types = options?.cache;\n\t\tif (types == null || types === 'all') {\n\t\t\t// No types = everything, for the provider's own clear and the host's handler alike.\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath);\n\t\t} else if (types.length) {\n\t\t\tthis.context.hooks?.cache?.onReset?.(repoPath, ...types);\n\t\t}\n\n\t\tthis.context.hooks?.repository?.onChanged?.(repoPath, [...changes]);\n\t}\n\n\tprivate _blame: BlameGitSubProvider | undefined;\n\tget blame(): BlameGitSubProvider {\n\t\treturn (this._blame ??= new BlameGitSubProvider(\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _branches: BranchesGitSubProvider | undefined;\n\tget branches(): BranchesGitSubProvider {\n\t\treturn (this._branches ??= new BranchesGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _commits: CommitsGitSubProvider | undefined;\n\tget commits(): CommitsGitSubProvider {\n\t\treturn (this._commits ??= new CommitsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _config: ConfigGitSubProvider | undefined;\n\tget config(): ConfigGitSubProvider {\n\t\treturn (this._config ??= new ConfigGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _contributors: ContributorsGitSubProvider | undefined;\n\tget contributors(): ContributorsGitSubProvider {\n\t\treturn (this._contributors ??= new ContributorsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _diff: DiffGitSubProvider | undefined;\n\tget diff(): DiffGitSubProvider {\n\t\treturn (this._diff ??= new DiffGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _graph: GraphGitSubProvider | undefined;\n\tget graph(): GraphGitSubProvider {\n\t\treturn (this._graph ??= new GraphGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _maintenance: MaintenanceGitSubProvider | undefined;\n\t// Optional so subclasses whose repos aren't local can report the capability as absent — see\n\t// `VslsGitProvider`. Consumers already treat `maintenance == null` as \"unsupported here\" (web builds\n\t// never register it at all).\n\tget maintenance(): MaintenanceGitSubProvider | undefined {\n\t\tif (!this._localRepositories) return undefined;\n\n\t\treturn (this._maintenance ??= new MaintenanceGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _ops: OperationsGitSubProvider | undefined;\n\tget ops(): OperationsGitSubProvider {\n\t\treturn (this._ops ??= new OperationsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _patch: PatchGitSubProvider | undefined;\n\tget patch(): PatchGitSubProvider {\n\t\treturn (this._patch ??= new PatchGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _pausedOps: PausedOperationsGitSubProvider | undefined;\n\tget pausedOps(): PausedOperationsGitSubProvider {\n\t\treturn (this._pausedOps ??= new PausedOperationsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _refs: RefsGitSubProvider | undefined;\n\tget refs(): RefsGitSubProvider {\n\t\treturn (this._refs ??= new RefsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _remotes: RemotesGitSubProvider | undefined;\n\tget remotes(): RemotesGitSubProvider {\n\t\treturn (this._remotes ??= new RemotesGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _revision: RevisionGitSubProvider | undefined;\n\tget revision(): RevisionGitSubProvider {\n\t\treturn (this._revision ??= new RevisionGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _staging: StagingGitSubProvider | undefined;\n\tget staging(): StagingGitSubProvider {\n\t\treturn (this._staging ??= new StagingGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _stash: StashGitSubProvider | undefined;\n\tget stash(): StashGitSubProvider {\n\t\treturn (this._stash ??= new StashGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _status: StatusGitSubProvider | undefined;\n\tget status(): StatusGitSubProvider {\n\t\treturn (this._status ??= new StatusGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _tags: TagsGitSubProvider | undefined;\n\tget tags(): TagsGitSubProvider {\n\t\treturn (this._tags ??= new TagsGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tprivate _worktrees: WorktreesGitSubProvider | undefined;\n\tget worktrees(): WorktreesGitSubProvider {\n\t\treturn (this._worktrees ??= new WorktreesGitSubProvider(\n\t\t\tthis.context,\n\t\t\tthis._git,\n\t\t\tthis._cache,\n\t\t\tthis as unknown as CliGitProviderInternal,\n\t\t));\n\t}\n\n\tgetAbsoluteUri(pathOrUri: string | Uri, base: string | Uri): Uri {\n\t\tconst baseUri = typeof base !== 'string' ? base : fileUri(base);\n\t\tif (typeof pathOrUri !== 'string') return pathOrUri;\n\t\tif (maybeUri(pathOrUri)) return parseUri(pathOrUri);\n\t\tif (path.isAbsolute(pathOrUri)) return fileUri(pathOrUri);\n\t\treturn joinUriPath(baseUri, pathOrUri);\n\t}\n\n\tgetRelativePath(pathOrUri: string | Uri, base: string | Uri): string {\n\t\tconst [relativePath] = splitPath(toFsPath(pathOrUri), toFsPath(base));\n\t\treturn relativePath;\n\t}\n\n\tasync excludeIgnoredUris(repoPath: string, uris: Uri[]): Promise<Uri[]> {\n\t\tconst filter = this.getIgnoreFilter(repoPath);\n\t\tawait filter.ready();\n\t\treturn uris.filter(uri => {\n\t\t\tconst relativePath = normalizePath(path.relative(repoPath, toFsPath(uri)));\n\t\t\treturn !relativePath || !filter.isIgnored(relativePath);\n\t\t});\n\t}\n\n\tasync getIgnoredUrisFilter(repoPath: string): Promise<(uri: Uri) => boolean> {\n\t\tconst filter = this.getIgnoreFilter(repoPath);\n\t\tawait filter.ready();\n\t\treturn (uri: Uri) => {\n\t\t\tconst relativePath = normalizePath(path.relative(repoPath, toFsPath(uri)));\n\t\t\treturn relativePath ? filter.isIgnored(relativePath) : false;\n\t\t};\n\t}\n\n\tasync getLastFetchedTimestamp(repoPath: string): Promise<number | undefined> {\n\t\treturn this._cache.getLastFetchedTimestamp(repoPath, async (commonPath): Promise<number | undefined> => {\n\t\t\tconst gitDir = await this.config.getGitDir?.(commonPath);\n\t\t\tif (gitDir == null) return undefined;\n\n\t\t\tconst gitDirUri = gitDir.commonUri ?? gitDir.uri;\n\t\t\tconst fetchHeadUri = joinUriPath(gitDirUri, 'FETCH_HEAD');\n\t\t\tconst stats = await this.context.fs.stat(fetchHeadUri);\n\t\t\t// If the file is empty, assume the fetch failed, and don't update the timestamp\n\t\t\tif (stats != null && stats.size > 0) return stats.mtime;\n\n\t\t\treturn undefined;\n\t\t});\n\t}\n\n\tgetIgnoreFilter(repoPath: string): GitIgnoreFilter {\n\t\tlet filter = this._cache.gitIgnore.get(repoPath);\n\t\tif (filter == null) {\n\t\t\tconst gitDir = this._cache.gitDir.get(repoPath);\n\t\t\tconst gitDirPath = gitDir?.uri.fsPath ?? `${repoPath}/.git`;\n\t\t\tfilter = new GitIgnoreFilter({\n\t\t\t\trepoPath: repoPath,\n\t\t\t\tgitDirPath: gitDirPath,\n\t\t\t\tfs: this.context.fs,\n\t\t\t\tgetGlobalExcludesPath:\n\t\t\t\t\tthis.config.getConfig != null\n\t\t\t\t\t\t? async () => this.config.getConfig(repoPath, 'core.excludesFile')\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\tthis._cache.gitIgnore.set(repoPath, filter);\n\t\t}\n\t\treturn filter;\n\t}\n\n\tprivate async isTrackedWithDetails(\n\t\tfilePath: string,\n\t\trepoPath: string,\n\t\trev?: string,\n\t): Promise<{ path: string; status?: GitFileStatus; originalPath?: string } | undefined> {\n\t\tif (rev === deletedOrMissing) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\ttry {\n\t\t\tconst [relativePath, root] = splitPath(filePath, repoPath);\n\n\t\t\t// Check if the file exists in the working tree first (better cache reuse)\n\t\t\tlet tracked = await this.revision.exists(root, relativePath);\n\t\t\tif (tracked) return { path: relativePath };\n\n\t\t\t// If a specific revision was provided, check there too\n\t\t\tif (rev && !isUncommitted(rev)) {\n\t\t\t\ttracked = await this.revision.exists(root, relativePath, rev);\n\t\t\t\tif (!tracked) {\n\t\t\t\t\t// Check the parent revision (file might have been deleted in this rev)\n\t\t\t\t\ttracked = await this.revision.exists(root, relativePath, `${rev}^`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn tracked ? { path: relativePath } : undefined;\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis._git.dispose();\n\t\tif (this._cacheOwned) {\n\t\t\tthis._cache.dispose();\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { BranchErrorReason, CheckoutErrorReason, CherryPickErrorReason, CommitErrorReason, FetchErrorReason, GitCommandError, GitSearchErrorReason, GitWarningKey, GitWarnings, MergeErrorReason, PausedOperationAbortErrorReason, PausedOperationContinueErrorReason, PullErrorReason, PushErrorReason, RebaseErrorReason, ResetErrorReason, RevertErrorReason, ShowErrorReason, SigningErrorReason, StashApplyErrorReason, StashPushErrorReason, TagErrorReason, WorktreeCreateErrorReason, WorktreeDeleteErrorReason } from "../../git/errors.js";
1
+ import { BranchErrorReason, CheckoutErrorReason, CherryPickErrorReason, CommitErrorReason, FetchErrorReason, GitCommandError, GitSearchErrorReason, GitWarningKey, GitWarnings, MergeErrorReason, PausedOperationAbortErrorReason, PausedOperationContinueErrorReason, PullErrorReason, PushErrorReason, RebaseErrorReason, ReferenceUpdateErrorReason, ResetErrorReason, RevertErrorReason, ShowErrorReason, SigningErrorReason, StashApplyErrorReason, StashPushErrorReason, TagErrorReason, WorktreeCreateErrorReason, WorktreeDeleteErrorReason } from "../../git/errors.js";
2
2
  import { SigningFormat } from "../../git/models/signature.js";
3
3
  import { GitHealthSlownessCategory } from "../../git/gitHealth.js";
4
4
  import { GitCommandPriority, GitResult, GitRunOptions, GitSpawnOptions } from "../../git/run.types.js";
@@ -51,7 +51,9 @@ export declare const GitErrors: {
51
51
  readonly noRemoteReference: RegExp;
52
52
  readonly noRemoteRepositorySpecified: RegExp;
53
53
  readonly noUpstream: RegExp;
54
+ readonly noTrackingInformation: RegExp;
54
55
  readonly notAValidObjectName: RegExp;
56
+ readonly notPossibleToFastForward: RegExp;
55
57
  readonly notAWorkingTree: RegExp;
56
58
  readonly noUserNameConfigured: RegExp;
57
59
  readonly nothingToCommit: RegExp;
@@ -67,7 +69,13 @@ export declare const GitErrors: {
67
69
  readonly rebaseMultipleBranches: RegExp;
68
70
  readonly revertAborted: RegExp;
69
71
  readonly revertInProgress: RegExp;
72
+ readonly refAlreadyExists: RegExp;
73
+ readonly refBadName: RegExp;
70
74
  readonly refLocked: RegExp;
75
+ readonly refNonexistentObject: RegExp;
76
+ readonly refNotAValidSha: RegExp;
77
+ readonly refUnableToResolve: RegExp;
78
+ readonly refValueMismatch: RegExp;
71
79
  readonly remoteAhead: RegExp;
72
80
  readonly remoteConnectionFailed: RegExp;
73
81
  readonly remoteRejected: RegExp;
@@ -103,7 +111,7 @@ export type PushForceOptions = {
103
111
  withLease: false;
104
112
  ifIncludes?: never;
105
113
  };
106
- type GitCommand = 'branch' | 'checkout' | 'cherry-pick' | 'commit' | 'fetch' | 'merge' | 'paused-operation-abort' | 'paused-operation-continue' | 'pull' | 'push' | 'rebase' | 'reset' | 'revert' | 'show' | 'stash-apply' | 'stash-push' | 'tag' | 'worktree-create' | 'worktree-delete';
114
+ type GitCommand = 'branch' | 'checkout' | 'cherry-pick' | 'commit' | 'fetch' | 'merge' | 'paused-operation-abort' | 'paused-operation-continue' | 'pull' | 'push' | 'rebase' | 'reset' | 'revert' | 'show' | 'stash-apply' | 'stash-push' | 'tag' | 'update-ref' | 'update-ref-delete' | 'worktree-create' | 'worktree-delete';
107
115
  type GitCommandToReasonMap = {
108
116
  branch: BranchErrorReason;
109
117
  checkout: CheckoutErrorReason;
@@ -122,6 +130,8 @@ type GitCommandToReasonMap = {
122
130
  'stash-apply': StashApplyErrorReason;
123
131
  'stash-push': StashPushErrorReason;
124
132
  tag: TagErrorReason;
133
+ 'update-ref': ReferenceUpdateErrorReason;
134
+ 'update-ref-delete': ReferenceUpdateErrorReason;
125
135
  'worktree-create': WorktreeCreateErrorReason;
126
136
  'worktree-delete': WorktreeDeleteErrorReason;
127
137
  };