git-chopstick-core 0.1.0 → 0.1.2

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 (427) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +324 -32
  3. package/dist/git/add.d.ts +9 -0
  4. package/dist/git/add.js +11 -0
  5. package/dist/git/add.js.map +1 -0
  6. package/dist/git/apply.d.ts +33 -0
  7. package/dist/git/apply.js +103 -0
  8. package/dist/git/apply.js.map +1 -0
  9. package/dist/git/authentication.d.ts +5 -0
  10. package/dist/git/authentication.js +19 -0
  11. package/dist/git/authentication.js.map +1 -0
  12. package/dist/git/branch.d.ts +43 -0
  13. package/dist/git/branch.js +150 -0
  14. package/dist/git/branch.js.map +1 -0
  15. package/dist/git/checkout-index.d.ts +19 -0
  16. package/dist/git/checkout-index.js +29 -0
  17. package/dist/git/checkout-index.js.map +1 -0
  18. package/dist/git/checkout.d.ts +46 -0
  19. package/dist/git/checkout.js +126 -0
  20. package/dist/git/checkout.js.map +1 -0
  21. package/dist/git/cherry-pick.d.ts +82 -0
  22. package/dist/git/cherry-pick.js +371 -0
  23. package/dist/git/cherry-pick.js.map +1 -0
  24. package/dist/git/clean.d.ts +5 -0
  25. package/dist/git/clean.js +8 -0
  26. package/dist/git/clean.js.map +1 -0
  27. package/dist/git/clone.d.ts +22 -0
  28. package/dist/git/clone.js +58 -0
  29. package/dist/git/clone.js.map +1 -0
  30. package/dist/git/coerce-to-buffer.d.ts +1 -0
  31. package/dist/git/coerce-to-buffer.js +2 -0
  32. package/dist/git/coerce-to-buffer.js.map +1 -0
  33. package/dist/git/coerce-to-string.d.ts +1 -0
  34. package/dist/git/coerce-to-string.js +2 -0
  35. package/dist/git/coerce-to-string.js.map +1 -0
  36. package/dist/git/commit.d.ts +25 -0
  37. package/dist/git/commit.js +99 -0
  38. package/dist/git/commit.js.map +1 -0
  39. package/dist/git/config.d.ts +98 -0
  40. package/dist/git/config.js +249 -0
  41. package/dist/git/config.js.map +1 -0
  42. package/dist/git/core.d.ts +167 -0
  43. package/dist/git/core.js +368 -0
  44. package/dist/git/core.js.map +1 -0
  45. package/dist/git/create-tail-stream.d.ts +4 -0
  46. package/dist/git/create-tail-stream.js +30 -0
  47. package/dist/git/create-tail-stream.js.map +1 -0
  48. package/dist/git/credential.d.ts +5 -0
  49. package/dist/git/credential.js +64 -0
  50. package/dist/git/credential.js.map +1 -0
  51. package/dist/git/description.d.ts +5 -0
  52. package/dist/git/description.js +24 -0
  53. package/dist/git/description.js.map +1 -0
  54. package/dist/git/diff-check.d.ts +7 -0
  55. package/dist/git/diff-check.js +17 -0
  56. package/dist/git/diff-check.js.map +1 -0
  57. package/dist/git/diff-index.d.ts +31 -0
  58. package/dist/git/diff-index.js +76 -0
  59. package/dist/git/diff-index.js.map +1 -0
  60. package/dist/git/diff.d.ts +81 -0
  61. package/dist/git/diff.js +611 -0
  62. package/dist/git/diff.js.map +1 -0
  63. package/dist/git/environment.d.ts +51 -0
  64. package/dist/git/environment.js +97 -0
  65. package/dist/git/environment.js.map +1 -0
  66. package/dist/git/exec.d.ts +109 -0
  67. package/dist/git/exec.js +224 -0
  68. package/dist/git/exec.js.map +1 -0
  69. package/dist/git/fetch.d.ts +25 -0
  70. package/dist/git/fetch.js +100 -0
  71. package/dist/git/fetch.js.map +1 -0
  72. package/dist/git/for-each-ref.d.ts +13 -0
  73. package/dist/git/for-each-ref.js +114 -0
  74. package/dist/git/for-each-ref.js.map +1 -0
  75. package/dist/git/format-patch.d.ts +10 -0
  76. package/dist/git/format-patch.js +16 -0
  77. package/dist/git/format-patch.js.map +1 -0
  78. package/dist/git/git-delimiter-parser.d.ts +38 -0
  79. package/dist/git/git-delimiter-parser.js +79 -0
  80. package/dist/git/git-delimiter-parser.js.map +1 -0
  81. package/dist/git/gitignore.d.ts +26 -0
  82. package/dist/git/gitignore.js +124 -0
  83. package/dist/git/gitignore.js.map +1 -0
  84. package/dist/git/index.d.ts +46 -0
  85. package/dist/git/index.js +47 -0
  86. package/dist/git/index.js.map +1 -0
  87. package/dist/git/init.d.ts +2 -0
  88. package/dist/git/init.js +7 -0
  89. package/dist/git/init.js.map +1 -0
  90. package/dist/git/interpret-trailers.d.ts +88 -0
  91. package/dist/git/interpret-trailers.js +130 -0
  92. package/dist/git/interpret-trailers.js.map +1 -0
  93. package/dist/git/lfs.d.ts +25 -0
  94. package/dist/git/lfs.js +73 -0
  95. package/dist/git/lfs.js.map +1 -0
  96. package/dist/git/log.d.ts +56 -0
  97. package/dist/git/log.js +258 -0
  98. package/dist/git/log.js.map +1 -0
  99. package/dist/git/merge-tree.d.ts +13 -0
  100. package/dist/git/merge-tree.js +24 -0
  101. package/dist/git/merge-tree.js.map +1 -0
  102. package/dist/git/merge.d.ts +50 -0
  103. package/dist/git/merge.js +111 -0
  104. package/dist/git/merge.js.map +1 -0
  105. package/dist/git/multi-operation-terminal-output.d.ts +20 -0
  106. package/dist/git/multi-operation-terminal-output.js +56 -0
  107. package/dist/git/multi-operation-terminal-output.js.map +1 -0
  108. package/dist/git/pull.d.ts +24 -0
  109. package/dist/git/pull.js +91 -0
  110. package/dist/git/pull.js.map +1 -0
  111. package/dist/git/push-terminal-chunk.d.ts +19 -0
  112. package/dist/git/push-terminal-chunk.js +36 -0
  113. package/dist/git/push-terminal-chunk.js.map +1 -0
  114. package/dist/git/push.d.ts +42 -0
  115. package/dist/git/push.js +80 -0
  116. package/dist/git/push.js.map +1 -0
  117. package/dist/git/rebase.d.ts +119 -0
  118. package/dist/git/rebase.js +415 -0
  119. package/dist/git/rebase.js.map +1 -0
  120. package/dist/git/reflog.d.ts +14 -0
  121. package/dist/git/reflog.js +88 -0
  122. package/dist/git/reflog.js.map +1 -0
  123. package/dist/git/refs.d.ts +26 -0
  124. package/dist/git/refs.js +53 -0
  125. package/dist/git/refs.js.map +1 -0
  126. package/dist/git/remote.d.ts +31 -0
  127. package/dist/git/remote.js +81 -0
  128. package/dist/git/remote.js.map +1 -0
  129. package/dist/git/reorder.d.ts +23 -0
  130. package/dist/git/reorder.js +111 -0
  131. package/dist/git/reorder.js.map +1 -0
  132. package/dist/git/reset.d.ts +41 -0
  133. package/dist/git/reset.js +86 -0
  134. package/dist/git/reset.js.map +1 -0
  135. package/dist/git/rev-list.d.ts +67 -0
  136. package/dist/git/rev-list.js +157 -0
  137. package/dist/git/rev-list.js.map +1 -0
  138. package/dist/git/rev-parse.d.ts +24 -0
  139. package/dist/git/rev-parse.js +65 -0
  140. package/dist/git/rev-parse.js.map +1 -0
  141. package/dist/git/revert.d.ts +12 -0
  142. package/dist/git/revert.js +30 -0
  143. package/dist/git/revert.js.map +1 -0
  144. package/dist/git/rm.d.ts +12 -0
  145. package/dist/git/rm.js +22 -0
  146. package/dist/git/rm.js.map +1 -0
  147. package/dist/git/show.d.ts +42 -0
  148. package/dist/git/show.js +59 -0
  149. package/dist/git/show.js.map +1 -0
  150. package/dist/git/spawn.d.ts +18 -0
  151. package/dist/git/spawn.js +16 -0
  152. package/dist/git/spawn.js.map +1 -0
  153. package/dist/git/squash.d.ts +28 -0
  154. package/dist/git/squash.js +127 -0
  155. package/dist/git/squash.js.map +1 -0
  156. package/dist/git/stage.d.ts +21 -0
  157. package/dist/git/stage.js +72 -0
  158. package/dist/git/stage.js.map +1 -0
  159. package/dist/git/stash.d.ts +53 -0
  160. package/dist/git/stash.js +204 -0
  161. package/dist/git/stash.js.map +1 -0
  162. package/dist/git/status.d.ts +39 -0
  163. package/dist/git/status.js +293 -0
  164. package/dist/git/status.js.map +1 -0
  165. package/dist/git/submodule.d.ts +20 -0
  166. package/dist/git/submodule.js +153 -0
  167. package/dist/git/submodule.js.map +1 -0
  168. package/dist/git/tag.d.ts +32 -0
  169. package/dist/git/tag.js +101 -0
  170. package/dist/git/tag.js.map +1 -0
  171. package/dist/git/update-index.d.ts +11 -0
  172. package/dist/git/update-index.js +99 -0
  173. package/dist/git/update-index.js.map +1 -0
  174. package/dist/git/update-ref.d.ts +23 -0
  175. package/dist/git/update-ref.js +32 -0
  176. package/dist/git/update-ref.js.map +1 -0
  177. package/dist/git/var.d.ts +18 -0
  178. package/dist/git/var.js +33 -0
  179. package/dist/git/var.js.map +1 -0
  180. package/dist/git/worktree-include.d.ts +42 -0
  181. package/dist/git/worktree-include.js +109 -0
  182. package/dist/git/worktree-include.js.map +1 -0
  183. package/dist/git/worktree.d.ts +25 -0
  184. package/dist/git/worktree.js +139 -0
  185. package/dist/git/worktree.js.map +1 -0
  186. package/dist/index.d.ts +4 -0
  187. package/dist/index.js +7 -0
  188. package/dist/index.js.map +1 -0
  189. package/dist/lib/api.d.ts +2 -0
  190. package/dist/lib/api.js +7 -0
  191. package/dist/lib/api.js.map +1 -0
  192. package/dist/lib/diff-parser.d.ts +20 -0
  193. package/dist/lib/diff-parser.js +184 -0
  194. package/dist/lib/diff-parser.js.map +1 -0
  195. package/dist/lib/directory-exists.d.ts +1 -0
  196. package/dist/lib/directory-exists.js +11 -0
  197. package/dist/lib/directory-exists.js.map +1 -0
  198. package/dist/lib/errno-exception.d.ts +6 -0
  199. package/dist/lib/errno-exception.js +6 -0
  200. package/dist/lib/errno-exception.js.map +1 -0
  201. package/dist/lib/fatal-error.d.ts +4 -0
  202. package/dist/lib/fatal-error.js +18 -0
  203. package/dist/lib/fatal-error.js.map +1 -0
  204. package/dist/lib/feature-flag.d.ts +14 -0
  205. package/dist/lib/feature-flag.js +25 -0
  206. package/dist/lib/feature-flag.js.map +1 -0
  207. package/dist/lib/file-system.d.ts +1 -0
  208. package/dist/lib/file-system.js +7 -0
  209. package/dist/lib/file-system.js.map +1 -0
  210. package/dist/lib/get-old-path.d.ts +2 -0
  211. package/dist/lib/get-old-path.js +9 -0
  212. package/dist/lib/get-old-path.js.map +1 -0
  213. package/dist/lib/git/environment.d.ts +3 -0
  214. package/dist/lib/git/environment.js +7 -0
  215. package/dist/lib/git/environment.js.map +1 -0
  216. package/dist/lib/git-perf.d.ts +1 -0
  217. package/dist/lib/git-perf.js +4 -0
  218. package/dist/lib/git-perf.js.map +1 -0
  219. package/dist/lib/helpers/default-branch.d.ts +1 -0
  220. package/dist/lib/helpers/default-branch.js +4 -0
  221. package/dist/lib/helpers/default-branch.js.map +1 -0
  222. package/dist/lib/helpers/path.d.ts +1 -0
  223. package/dist/lib/helpers/path.js +5 -0
  224. package/dist/lib/helpers/path.js.map +1 -0
  225. package/dist/lib/hooks/with-hooks-env.d.ts +3 -0
  226. package/dist/lib/hooks/with-hooks-env.js +4 -0
  227. package/dist/lib/hooks/with-hooks-env.js.map +1 -0
  228. package/dist/lib/merge.d.ts +1 -0
  229. package/dist/lib/merge.js +4 -0
  230. package/dist/lib/merge.js.map +1 -0
  231. package/dist/lib/noop.d.ts +1 -0
  232. package/dist/lib/noop.js +2 -0
  233. package/dist/lib/noop.js.map +1 -0
  234. package/dist/lib/patch-formatter.d.ts +5 -0
  235. package/dist/lib/patch-formatter.js +7 -0
  236. package/dist/lib/patch-formatter.js.map +1 -0
  237. package/dist/lib/path-exists.d.ts +1 -0
  238. package/dist/lib/path-exists.js +3 -0
  239. package/dist/lib/path-exists.js.map +1 -0
  240. package/dist/lib/progress/from-process.d.ts +2 -0
  241. package/dist/lib/progress/from-process.js +4 -0
  242. package/dist/lib/progress/from-process.js.map +1 -0
  243. package/dist/lib/progress/index.d.ts +49 -0
  244. package/dist/lib/progress/index.js +32 -0
  245. package/dist/lib/progress/index.js.map +1 -0
  246. package/dist/lib/progress/revert.d.ts +8 -0
  247. package/dist/lib/progress/revert.js +15 -0
  248. package/dist/lib/progress/revert.js.map +1 -0
  249. package/dist/lib/rebase.d.ts +1 -0
  250. package/dist/lib/rebase.js +4 -0
  251. package/dist/lib/rebase.js.map +1 -0
  252. package/dist/lib/remove-remote-prefix.d.ts +1 -0
  253. package/dist/lib/remove-remote-prefix.js +5 -0
  254. package/dist/lib/remove-remote-prefix.js.map +1 -0
  255. package/dist/lib/resolve-git-proxy.d.ts +1 -0
  256. package/dist/lib/resolve-git-proxy.js +4 -0
  257. package/dist/lib/resolve-git-proxy.js.map +1 -0
  258. package/dist/lib/round.d.ts +1 -0
  259. package/dist/lib/round.js +5 -0
  260. package/dist/lib/round.js.map +1 -0
  261. package/dist/lib/split-buffer.d.ts +1 -0
  262. package/dist/lib/split-buffer.js +15 -0
  263. package/dist/lib/split-buffer.js.map +1 -0
  264. package/dist/lib/status-parser.d.ts +19 -0
  265. package/dist/lib/status-parser.js +137 -0
  266. package/dist/lib/status-parser.js.map +1 -0
  267. package/dist/lib/stores/helpers/find-default-remote.d.ts +1 -0
  268. package/dist/lib/stores/helpers/find-default-remote.js +4 -0
  269. package/dist/lib/stores/helpers/find-default-remote.js.map +1 -0
  270. package/dist/lib/trampoline/trampoline-environment.d.ts +1 -0
  271. package/dist/lib/trampoline/trampoline-environment.js +4 -0
  272. package/dist/lib/trampoline/trampoline-environment.js.map +1 -0
  273. package/dist/models/branch.d.ts +44 -0
  274. package/dist/models/branch.js +59 -0
  275. package/dist/models/branch.js.map +1 -0
  276. package/dist/models/cherry-pick.d.ts +11 -0
  277. package/dist/models/cherry-pick.js +2 -0
  278. package/dist/models/cherry-pick.js.map +1 -0
  279. package/dist/models/clone-options.d.ts +6 -0
  280. package/dist/models/clone-options.js +2 -0
  281. package/dist/models/clone-options.js.map +1 -0
  282. package/dist/models/commit-identity.d.ts +9 -0
  283. package/dist/models/commit-identity.js +34 -0
  284. package/dist/models/commit-identity.js.map +1 -0
  285. package/dist/models/commit.d.ts +30 -0
  286. package/dist/models/commit.js +32 -0
  287. package/dist/models/commit.js.map +1 -0
  288. package/dist/models/computed-action.d.ts +6 -0
  289. package/dist/models/computed-action.js +8 -0
  290. package/dist/models/computed-action.js.map +1 -0
  291. package/dist/models/diff/diff-data.d.ts +53 -0
  292. package/dist/models/diff/diff-data.js +19 -0
  293. package/dist/models/diff/diff-data.js.map +1 -0
  294. package/dist/models/diff/diff-line.d.ts +18 -0
  295. package/dist/models/diff/diff-line.js +33 -0
  296. package/dist/models/diff/diff-line.js.map +1 -0
  297. package/dist/models/diff/diff-selection.d.ts +22 -0
  298. package/dist/models/diff/diff-selection.js +127 -0
  299. package/dist/models/diff/diff-selection.js.map +1 -0
  300. package/dist/models/diff/image-diff.d.ts +6 -0
  301. package/dist/models/diff/image-diff.js +8 -0
  302. package/dist/models/diff/image-diff.js.map +1 -0
  303. package/dist/models/diff/image.d.ts +7 -0
  304. package/dist/models/diff/image.js +13 -0
  305. package/dist/models/diff/image.js.map +1 -0
  306. package/dist/models/diff/index.d.ts +6 -0
  307. package/dist/models/diff/index.js +7 -0
  308. package/dist/models/diff/index.js.map +1 -0
  309. package/dist/models/diff/raw-diff.d.ts +32 -0
  310. package/dist/models/diff/raw-diff.js +38 -0
  311. package/dist/models/diff/raw-diff.js.map +1 -0
  312. package/dist/models/git-author.d.ts +7 -0
  313. package/dist/models/git-author.js +18 -0
  314. package/dist/models/git-author.js.map +1 -0
  315. package/dist/models/index.d.ts +21 -0
  316. package/dist/models/index.js +20 -0
  317. package/dist/models/index.js.map +1 -0
  318. package/dist/models/manual-conflict-resolution.d.ts +4 -0
  319. package/dist/models/manual-conflict-resolution.js +6 -0
  320. package/dist/models/manual-conflict-resolution.js.map +1 -0
  321. package/dist/models/merge.d.ts +6 -0
  322. package/dist/models/merge.js +2 -0
  323. package/dist/models/merge.js.map +1 -0
  324. package/dist/models/multi-commit-operation.d.ts +6 -0
  325. package/dist/models/multi-commit-operation.js +8 -0
  326. package/dist/models/multi-commit-operation.js.map +1 -0
  327. package/dist/models/progress.d.ts +41 -0
  328. package/dist/models/progress.js +7 -0
  329. package/dist/models/progress.js.map +1 -0
  330. package/dist/models/rebase.d.ts +17 -0
  331. package/dist/models/rebase.js +8 -0
  332. package/dist/models/rebase.js.map +1 -0
  333. package/dist/models/remote.d.ts +5 -0
  334. package/dist/models/remote.js +8 -0
  335. package/dist/models/remote.js.map +1 -0
  336. package/dist/models/repository.d.ts +7 -0
  337. package/dist/models/repository.js +15 -0
  338. package/dist/models/repository.js.map +1 -0
  339. package/dist/models/stash-entry.d.ts +20 -0
  340. package/dist/models/stash-entry.js +7 -0
  341. package/dist/models/stash-entry.js.map +1 -0
  342. package/dist/models/status.d.ts +166 -0
  343. package/dist/models/status.js +135 -0
  344. package/dist/models/status.js.map +1 -0
  345. package/dist/models/submodule.d.ts +12 -0
  346. package/dist/models/submodule.js +2 -0
  347. package/dist/models/submodule.js.map +1 -0
  348. package/dist/models/worktree.d.ts +10 -0
  349. package/dist/models/worktree.js +2 -0
  350. package/dist/models/worktree.js.map +1 -0
  351. package/package.json +17 -2
  352. package/src/git/add.ts +3 -3
  353. package/src/git/apply.ts +8 -8
  354. package/src/git/authentication.ts +3 -2
  355. package/src/git/branch.ts +10 -10
  356. package/src/git/checkout-index.ts +2 -2
  357. package/src/git/checkout.ts +12 -12
  358. package/src/git/cherry-pick.ts +16 -16
  359. package/src/git/clean.ts +2 -2
  360. package/src/git/clone.ts +6 -6
  361. package/src/git/commit.ts +7 -7
  362. package/src/git/config.ts +2 -2
  363. package/src/git/core.ts +8 -8
  364. package/src/git/credential.ts +1 -1
  365. package/src/git/diff-check.ts +1 -1
  366. package/src/git/diff-index.ts +2 -2
  367. package/src/git/diff.ts +18 -18
  368. package/src/git/environment.ts +5 -5
  369. package/src/git/fetch.ts +7 -7
  370. package/src/git/for-each-ref.ts +5 -5
  371. package/src/git/format-patch.ts +3 -3
  372. package/src/git/git-delimiter-parser.ts +1 -1
  373. package/src/git/gitignore.ts +2 -2
  374. package/src/git/index.ts +46 -36
  375. package/src/git/init.ts +2 -2
  376. package/src/git/interpret-trailers.ts +3 -3
  377. package/src/git/lfs.ts +2 -2
  378. package/src/git/log.ts +8 -8
  379. package/src/git/merge-tree.ts +5 -5
  380. package/src/git/merge.ts +5 -5
  381. package/src/git/multi-operation-terminal-output.ts +3 -3
  382. package/src/git/pull.ts +7 -7
  383. package/src/git/push-terminal-chunk.ts +1 -1
  384. package/src/git/push.ts +7 -7
  385. package/src/git/rebase.ts +16 -16
  386. package/src/git/reflog.ts +2 -2
  387. package/src/git/refs.ts +2 -2
  388. package/src/git/remote.ts +6 -6
  389. package/src/git/reorder.ts +7 -7
  390. package/src/git/reset.ts +3 -3
  391. package/src/git/rev-list.ts +5 -5
  392. package/src/git/rev-parse.ts +2 -2
  393. package/src/git/revert.ts +8 -8
  394. package/src/git/rm.ts +3 -3
  395. package/src/git/show.ts +4 -4
  396. package/src/git/spawn.ts +3 -3
  397. package/src/git/squash.ts +7 -7
  398. package/src/git/stage.ts +7 -7
  399. package/src/git/stash.ts +10 -10
  400. package/src/git/status.ts +13 -13
  401. package/src/git/submodule.ts +9 -9
  402. package/src/git/tag.ts +4 -4
  403. package/src/git/update-index.ts +5 -5
  404. package/src/git/update-ref.ts +2 -2
  405. package/src/git/var.ts +3 -3
  406. package/src/git/worktree-include.ts +3 -3
  407. package/src/git/worktree.ts +4 -4
  408. package/src/index.ts +11 -0
  409. package/src/lib/diff-parser.ts +2 -2
  410. package/src/lib/get-old-path.ts +1 -1
  411. package/src/lib/git/environment.ts +1 -1
  412. package/src/lib/patch-formatter.ts +3 -3
  413. package/src/lib/progress/from-process.ts +1 -1
  414. package/src/lib/progress/index.ts +1 -1
  415. package/src/lib/status-parser.ts +2 -2
  416. package/src/models/branch.ts +1 -1
  417. package/src/models/cherry-pick.ts +2 -2
  418. package/src/models/commit.ts +1 -1
  419. package/src/models/diff/diff-data.ts +3 -3
  420. package/src/models/diff/index.ts +6 -6
  421. package/src/models/diff/raw-diff.ts +1 -1
  422. package/src/models/index.ts +36 -0
  423. package/src/models/rebase.ts +2 -2
  424. package/src/models/stash-entry.ts +1 -1
  425. package/src/models/status.ts +1 -1
  426. package/examples/get-status.ts +0 -84
  427. package/tsconfig.json +0 -17
