@gitkraken/core-gitlens 0.7.2 → 0.9.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 (192) hide show
  1. package/CHANGELOG.md +72 -1
  2. package/dist/git/cache.d.ts +29 -5
  3. package/dist/git/cache.js +52 -11
  4. package/dist/git/cache.js.map +1 -1
  5. package/dist/git/context.d.ts +6 -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/features.d.ts +1 -1
  11. package/dist/git/features.js +1 -0
  12. package/dist/git/features.js.map +1 -1
  13. package/dist/git/models/reflog.d.ts +6 -0
  14. package/dist/git/models/reflog.js.map +1 -1
  15. package/dist/git/models/revision.d.ts +0 -1
  16. package/dist/git/models/revision.js +1 -2
  17. package/dist/git/models/revision.js.map +1 -1
  18. package/dist/git/providers/branches.d.ts +5 -1
  19. package/dist/git/providers/commits.d.ts +44 -2
  20. package/dist/git/providers/config.d.ts +7 -1
  21. package/dist/git/providers/operations.d.ts +19 -0
  22. package/dist/git/providers/provider.d.ts +29 -2
  23. package/dist/git/providers/refs.d.ts +48 -3
  24. package/dist/git/providers/revision.d.ts +7 -1
  25. package/dist/git/providers/staging.d.ts +13 -0
  26. package/dist/git/providers/stash.d.ts +3 -2
  27. package/dist/git/providers/status.d.ts +4 -0
  28. package/dist/git/providers/worktrees.d.ts +23 -3
  29. package/dist/git/run.types.d.ts +22 -0
  30. package/dist/git-cli/cliGitProvider.d.ts +39 -2
  31. package/dist/git-cli/cliGitProvider.js +109 -11
  32. package/dist/git-cli/cliGitProvider.js.map +1 -1
  33. package/dist/git-cli/exec/commandClassifier.d.ts +31 -0
  34. package/dist/git-cli/exec/commandClassifier.js +391 -0
  35. package/dist/git-cli/exec/commandClassifier.js.map +1 -0
  36. package/dist/git-cli/exec/git.d.ts +36 -5
  37. package/dist/git-cli/exec/git.js +163 -28
  38. package/dist/git-cli/exec/git.js.map +1 -1
  39. package/dist/git-cli/exec/gitQueue.d.ts +4 -1
  40. package/dist/git-cli/exec/gitQueue.js +1 -1
  41. package/dist/git-cli/exec/gitQueue.js.map +1 -1
  42. package/dist/git-cli/parsers/reflogParser.d.ts +7 -0
  43. package/dist/git-cli/parsers/reflogParser.js +11 -1
  44. package/dist/git-cli/parsers/reflogParser.js.map +1 -1
  45. package/dist/git-cli/providers/branches.d.ts +10 -1
  46. package/dist/git-cli/providers/branches.js +31 -22
  47. package/dist/git-cli/providers/branches.js.map +1 -1
  48. package/dist/git-cli/providers/commits.d.ts +27 -3
  49. package/dist/git-cli/providers/commits.js +112 -12
  50. package/dist/git-cli/providers/commits.js.map +1 -1
  51. package/dist/git-cli/providers/config.js +2 -1
  52. package/dist/git-cli/providers/config.js.map +1 -1
  53. package/dist/git-cli/providers/diff.js +4 -4
  54. package/dist/git-cli/providers/diff.js.map +1 -1
  55. package/dist/git-cli/providers/operations.d.ts +13 -0
  56. package/dist/git-cli/providers/operations.js +64 -5
  57. package/dist/git-cli/providers/operations.js.map +1 -1
  58. package/dist/git-cli/providers/patch.js +21 -45
  59. package/dist/git-cli/providers/patch.js.map +1 -1
  60. package/dist/git-cli/providers/refs.d.ts +20 -3
  61. package/dist/git-cli/providers/refs.js +140 -10
  62. package/dist/git-cli/providers/refs.js.map +1 -1
  63. package/dist/git-cli/providers/remotes.js +3 -2
  64. package/dist/git-cli/providers/remotes.js.map +1 -1
  65. package/dist/git-cli/providers/revision.d.ts +5 -1
  66. package/dist/git-cli/providers/revision.js +20 -5
  67. package/dist/git-cli/providers/revision.js.map +1 -1
  68. package/dist/git-cli/providers/staging.d.ts +9 -0
  69. package/dist/git-cli/providers/staging.js +63 -6
  70. package/dist/git-cli/providers/staging.js.map +1 -1
  71. package/dist/git-cli/providers/stash.d.ts +3 -2
  72. package/dist/git-cli/providers/stash.js +34 -22
  73. package/dist/git-cli/providers/stash.js.map +1 -1
  74. package/dist/git-cli/providers/status.d.ts +2 -0
  75. package/dist/git-cli/providers/status.js +27 -9
  76. package/dist/git-cli/providers/status.js.map +1 -1
  77. package/dist/git-cli/providers/worktrees.d.ts +31 -2
  78. package/dist/git-cli/providers/worktrees.js +75 -7
  79. package/dist/git-cli/providers/worktrees.js.map +1 -1
  80. package/dist/plus/git-github/api/github.d.ts +64 -3
  81. package/dist/plus/git-github/api/github.js +237 -24
  82. package/dist/plus/git-github/api/github.js.map +1 -1
  83. package/dist/plus/git-github/providers/github/branches.d.ts +3 -1
  84. package/dist/plus/git-github/providers/github/branches.js +2 -1
  85. package/dist/plus/git-github/providers/github/branches.js.map +1 -1
  86. package/dist/plus/git-github/providers/github/commits.d.ts +4 -2
  87. package/dist/plus/git-github/providers/github/commits.js +3 -1
  88. package/dist/plus/git-github/providers/github/commits.js.map +1 -1
  89. package/dist/plus/git-github/providers/github/refs.d.ts +10 -3
  90. package/dist/plus/git-github/providers/github/refs.js +4 -4
  91. package/dist/plus/git-github/providers/github/refs.js.map +1 -1
  92. package/dist/plus/git-github/providers/github/revision.d.ts +4 -1
  93. package/dist/plus/git-github/providers/github/revision.js +6 -1
  94. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  95. package/dist/plus/integrations/index.d.ts +5 -2
  96. package/dist/plus/integrations/index.js.map +1 -1
  97. package/dist/plus/integrations/integrationService.d.ts +35 -9
  98. package/dist/plus/integrations/integrationService.js +16 -3
  99. package/dist/plus/integrations/integrationService.js.map +1 -1
  100. package/dist/plus/integrations/manager.d.ts +107 -37
  101. package/dist/plus/integrations/models/gitHostIntegration.d.ts +128 -13
  102. package/dist/plus/integrations/models/gitHostIntegration.js +130 -17
  103. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
  104. package/dist/plus/integrations/models/integration.d.ts +51 -3
  105. package/dist/plus/integrations/models/integration.js +125 -18
  106. package/dist/plus/integrations/models/integration.js.map +1 -1
  107. package/dist/plus/integrations/models/issuesIntegration.d.ts +18 -5
  108. package/dist/plus/integrations/models/issuesIntegration.js +40 -10
  109. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -1
  110. package/dist/plus/integrations/providers/azure/azure.d.ts +1 -1
  111. package/dist/plus/integrations/providers/azure/azure.js +13 -17
  112. package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
  113. package/dist/plus/integrations/providers/azure/models.d.ts +29 -0
  114. package/dist/plus/integrations/providers/azure/models.js +112 -1
  115. package/dist/plus/integrations/providers/azure/models.js.map +1 -1
  116. package/dist/plus/integrations/providers/azureDevOps.d.ts +54 -2
  117. package/dist/plus/integrations/providers/azureDevOps.js +80 -2
  118. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
  119. package/dist/plus/integrations/providers/azureDevOpsServer.js +2 -1
  120. package/dist/plus/integrations/providers/azureDevOpsServer.js.map +1 -1
  121. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +61 -0
  122. package/dist/plus/integrations/providers/bitbucket/bitbucket.js +165 -23
  123. package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -1
  124. package/dist/plus/integrations/providers/bitbucket/models.d.ts +6 -1
  125. package/dist/plus/integrations/providers/bitbucket/models.js +4 -3
  126. package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -1
  127. package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js +1 -1
  128. package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js.map +1 -1
  129. package/dist/plus/integrations/providers/bitbucket-server.d.ts +38 -1
  130. package/dist/plus/integrations/providers/bitbucket-server.js +33 -1
  131. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
  132. package/dist/plus/integrations/providers/bitbucket.d.ts +36 -1
  133. package/dist/plus/integrations/providers/bitbucket.js +29 -1
  134. package/dist/plus/integrations/providers/bitbucket.js.map +1 -1
  135. package/dist/plus/integrations/providers/github.d.ts +48 -4
  136. package/dist/plus/integrations/providers/github.js +101 -6
  137. package/dist/plus/integrations/providers/github.js.map +1 -1
  138. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +35 -0
  139. package/dist/plus/integrations/providers/gitlab/gitlab.js +132 -15
  140. package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -1
  141. package/dist/plus/integrations/providers/gitlab/models.d.ts +1 -0
  142. package/dist/plus/integrations/providers/gitlab/models.js +1 -1
  143. package/dist/plus/integrations/providers/gitlab/models.js.map +1 -1
  144. package/dist/plus/integrations/providers/gitlab.d.ts +48 -1
  145. package/dist/plus/integrations/providers/gitlab.js +79 -3
  146. package/dist/plus/integrations/providers/gitlab.js.map +1 -1
  147. package/dist/plus/integrations/providers/jira-server.d.ts +3 -3
  148. package/dist/plus/integrations/providers/jira-server.js +3 -3
  149. package/dist/plus/integrations/providers/jira-server.js.map +1 -1
  150. package/dist/plus/integrations/providers/models.d.ts +12 -1
  151. package/dist/plus/integrations/providers/models.js +11 -1
  152. package/dist/plus/integrations/providers/models.js.map +1 -1
  153. package/dist/plus/integrations/providers/providerErrors.d.ts +9 -1
  154. package/dist/plus/integrations/providers/providerErrors.js +10 -1
  155. package/dist/plus/integrations/providers/providerErrors.js.map +1 -1
  156. package/dist/plus/integrations/providers/providersApi.d.ts +59 -0
  157. package/dist/plus/integrations/providers/providersApi.js +136 -1
  158. package/dist/plus/integrations/providers/providersApi.js.map +1 -1
  159. package/dist/plus/integrations/providers/utils/providerPaging.d.ts +42 -0
  160. package/dist/plus/integrations/providers/utils/providerPaging.js +58 -1
  161. package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -1
  162. package/dist/plus/integrations/providers/utils.d.ts +1 -1
  163. package/dist/plus/integrations/reads/currentAccount.d.ts +35 -0
  164. package/dist/plus/integrations/reads/currentAccount.js +46 -0
  165. package/dist/plus/integrations/reads/currentAccount.js.map +1 -0
  166. package/dist/plus/integrations/reads/drains.d.ts +4 -1
  167. package/dist/plus/integrations/reads/drains.js +7 -3
  168. package/dist/plus/integrations/reads/drains.js.map +1 -1
  169. package/dist/plus/integrations/reads/issueBatch.d.ts +72 -12
  170. package/dist/plus/integrations/reads/issueBatch.js +193 -48
  171. package/dist/plus/integrations/reads/issueBatch.js.map +1 -1
  172. package/dist/plus/integrations/reads/pullRequestBatch.d.ts +57 -0
  173. package/dist/plus/integrations/reads/pullRequestBatch.js +80 -0
  174. package/dist/plus/integrations/reads/pullRequestBatch.js.map +1 -0
  175. package/dist/plus/integrations/reads/pullRequestBranches.d.ts +58 -0
  176. package/dist/plus/integrations/reads/pullRequestBranches.js +111 -0
  177. package/dist/plus/integrations/reads/pullRequestBranches.js.map +1 -0
  178. package/dist/plus/integrations/reads/pullRequests.js +3 -3
  179. package/dist/plus/integrations/reads/pullRequests.js.map +1 -1
  180. package/dist/plus/integrations/reads/sweeps.js +3 -3
  181. package/dist/plus/integrations/reads/sweeps.js.map +1 -1
  182. package/dist/plus/integrations/results.d.ts +5 -2
  183. package/dist/plus/integrations/results.js.map +1 -1
  184. package/dist/utils/env/node/exec.js +1 -1
  185. package/dist/utils/env/node/exec.js.map +1 -1
  186. package/docs/integrations.md +90 -36
  187. package/docs/kepler-git-write-api-parity.md +365 -0
  188. package/docs/kepler-read-api-parity.md +75 -28
  189. package/package.json +1 -1
  190. package/dist/plus/integrations/reads/trackerIssue.d.ts +0 -33
  191. package/dist/plus/integrations/reads/trackerIssue.js +0 -60
  192. package/dist/plus/integrations/reads/trackerIssue.js.map +0 -1
