gitx.do 0.1.1 → 0.1.3

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 (376) hide show
  1. package/README.md +40 -353
  2. package/dist/do/logger.d.ts +50 -0
  3. package/dist/do/logger.d.ts.map +1 -0
  4. package/dist/do/logger.js +122 -0
  5. package/dist/do/logger.js.map +1 -0
  6. package/dist/{durable-object → do}/schema.d.ts +3 -3
  7. package/dist/do/schema.d.ts.map +1 -0
  8. package/dist/{durable-object → do}/schema.js +4 -3
  9. package/dist/do/schema.js.map +1 -0
  10. package/dist/do/types.d.ts +267 -0
  11. package/dist/do/types.d.ts.map +1 -0
  12. package/dist/do/types.js +62 -0
  13. package/dist/do/types.js.map +1 -0
  14. package/dist/index.d.ts +15 -469
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +39 -481
  17. package/dist/index.js.map +1 -1
  18. package/dist/mcp/auth.d.ts +77 -0
  19. package/dist/mcp/auth.d.ts.map +1 -0
  20. package/dist/mcp/auth.js +278 -0
  21. package/dist/mcp/auth.js.map +1 -0
  22. package/dist/mcp/index.d.ts +13 -0
  23. package/dist/mcp/index.d.ts.map +1 -0
  24. package/dist/mcp/index.js +19 -0
  25. package/dist/mcp/index.js.map +1 -0
  26. package/dist/mcp/server.d.ts +200 -0
  27. package/dist/mcp/server.d.ts.map +1 -0
  28. package/dist/mcp/server.js +275 -0
  29. package/dist/mcp/server.js.map +1 -0
  30. package/dist/mcp/tool-registry.d.ts +47 -0
  31. package/dist/mcp/tool-registry.d.ts.map +1 -0
  32. package/dist/mcp/tool-registry.js +284 -0
  33. package/dist/mcp/tool-registry.js.map +1 -0
  34. package/dist/mcp/tools.d.ts +103 -515
  35. package/dist/mcp/tools.d.ts.map +1 -1
  36. package/dist/mcp/tools.js +676 -3087
  37. package/dist/mcp/tools.js.map +1 -1
  38. package/dist/mcp/types.d.ts +124 -0
  39. package/dist/mcp/types.d.ts.map +1 -0
  40. package/dist/mcp/types.js +9 -0
  41. package/dist/mcp/types.js.map +1 -0
  42. package/package.json +19 -21
  43. package/dist/cli/commands/add.d.ts +0 -176
  44. package/dist/cli/commands/add.d.ts.map +0 -1
  45. package/dist/cli/commands/add.js +0 -979
  46. package/dist/cli/commands/add.js.map +0 -1
  47. package/dist/cli/commands/blame.d.ts +0 -259
  48. package/dist/cli/commands/blame.d.ts.map +0 -1
  49. package/dist/cli/commands/blame.js +0 -609
  50. package/dist/cli/commands/blame.js.map +0 -1
  51. package/dist/cli/commands/branch.d.ts +0 -249
  52. package/dist/cli/commands/branch.d.ts.map +0 -1
  53. package/dist/cli/commands/branch.js +0 -693
  54. package/dist/cli/commands/branch.js.map +0 -1
  55. package/dist/cli/commands/checkout.d.ts +0 -73
  56. package/dist/cli/commands/checkout.d.ts.map +0 -1
  57. package/dist/cli/commands/checkout.js +0 -725
  58. package/dist/cli/commands/checkout.js.map +0 -1
  59. package/dist/cli/commands/commit.d.ts +0 -182
  60. package/dist/cli/commands/commit.d.ts.map +0 -1
  61. package/dist/cli/commands/commit.js +0 -457
  62. package/dist/cli/commands/commit.js.map +0 -1
  63. package/dist/cli/commands/diff.d.ts +0 -464
  64. package/dist/cli/commands/diff.d.ts.map +0 -1
  65. package/dist/cli/commands/diff.js +0 -959
  66. package/dist/cli/commands/diff.js.map +0 -1
  67. package/dist/cli/commands/log.d.ts +0 -239
  68. package/dist/cli/commands/log.d.ts.map +0 -1
  69. package/dist/cli/commands/log.js +0 -535
  70. package/dist/cli/commands/log.js.map +0 -1
  71. package/dist/cli/commands/merge.d.ts +0 -106
  72. package/dist/cli/commands/merge.d.ts.map +0 -1
  73. package/dist/cli/commands/merge.js +0 -852
  74. package/dist/cli/commands/merge.js.map +0 -1
  75. package/dist/cli/commands/review.d.ts +0 -457
  76. package/dist/cli/commands/review.d.ts.map +0 -1
  77. package/dist/cli/commands/review.js +0 -558
  78. package/dist/cli/commands/review.js.map +0 -1
  79. package/dist/cli/commands/stash.d.ts +0 -157
  80. package/dist/cli/commands/stash.d.ts.map +0 -1
  81. package/dist/cli/commands/stash.js +0 -655
  82. package/dist/cli/commands/stash.js.map +0 -1
  83. package/dist/cli/commands/status.d.ts +0 -269
  84. package/dist/cli/commands/status.d.ts.map +0 -1
  85. package/dist/cli/commands/status.js +0 -492
  86. package/dist/cli/commands/status.js.map +0 -1
  87. package/dist/cli/commands/web.d.ts +0 -199
  88. package/dist/cli/commands/web.d.ts.map +0 -1
  89. package/dist/cli/commands/web.js +0 -697
  90. package/dist/cli/commands/web.js.map +0 -1
  91. package/dist/cli/fs-adapter.d.ts +0 -656
  92. package/dist/cli/fs-adapter.d.ts.map +0 -1
  93. package/dist/cli/fs-adapter.js +0 -1177
  94. package/dist/cli/fs-adapter.js.map +0 -1
  95. package/dist/cli/fsx-cli-adapter.d.ts +0 -359
  96. package/dist/cli/fsx-cli-adapter.d.ts.map +0 -1
  97. package/dist/cli/fsx-cli-adapter.js +0 -619
  98. package/dist/cli/fsx-cli-adapter.js.map +0 -1
  99. package/dist/cli/index.d.ts +0 -387
  100. package/dist/cli/index.d.ts.map +0 -1
  101. package/dist/cli/index.js +0 -579
  102. package/dist/cli/index.js.map +0 -1
  103. package/dist/cli/ui/components/DiffView.d.ts +0 -12
  104. package/dist/cli/ui/components/DiffView.d.ts.map +0 -1
  105. package/dist/cli/ui/components/DiffView.js +0 -11
  106. package/dist/cli/ui/components/DiffView.js.map +0 -1
  107. package/dist/cli/ui/components/ErrorDisplay.d.ts +0 -10
  108. package/dist/cli/ui/components/ErrorDisplay.d.ts.map +0 -1
  109. package/dist/cli/ui/components/ErrorDisplay.js +0 -11
  110. package/dist/cli/ui/components/ErrorDisplay.js.map +0 -1
  111. package/dist/cli/ui/components/FuzzySearch.d.ts +0 -15
  112. package/dist/cli/ui/components/FuzzySearch.d.ts.map +0 -1
  113. package/dist/cli/ui/components/FuzzySearch.js +0 -12
  114. package/dist/cli/ui/components/FuzzySearch.js.map +0 -1
  115. package/dist/cli/ui/components/LoadingSpinner.d.ts +0 -10
  116. package/dist/cli/ui/components/LoadingSpinner.d.ts.map +0 -1
  117. package/dist/cli/ui/components/LoadingSpinner.js +0 -10
  118. package/dist/cli/ui/components/LoadingSpinner.js.map +0 -1
  119. package/dist/cli/ui/components/NavigationList.d.ts +0 -14
  120. package/dist/cli/ui/components/NavigationList.d.ts.map +0 -1
  121. package/dist/cli/ui/components/NavigationList.js +0 -11
  122. package/dist/cli/ui/components/NavigationList.js.map +0 -1
  123. package/dist/cli/ui/components/ScrollableContent.d.ts +0 -13
  124. package/dist/cli/ui/components/ScrollableContent.d.ts.map +0 -1
  125. package/dist/cli/ui/components/ScrollableContent.js +0 -11
  126. package/dist/cli/ui/components/ScrollableContent.js.map +0 -1
  127. package/dist/cli/ui/components/index.d.ts +0 -7
  128. package/dist/cli/ui/components/index.d.ts.map +0 -1
  129. package/dist/cli/ui/components/index.js +0 -9
  130. package/dist/cli/ui/components/index.js.map +0 -1
  131. package/dist/cli/ui/terminal-ui.d.ts +0 -85
  132. package/dist/cli/ui/terminal-ui.d.ts.map +0 -1
  133. package/dist/cli/ui/terminal-ui.js +0 -121
  134. package/dist/cli/ui/terminal-ui.js.map +0 -1
  135. package/dist/do/BashModule.d.ts +0 -871
  136. package/dist/do/BashModule.d.ts.map +0 -1
  137. package/dist/do/BashModule.js +0 -1143
  138. package/dist/do/BashModule.js.map +0 -1
  139. package/dist/do/FsModule.d.ts +0 -612
  140. package/dist/do/FsModule.d.ts.map +0 -1
  141. package/dist/do/FsModule.js +0 -1120
  142. package/dist/do/FsModule.js.map +0 -1
  143. package/dist/do/GitModule.d.ts +0 -635
  144. package/dist/do/GitModule.d.ts.map +0 -1
  145. package/dist/do/GitModule.js +0 -784
  146. package/dist/do/GitModule.js.map +0 -1
  147. package/dist/do/GitRepoDO.d.ts +0 -281
  148. package/dist/do/GitRepoDO.d.ts.map +0 -1
  149. package/dist/do/GitRepoDO.js +0 -479
  150. package/dist/do/GitRepoDO.js.map +0 -1
  151. package/dist/do/bash-ast.d.ts +0 -246
  152. package/dist/do/bash-ast.d.ts.map +0 -1
  153. package/dist/do/bash-ast.js +0 -888
  154. package/dist/do/bash-ast.js.map +0 -1
  155. package/dist/do/container-executor.d.ts +0 -491
  156. package/dist/do/container-executor.d.ts.map +0 -1
  157. package/dist/do/container-executor.js +0 -731
  158. package/dist/do/container-executor.js.map +0 -1
  159. package/dist/do/index.d.ts +0 -53
  160. package/dist/do/index.d.ts.map +0 -1
  161. package/dist/do/index.js +0 -91
  162. package/dist/do/index.js.map +0 -1
  163. package/dist/do/tiered-storage.d.ts +0 -403
  164. package/dist/do/tiered-storage.d.ts.map +0 -1
  165. package/dist/do/tiered-storage.js +0 -689
  166. package/dist/do/tiered-storage.js.map +0 -1
  167. package/dist/do/withBash.d.ts +0 -231
  168. package/dist/do/withBash.d.ts.map +0 -1
  169. package/dist/do/withBash.js +0 -244
  170. package/dist/do/withBash.js.map +0 -1
  171. package/dist/do/withFs.d.ts +0 -237
  172. package/dist/do/withFs.d.ts.map +0 -1
  173. package/dist/do/withFs.js +0 -387
  174. package/dist/do/withFs.js.map +0 -1
  175. package/dist/do/withGit.d.ts +0 -180
  176. package/dist/do/withGit.d.ts.map +0 -1
  177. package/dist/do/withGit.js +0 -271
  178. package/dist/do/withGit.js.map +0 -1
  179. package/dist/durable-object/object-store.d.ts +0 -633
  180. package/dist/durable-object/object-store.d.ts.map +0 -1
  181. package/dist/durable-object/object-store.js +0 -1164
  182. package/dist/durable-object/object-store.js.map +0 -1
  183. package/dist/durable-object/schema.d.ts.map +0 -1
  184. package/dist/durable-object/schema.js.map +0 -1
  185. package/dist/durable-object/wal.d.ts +0 -416
  186. package/dist/durable-object/wal.d.ts.map +0 -1
  187. package/dist/durable-object/wal.js +0 -445
  188. package/dist/durable-object/wal.js.map +0 -1
  189. package/dist/mcp/adapter.d.ts +0 -772
  190. package/dist/mcp/adapter.d.ts.map +0 -1
  191. package/dist/mcp/adapter.js +0 -895
  192. package/dist/mcp/adapter.js.map +0 -1
  193. package/dist/mcp/sandbox/miniflare-evaluator.d.ts +0 -22
  194. package/dist/mcp/sandbox/miniflare-evaluator.d.ts.map +0 -1
  195. package/dist/mcp/sandbox/miniflare-evaluator.js +0 -140
  196. package/dist/mcp/sandbox/miniflare-evaluator.js.map +0 -1
  197. package/dist/mcp/sandbox/object-store-proxy.d.ts +0 -32
  198. package/dist/mcp/sandbox/object-store-proxy.d.ts.map +0 -1
  199. package/dist/mcp/sandbox/object-store-proxy.js +0 -30
  200. package/dist/mcp/sandbox/object-store-proxy.js.map +0 -1
  201. package/dist/mcp/sandbox/template.d.ts +0 -17
  202. package/dist/mcp/sandbox/template.d.ts.map +0 -1
  203. package/dist/mcp/sandbox/template.js +0 -71
  204. package/dist/mcp/sandbox/template.js.map +0 -1
  205. package/dist/mcp/sandbox.d.ts +0 -764
  206. package/dist/mcp/sandbox.d.ts.map +0 -1
  207. package/dist/mcp/sandbox.js +0 -1362
  208. package/dist/mcp/sandbox.js.map +0 -1
  209. package/dist/mcp/sdk-adapter.d.ts +0 -835
  210. package/dist/mcp/sdk-adapter.d.ts.map +0 -1
  211. package/dist/mcp/sdk-adapter.js +0 -974
  212. package/dist/mcp/sdk-adapter.js.map +0 -1
  213. package/dist/mcp/tools/do.d.ts +0 -32
  214. package/dist/mcp/tools/do.d.ts.map +0 -1
  215. package/dist/mcp/tools/do.js +0 -117
  216. package/dist/mcp/tools/do.js.map +0 -1
  217. package/dist/ops/blame.d.ts +0 -551
  218. package/dist/ops/blame.d.ts.map +0 -1
  219. package/dist/ops/blame.js +0 -1037
  220. package/dist/ops/blame.js.map +0 -1
  221. package/dist/ops/branch.d.ts +0 -766
  222. package/dist/ops/branch.d.ts.map +0 -1
  223. package/dist/ops/branch.js +0 -950
  224. package/dist/ops/branch.js.map +0 -1
  225. package/dist/ops/commit-traversal.d.ts +0 -349
  226. package/dist/ops/commit-traversal.d.ts.map +0 -1
  227. package/dist/ops/commit-traversal.js +0 -821
  228. package/dist/ops/commit-traversal.js.map +0 -1
  229. package/dist/ops/commit.d.ts +0 -555
  230. package/dist/ops/commit.d.ts.map +0 -1
  231. package/dist/ops/commit.js +0 -826
  232. package/dist/ops/commit.js.map +0 -1
  233. package/dist/ops/merge-base.d.ts +0 -397
  234. package/dist/ops/merge-base.d.ts.map +0 -1
  235. package/dist/ops/merge-base.js +0 -691
  236. package/dist/ops/merge-base.js.map +0 -1
  237. package/dist/ops/merge.d.ts +0 -855
  238. package/dist/ops/merge.d.ts.map +0 -1
  239. package/dist/ops/merge.js +0 -1551
  240. package/dist/ops/merge.js.map +0 -1
  241. package/dist/ops/tag.d.ts +0 -247
  242. package/dist/ops/tag.d.ts.map +0 -1
  243. package/dist/ops/tag.js +0 -649
  244. package/dist/ops/tag.js.map +0 -1
  245. package/dist/ops/tree-builder.d.ts +0 -178
  246. package/dist/ops/tree-builder.d.ts.map +0 -1
  247. package/dist/ops/tree-builder.js +0 -271
  248. package/dist/ops/tree-builder.js.map +0 -1
  249. package/dist/ops/tree-diff.d.ts +0 -291
  250. package/dist/ops/tree-diff.d.ts.map +0 -1
  251. package/dist/ops/tree-diff.js +0 -705
  252. package/dist/ops/tree-diff.js.map +0 -1
  253. package/dist/pack/delta.d.ts +0 -248
  254. package/dist/pack/delta.d.ts.map +0 -1
  255. package/dist/pack/delta.js +0 -740
  256. package/dist/pack/delta.js.map +0 -1
  257. package/dist/pack/format.d.ts +0 -446
  258. package/dist/pack/format.d.ts.map +0 -1
  259. package/dist/pack/format.js +0 -572
  260. package/dist/pack/format.js.map +0 -1
  261. package/dist/pack/full-generation.d.ts +0 -612
  262. package/dist/pack/full-generation.d.ts.map +0 -1
  263. package/dist/pack/full-generation.js +0 -1378
  264. package/dist/pack/full-generation.js.map +0 -1
  265. package/dist/pack/generation.d.ts +0 -441
  266. package/dist/pack/generation.d.ts.map +0 -1
  267. package/dist/pack/generation.js +0 -707
  268. package/dist/pack/generation.js.map +0 -1
  269. package/dist/pack/index.d.ts +0 -502
  270. package/dist/pack/index.d.ts.map +0 -1
  271. package/dist/pack/index.js +0 -833
  272. package/dist/pack/index.js.map +0 -1
  273. package/dist/refs/branch.d.ts +0 -683
  274. package/dist/refs/branch.d.ts.map +0 -1
  275. package/dist/refs/branch.js +0 -881
  276. package/dist/refs/branch.js.map +0 -1
  277. package/dist/refs/storage.d.ts +0 -833
  278. package/dist/refs/storage.d.ts.map +0 -1
  279. package/dist/refs/storage.js +0 -1023
  280. package/dist/refs/storage.js.map +0 -1
  281. package/dist/refs/tag.d.ts +0 -860
  282. package/dist/refs/tag.d.ts.map +0 -1
  283. package/dist/refs/tag.js +0 -996
  284. package/dist/refs/tag.js.map +0 -1
  285. package/dist/storage/backend.d.ts +0 -425
  286. package/dist/storage/backend.d.ts.map +0 -1
  287. package/dist/storage/backend.js +0 -41
  288. package/dist/storage/backend.js.map +0 -1
  289. package/dist/storage/fsx-adapter.d.ts +0 -204
  290. package/dist/storage/fsx-adapter.d.ts.map +0 -1
  291. package/dist/storage/fsx-adapter.js +0 -518
  292. package/dist/storage/fsx-adapter.js.map +0 -1
  293. package/dist/storage/lru-cache.d.ts +0 -691
  294. package/dist/storage/lru-cache.d.ts.map +0 -1
  295. package/dist/storage/lru-cache.js +0 -813
  296. package/dist/storage/lru-cache.js.map +0 -1
  297. package/dist/storage/object-index.d.ts +0 -585
  298. package/dist/storage/object-index.d.ts.map +0 -1
  299. package/dist/storage/object-index.js +0 -532
  300. package/dist/storage/object-index.js.map +0 -1
  301. package/dist/storage/r2-pack.d.ts +0 -1257
  302. package/dist/storage/r2-pack.d.ts.map +0 -1
  303. package/dist/storage/r2-pack.js +0 -1773
  304. package/dist/storage/r2-pack.js.map +0 -1
  305. package/dist/tiered/cdc-pipeline.d.ts +0 -1888
  306. package/dist/tiered/cdc-pipeline.d.ts.map +0 -1
  307. package/dist/tiered/cdc-pipeline.js +0 -1880
  308. package/dist/tiered/cdc-pipeline.js.map +0 -1
  309. package/dist/tiered/migration.d.ts +0 -1104
  310. package/dist/tiered/migration.d.ts.map +0 -1
  311. package/dist/tiered/migration.js +0 -1217
  312. package/dist/tiered/migration.js.map +0 -1
  313. package/dist/tiered/parquet-writer.d.ts +0 -1145
  314. package/dist/tiered/parquet-writer.d.ts.map +0 -1
  315. package/dist/tiered/parquet-writer.js +0 -1183
  316. package/dist/tiered/parquet-writer.js.map +0 -1
  317. package/dist/tiered/read-path.d.ts +0 -835
  318. package/dist/tiered/read-path.d.ts.map +0 -1
  319. package/dist/tiered/read-path.js +0 -487
  320. package/dist/tiered/read-path.js.map +0 -1
  321. package/dist/types/capability.d.ts +0 -1385
  322. package/dist/types/capability.d.ts.map +0 -1
  323. package/dist/types/capability.js +0 -36
  324. package/dist/types/capability.js.map +0 -1
  325. package/dist/types/index.d.ts +0 -13
  326. package/dist/types/index.d.ts.map +0 -1
  327. package/dist/types/index.js +0 -18
  328. package/dist/types/index.js.map +0 -1
  329. package/dist/types/interfaces.d.ts +0 -673
  330. package/dist/types/interfaces.d.ts.map +0 -1
  331. package/dist/types/interfaces.js +0 -26
  332. package/dist/types/interfaces.js.map +0 -1
  333. package/dist/types/objects.d.ts +0 -692
  334. package/dist/types/objects.d.ts.map +0 -1
  335. package/dist/types/objects.js +0 -837
  336. package/dist/types/objects.js.map +0 -1
  337. package/dist/types/storage.d.ts +0 -603
  338. package/dist/types/storage.d.ts.map +0 -1
  339. package/dist/types/storage.js +0 -191
  340. package/dist/types/storage.js.map +0 -1
  341. package/dist/types/worker-loader.d.ts +0 -60
  342. package/dist/types/worker-loader.d.ts.map +0 -1
  343. package/dist/types/worker-loader.js +0 -62
  344. package/dist/types/worker-loader.js.map +0 -1
  345. package/dist/utils/hash.d.ts +0 -198
  346. package/dist/utils/hash.d.ts.map +0 -1
  347. package/dist/utils/hash.js +0 -272
  348. package/dist/utils/hash.js.map +0 -1
  349. package/dist/utils/sha1.d.ts +0 -325
  350. package/dist/utils/sha1.d.ts.map +0 -1
  351. package/dist/utils/sha1.js +0 -635
  352. package/dist/utils/sha1.js.map +0 -1
  353. package/dist/wire/capabilities.d.ts +0 -1044
  354. package/dist/wire/capabilities.d.ts.map +0 -1
  355. package/dist/wire/capabilities.js +0 -941
  356. package/dist/wire/capabilities.js.map +0 -1
  357. package/dist/wire/path-security.d.ts +0 -157
  358. package/dist/wire/path-security.d.ts.map +0 -1
  359. package/dist/wire/path-security.js +0 -307
  360. package/dist/wire/path-security.js.map +0 -1
  361. package/dist/wire/pkt-line.d.ts +0 -345
  362. package/dist/wire/pkt-line.d.ts.map +0 -1
  363. package/dist/wire/pkt-line.js +0 -381
  364. package/dist/wire/pkt-line.js.map +0 -1
  365. package/dist/wire/receive-pack.d.ts +0 -1059
  366. package/dist/wire/receive-pack.d.ts.map +0 -1
  367. package/dist/wire/receive-pack.js +0 -1414
  368. package/dist/wire/receive-pack.js.map +0 -1
  369. package/dist/wire/smart-http.d.ts +0 -799
  370. package/dist/wire/smart-http.d.ts.map +0 -1
  371. package/dist/wire/smart-http.js +0 -945
  372. package/dist/wire/smart-http.js.map +0 -1
  373. package/dist/wire/upload-pack.d.ts +0 -727
  374. package/dist/wire/upload-pack.d.ts.map +0 -1
  375. package/dist/wire/upload-pack.js +0 -1141
  376. package/dist/wire/upload-pack.js.map +0 -1