@@ -0,0 +1,611 @@
1
+ import * as Path from 'path';
2
+ import { getBlobContents } from './show.js';
3
+ import { WorkingDirectoryFileChange, AppFileStatusKind, CommittedFileChange, } from '../models/status.js';
4
+ import { DiffType, Image, parseLineEndingText, } from '../models/diff/index.js';
5
+ import { DiffParser } from '../lib/diff-parser.js';
6
+ import { getOldPathOrDefault } from '../lib/get-old-path.js';
7
+ import { readFile } from 'fs/promises';
8
+ import { forceUnwrap } from '../lib/fatal-error.js';
9
+ import { git } from './core.js';
10
+ import { NullTreeSHA } from './diff-index.js';
11
+ import { GitError } from './exec.js';
12
+ import { parseRawLogWithNumstat } from './log.js';
13
+ import { getConfigValue } from './config.js';
14
+ import { getMergeBase } from './merge.js';
15
+ import { createLogParser } from './git-delimiter-parser.js';
16
+ import { enableImagePreviewsForDDSFiles } from '../lib/feature-flag.js';
17
+ import { unstageAll } from './reset.js';
18
+ import { stageFiles } from './update-index.js';
19
+ import { isAbsolute } from 'path';
20
+ /**
21
+ * V8 has a limit on the size of string it can create (~256MB), and unless we want to
22
+ * trigger an unhandled exception we need to do the encoding conversion by hand.
23
+ *
24
+ * This is a hard limit on how big a buffer can be and still be converted into
25
+ * a string.
26
+ */
27
+ const MaxDiffBufferSize = 70e6; // 70MB in decimal
28
+ /**
29
+ * Where `MaxDiffBufferSize` is a hard limit, this is a suggested limit. Diffs
30
+ * bigger than this _could_ be displayed but it might cause some slowness.
31
+ */
32
+ const MaxReasonableDiffSize = MaxDiffBufferSize / 16; // ~4.375MB in decimal
33
+ /**
34
+ * The longest line length we should try to display. If a diff has a line longer
35
+ * than this, we probably shouldn't attempt it
36
+ */
37
+ const MaxCharactersPerLine = 5000;
38
+ /**
39
+ * Utility function to check whether parsing this buffer is going to cause
40
+ * issues at runtime.
41
+ *
42
+ * @param buffer A buffer of binary text from a spawned process
43
+ */
44
+ function isValidBuffer(buffer) {
45
+ return buffer.length <= MaxDiffBufferSize;
46
+ }
47
+ /** Is the buffer too large for us to reasonably represent? */
48
+ function isBufferTooLarge(buffer) {
49
+ return buffer.length >= MaxReasonableDiffSize;
50
+ }
51
+ /** Is the diff too large for us to reasonably represent? */
52
+ function isDiffTooLarge(diff) {
53
+ for (const hunk of diff.hunks) {
54
+ for (const line of hunk.lines) {
55
+ if (line.text.length > MaxCharactersPerLine) {
56
+ return true;
57
+ }
58
+ }
59
+ }
60
+ return false;
61
+ }
62
+ /**
63
+ * Defining the list of known extensions we can render inside the app
64
+ */
65
+ const imageFileExtensions = new Set([
66
+ '.png',
67
+ '.jpg',
68
+ '.jpeg',
69
+ '.gif',
70
+ '.ico',
71
+ '.webp',
72
+ '.bmp',
73
+ '.avif',
74
+ '.svg',
75
+ ]);
76
+ if (enableImagePreviewsForDDSFiles()) {
77
+ imageFileExtensions.add('.dds');
78
+ }
79
+ /**
80
+ * Render the difference between a file in the given commit and its parent
81
+ *
82
+ * @param commitish A commit SHA or some other identifier that ultimately dereferences
83
+ * to a commit.
84
+ */
85
+ export async function getCommitDiff(repository, file, commitish, hideWhitespaceInDiff = false) {
86
+ const args = [
87
+ 'log',
88
+ commitish,
89
+ ...(hideWhitespaceInDiff ? ['-w'] : []),
90
+ '-m',
91
+ '-1',
92
+ '--first-parent',
93
+ '--patch-with-raw',
94
+ '--format=',
95
+ '-z',
96
+ '--no-color',
97
+ '--',
98
+ ensureRelativePath(file.path),
99
+ ];
100
+ if (file.status.kind === AppFileStatusKind.Renamed ||
101
+ file.status.kind === AppFileStatusKind.Copied) {
102
+ args.push(ensureRelativePath(file.status.oldPath));
103
+ }
104
+ const { stdout } = await git(args, repository.path, 'getCommitDiff', {
105
+ encoding: 'buffer',
106
+ });
107
+ return buildDiff(stdout, repository, file, commitish, commitish);
108
+ }
109
+ /**
110
+ * Render the diff between two branches with --merge-base for a file
111
+ * (Show what would be the result of merge)
112
+ */
113
+ export async function getBranchMergeBaseDiff(repository, file, baseBranchName, comparisonBranchName, hideWhitespaceInDiff = false, latestCommit) {
114
+ const args = [
115
+ 'diff',
116
+ '--merge-base',
117
+ baseBranchName,
118
+ comparisonBranchName,
119
+ ...(hideWhitespaceInDiff ? ['-w'] : []),
120
+ '--patch-with-raw',
121
+ '-z',
122
+ '--no-color',
123
+ '--',
124
+ ensureRelativePath(file.path),
125
+ ];
126
+ if (file.status.kind === AppFileStatusKind.Renamed ||
127
+ file.status.kind === AppFileStatusKind.Copied) {
128
+ args.push(ensureRelativePath(file.status.oldPath));
129
+ }
130
+ const result = await git(args, repository.path, 'getBranchMergeBaseDiff', {
131
+ encoding: 'buffer',
132
+ });
133
+ return buildDiff(result.stdout, repository, file, latestCommit, latestCommit);
134
+ }
135
+ /**
136
+ * Render the difference between two commits for a file
137
+ *
138
+ */
139
+ export async function getCommitRangeDiff(repository, file, commits, hideWhitespaceInDiff = false, useNullTreeSHA = false) {
140
+ if (commits.length === 0) {
141
+ throw new Error('No commits to diff...');
142
+ }
143
+ const oldestCommit = useNullTreeSHA ? NullTreeSHA : commits[0];
144
+ const oldestCommitRef = useNullTreeSHA ? NullTreeSHA : `${commits[0]}^`;
145
+ const latestCommit = commits.at(-1) ?? ''; // can't be undefined since commits.length > 0
146
+ const args = [
147
+ 'diff',
148
+ oldestCommitRef,
149
+ latestCommit,
150
+ ...(hideWhitespaceInDiff ? ['-w'] : []),
151
+ '--patch-with-raw',
152
+ '--format=',
153
+ '-z',
154
+ '--no-color',
155
+ '--',
156
+ ensureRelativePath(file.path),
157
+ ];
158
+ if (file.status.kind === AppFileStatusKind.Renamed ||
159
+ file.status.kind === AppFileStatusKind.Copied) {
160
+ args.push(ensureRelativePath(file.status.oldPath));
161
+ }
162
+ const result = await git(args, repository.path, 'getCommitsDiff', {
163
+ encoding: 'buffer',
164
+ expectedErrors: new Set([GitError.BadRevision]),
165
+ });
166
+ // This should only happen if the oldest commit does not have a parent (ex:
167
+ // initial commit of a branch) and therefore `SHA^` is not a valid reference.
168
+ // In which case, we will retry with the null tree sha.
169
+ if (result.gitError === GitError.BadRevision && useNullTreeSHA === false) {
170
+ return getCommitRangeDiff(repository, file, commits, hideWhitespaceInDiff, true);
171
+ }
172
+ return buildDiff(result.stdout, repository, file, latestCommit, oldestCommit);
173
+ }
174
+ /**
175
+ * Get the files that were changed for the merge base comparison of two branches.
176
+ * (What would be the result of a merge)
177
+ */
178
+ export async function getBranchMergeBaseChangedFiles(repository, baseBranchName, comparisonBranchName, latestComparisonBranchCommitRef) {
179
+ const baseArgs = [
180
+ 'diff',
181
+ '--merge-base',
182
+ baseBranchName,
183
+ comparisonBranchName,
184
+ '-C',
185
+ '-M',
186
+ '-z',
187
+ '--raw',
188
+ '--numstat',
189
+ '--',
190
+ ];
191
+ const mergeBaseCommit = await getMergeBase(repository, baseBranchName, comparisonBranchName);
192
+ if (mergeBaseCommit === null) {
193
+ return null;
194
+ }
195
+ const result = await git(baseArgs, repository.path, 'getBranchMergeBaseChangedFiles');
196
+ return parseRawLogWithNumstat(result.stdout, `${latestComparisonBranchCommitRef}`, mergeBaseCommit);
197
+ }
198
+ export async function getCommitRangeChangedFiles(repository, shas, useNullTreeSHA = false) {
199
+ if (shas.length === 0) {
200
+ throw new Error('No commits to diff...');
201
+ }
202
+ const oldestCommitRef = useNullTreeSHA ? NullTreeSHA : `${shas[0]}^`;
203
+ const latestCommitRef = shas.at(-1) ?? ''; // can't be undefined since shas.length > 0
204
+ const baseArgs = [
205
+ 'diff',
206
+ oldestCommitRef,
207
+ latestCommitRef,
208
+ '-C',
209
+ '-M',
210
+ '-z',
211
+ '--raw',
212
+ '--numstat',
213
+ '--',
214
+ ];
215
+ const { stdout, gitError } = await git(baseArgs, repository.path, 'getCommitRangeChangedFiles', {
216
+ expectedErrors: new Set([GitError.BadRevision]),
217
+ });
218
+ // This should only happen if the oldest commit does not have a parent (ex:
219
+ // initial commit of a branch) and therefore `SHA^` is not a valid reference.
220
+ // In which case, we will retry with the null tree sha.
221
+ if (gitError === GitError.BadRevision && useNullTreeSHA === false) {
222
+ const useNullTreeSHA = true;
223
+ return getCommitRangeChangedFiles(repository, shas, useNullTreeSHA);
224
+ }
225
+ return parseRawLogWithNumstat(stdout, latestCommitRef, oldestCommitRef);
226
+ }
227
+ /**
228
+ * Render the diff for a file within the repository working directory. The file will be
229
+ * compared against HEAD if it's tracked, if not it'll be compared to an empty file meaning
230
+ * that all content in the file will be treated as additions.
231
+ */
232
+ export async function getWorkingDirectoryDiff(repository, file, hideWhitespaceInDiff = false) {
233
+ // `--no-ext-diff` should be provided wherever we invoke `git diff` so that any
234
+ // diff.external program configured by the user is ignored
235
+ const args = [
236
+ 'diff',
237
+ ...(hideWhitespaceInDiff ? ['-w'] : []),
238
+ '--no-ext-diff',
239
+ '--patch-with-raw',
240
+ '-z',
241
+ '--no-color',
242
+ ];
243
+ const successExitCodes = new Set([0]);
244
+ const isSubmodule = file.status.submoduleStatus !== undefined;
245
+ // For added submodules, we'll use the "default" parameters, which are able
246
+ // to output the submodule commit.
247
+ if (!isSubmodule &&
248
+ (file.status.kind === AppFileStatusKind.New ||
249
+ file.status.kind === AppFileStatusKind.Untracked)) {
250
+ // `git diff --no-index` seems to emulate the exit codes from `diff` irrespective of
251
+ // whether you set --exit-code
252
+ //
253
+ // this is the behavior:
254
+ // - 0 if no changes found
255
+ // - 1 if changes found
256
+ // - and error otherwise
257
+ //
258
+ // citation in source:
259
+ // https://github.com/git/git/blob/1f66975deb8402131fbf7c14330d0c7cdebaeaa2/diff-no-index.c#L300
260
+ successExitCodes.add(1);
261
+ args.push('--no-index', '--', '/dev/null', file.path);
262
+ }
263
+ else if (file.status.kind === AppFileStatusKind.Renamed) {
264
+ // NB: Technically this is incorrect, the best kind of incorrect.
265
+ // In order to show exactly what will end up in the commit we should
266
+ // perform a diff between the new file and the old file as it appears
267
+ // in HEAD. By diffing against the index we won't show any changes
268
+ // already staged to the renamed file which differs from our other diffs.
269
+ // The closest I got to that was running hash-object and then using
270
+ // git diff <blob> <blob> but that seems a bit excessive.
271
+ args.push('--', ensureRelativePath(file.path));
272
+ }
273
+ else {
274
+ args.push('HEAD', '--', ensureRelativePath(file.path));
275
+ }
276
+ const { stdout, stderr } = await git(args, repository.path, 'getWorkingDirectoryDiff', { successExitCodes, encoding: 'buffer' });
277
+ const lineEndingsChange = parseLineEndingsWarning(stderr);
278
+ return buildDiff(stdout, repository, file, 'HEAD', 'HEAD', lineEndingsChange);
279
+ }
280
+ /**
281
+ * Render the diff for a list of files within the repository working directory.
282
+ * The files will be compared against HEAD if it's tracked, if not it'll be
283
+ * compared to an empty file meaning that all content in the file will be
284
+ * treated as additions.
285
+ *
286
+ * @param repository The repository to get the diff for
287
+ * @param files The list of files to get the diff for
288
+ * @param commitish The commitish to compare against, if not provided it will
289
+ * default to HEAD. Mainly used to get a diff that includes
290
+ * both staged changes and the changes in a commit. For example,
291
+ * when the user is amending a commit and wants to generate
292
+ * a commit message based on both the new changes and the
293
+ * changes in the commit.
294
+ */
295
+ export async function getFilesDiffText(repository, files, commitish) {
296
+ // Clear the staging area, our diffs reflect the difference between the
297
+ // working directory and the last commit (if any) so our commits should
298
+ // do the same thing.
299
+ await unstageAll(repository);
300
+ await stageFiles(repository, files);
301
+ // `--no-ext-diff` should be provided wherever we invoke `git diff` so that any
302
+ // diff.external program configured by the user is ignored
303
+ const args = [
304
+ 'diff',
305
+ '--no-ext-diff',
306
+ '--patch-with-raw',
307
+ '--no-color',
308
+ '--staged',
309
+ ...(commitish ? [commitish] : []),
310
+ ];
311
+ const successExitCodes = new Set([0]);
312
+ const { stdout } = await git(args, repository.path, 'getFilesDiffText', {
313
+ successExitCodes,
314
+ encoding: 'buffer',
315
+ });
316
+ await unstageAll(repository);
317
+ // No more than 10MB
318
+ if (stdout.length > 10 * 1024 * 1024) {
319
+ throw new Error('Diff is too large to render');
320
+ }
321
+ // `.toString()` in a promise in case its a large buffer
322
+ const outputString = await (async () => stdout.toString('utf8'))();
323
+ return outputString;
324
+ }
325
+ async function getImageDiff(repository, file, newestCommitish, oldestCommitish) {
326
+ let current = undefined;
327
+ let previous = undefined;
328
+ // Are we looking at a file in the working directory or a file in a commit?
329
+ if (file instanceof WorkingDirectoryFileChange) {
330
+ // No idea what to do about this, a conflicted binary (presumably) file.
331
+ // Ideally we'd show all three versions and let the user pick but that's
332
+ // a bit out of scope for now.
333
+ if (file.status.kind === AppFileStatusKind.Conflicted) {
334
+ return { kind: DiffType.Image };
335
+ }
336
+ // Does it even exist in the working directory?
337
+ if (file.status.kind !== AppFileStatusKind.Deleted) {
338
+ current = await getWorkingDirectoryImage(repository, file);
339
+ }
340
+ if (file.status.kind !== AppFileStatusKind.New &&
341
+ file.status.kind !== AppFileStatusKind.Untracked) {
342
+ // If we have file.oldPath that means it's a rename so we'll
343
+ // look for that file.
344
+ previous = await getBlobImage(repository, getOldPathOrDefault(file), 'HEAD');
345
+ }
346
+ }
347
+ else {
348
+ // File status can't be conflicted for a file in a commit
349
+ if (file.status.kind !== AppFileStatusKind.Deleted) {
350
+ current = await getBlobImage(repository, file.path, newestCommitish);
351
+ }
352
+ // File status can't be conflicted for a file in a commit
353
+ if (file.status.kind !== AppFileStatusKind.New &&
354
+ file.status.kind !== AppFileStatusKind.Untracked &&
355
+ file.status.kind !== AppFileStatusKind.Deleted) {
356
+ // TODO: commitish^ won't work for the first commit
357
+ //
358
+ // If we have file.oldPath that means it's a rename so we'll
359
+ // look for that file.
360
+ previous = await getBlobImage(repository, getOldPathOrDefault(file), `${oldestCommitish}^`);
361
+ }
362
+ if (file instanceof CommittedFileChange &&
363
+ file.status.kind === AppFileStatusKind.Deleted) {
364
+ previous = await getBlobImage(repository, getOldPathOrDefault(file), file.parentCommitish);
365
+ }
366
+ }
367
+ return {
368
+ kind: DiffType.Image,
369
+ previous: previous,
370
+ current: current,
371
+ };
372
+ }
373
+ export async function convertDiff(repository, file, diff, newestCommitish, oldestCommitish, lineEndingsChange) {
374
+ const extension = Path.extname(file.path).toLowerCase();
375
+ // SVG files are text-based but can also be rendered as images. Return an
376
+ // image diff that also includes the text diff so the viewer can show both.
377
+ if (extension === '.svg') {
378
+ const imageDiff = await getImageDiff(repository, file, newestCommitish, oldestCommitish);
379
+ if (!diff.isBinary) {
380
+ return {
381
+ ...imageDiff,
382
+ textDiff: {
383
+ text: diff.contents,
384
+ hunks: diff.hunks,
385
+ lineEndingsChange,
386
+ maxLineNumber: diff.maxLineNumber,
387
+ hasHiddenBidiChars: diff.hasHiddenBidiChars,
388
+ },
389
+ };
390
+ }
391
+ return imageDiff;
392
+ }
393
+ if (diff.isBinary) {
394
+ // some extension we don't know how to parse, never mind
395
+ if (!imageFileExtensions.has(extension)) {
396
+ return {
397
+ kind: DiffType.Binary,
398
+ };
399
+ }
400
+ else {
401
+ return getImageDiff(repository, file, newestCommitish, oldestCommitish);
402
+ }
403
+ }
404
+ return {
405
+ kind: DiffType.Text,
406
+ text: diff.contents,
407
+ hunks: diff.hunks,
408
+ lineEndingsChange,
409
+ maxLineNumber: diff.maxLineNumber,
410
+ hasHiddenBidiChars: diff.hasHiddenBidiChars,
411
+ };
412
+ }
413
+ /**
414
+ * Map a given file extension to the related data URL media type
415
+ */
416
+ function getMediaType(extension) {
417
+ if (extension === '.png') {
418
+ return 'image/png';
419
+ }
420
+ if (extension === '.jpg' || extension === '.jpeg') {
421
+ return 'image/jpg';
422
+ }
423
+ if (extension === '.gif') {
424
+ return 'image/gif';
425
+ }
426
+ if (extension === '.ico') {
427
+ return 'image/x-icon';
428
+ }
429
+ if (extension === '.webp') {
430
+ return 'image/webp';
431
+ }
432
+ if (extension === '.bmp') {
433
+ return 'image/bmp';
434
+ }
435
+ if (extension === '.avif') {
436
+ return 'image/avif';
437
+ }
438
+ if (extension === '.svg') {
439
+ return 'image/svg+xml';
440
+ }
441
+ if (extension === '.dds') {
442
+ return 'image/vnd-ms.dds';
443
+ }
444
+ // fallback value as per the spec
445
+ return 'text/plain';
446
+ }
447
+ /**
448
+ * `git diff` will write out messages about the line ending changes it knows
449
+ * about to `stderr` - this rule here will catch this and also the to/from
450
+ * changes based on what the user has configured.
451
+ */
452
+ const lineEndingsChangeRegex = /', (CRLF|CR|LF) will be replaced by (CRLF|CR|LF) the .*/;
453
+ /**
454
+ * Utility function for inspecting the stderr output for the line endings
455
+ * warning that Git may report.
456
+ *
457
+ * @param error A buffer of binary text from a spawned process
458
+ */
459
+ function parseLineEndingsWarning(error) {
460
+ if (error.length === 0) {
461
+ return undefined;
462
+ }
463
+ const errorText = error.toString('utf-8');
464
+ const match = lineEndingsChangeRegex.exec(errorText);
465
+ if (match) {
466
+ const from = parseLineEndingText(match[1]);
467
+ const to = parseLineEndingText(match[2]);
468
+ if (from && to) {
469
+ return { from, to };
470
+ }
471
+ }
472
+ return undefined;
473
+ }
474
+ /**
475
+ * Utility function used by get(Commit|WorkingDirectory)Diff.
476
+ *
477
+ * Parses the output from a diff-like command that uses `--path-with-raw`
478
+ */
479
+ function diffFromRawDiffOutput(output) {
480
+ // for now we just assume the diff is UTF-8, but given we have the raw buffer
481
+ // we can try and convert this into other encodings in the future
482
+ const result = output.toString('utf-8');
483
+ const pieces = result.split('\0');
484
+ const parser = new DiffParser();
485
+ return parser.parse(forceUnwrap(`Invalid diff output`, pieces.at(-1)));
486
+ }
487
+ async function buildSubmoduleDiff(buffer, repository, file, status) {
488
+ const path = file.path;
489
+ const fullPath = Path.join(repository.path, path);
490
+ const url = await getConfigValue(repository, `submodule.${path}.url`, true);
491
+ let oldSHA = null;
492
+ let newSHA = null;
493
+ if (status.commitChanged ||
494
+ file.status.kind === AppFileStatusKind.New ||
495
+ file.status.kind === AppFileStatusKind.Deleted) {
496
+ const diff = buffer.toString('utf-8');
497
+ const lines = diff.split('\n');
498
+ const baseRegex = 'Subproject commit ([^-]+)(-dirty)?$';
499
+ const oldSHARegex = new RegExp('-' + baseRegex);
500
+ const newSHARegex = new RegExp('\\+' + baseRegex);
501
+ const lineMatch = (regex) => lines
502
+ .flatMap(line => {
503
+ const match = line.match(regex);
504
+ return match ? match[1] : [];
505
+ })
506
+ .at(0) ?? null;
507
+ oldSHA = lineMatch(oldSHARegex);
508
+ newSHA = lineMatch(newSHARegex);
509
+ }
510
+ return {
511
+ kind: DiffType.Submodule,
512
+ fullPath,
513
+ path,
514
+ url,
515
+ status,
516
+ oldSHA,
517
+ newSHA,
518
+ };
519
+ }
520
+ async function buildDiff(buffer, repository, file, newestCommitish, oldestCommitish, lineEndingsChange) {
521
+ if (file.status.submoduleStatus !== undefined) {
522
+ return buildSubmoduleDiff(buffer, repository, file, file.status.submoduleStatus);
523
+ }
524
+ if (!isValidBuffer(buffer)) {
525
+ // the buffer's diff is too large to be renderable in the UI
526
+ return { kind: DiffType.Unrenderable };
527
+ }
528
+ const diff = diffFromRawDiffOutput(buffer);
529
+ if (isBufferTooLarge(buffer) || isDiffTooLarge(diff)) {
530
+ // we don't want to render by default
531
+ // but we keep it as an option by
532
+ // passing in text and hunks
533
+ const largeTextDiff = {
534
+ kind: DiffType.LargeText,
535
+ text: diff.contents,
536
+ hunks: diff.hunks,
537
+ lineEndingsChange,
538
+ maxLineNumber: diff.maxLineNumber,
539
+ hasHiddenBidiChars: diff.hasHiddenBidiChars,
540
+ };
541
+ return largeTextDiff;
542
+ }
543
+ return convertDiff(repository, file, diff, newestCommitish, oldestCommitish, lineEndingsChange);
544
+ }
545
+ /**
546
+ * Retrieve the binary contents of a blob from the object database
547
+ *
548
+ * Returns an image object containing the base64 encoded string,
549
+ * as <img> tags support the data URI scheme instead of
550
+ * needing to reference a file:// URI
551
+ *
552
+ * https://en.wikipedia.org/wiki/Data_URI_scheme
553
+ */
554
+ export async function getBlobImage(repository, path, commitish) {
555
+ const extension = Path.extname(path);
556
+ const contents = await getBlobContents(repository, commitish, path);
557
+ return new Image(contents.buffer, contents.toString('base64'), getMediaType(extension), contents.length);
558
+ }
559
+ /**
560
+ * Retrieve the binary contents of a blob from the working directory
561
+ *
562
+ * Returns an image object containing the base64 encoded string,
563
+ * as <img> tags support the data URI scheme instead of
564
+ * needing to reference a file:// URI
565
+ *
566
+ * https://en.wikipedia.org/wiki/Data_URI_scheme
567
+ */
568
+ export async function getWorkingDirectoryImage(repository, file) {
569
+ const contents = await readFile(Path.join(repository.path, file.path));
570
+ return new Image(contents.buffer, contents.toString('base64'), getMediaType(Path.extname(file.path)), contents.length);
571
+ }
572
+ /**
573
+ * List the modified binary files' paths in the given repository
574
+ *
575
+ * @param repository to run git operation in
576
+ * @param ref ref (sha, branch, etc) to compare the working index against
577
+ *
578
+ * if you're mid-merge pass `'MERGE_HEAD'` to ref to get a diff of `HEAD` vs `MERGE_HEAD`,
579
+ * otherwise you should probably pass `'HEAD'` to get a diff of the working tree vs `HEAD`
580
+ */
581
+ export async function getBinaryPaths(repository, ref, conflictedFilesInIndex) {
582
+ const [detectedBinaryFiles, conflictedFilesUsingBinaryMergeDriver] = await Promise.all([
583
+ getDetectedBinaryFiles(repository, ref),
584
+ getFilesUsingBinaryMergeDriver(repository, conflictedFilesInIndex),
585
+ ]);
586
+ return Array.from(new Set([...detectedBinaryFiles, ...conflictedFilesUsingBinaryMergeDriver]));
587
+ }
588
+ /**
589
+ * Runs diff --numstat to get the list of files that have changed and which
590
+ * Git have detected as binary files
591
+ */
592
+ async function getDetectedBinaryFiles(repository, ref) {
593
+ const { stdout } = await git(['diff', '--numstat', '-z', ref], repository.path, 'getBinaryPaths');
594
+ return Array.from(stdout.matchAll(binaryListRegex), m => m[1]);
595
+ }
596
+ const binaryListRegex = /-\t-\t(?:\0.+\0)?([^\0]*)/gi;
597
+ async function getFilesUsingBinaryMergeDriver(repository, files) {
598
+ const { stdout } = await git(['check-attr', '--stdin', '-z', 'merge'], repository.path, 'getConflictedFilesUsingBinaryMergeDriver', {
599
+ stdin: files.map(f => f.path).join('\0'),
600
+ });
601
+ return createLogParser({ path: '', attr: '', value: '' })
602
+ .parse(stdout)
603
+ .filter(x => x.attr === 'merge' && x.value === 'binary')
604
+ .map(x => x.path);
605
+ }
606
+ // Prefix absolute path with `:(top,literal)` to ensure that git treats it as a
607
+ // literal path. This is important for paths that appear to be absolute paths on
608
+ // some platforms and not others. See
609
+ // https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-top
610
+ const ensureRelativePath = (path) => isAbsolute(path) ? `:(top,literal)${path}` : path;
611
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/git/diff.ts"],"names":[],"mappings":"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"}