@@ -0,0 +1,391 @@
1
+ import { isAbsolute, join } from "node:path";
2
+ //#region ../git-cli/src/exec/commandClassifier.ts
3
+ /**
4
+ * Verbs that never move a ref, the index or the working tree, so a raw run needs no notification.
5
+ * Anything not listed is treated as a mutation: a needless notification costs a full cache eviction, a
6
+ * missed one serves stale state. Object-writing plumbing (`hash-object -w`, `mktree`, `commit-tree`,
7
+ * `write-tree`) is listed too: it only adds loose objects nothing cached observes.
8
+ */
9
+ const readOnlyVerbs = /* @__PURE__ */ new Set([
10
+ "annotate",
11
+ "archive",
12
+ "blame",
13
+ "cat-file",
14
+ "check-attr",
15
+ "check-ignore",
16
+ "check-mailmap",
17
+ "check-ref-format",
18
+ "cherry",
19
+ "commit-tree",
20
+ "count-objects",
21
+ "describe",
22
+ "diff",
23
+ "diff-files",
24
+ "diff-index",
25
+ "diff-tree",
26
+ "for-each-ref",
27
+ "fsck",
28
+ "grep",
29
+ "hash-object",
30
+ "help",
31
+ "log",
32
+ "ls-files",
33
+ "ls-remote",
34
+ "ls-tree",
35
+ "merge-base",
36
+ "merge-tree",
37
+ "mktree",
38
+ "name-rev",
39
+ "patch-id",
40
+ "range-diff",
41
+ "rev-list",
42
+ "rev-parse",
43
+ "shortlog",
44
+ "show",
45
+ "show-branch",
46
+ "show-ref",
47
+ "status",
48
+ "var",
49
+ "verify-commit",
50
+ "verify-pack",
51
+ "verify-tag",
52
+ "version",
53
+ "whatchanged",
54
+ "write-tree"
55
+ ]);
56
+ const reflogWriteSubcommands = /* @__PURE__ */ new Set([
57
+ "expire",
58
+ "delete",
59
+ "drop"
60
+ ]);
61
+ /**
62
+ * Sub-commands of otherwise-mutating verbs that only list. `''` is the bare verb, which lists for `branch`,
63
+ * `tag`, `remote` and `notes`; `branch -v` and every `tag` filter imply git's own list mode.
64
+ */
65
+ const readOnlySubcommands = {
66
+ branch: /* @__PURE__ */ new Set([
67
+ "",
68
+ "-l",
69
+ "--list",
70
+ "--show-current",
71
+ "-a",
72
+ "-r",
73
+ "-v",
74
+ "-vv",
75
+ "--verbose",
76
+ "--contains",
77
+ "--no-contains",
78
+ "--merged",
79
+ "--no-merged",
80
+ "--points-at"
81
+ ]),
82
+ config: /* @__PURE__ */ new Set(["get", "list"]),
83
+ notes: /* @__PURE__ */ new Set([
84
+ "",
85
+ "list",
86
+ "show",
87
+ "get-ref"
88
+ ]),
89
+ stash: /* @__PURE__ */ new Set(["list", "show"]),
90
+ tag: /* @__PURE__ */ new Set([
91
+ "",
92
+ "-l",
93
+ "--list",
94
+ "-n",
95
+ "-v",
96
+ "--verify",
97
+ "--contains",
98
+ "--no-contains",
99
+ "--merged",
100
+ "--no-merged",
101
+ "--points-at"
102
+ ]),
103
+ worktree: /* @__PURE__ */ new Set(["list"]),
104
+ remote: /* @__PURE__ */ new Set([
105
+ "",
106
+ "-v",
107
+ "get-url",
108
+ "show"
109
+ ])
110
+ };
111
+ /**
112
+ * Options that make an argv write whatever else it contains, checked across the whole argv rather than
113
+ * only its first token: `branch -r -d origin/x` leads with a listing flag and still deletes.
114
+ */
115
+ const writeOptions = {
116
+ branch: [
117
+ "-d",
118
+ "-D",
119
+ "--delete",
120
+ "-m",
121
+ "-M",
122
+ "--move",
123
+ "-c",
124
+ "-C",
125
+ "--copy",
126
+ "-f",
127
+ "--force",
128
+ "-t",
129
+ "--track",
130
+ "--no-track",
131
+ "-u",
132
+ "--set-upstream-to",
133
+ "--unset-upstream",
134
+ "--edit-description"
135
+ ],
136
+ config: [
137
+ "--add",
138
+ "--replace-all",
139
+ "--unset",
140
+ "--unset-all",
141
+ "--rename-section",
142
+ "--remove-section",
143
+ "-e",
144
+ "--edit"
145
+ ]
146
+ };
147
+ const configReadOptions = /* @__PURE__ */ new Set([
148
+ "--get",
149
+ "--get-all",
150
+ "--get-regexp",
151
+ "--get-urlmatch",
152
+ "--get-color",
153
+ "--get-colorbool",
154
+ "--list",
155
+ "-l"
156
+ ]);
157
+ function hasWriteOption(verb, rest) {
158
+ const options = writeOptions[verb];
159
+ if (options == null) return false;
160
+ return rest.some((arg) => options.some((opt) => arg === opt || arg.startsWith(`${opt}=`)));
161
+ }
162
+ /**
163
+ * `config <key>` with nothing after the key is git's own read form, as is any `--get*`/`--list`. `config edit`
164
+ * (git 2.46's subcommand form of `--edit`) also has a single non-flag argument but writes.
165
+ */
166
+ function isConfigRead(rest) {
167
+ if (rest[0] === "edit") return false;
168
+ if (rest.some((arg) => configReadOptions.has(arg))) return true;
169
+ return rest.filter((arg) => !arg.startsWith("-")).length === 1;
170
+ }
171
+ /** Global options whose value is the next argument, so the verb scan must skip both. */
172
+ const globalOptionsWithValue = /* @__PURE__ */ new Set([
173
+ "-c",
174
+ "--config-env",
175
+ "--exec-path",
176
+ "--git-dir",
177
+ "--namespace",
178
+ "--super-prefix",
179
+ "--work-tree"
180
+ ]);
181
+ /**
182
+ * Skips the global options (`-c key=val`, `-C path`) git accepts before the verb to find it, and notes a
183
+ * `-C` re-scope so notification targets that tree.
184
+ */
185
+ function leadingCommand(args) {
186
+ let pathOverride;
187
+ let i = 0;
188
+ while (i < args.length) {
189
+ const arg = args[i];
190
+ if (arg === "-C") {
191
+ const path = args[i + 1];
192
+ if (path != null) pathOverride = pathOverride == null || isAbsolute(path) ? path : join(pathOverride, path);
193
+ i += 2;
194
+ continue;
195
+ }
196
+ if (globalOptionsWithValue.has(arg)) {
197
+ i += 2;
198
+ continue;
199
+ }
200
+ if (arg.startsWith("-")) {
201
+ i += 1;
202
+ continue;
203
+ }
204
+ break;
205
+ }
206
+ const verb = args[i] ?? "";
207
+ const rest = args.slice(i + 1);
208
+ return {
209
+ verb,
210
+ readOnly: !hasWriteOption(verb, rest) && (readOnlyVerbs.has(verb) || (readOnlySubcommands[verb]?.has(rest[0] ?? "") ?? false) || verb === "config" && isConfigRead(rest) || verb === "reflog" && !reflogWriteSubcommands.has(rest[0] ?? "") || verb === "symbolic-ref" && !rest.includes("-d") && !rest.includes("--delete") && rest.filter((a) => !a.startsWith("-")).length < 2),
211
+ subcommand: rest[0],
212
+ pathOverride
213
+ };
214
+ }
215
+ /**
216
+ * The change kinds every worktree sharing a `.git` sees: its refs, stash, worktree list and config. The rest a
217
+ * classified verb announces — HEAD, the index, a paused operation, FETCH_HEAD — belong to the one tree the
218
+ * command ran in, so a `-C`-scoped write tells the caller's own `cwd` only this subset of what it changed.
219
+ */
220
+ const worktreeSharedChanges = /* @__PURE__ */ new Set([
221
+ "heads",
222
+ "tags",
223
+ "stash",
224
+ "remotes",
225
+ "worktrees",
226
+ "config"
227
+ ]);
228
+ /**
229
+ * Verbs whose effect is confined to the object store that nothing cached observes — repacking or pruning
230
+ * `.git/objects` changes no cached read (branches, refs, status, worktrees, …). `init` and `clone` create a
231
+ * repository rather than mutate a registered one, so there is nothing yet registered to notify.
232
+ */
233
+ const objectOnlyVerbs = /* @__PURE__ */ new Set([
234
+ "gc",
235
+ "repack",
236
+ "prune",
237
+ "maintenance",
238
+ "commit-graph",
239
+ "multi-pack-index",
240
+ "init",
241
+ "clone"
242
+ ]);
243
+ /**
244
+ * The {@link RepositoryChange} kinds each mutating verb announces. A worktree subcommand other than a
245
+ * listing is handled separately (see {@link getChangesForCommand}), and any verb absent from both this
246
+ * table and {@link objectOnlyVerbs} announces `[]` — the conservative default for an unclassified
247
+ * mutation: the caller still learns something changed, just not what. An entry covers at least what the
248
+ * verb's typed mutator announces; `update-ref` and `symbolic-ref` name every kind their target ref could be.
249
+ * The kinds decide which caches the announcement resets, so a verb that can start or end a paused operation
250
+ * names `pausedOp`: `commit` concludes a merge, cherry-pick or revert, `reset` aborts one, and `am` runs in
251
+ * `rebase-apply`.
252
+ */
253
+ const changesByVerb = {
254
+ commit: [
255
+ "head",
256
+ "heads",
257
+ "index",
258
+ "pausedOp"
259
+ ],
260
+ am: [
261
+ "head",
262
+ "heads",
263
+ "index",
264
+ "pausedOp"
265
+ ],
266
+ bisect: ["head", "index"],
267
+ checkout: [
268
+ "head",
269
+ "heads",
270
+ "index"
271
+ ],
272
+ switch: [
273
+ "head",
274
+ "heads",
275
+ "index"
276
+ ],
277
+ reset: [
278
+ "head",
279
+ "heads",
280
+ "index",
281
+ "pausedOp"
282
+ ],
283
+ merge: [
284
+ "head",
285
+ "heads",
286
+ "index",
287
+ "pausedOp",
288
+ "merge"
289
+ ],
290
+ rebase: [
291
+ "head",
292
+ "heads",
293
+ "index",
294
+ "pausedOp",
295
+ "rebase"
296
+ ],
297
+ "cherry-pick": [
298
+ "head",
299
+ "heads",
300
+ "index",
301
+ "pausedOp",
302
+ "cherryPick"
303
+ ],
304
+ revert: [
305
+ "head",
306
+ "heads",
307
+ "index",
308
+ "pausedOp",
309
+ "revert"
310
+ ],
311
+ pull: [
312
+ "head",
313
+ "heads",
314
+ "index",
315
+ "remotes",
316
+ "tags",
317
+ "lastFetched",
318
+ "pausedOp",
319
+ "merge",
320
+ "rebase"
321
+ ],
322
+ add: ["index"],
323
+ rm: ["index"],
324
+ mv: ["index"],
325
+ restore: ["index"],
326
+ apply: ["index"],
327
+ "read-tree": ["index"],
328
+ "update-index": ["index"],
329
+ clean: ["index"],
330
+ stash: ["stash", "index"],
331
+ "update-ref": [
332
+ "head",
333
+ "heads",
334
+ "remotes",
335
+ "tags",
336
+ "stash"
337
+ ],
338
+ branch: [
339
+ "heads",
340
+ "remotes",
341
+ "tags"
342
+ ],
343
+ "symbolic-ref": [
344
+ "head",
345
+ "heads",
346
+ "remotes",
347
+ "tags"
348
+ ],
349
+ "pack-refs": [
350
+ "heads",
351
+ "remotes",
352
+ "tags"
353
+ ],
354
+ tag: ["tags"],
355
+ fetch: [
356
+ "heads",
357
+ "remotes",
358
+ "tags",
359
+ "lastFetched"
360
+ ],
361
+ push: ["remotes"],
362
+ remote: ["remotes", "config"],
363
+ config: [
364
+ "config",
365
+ "heads",
366
+ "remotes"
367
+ ],
368
+ notes: ["heads"]
369
+ };
370
+ const worktreeChanges = ["worktrees", "heads"];
371
+ const emptyChanges = [];
372
+ /**
373
+ * Classifies a raw git argv for the notification `git.run`'s `notify: 'infer'` applies after the run
374
+ * settles. Returns `undefined` for a read-only or object-only command — nothing to announce — otherwise
375
+ * the {@link RepositoryChange} kinds the verb announces, the `-C` re-scope target (if any), and which of
376
+ * those kinds every worktree sees.
377
+ */
378
+ function getChangesForCommand(args) {
379
+ const command = leadingCommand(args);
380
+ if (command.readOnly || objectOnlyVerbs.has(command.verb)) return void 0;
381
+ const changes = command.verb === "worktree" ? worktreeChanges : changesByVerb[command.verb] ?? emptyChanges;
382
+ return {
383
+ changes,
384
+ pathOverride: command.pathOverride,
385
+ sharedChanges: changes.filter((c) => worktreeSharedChanges.has(c))
386
+ };
387
+ }
388
+ //#endregion
389
+ export { getChangesForCommand, leadingCommand };
390
+
391
+ //# sourceMappingURL=commandClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandClassifier.js","names":[],"sources":["../../../../git-cli/src/exec/commandClassifier.ts"],"sourcesContent":["import { isAbsolute, join } from 'node:path';\nimport type { RepositoryChange } from '@gitlens/git/models/repository.js';\n\n/**\n * Verbs that never move a ref, the index or the working tree, so a raw run needs no notification.\n * Anything not listed is treated as a mutation: a needless notification costs a full cache eviction, a\n * missed one serves stale state. Object-writing plumbing (`hash-object -w`, `mktree`, `commit-tree`,\n * `write-tree`) is listed too: it only adds loose objects nothing cached observes.\n */\nconst readOnlyVerbs = new Set([\n\t'annotate',\n\t'archive',\n\t'blame',\n\t'cat-file',\n\t'check-attr',\n\t'check-ignore',\n\t'check-mailmap',\n\t'check-ref-format',\n\t'cherry',\n\t'commit-tree',\n\t'count-objects',\n\t'describe',\n\t'diff',\n\t'diff-files',\n\t'diff-index',\n\t'diff-tree',\n\t'for-each-ref',\n\t'fsck',\n\t'grep',\n\t'hash-object',\n\t'help',\n\t'log',\n\t'ls-files',\n\t// Asks a remote what it has; nothing local moves.\n\t'ls-remote',\n\t'ls-tree',\n\t'merge-base',\n\t'merge-tree',\n\t'mktree',\n\t'name-rev',\n\t'patch-id',\n\t'range-diff',\n\t'rev-list',\n\t'rev-parse',\n\t'shortlog',\n\t'show',\n\t'show-branch',\n\t'show-ref',\n\t'status',\n\t'var',\n\t'verify-commit',\n\t'verify-pack',\n\t'verify-tag',\n\t'version',\n\t'whatchanged',\n\t'write-tree',\n]);\n\nconst reflogWriteSubcommands: ReadonlySet<string> = new Set(['expire', 'delete', 'drop']);\n\n/**\n * Sub-commands of otherwise-mutating verbs that only list. `''` is the bare verb, which lists for `branch`,\n * `tag`, `remote` and `notes`; `branch -v` and every `tag` filter imply git's own list mode.\n */\nconst readOnlySubcommands: Readonly<Record<string, ReadonlySet<string>>> = {\n\tbranch: new Set([\n\t\t'',\n\t\t'-l',\n\t\t'--list',\n\t\t'--show-current',\n\t\t'-a',\n\t\t'-r',\n\t\t'-v',\n\t\t'-vv',\n\t\t'--verbose',\n\t\t'--contains',\n\t\t'--no-contains',\n\t\t'--merged',\n\t\t'--no-merged',\n\t\t'--points-at',\n\t]),\n\tconfig: new Set(['get', 'list']),\n\tnotes: new Set(['', 'list', 'show', 'get-ref']),\n\tstash: new Set(['list', 'show']),\n\ttag: new Set([\n\t\t'',\n\t\t'-l',\n\t\t'--list',\n\t\t'-n',\n\t\t'-v',\n\t\t'--verify',\n\t\t'--contains',\n\t\t'--no-contains',\n\t\t'--merged',\n\t\t'--no-merged',\n\t\t'--points-at',\n\t]),\n\tworktree: new Set(['list']),\n\tremote: new Set(['', '-v', 'get-url', 'show']),\n};\n\n/**\n * Options that make an argv write whatever else it contains, checked across the whole argv rather than\n * only its first token: `branch -r -d origin/x` leads with a listing flag and still deletes.\n */\nconst writeOptions: Readonly<Record<string, readonly string[]>> = {\n\tbranch: [\n\t\t'-d',\n\t\t'-D',\n\t\t'--delete',\n\t\t'-m',\n\t\t'-M',\n\t\t'--move',\n\t\t'-c',\n\t\t'-C',\n\t\t'--copy',\n\t\t'-f',\n\t\t'--force',\n\t\t'-t',\n\t\t'--track',\n\t\t'--no-track',\n\t\t'-u',\n\t\t'--set-upstream-to',\n\t\t'--unset-upstream',\n\t\t'--edit-description',\n\t],\n\tconfig: [\n\t\t'--add',\n\t\t'--replace-all',\n\t\t'--unset',\n\t\t'--unset-all',\n\t\t'--rename-section',\n\t\t'--remove-section',\n\t\t'-e',\n\t\t'--edit',\n\t],\n};\n\nconst configReadOptions = new Set([\n\t'--get',\n\t'--get-all',\n\t'--get-regexp',\n\t'--get-urlmatch',\n\t'--get-color',\n\t'--get-colorbool',\n\t'--list',\n\t'-l',\n]);\n\nfunction hasWriteOption(verb: string, rest: readonly string[]): boolean {\n\tconst options = writeOptions[verb];\n\tif (options == null) return false;\n\treturn rest.some(arg => options.some(opt => arg === opt || arg.startsWith(`${opt}=`)));\n}\n\n/**\n * `config <key>` with nothing after the key is git's own read form, as is any `--get*`/`--list`. `config edit`\n * (git 2.46's subcommand form of `--edit`) also has a single non-flag argument but writes.\n */\nfunction isConfigRead(rest: readonly string[]): boolean {\n\tif (rest[0] === 'edit') return false;\n\tif (rest.some(arg => configReadOptions.has(arg))) return true;\n\n\treturn rest.filter(arg => !arg.startsWith('-')).length === 1;\n}\n\n/** Global options whose value is the next argument, so the verb scan must skip both. */\nconst globalOptionsWithValue = new Set([\n\t'-c',\n\t'--config-env',\n\t'--exec-path',\n\t'--git-dir',\n\t'--namespace',\n\t'--super-prefix',\n\t'--work-tree',\n]);\n\nexport interface LeadingCommand {\n\tverb: string;\n\treadOnly: boolean;\n\t/** The first token after the verb, unresolved — used for subcommand-shaped decisions (`worktree add`). */\n\tsubcommand?: string;\n\t/** The `-C <path>` target when the caller re-scopes the command to another working tree. */\n\tpathOverride?: string;\n}\n\n/**\n * Skips the global options (`-c key=val`, `-C path`) git accepts before the verb to find it, and notes a\n * `-C` re-scope so notification targets that tree.\n */\nexport function leadingCommand(args: readonly string[]): LeadingCommand {\n\tlet pathOverride: string | undefined;\n\tlet i = 0;\n\twhile (i < args.length) {\n\t\tconst arg = args[i];\n\t\tif (arg === '-C') {\n\t\t\t// git applies each `-C` relative to the one before it\n\t\t\tconst path = args[i + 1];\n\t\t\tif (path != null) {\n\t\t\t\tpathOverride = pathOverride == null || isAbsolute(path) ? path : join(pathOverride, path);\n\t\t\t}\n\t\t\ti += 2;\n\n\t\t\tcontinue;\n\t\t}\n\t\tif (globalOptionsWithValue.has(arg)) {\n\t\t\ti += 2;\n\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith('-')) {\n\t\t\ti += 1;\n\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n\tconst verb = args[i] ?? '';\n\tconst rest = args.slice(i + 1);\n\tconst readOnly =\n\t\t!hasWriteOption(verb, rest) &&\n\t\t(readOnlyVerbs.has(verb) ||\n\t\t\t(readOnlySubcommands[verb]?.has(rest[0] ?? '') ?? false) ||\n\t\t\t(verb === 'config' && isConfigRead(rest)) ||\n\t\t\t// Every `reflog` form reads (bare, `<ref>`, `show`, `list`, `exists`) except the three that rewrite\n\t\t\t// it. Base-branch detection answers \"none\" unless a branch's reflog has exactly one creation entry,\n\t\t\t// so a rewrite can make a cached \"none\" derivable; no change kind names a reflog, so it resets all.\n\t\t\t(verb === 'reflog' && !reflogWriteSubcommands.has(rest[0] ?? '')) ||\n\t\t\t// A bare `symbolic-ref <name>` reads; a second non-flag argument, or a delete, writes.\n\t\t\t(verb === 'symbolic-ref' &&\n\t\t\t\t!rest.includes('-d') &&\n\t\t\t\t!rest.includes('--delete') &&\n\t\t\t\trest.filter(a => !a.startsWith('-')).length < 2));\n\n\treturn { verb: verb, readOnly: readOnly, subcommand: rest[0], pathOverride: pathOverride };\n}\n\n/**\n * The change kinds every worktree sharing a `.git` sees: its refs, stash, worktree list and config. The rest a\n * classified verb announces — HEAD, the index, a paused operation, FETCH_HEAD — belong to the one tree the\n * command ran in, so a `-C`-scoped write tells the caller's own `cwd` only this subset of what it changed.\n */\nconst worktreeSharedChanges: ReadonlySet<RepositoryChange> = new Set([\n\t'heads',\n\t'tags',\n\t'stash',\n\t'remotes',\n\t'worktrees',\n\t'config',\n]);\n\n/**\n * Verbs whose effect is confined to the object store that nothing cached observes — repacking or pruning\n * `.git/objects` changes no cached read (branches, refs, status, worktrees, …). `init` and `clone` create a\n * repository rather than mutate a registered one, so there is nothing yet registered to notify.\n */\nconst objectOnlyVerbs = new Set([\n\t'gc',\n\t'repack',\n\t'prune',\n\t'maintenance',\n\t'commit-graph',\n\t'multi-pack-index',\n\t'init',\n\t'clone',\n]);\n\n/**\n * The {@link RepositoryChange} kinds each mutating verb announces. A worktree subcommand other than a\n * listing is handled separately (see {@link getChangesForCommand}), and any verb absent from both this\n * table and {@link objectOnlyVerbs} announces `[]` — the conservative default for an unclassified\n * mutation: the caller still learns something changed, just not what. An entry covers at least what the\n * verb's typed mutator announces; `update-ref` and `symbolic-ref` name every kind their target ref could be.\n * The kinds decide which caches the announcement resets, so a verb that can start or end a paused operation\n * names `pausedOp`: `commit` concludes a merge, cherry-pick or revert, `reset` aborts one, and `am` runs in\n * `rebase-apply`.\n */\nconst changesByVerb: Readonly<Record<string, readonly RepositoryChange[]>> = {\n\tcommit: ['head', 'heads', 'index', 'pausedOp'],\n\tam: ['head', 'heads', 'index', 'pausedOp'],\n\tbisect: ['head', 'index'],\n\tcheckout: ['head', 'heads', 'index'],\n\tswitch: ['head', 'heads', 'index'],\n\treset: ['head', 'heads', 'index', 'pausedOp'],\n\tmerge: ['head', 'heads', 'index', 'pausedOp', 'merge'],\n\trebase: ['head', 'heads', 'index', 'pausedOp', 'rebase'],\n\t'cherry-pick': ['head', 'heads', 'index', 'pausedOp', 'cherryPick'],\n\trevert: ['head', 'heads', 'index', 'pausedOp', 'revert'],\n\tpull: ['head', 'heads', 'index', 'remotes', 'tags', 'lastFetched', 'pausedOp', 'merge', 'rebase'],\n\tadd: ['index'],\n\trm: ['index'],\n\tmv: ['index'],\n\trestore: ['index'],\n\tapply: ['index'],\n\t'read-tree': ['index'],\n\t'update-index': ['index'],\n\tclean: ['index'],\n\tstash: ['stash', 'index'],\n\t'update-ref': ['head', 'heads', 'remotes', 'tags', 'stash'],\n\tbranch: ['heads', 'remotes', 'tags'],\n\t'symbolic-ref': ['head', 'heads', 'remotes', 'tags'],\n\t'pack-refs': ['heads', 'remotes', 'tags'],\n\ttag: ['tags'],\n\t// A refspec can write a local branch (`fetch origin main:main`), which only the typed fetch parses for\n\tfetch: ['heads', 'remotes', 'tags', 'lastFetched'],\n\tpush: ['remotes'],\n\tremote: ['remotes', 'config'],\n\tconfig: ['config', 'heads', 'remotes'],\n\tnotes: ['heads'],\n};\n\nconst worktreeChanges: readonly RepositoryChange[] = ['worktrees', 'heads'];\nconst emptyChanges: readonly RepositoryChange[] = [];\n\nexport interface CommandChanges {\n\tchanges: readonly RepositoryChange[];\n\t/** The `-C <path>` target when the caller re-scoped the command to another working tree. */\n\tpathOverride?: string;\n\t/** The subset of {@link changes} every worktree sharing the same `.git` sees, not just the tree the command ran in. */\n\tsharedChanges: readonly RepositoryChange[];\n}\n\n/**\n * Classifies a raw git argv for the notification `git.run`'s `notify: 'infer'` applies after the run\n * settles. Returns `undefined` for a read-only or object-only command — nothing to announce — otherwise\n * the {@link RepositoryChange} kinds the verb announces, the `-C` re-scope target (if any), and which of\n * those kinds every worktree sees.\n */\nexport function getChangesForCommand(args: readonly string[]): CommandChanges | undefined {\n\tconst command = leadingCommand(args);\n\tif (command.readOnly || objectOnlyVerbs.has(command.verb)) return undefined;\n\n\t// `worktree list` is read-only (filtered out above); every other subcommand adds, removes or\n\t// relocks a checkout, which is both a worktree-list change and, for `add`, a brand-new HEAD.\n\tconst changes = command.verb === 'worktree' ? worktreeChanges : (changesByVerb[command.verb] ?? emptyChanges);\n\treturn {\n\t\tchanges: changes,\n\t\tpathOverride: command.pathOverride,\n\t\tsharedChanges: changes.filter(c => worktreeSharedChanges.has(c)),\n\t};\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
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
+ import { RepositoryChange } from "../../git/models/repository.js";
2
3
  import { SigningFormat } from "../../git/models/signature.js";