@@ -1,821 +0,0 @@
1
- /**
2
- * @fileoverview Commit Graph Traversal
3
- *
4
- * Provides functionality for walking commit graphs, finding ancestors,
5
- * topological sorting, and revision range parsing.
6
- *
7
- * ## Features
8
- *
9
- * - Commit graph walking with various traversal strategies
10
- * - Topological and date-based sorting
11
- * - Revision range parsing (A..B, A...B syntax)
12
- * - Ancestor and merge base finding
13
- * - Path-based commit filtering
14
- * - Author/date/message filtering
15
- *
16
- * ## Usage Example
17
- *
18
- * ```typescript
19
- * import { walkCommits, CommitWalker } from './ops/commit-traversal'
20
- *
21
- * // Walk commits from HEAD
22
- * for await (const commit of walkCommits(provider, headSha, {
23
- * maxCount: 10,
24
- * sort: 'topological'
25
- * })) {
26
- * console.log(commit.sha, commit.commit.message)
27
- * }
28
- *
29
- * // Use CommitWalker for more control
30
- * const walker = new CommitWalker(provider)
31
- * walker.push(startSha)
32
- * walker.hide(excludeSha) // Exclude this commit and its ancestors
33
- *
34
- * while (walker.hasNext()) {
35
- * const commit = await walker.next()
36
- * // Process commit...
37
- * }
38
- * ```
39
- *
40
- * @module ops/commit-traversal
41
- */
42
- // ============================================================================
43
- // CommitWalker Class
44
- // ============================================================================
45
- /**
46
- * Walker for traversing commit graphs.
47
- *
48
- * Supports various traversal strategies including topological sorting,
49
- * date-based sorting, path filtering, and revision ranges.
50
- *
51
- * The walker maintains state and can be used for incremental traversal,
52
- * making it suitable for large repositories where you want to process
53
- * commits in batches.
54
- *
55
- * @class CommitWalker
56
- *
57
- * @example
58
- * ```typescript
59
- * // Create walker
60
- * const walker = new CommitWalker(provider, { firstParentOnly: true })
61
- *
62
- * // Add starting points
63
- * walker.push('abc123')
64
- * walker.push('def456')
65
- *
66
- * // Exclude certain commits
67
- * walker.hide('old-base-sha')
68
- *
69
- * // Iterate
70
- * let commit = await walker.next()
71
- * while (commit) {
72
- * console.log(commit.sha)
73
- * commit = await walker.next()
74
- * }
75
- *
76
- * // Or use async iteration
77
- * for await (const commit of walker) {
78
- * console.log(commit.sha)
79
- * }
80
- * ```
81
- */
82
- export class CommitWalker {
83
- provider;
84
- options;
85
- visited = new Set();
86
- hidden = new Set();
87
- queue = [];
88
- hiddenExpanded = false;
89
- constructor(provider, options = {}) {
90
- this.provider = provider;
91
- this.options = options;
92
- }
93
- /**
94
- * Reset the walker state
95
- */
96
- reset() {
97
- this.visited = new Set();
98
- this.hidden = new Set();
99
- this.queue = [];
100
- this.hiddenExpanded = false;
101
- }
102
- /**
103
- * Add a starting commit to the walker
104
- */
105
- push(sha) {
106
- if (!this.visited.has(sha) && !this.hidden.has(sha)) {
107
- this.queue.push({ sha, depth: 0 });
108
- }
109
- }
110
- /**
111
- * Hide a commit and its ancestors from the walk
112
- */
113
- hide(sha) {
114
- this.hidden.add(sha);
115
- }
116
- /**
117
- * Expand hidden commits to include all ancestors
118
- */
119
- async expandHidden() {
120
- if (this.hiddenExpanded)
121
- return;
122
- this.hiddenExpanded = true;
123
- const toExpand = [...this.hidden];
124
- const expanded = new Set(this.hidden);
125
- while (toExpand.length > 0) {
126
- const sha = toExpand.pop();
127
- const commit = await this.provider.getCommit(sha);
128
- if (!commit)
129
- continue;
130
- for (const parent of commit.parents) {
131
- if (!expanded.has(parent)) {
132
- expanded.add(parent);
133
- toExpand.push(parent);
134
- }
135
- }
136
- }
137
- this.hidden = expanded;
138
- }
139
- /**
140
- * Get the next commit in the walk
141
- */
142
- async next() {
143
- // Expand hidden commits on first call
144
- await this.expandHidden();
145
- while (this.queue.length > 0) {
146
- const { sha, depth } = this.queue.shift();
147
- // Skip if visited or hidden
148
- if (this.visited.has(sha) || this.hidden.has(sha)) {
149
- continue;
150
- }
151
- const commit = await this.provider.getCommit(sha);
152
- if (!commit)
153
- continue;
154
- this.visited.add(sha);
155
- // Add parents to queue
156
- const parentsToAdd = this.options.firstParentOnly
157
- ? commit.parents.slice(0, 1)
158
- : commit.parents;
159
- for (const parent of parentsToAdd) {
160
- if (!this.visited.has(parent) && !this.hidden.has(parent)) {
161
- this.queue.push({ sha: parent, depth: depth + 1 });
162
- }
163
- }
164
- return {
165
- sha,
166
- commit,
167
- depth,
168
- isMerge: commit.parents.length > 1
169
- };
170
- }
171
- return null;
172
- }
173
- /**
174
- * Check if there are more commits to walk
175
- */
176
- hasNext() {
177
- // Check if there are any unvisited, non-hidden commits in the queue
178
- return this.queue.some(({ sha }) => !this.visited.has(sha) && !this.hidden.has(sha));
179
- }
180
- /**
181
- * Iterate over all commits matching the options
182
- */
183
- async *[Symbol.asyncIterator]() {
184
- let commit = await this.next();
185
- while (commit !== null) {
186
- yield commit;
187
- commit = await this.next();
188
- }
189
- }
190
- }
191
- // ============================================================================
192
- // Generator Function
193
- // ============================================================================
194
- /**
195
- * Walk commits starting from the given SHA(s)
196
- *
197
- * @param provider - The commit provider for fetching commits
198
- * @param start - Starting commit SHA or array of SHAs
199
- * @param options - Traversal options
200
- * @yields TraversalCommit objects in the requested order
201
- */
202
- export async function* walkCommits(provider, start, options = {}) {
203
- const startShas = Array.isArray(start) ? start : [start];
204
- const { maxCount, skip = 0, paths, sort = 'none', reverse = false, exclude, includeMerges = true, firstParentOnly = false, author, committer, after, before, grep } = options;
205
- // If maxCount is 0, return immediately
206
- if (maxCount === 0) {
207
- return;
208
- }
209
- // Get commits that match path filters
210
- let pathMatchingCommits = null;
211
- if (paths && paths.length > 0 && provider.getCommitsForPath) {
212
- pathMatchingCommits = new Set();
213
- for (const path of paths) {
214
- const commits = await provider.getCommitsForPath(path);
215
- for (const sha of commits) {
216
- pathMatchingCommits.add(sha);
217
- }
218
- }
219
- // If no commits match paths, return empty
220
- if (pathMatchingCommits.size === 0) {
221
- return;
222
- }
223
- }
224
- // Build set of hidden commits (exclude and their ancestors)
225
- const hidden = new Set();
226
- if (exclude && exclude.length > 0) {
227
- const toExpand = [...exclude];
228
- while (toExpand.length > 0) {
229
- const sha = toExpand.pop();
230
- if (hidden.has(sha))
231
- continue;
232
- hidden.add(sha);
233
- const commit = await provider.getCommit(sha);
234
- if (commit) {
235
- for (const parent of commit.parents) {
236
- toExpand.push(parent);
237
- }
238
- }
239
- }
240
- }
241
- // Collect all commits first for sorting
242
- const allCommits = [];
243
- const visited = new Set();
244
- const queue = startShas.map(sha => ({
245
- sha,
246
- depth: 0
247
- }));
248
- while (queue.length > 0) {
249
- // For date-based sorting, we need to process in date order
250
- if (sort === 'date' || sort === 'author-date') {
251
- // Sort queue by date (most recent first)
252
- queue.sort((_a, _b) => {
253
- // We need to fetch commits to sort - use simple queue position for now
254
- return 0;
255
- });
256
- }
257
- const { sha, depth } = queue.shift();
258
- if (visited.has(sha) || hidden.has(sha)) {
259
- continue;
260
- }
261
- const commit = await provider.getCommit(sha);
262
- if (!commit)
263
- continue;
264
- visited.add(sha);
265
- // Add parents to queue
266
- const parentsToAdd = firstParentOnly
267
- ? commit.parents.slice(0, 1)
268
- : commit.parents;
269
- for (const parent of parentsToAdd) {
270
- if (!visited.has(parent) && !hidden.has(parent)) {
271
- queue.push({ sha: parent, depth: depth + 1 });
272
- }
273
- }
274
- const traversalCommit = {
275
- sha,
276
- commit,
277
- depth,
278
- isMerge: commit.parents.length > 1
279
- };
280
- allCommits.push(traversalCommit);
281
- }
282
- // Apply sorting
283
- let sortedCommits = [...allCommits];
284
- if (sort === 'topological') {
285
- // Topological sort - children before parents
286
- const shas = sortedCommits.map(c => c.sha);
287
- const sortedShas = await topologicalSort(provider, shas);
288
- const shaToCommit = new Map(sortedCommits.map(c => [c.sha, c]));
289
- sortedCommits = sortedShas.map(sha => shaToCommit.get(sha)).filter(Boolean);
290
- }
291
- else if (sort === 'date') {
292
- // Sort by committer date (newest first)
293
- sortedCommits.sort((a, b) => b.commit.committer.timestamp - a.commit.committer.timestamp);
294
- }
295
- else if (sort === 'author-date') {
296
- // Sort by author date (newest first)
297
- sortedCommits.sort((a, b) => b.commit.author.timestamp - a.commit.author.timestamp);
298
- }
299
- // Reverse if requested
300
- if (reverse) {
301
- sortedCommits.reverse();
302
- }
303
- // Apply filters and yield commits
304
- let skipped = 0;
305
- let yielded = 0;
306
- for (const traversalCommit of sortedCommits) {
307
- const { commit, sha } = traversalCommit;
308
- // Path filter
309
- if (pathMatchingCommits && !pathMatchingCommits.has(sha)) {
310
- continue;
311
- }
312
- // Merge filter
313
- if (!includeMerges && commit.parents.length > 1) {
314
- continue;
315
- }
316
- // Author filter
317
- if (author && commit.author.name !== author) {
318
- continue;
319
- }
320
- // Committer filter
321
- if (committer && commit.committer.name !== committer) {
322
- continue;
323
- }
324
- // Date filters
325
- const commitTimestamp = commit.committer.timestamp * 1000;
326
- if (after && commitTimestamp <= after.getTime()) {
327
- continue;
328
- }
329
- if (before && commitTimestamp >= before.getTime()) {
330
- continue;
331
- }
332
- // Grep filter
333
- if (grep) {
334
- const pattern = typeof grep === 'string' ? new RegExp(grep) : grep;
335
- if (!pattern.test(commit.message)) {
336
- continue;
337
- }
338
- }
339
- // Skip handling
340
- if (skipped < skip) {
341
- skipped++;
342
- continue;
343
- }
344
- // MaxCount handling
345
- if (maxCount !== undefined && yielded >= maxCount) {
346
- return;
347
- }
348
- yield traversalCommit;
349
- yielded++;
350
- }
351
- }
352
- // ============================================================================
353
- // Ancestor Functions
354
- // ============================================================================
355
- /**
356
- * Check if commit A is an ancestor of commit B
357
- *
358
- * @param provider - The commit provider for fetching commits
359
- * @param ancestor - Potential ancestor commit SHA
360
- * @param descendant - Potential descendant commit SHA
361
- * @returns true if ancestor is reachable from descendant
362
- */
363
- export async function isAncestor(provider, ancestor, descendant) {
364
- // Same commit is considered its own ancestor
365
- if (ancestor === descendant) {
366
- return true;
367
- }
368
- const visited = new Set();
369
- const queue = [descendant];
370
- while (queue.length > 0) {
371
- const sha = queue.shift();
372
- if (visited.has(sha))
373
- continue;
374
- visited.add(sha);
375
- if (sha === ancestor) {
376
- return true;
377
- }
378
- const commit = await provider.getCommit(sha);
379
- if (!commit)
380
- continue;
381
- for (const parent of commit.parents) {
382
- if (!visited.has(parent)) {
383
- queue.push(parent);
384
- }
385
- }
386
- }
387
- return false;
388
- }
389
- /**
390
- * Find the common ancestor(s) of two commits
391
- *
392
- * @param provider - The commit provider for fetching commits
393
- * @param commit1 - First commit SHA
394
- * @param commit2 - Second commit SHA
395
- * @param all - If true, return all common ancestors; if false, return only the best one
396
- * @returns The common ancestor SHA(s), or null if none found
397
- */
398
- export async function findCommonAncestor(provider, commit1, commit2, all) {
399
- // Get all ancestors of commit1
400
- const ancestors1 = new Set();
401
- const queue1 = [commit1];
402
- while (queue1.length > 0) {
403
- const sha = queue1.shift();
404
- if (ancestors1.has(sha))
405
- continue;
406
- ancestors1.add(sha);
407
- const commit = await provider.getCommit(sha);
408
- if (commit) {
409
- for (const parent of commit.parents) {
410
- queue1.push(parent);
411
- }
412
- }
413
- }
414
- // Find common ancestors by walking from commit2
415
- const commonAncestors = [];
416
- const visited2 = new Set();
417
- const queue2 = [commit2];
418
- while (queue2.length > 0) {
419
- const sha = queue2.shift();
420
- if (visited2.has(sha))
421
- continue;
422
- visited2.add(sha);
423
- if (ancestors1.has(sha)) {
424
- commonAncestors.push(sha);
425
- if (!all) {
426
- // For single result, return the first common ancestor (best merge base)
427
- return sha;
428
- }
429
- // Don't explore further ancestors of common ancestors
430
- continue;
431
- }
432
- const commit = await provider.getCommit(sha);
433
- if (commit) {
434
- for (const parent of commit.parents) {
435
- queue2.push(parent);
436
- }
437
- }
438
- }
439
- if (commonAncestors.length === 0) {
440
- return null;
441
- }
442
- if (all) {
443
- return commonAncestors;
444
- }
445
- return commonAncestors[0] || null;
446
- }
447
- /**
448
- * Find the merge base(s) of multiple commits
449
- *
450
- * @param provider - The commit provider for fetching commits
451
- * @param commits - Array of commit SHAs
452
- * @returns The merge base SHA(s)
453
- */
454
- export async function findMergeBase(provider, commits) {
455
- if (commits.length === 0) {
456
- return [];
457
- }
458
- if (commits.length === 1) {
459
- return [commits[0]];
460
- }
461
- // Find common ancestor of first two commits
462
- let result = await findCommonAncestor(provider, commits[0], commits[1], true);
463
- if (result === null) {
464
- return [];
465
- }
466
- let bases = Array.isArray(result) ? result : [result];
467
- // For each additional commit, find common ancestor with current bases
468
- for (let i = 2; i < commits.length; i++) {
469
- const newBases = [];
470
- for (const base of bases) {
471
- const ancestor = await findCommonAncestor(provider, base, commits[i], true);
472
- if (ancestor !== null) {
473
- const ancestors = Array.isArray(ancestor) ? ancestor : [ancestor];
474
- for (const a of ancestors) {
475
- if (!newBases.includes(a)) {
476
- newBases.push(a);
477
- }
478
- }
479
- }
480
- }
481
- if (newBases.length === 0) {
482
- return [];
483
- }
484
- bases = newBases;
485
- }
486
- return bases;
487
- }
488
- // ============================================================================
489
- // Revision Range Parsing
490
- // ============================================================================
491
- /**
492
- * Parse a revision range specification
493
- *
494
- * Supports:
495
- * - Single commit: "abc123"
496
- * - Two-dot range: "A..B" (commits reachable from B but not from A)
497
- * - Three-dot range: "A...B" (symmetric difference)
498
- * - Caret exclusion: "^A B" (B excluding A)
499
- *
500
- * @param spec - The revision specification string
501
- * @returns Parsed revision range
502
- */
503
- export function parseRevisionRange(spec) {
504
- // Check for three-dot range first (to avoid matching .. before ...)
505
- if (spec.includes('...')) {
506
- const [left, right] = spec.split('...');
507
- return {
508
- type: 'three-dot',
509
- left,
510
- right
511
- };
512
- }
513
- // Check for two-dot range
514
- if (spec.includes('..')) {
515
- const [left, right] = spec.split('..');
516
- return {
517
- type: 'two-dot',
518
- left,
519
- right
520
- };
521
- }
522
- // Single commit reference
523
- return {
524
- type: 'single',
525
- left: spec
526
- };
527
- }
528
- /**
529
- * Expand a revision range into include/exclude commit sets
530
- *
531
- * @param provider - The commit provider for fetching commits
532
- * @param range - The parsed revision range
533
- * @returns Object with include and exclude commit arrays
534
- */
535
- export async function expandRevisionRange(provider, range) {
536
- if (range.type === 'single') {
537
- return {
538
- include: [range.left],
539
- exclude: []
540
- };
541
- }
542
- if (range.type === 'two-dot') {
543
- // A..B means commits reachable from B but not from A
544
- // Include: all commits reachable from B
545
- // Exclude: all commits reachable from A (including A)
546
- const include = [];
547
- const exclude = [];
548
- // Get commits reachable from right (B)
549
- const visited = new Set();
550
- const queue = [range.right];
551
- while (queue.length > 0) {
552
- const sha = queue.shift();
553
- if (visited.has(sha))
554
- continue;
555
- visited.add(sha);
556
- include.push(sha);
557
- const commit = await provider.getCommit(sha);
558
- if (commit) {
559
- for (const parent of commit.parents) {
560
- queue.push(parent);
561
- }
562
- }
563
- }
564
- // Get commits reachable from left (A) to exclude
565
- const excludeVisited = new Set();
566
- const excludeQueue = [range.left];
567
- while (excludeQueue.length > 0) {
568
- const sha = excludeQueue.shift();
569
- if (excludeVisited.has(sha))
570
- continue;
571
- excludeVisited.add(sha);
572
- exclude.push(sha);
573
- const commit = await provider.getCommit(sha);
574
- if (commit) {
575
- for (const parent of commit.parents) {
576
- excludeQueue.push(parent);
577
- }
578
- }
579
- }
580
- return { include, exclude };
581
- }
582
- if (range.type === 'three-dot') {
583
- // A...B means symmetric difference (commits in either A or B but not both)
584
- // Find merge base and include commits from both sides up to merge base
585
- const mergeBase = await findCommonAncestor(provider, range.left, range.right);
586
- const exclude = [];
587
- if (mergeBase) {
588
- // Exclude merge base and its ancestors
589
- const baseCommits = Array.isArray(mergeBase) ? mergeBase : [mergeBase];
590
- for (const base of baseCommits) {
591
- exclude.push(base);
592
- const visited = new Set();
593
- const queue = [base];
594
- while (queue.length > 0) {
595
- const sha = queue.shift();
596
- if (visited.has(sha))
597
- continue;
598
- visited.add(sha);
599
- const commit = await provider.getCommit(sha);
600
- if (commit) {
601
- for (const parent of commit.parents) {
602
- if (!visited.has(parent)) {
603
- exclude.push(parent);
604
- queue.push(parent);
605
- }
606
- }
607
- }
608
- }
609
- }
610
- }
611
- return {
612
- include: [range.left, range.right],
613
- exclude
614
- };
615
- }
616
- return { include: [], exclude: [] };
617
- }
618
- // ============================================================================
619
- // Sorting Functions
620
- // ============================================================================
621
- /**
622
- * Sort commits topologically (children before parents)
623
- *
624
- * @param provider - The commit provider for fetching commits
625
- * @param commits - Array of commit SHAs to sort
626
- * @returns Sorted array of commit SHAs
627
- */
628
- export async function topologicalSort(provider, commits) {
629
- if (commits.length === 0) {
630
- return [];
631
- }
632
- const commitSet = new Set(commits);
633
- const commitData = new Map();
634
- // Fetch all commit data
635
- for (const sha of commits) {
636
- const commit = await provider.getCommit(sha);
637
- if (commit) {
638
- commitData.set(sha, commit);
639
- }
640
- }
641
- // Build in-degree map (count of children within the set)
642
- const inDegree = new Map();
643
- for (const sha of commits) {
644
- inDegree.set(sha, 0);
645
- }
646
- // Calculate in-degrees: for each parent, increment its in-degree
647
- for (const sha of commits) {
648
- const commit = commitData.get(sha);
649
- if (commit) {
650
- for (const parent of commit.parents) {
651
- if (commitSet.has(parent)) {
652
- inDegree.set(parent, (inDegree.get(parent) || 0) + 1);
653
- }
654
- }
655
- }
656
- }
657
- // Find all commits with no children (in-degree 0) - these are the starting points
658
- const queue = [];
659
- for (const [sha, degree] of inDegree) {
660
- if (degree === 0) {
661
- queue.push(sha);
662
- }
663
- }
664
- // Sort queue by timestamp (newest first) for consistent ordering
665
- queue.sort((a, b) => {
666
- const commitA = commitData.get(a);
667
- const commitB = commitData.get(b);
668
- if (!commitA || !commitB)
669
- return 0;
670
- return commitB.committer.timestamp - commitA.committer.timestamp;
671
- });
672
- const result = [];
673
- while (queue.length > 0) {
674
- // Take the first from queue (sorted by timestamp)
675
- const sha = queue.shift();
676
- result.push(sha);
677
- const commit = commitData.get(sha);
678
- if (commit) {
679
- for (const parent of commit.parents) {
680
- if (commitSet.has(parent)) {
681
- const newDegree = (inDegree.get(parent) || 0) - 1;
682
- inDegree.set(parent, newDegree);
683
- if (newDegree === 0) {
684
- // Insert in sorted order by timestamp
685
- const parentCommit = commitData.get(parent);
686
- if (parentCommit) {
687
- let insertIndex = 0;
688
- for (let i = 0; i < queue.length; i++) {
689
- const queueCommit = commitData.get(queue[i]);
690
- if (queueCommit &&
691
- parentCommit.committer.timestamp <=
692
- queueCommit.committer.timestamp) {
693
- insertIndex = i + 1;
694
- }
695
- else {
696
- break;
697
- }
698
- }
699
- queue.splice(insertIndex, 0, parent);
700
- }
701
- else {
702
- queue.push(parent);
703
- }
704
- }
705
- }
706
- }
707
- }
708
- }
709
- return result;
710
- }
711
- /**
712
- * Sort commits by date
713
- *
714
- * @param provider - The commit provider for fetching commits
715
- * @param commits - Array of commit SHAs to sort
716
- * @param useAuthorDate - If true, use author date; otherwise use committer date
717
- * @returns Sorted array of commit SHAs (newest first)
718
- */
719
- export async function sortByDate(provider, commits, useAuthorDate) {
720
- const commitData = [];
721
- for (const sha of commits) {
722
- const commit = await provider.getCommit(sha);
723
- if (commit) {
724
- const timestamp = useAuthorDate
725
- ? commit.author.timestamp
726
- : commit.committer.timestamp;
727
- commitData.push({ sha, timestamp });
728
- }
729
- }
730
- // Sort by timestamp (newest first)
731
- commitData.sort((a, b) => b.timestamp - a.timestamp);
732
- return commitData.map(c => c.sha);
733
- }
734
- // ============================================================================
735
- // Utility Functions
736
- // ============================================================================
737
- /**
738
- * Get all commits between two commits (exclusive of start, inclusive of end)
739
- *
740
- * @param provider - The commit provider for fetching commits
741
- * @param start - Starting commit SHA (exclusive)
742
- * @param end - Ending commit SHA (inclusive)
743
- * @returns Array of commit SHAs
744
- */
745
- export async function getCommitsBetween(provider, start, end) {
746
- // If start equals end, return empty
747
- if (start === end) {
748
- return [];
749
- }
750
- // Check if end is an ancestor of start (wrong direction)
751
- if (await isAncestor(provider, end, start)) {
752
- // end is ancestor of start, so there are no commits "between" them in this direction
753
- // Actually we need to check if start is NOT an ancestor of end
754
- if (!(await isAncestor(provider, start, end))) {
755
- return [];
756
- }
757
- }
758
- // Walk from end back to start, collecting commits
759
- const result = [];
760
- const visited = new Set();
761
- const queue = [end];
762
- // First check if start is reachable from end
763
- const startReachable = await isAncestor(provider, start, end);
764
- if (!startReachable) {
765
- return [];
766
- }
767
- while (queue.length > 0) {
768
- const sha = queue.shift();
769
- if (visited.has(sha))
770
- continue;
771
- visited.add(sha);
772
- // Stop at start (exclusive)
773
- if (sha === start) {
774
- continue;
775
- }
776
- result.push(sha);
777
- const commit = await provider.getCommit(sha);
778
- if (commit) {
779
- for (const parent of commit.parents) {
780
- if (!visited.has(parent)) {
781
- queue.push(parent);
782
- }
783
- }
784
- }
785
- }
786
- return result;
787
- }
788
- /**
789
- * Count the number of commits reachable from a commit
790
- *
791
- * @param provider - The commit provider for fetching commits
792
- * @param sha - Starting commit SHA
793
- * @param maxDepth - Maximum depth to count
794
- * @returns Number of reachable commits
795
- */
796
- export async function countCommits(provider, sha, maxDepth) {
797
- const visited = new Set();
798
- const queue = [{ sha, depth: 0 }];
799
- let count = 0;
800
- while (queue.length > 0) {
801
- const { sha: currentSha, depth } = queue.shift();
802
- if (visited.has(currentSha))
803
- continue;
804
- const commit = await provider.getCommit(currentSha);
805
- if (!commit)
806
- continue;
807
- visited.add(currentSha);
808
- count++;
809
- // Check depth limit
810
- if (maxDepth !== undefined && depth >= maxDepth) {
811
- continue;
812
- }
813
- for (const parent of commit.parents) {
814
- if (!visited.has(parent)) {
815
- queue.push({ sha: parent, depth: depth + 1 });
816
- }
817
- }
818
- }
819
- return count;
820
- }
821
- //# sourceMappingURL=commit-traversal.js.map