3
4
  import { GitHealthSlownessCategory } from "../../git/gitHealth.js";
4
5
  import { GitCommandPriority, GitResult, GitRunOptions, GitSpawnOptions } from "../../git/run.types.js";
@@ -51,7 +52,9 @@ export declare const GitErrors: {
51
52
  readonly noRemoteReference: RegExp;
52
53
  readonly noRemoteRepositorySpecified: RegExp;
53
54
  readonly noUpstream: RegExp;
55
+ readonly noTrackingInformation: RegExp;
54
56
  readonly notAValidObjectName: RegExp;
57
+ readonly notPossibleToFastForward: RegExp;
55
58
  readonly notAWorkingTree: RegExp;
56
59
  readonly noUserNameConfigured: RegExp;
57
60
  readonly nothingToCommit: RegExp;
@@ -67,7 +70,13 @@ export declare const GitErrors: {
67
70
  readonly rebaseMultipleBranches: RegExp;
68
71
  readonly revertAborted: RegExp;
69
72
  readonly revertInProgress: RegExp;
73
+ readonly refAlreadyExists: RegExp;
74
+ readonly refBadName: RegExp;
70
75
  readonly refLocked: RegExp;
76
+ readonly refNonexistentObject: RegExp;
77
+ readonly refNotAValidSha: RegExp;
78
+ readonly refUnableToResolve: RegExp;
79
+ readonly refValueMismatch: RegExp;
71
80
  readonly remoteAhead: RegExp;
72
81
  readonly remoteConnectionFailed: RegExp;
73
82
  readonly remoteRejected: RegExp;
@@ -103,7 +112,7 @@ export type PushForceOptions = {
103
112
  withLease: false;
104
113
  ifIncludes?: never;
105
114
  };
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';
115
+ 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
116
  type GitCommandToReasonMap = {
108
117
  branch: BranchErrorReason;
109
118
  checkout: CheckoutErrorReason;
@@ -122,6 +131,8 @@ type GitCommandToReasonMap = {
122
131
  'stash-apply': StashApplyErrorReason;
123
132
  'stash-push': StashPushErrorReason;
124
133
  tag: TagErrorReason;
134
+ 'update-ref': ReferenceUpdateErrorReason;
135
+ 'update-ref-delete': ReferenceUpdateErrorReason;
125
136
  'worktree-create': WorktreeCreateErrorReason;
126
137
  'worktree-delete': WorktreeDeleteErrorReason;
127
138
  };
@@ -221,13 +232,23 @@ export declare class Git {
221
232
  private readonly _eventLoopMonitor;
222
233
  /** Count of git commands currently in flight, across both the exec and streaming paths */
223
234
  private _activeCommandCount;
224
- /** Cached base environment: process.env + static options.env + GCM/LC_ALL vars */
235
+ /** Cached base environment: process.env (minus {@link inheritedEnvKeysToDrop}) + static options.env + GCM/LC_ALL vars */
225
236
  private _baseEnv;
226
237
  /** Cached full environment: base + dynamic getEnvironment() result */
227
238
  private _fullEnv;
228
239
  /** Last dynamic env reference, used to detect when getEnvironment() returns a new object */
229
240
  private _lastDynamicEnv;
241
+ /** Bound via {@link bindChangeNotifier}; announces a `notify`-flagged run's changes. No-op until bound. */
242
+ private _changeNotifier;
230
243
  constructor(_locator: () => Promise<GitLocation>, options?: GitOptions);
244
+ /**
245
+ * Binds the callback a `notify`-flagged {@link run} calls once it settles. `CliGitProvider` wires this
246
+ * to its own `notifyChanged` from its constructor — including when it's handed a pre-built `Git` via
247
+ * `options.git`, so a host-supplied instance gets bound too. With nothing bound, `notify` is a no-op.
248
+ * `repoPaths` holds more than one path only for a `-C`-scoped shared-state verb: the `-C` target, then the
249
+ * caller's own `cwd`.
250
+ */
251
+ bindChangeNotifier(fn: (repoPaths: readonly string[], changes: readonly RepositoryChange[]) => void): void;
231
252
  /**
232
253
  * Returns the base environment for git commands. Cached to avoid spreading
233
254
  * process.env (30-100+ keys) on every call. Includes static options.env and
@@ -246,8 +267,12 @@ export declare class Git {
246
267
  */
247
268
  private buildEnv;
248
269
  dispose(): void;
249
- /** Clear pending commands (e.g. on cache reset) */
250
- clearPendingCommands(): void;
270
+ /**
271
+ * Drops in-flight commands so a later identical call spawns its own run instead of joining one that
272
+ * started before a change. With `repoPaths`, drops only runs whose `cwd` is one of them or inside one;
273
+ * without, drops every run.
274
+ */
275
+ clearPendingCommands(repoPaths?: readonly string[]): void;
251
276
  /** Marks one more git command as in flight; starts the event-loop monitor on the first. */
252
277
  private beginActiveCommand;
253
278
  /** Marks a git command as finished; stops the event-loop monitor once none remain. */
@@ -265,6 +290,12 @@ export declare class Git {
265
290
  ensureSupports(feature: GitFeatures, message: GitFeatureUnsupportedMessage): Promise<void>;
266
291
  run(options: ExitCodeOnlyGitCommandOptions, ...args: readonly (string | undefined)[]): Promise<GitResult<unknown>>;
267
292
  run<T extends string | Buffer = string>(options: GitRunOptions, ...args: readonly (string | undefined)[]): Promise<GitResult<T>>;
293
+ /**
294
+ * Applies `options.notify` once a {@link run} has settled — a no-op unless both `notify` and a
295
+ * {@link bindChangeNotifier bound} notifier are present, so an unflagged caller pays nothing.
296
+ */
297
+ private applyNotify;
298
+ private resolveNotifyPath;
268
299
  private runCore;
269
300
  stream(options: GitSpawnOptions, ...args: readonly (string | undefined)[]): AsyncGenerator<string>;
270
301
  rev_parse__git_dir(cwd: string): Promise<{