git 4.3.2 → 5.0.0.beta.1

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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +67 -2705
  3. data/.github/pull_request_template.md +3 -1
  4. data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
  5. data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
  6. data/.github/skills/command-implementation/REFERENCE.md +993 -0
  7. data/.github/skills/command-implementation/SKILL.md +229 -0
  8. data/.github/skills/command-test-conventions/SKILL.md +660 -0
  9. data/.github/skills/command-yard-documentation/SKILL.md +426 -0
  10. data/.github/skills/dependency-management/SKILL.md +72 -0
  11. data/.github/skills/development-workflow/SKILL.md +506 -0
  12. data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
  13. data/.github/skills/extract-facade-from-base-lib/SKILL.md +586 -0
  14. data/.github/skills/facade-implementation/REFERENCE.md +840 -0
  15. data/.github/skills/facade-implementation/SKILL.md +260 -0
  16. data/.github/skills/facade-test-conventions/SKILL.md +380 -0
  17. data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
  18. data/.github/skills/make-skill-template/SKILL.md +176 -0
  19. data/.github/skills/pr-readiness-review/SKILL.md +185 -0
  20. data/.github/skills/project-context/SKILL.md +313 -0
  21. data/.github/skills/pull-request-review/SKILL.md +168 -0
  22. data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
  23. data/.github/skills/release-management/SKILL.md +125 -0
  24. data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
  25. data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
  26. data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
  27. data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
  28. data/.github/skills/reviewing-skills/SKILL.md +189 -0
  29. data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
  30. data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
  31. data/.github/skills/test-debugging/SKILL.md +160 -0
  32. data/.github/skills/yard-documentation/SKILL.md +793 -0
  33. data/.github/workflows/continuous_integration.yml +3 -2
  34. data/.github/workflows/enforce_conventional_commits.yml +1 -1
  35. data/.github/workflows/experimental_continuous_integration.yml +2 -2
  36. data/.github/workflows/release.yml +3 -4
  37. data/.gitignore +8 -0
  38. data/.husky/pre-commit +13 -0
  39. data/.release-please-manifest.json +1 -1
  40. data/.rspec +3 -0
  41. data/.rubocop.yml +7 -3
  42. data/.rubocop_todo.yml +23 -5
  43. data/.yardopts +1 -0
  44. data/CHANGELOG.md +0 -40
  45. data/CONTRIBUTING.md +694 -53
  46. data/README.md +17 -5
  47. data/Rakefile +61 -9
  48. data/commitlint.test +4 -0
  49. data/git.gemspec +14 -8
  50. data/lib/git/args_builder.rb +0 -8
  51. data/lib/git/base.rb +486 -410
  52. data/lib/git/branch.rb +380 -43
  53. data/lib/git/branch_delete_failure.rb +31 -0
  54. data/lib/git/branch_delete_result.rb +63 -0
  55. data/lib/git/branch_info.rb +178 -0
  56. data/lib/git/branches.rb +130 -24
  57. data/lib/git/command_line/base.rb +245 -0
  58. data/lib/git/command_line/capturing.rb +249 -0
  59. data/lib/git/command_line/result.rb +96 -0
  60. data/lib/git/command_line/streaming.rb +194 -0
  61. data/lib/git/command_line.rb +43 -322
  62. data/lib/git/command_line_result.rb +4 -88
  63. data/lib/git/commands/add.rb +131 -0
  64. data/lib/git/commands/am/abort.rb +43 -0
  65. data/lib/git/commands/am/apply.rb +252 -0
  66. data/lib/git/commands/am/continue.rb +43 -0
  67. data/lib/git/commands/am/quit.rb +43 -0
  68. data/lib/git/commands/am/retry.rb +47 -0
  69. data/lib/git/commands/am/show_current_patch.rb +64 -0
  70. data/lib/git/commands/am/skip.rb +42 -0
  71. data/lib/git/commands/am.rb +33 -0
  72. data/lib/git/commands/apply.rb +237 -0
  73. data/lib/git/commands/archive/list_formats.rb +46 -0
  74. data/lib/git/commands/archive.rb +140 -0
  75. data/lib/git/commands/arguments.rb +3510 -0
  76. data/lib/git/commands/base.rb +403 -0
  77. data/lib/git/commands/branch/copy.rb +94 -0
  78. data/lib/git/commands/branch/create.rb +173 -0
  79. data/lib/git/commands/branch/delete.rb +80 -0
  80. data/lib/git/commands/branch/list.rb +162 -0
  81. data/lib/git/commands/branch/move.rb +94 -0
  82. data/lib/git/commands/branch/set_upstream.rb +86 -0
  83. data/lib/git/commands/branch/show_current.rb +49 -0
  84. data/lib/git/commands/branch/unset_upstream.rb +57 -0
  85. data/lib/git/commands/branch.rb +34 -0
  86. data/lib/git/commands/cat_file/batch.rb +364 -0
  87. data/lib/git/commands/cat_file/filtered.rb +105 -0
  88. data/lib/git/commands/cat_file/raw.rb +210 -0
  89. data/lib/git/commands/cat_file.rb +49 -0
  90. data/lib/git/commands/checkout/branch.rb +151 -0
  91. data/lib/git/commands/checkout/files.rb +115 -0
  92. data/lib/git/commands/checkout.rb +38 -0
  93. data/lib/git/commands/checkout_index.rb +105 -0
  94. data/lib/git/commands/clean.rb +100 -0
  95. data/lib/git/commands/clone.rb +240 -0
  96. data/lib/git/commands/commit.rb +272 -0
  97. data/lib/git/commands/commit_tree.rb +100 -0
  98. data/lib/git/commands/config_option_syntax/add.rb +83 -0
  99. data/lib/git/commands/config_option_syntax/get.rb +117 -0
  100. data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
  101. data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
  102. data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
  103. data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
  104. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +102 -0
  105. data/lib/git/commands/config_option_syntax/list.rb +107 -0
  106. data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
  107. data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
  108. data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
  109. data/lib/git/commands/config_option_syntax/set.rb +114 -0
  110. data/lib/git/commands/config_option_syntax/unset.rb +89 -0
  111. data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
  112. data/lib/git/commands/config_option_syntax.rb +56 -0
  113. data/lib/git/commands/describe.rb +155 -0
  114. data/lib/git/commands/diff.rb +656 -0
  115. data/lib/git/commands/diff_files.rb +518 -0
  116. data/lib/git/commands/diff_index.rb +496 -0
  117. data/lib/git/commands/fetch.rb +352 -0
  118. data/lib/git/commands/fsck.rb +136 -0
  119. data/lib/git/commands/gc.rb +132 -0
  120. data/lib/git/commands/grep.rb +338 -0
  121. data/lib/git/commands/init.rb +99 -0
  122. data/lib/git/commands/log.rb +632 -0
  123. data/lib/git/commands/ls_files.rb +191 -0
  124. data/lib/git/commands/ls_remote.rb +155 -0
  125. data/lib/git/commands/ls_tree.rb +131 -0
  126. data/lib/git/commands/maintenance/register.rb +75 -0
  127. data/lib/git/commands/maintenance/run.rb +104 -0
  128. data/lib/git/commands/maintenance/start.rb +66 -0
  129. data/lib/git/commands/maintenance/stop.rb +55 -0
  130. data/lib/git/commands/maintenance/unregister.rb +79 -0
  131. data/lib/git/commands/maintenance.rb +31 -0
  132. data/lib/git/commands/merge/abort.rb +44 -0
  133. data/lib/git/commands/merge/continue.rb +44 -0
  134. data/lib/git/commands/merge/quit.rb +46 -0
  135. data/lib/git/commands/merge/start.rb +245 -0
  136. data/lib/git/commands/merge.rb +28 -0
  137. data/lib/git/commands/merge_base.rb +86 -0
  138. data/lib/git/commands/mv.rb +77 -0
  139. data/lib/git/commands/name_rev.rb +114 -0
  140. data/lib/git/commands/pull.rb +377 -0
  141. data/lib/git/commands/push.rb +246 -0
  142. data/lib/git/commands/read_tree.rb +149 -0
  143. data/lib/git/commands/remote/add.rb +91 -0
  144. data/lib/git/commands/remote/get_url.rb +66 -0
  145. data/lib/git/commands/remote/list.rb +54 -0
  146. data/lib/git/commands/remote/prune.rb +61 -0
  147. data/lib/git/commands/remote/remove.rb +52 -0
  148. data/lib/git/commands/remote/rename.rb +69 -0
  149. data/lib/git/commands/remote/set_branches.rb +63 -0
  150. data/lib/git/commands/remote/set_head.rb +82 -0
  151. data/lib/git/commands/remote/set_url.rb +71 -0
  152. data/lib/git/commands/remote/set_url_add.rb +61 -0
  153. data/lib/git/commands/remote/set_url_delete.rb +64 -0
  154. data/lib/git/commands/remote/show.rb +71 -0
  155. data/lib/git/commands/remote/update.rb +72 -0
  156. data/lib/git/commands/remote.rb +42 -0
  157. data/lib/git/commands/repack.rb +277 -0
  158. data/lib/git/commands/reset.rb +147 -0
  159. data/lib/git/commands/rev_parse.rb +297 -0
  160. data/lib/git/commands/revert/abort.rb +45 -0
  161. data/lib/git/commands/revert/continue.rb +57 -0
  162. data/lib/git/commands/revert/quit.rb +47 -0
  163. data/lib/git/commands/revert/skip.rb +44 -0
  164. data/lib/git/commands/revert/start.rb +153 -0
  165. data/lib/git/commands/revert.rb +29 -0
  166. data/lib/git/commands/rm.rb +114 -0
  167. data/lib/git/commands/show.rb +632 -0
  168. data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
  169. data/lib/git/commands/show_ref/exists.rb +78 -0
  170. data/lib/git/commands/show_ref/list.rb +145 -0
  171. data/lib/git/commands/show_ref/verify.rb +120 -0
  172. data/lib/git/commands/show_ref.rb +42 -0
  173. data/lib/git/commands/stash/apply.rb +75 -0
  174. data/lib/git/commands/stash/branch.rb +65 -0
  175. data/lib/git/commands/stash/clear.rb +41 -0
  176. data/lib/git/commands/stash/create.rb +58 -0
  177. data/lib/git/commands/stash/drop.rb +67 -0
  178. data/lib/git/commands/stash/list.rb +39 -0
  179. data/lib/git/commands/stash/pop.rb +78 -0
  180. data/lib/git/commands/stash/push.rb +103 -0
  181. data/lib/git/commands/stash/show.rb +149 -0
  182. data/lib/git/commands/stash/store.rb +63 -0
  183. data/lib/git/commands/stash.rb +38 -0
  184. data/lib/git/commands/status.rb +169 -0
  185. data/lib/git/commands/symbolic_ref/delete.rb +68 -0
  186. data/lib/git/commands/symbolic_ref/read.rb +95 -0
  187. data/lib/git/commands/symbolic_ref/update.rb +76 -0
  188. data/lib/git/commands/symbolic_ref.rb +38 -0
  189. data/lib/git/commands/tag/create.rb +139 -0
  190. data/lib/git/commands/tag/delete.rb +55 -0
  191. data/lib/git/commands/tag/list.rb +143 -0
  192. data/lib/git/commands/tag/verify.rb +71 -0
  193. data/lib/git/commands/tag.rb +26 -0
  194. data/lib/git/commands/update_ref/batch.rb +140 -0
  195. data/lib/git/commands/update_ref/delete.rb +92 -0
  196. data/lib/git/commands/update_ref/update.rb +106 -0
  197. data/lib/git/commands/update_ref.rb +42 -0
  198. data/lib/git/commands/version.rb +52 -0
  199. data/lib/git/commands/worktree/add.rb +140 -0
  200. data/lib/git/commands/worktree/list.rb +64 -0
  201. data/lib/git/commands/worktree/lock.rb +58 -0
  202. data/lib/git/commands/worktree/management_base.rb +51 -0
  203. data/lib/git/commands/worktree/move.rb +66 -0
  204. data/lib/git/commands/worktree/prune.rb +67 -0
  205. data/lib/git/commands/worktree/remove.rb +63 -0
  206. data/lib/git/commands/worktree/repair.rb +76 -0
  207. data/lib/git/commands/worktree/unlock.rb +47 -0
  208. data/lib/git/commands/worktree.rb +43 -0
  209. data/lib/git/commands/write_tree.rb +68 -0
  210. data/lib/git/commands.rb +89 -0
  211. data/lib/git/detached_head_info.rb +54 -0
  212. data/lib/git/diff.rb +297 -7
  213. data/lib/git/diff_file_numstat_info.rb +29 -0
  214. data/lib/git/diff_file_patch_info.rb +134 -0
  215. data/lib/git/diff_file_raw_info.rb +127 -0
  216. data/lib/git/diff_info.rb +169 -0
  217. data/lib/git/diff_path_status.rb +78 -19
  218. data/lib/git/diff_result.rb +32 -0
  219. data/lib/git/diff_stats.rb +59 -14
  220. data/lib/git/dirstat_info.rb +86 -0
  221. data/lib/git/errors.rb +65 -2
  222. data/lib/git/execution_context/global.rb +56 -0
  223. data/lib/git/execution_context/repository.rb +147 -0
  224. data/lib/git/execution_context.rb +482 -0
  225. data/lib/git/file_ref.rb +74 -0
  226. data/lib/git/fsck_object.rb +9 -9
  227. data/lib/git/fsck_result.rb +1 -1
  228. data/lib/git/lib.rb +1606 -1028
  229. data/lib/git/log.rb +15 -2
  230. data/lib/git/object.rb +92 -22
  231. data/lib/git/parsers/branch.rb +224 -0
  232. data/lib/git/parsers/cat_file.rb +111 -0
  233. data/lib/git/parsers/diff.rb +585 -0
  234. data/lib/git/parsers/fsck.rb +133 -0
  235. data/lib/git/parsers/grep.rb +42 -0
  236. data/lib/git/parsers/ls_tree.rb +58 -0
  237. data/lib/git/parsers/stash.rb +208 -0
  238. data/lib/git/parsers/tag.rb +257 -0
  239. data/lib/git/remote.rb +133 -9
  240. data/lib/git/repository/branching.rb +572 -0
  241. data/lib/git/repository/committing.rb +191 -0
  242. data/lib/git/repository/configuring.rb +156 -0
  243. data/lib/git/repository/diffing.rb +775 -0
  244. data/lib/git/repository/inspecting.rb +153 -0
  245. data/lib/git/repository/logging.rb +247 -0
  246. data/lib/git/repository/merging.rb +295 -0
  247. data/lib/git/repository/object_operations.rb +1101 -0
  248. data/lib/git/repository/path_resolver.rb +207 -0
  249. data/lib/git/repository/remote_operations.rb +753 -0
  250. data/lib/git/repository/shared_private.rb +51 -0
  251. data/lib/git/repository/staging.rb +390 -0
  252. data/lib/git/repository/stashing.rb +107 -0
  253. data/lib/git/repository/status_operations.rb +180 -0
  254. data/lib/git/repository/worktree_operations.rb +159 -0
  255. data/lib/git/repository.rb +264 -1
  256. data/lib/git/stash.rb +85 -4
  257. data/lib/git/stash_info.rb +104 -0
  258. data/lib/git/stashes.rb +130 -13
  259. data/lib/git/status.rb +224 -18
  260. data/lib/git/tag_delete_failure.rb +31 -0
  261. data/lib/git/tag_delete_result.rb +63 -0
  262. data/lib/git/tag_info.rb +105 -0
  263. data/lib/git/version.rb +109 -2
  264. data/lib/git/version_constraint.rb +81 -0
  265. data/lib/git/worktree.rb +120 -5
  266. data/lib/git/worktrees.rb +107 -7
  267. data/lib/git.rb +114 -18
  268. data/redesign/1_architecture_existing.md +54 -18
  269. data/redesign/2_architecture_redesign.md +365 -46
  270. data/redesign/3_architecture_implementation.md +1451 -54
  271. data/tasks/gem_tasks.rake +4 -0
  272. data/tasks/npm_tasks.rake +7 -0
  273. data/tasks/rspec.rake +48 -0
  274. data/tasks/test.rake +13 -1
  275. data/tasks/yard.rake +34 -7
  276. metadata +349 -20
  277. data/lib/git/index.rb +0 -6
  278. data/lib/git/path.rb +0 -38
  279. data/lib/git/working_directory.rb +0 -6
  280. /data/{release-please-config.json → .release-please-config.json} +0 -0
@@ -0,0 +1,496 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git diff-index` command
8
+ #
9
+ # Compares a tree object to either the index or the working tree.
10
+ #
11
+ # When `--cached` is given (`cached: true`) it compares the tree to the index
12
+ # (staged changes). Without `--cached` it compares the tree to the working tree,
13
+ # treating any file that differs from the index as changed even if the on-disk
14
+ # content is identical to the tree.
15
+ #
16
+ # @example Compare HEAD tree to the working tree (raw output)
17
+ # # git diff-index HEAD
18
+ # Git::Commands::DiffIndex.new(ctx).call('HEAD')
19
+ #
20
+ # @example Compare HEAD tree to the index (staged changes, raw output)
21
+ # # git diff-index --cached HEAD
22
+ # Git::Commands::DiffIndex.new(ctx).call('HEAD', cached: true)
23
+ #
24
+ # @example Compare HEAD tree to the index, showing a patch
25
+ # # git diff-index --cached --patch HEAD
26
+ # Git::Commands::DiffIndex.new(ctx).call('HEAD', cached: true, patch: true)
27
+ #
28
+ # @example Limit comparison to a specific path
29
+ # # git diff-index --cached HEAD -- lib/
30
+ # Git::Commands::DiffIndex.new(ctx).call('HEAD', 'lib/', cached: true)
31
+ #
32
+ # @note `arguments` block audited against https://git-scm.com/docs/git-diff-index/2.53.0
33
+ #
34
+ # @see https://git-scm.com/docs/git-diff-index git-diff-index documentation
35
+ #
36
+ # @see Git::Commands
37
+ #
38
+ # @api private
39
+ #
40
+ class DiffIndex < Git::Commands::Base
41
+ arguments do
42
+ literal 'diff-index'
43
+
44
+ # diff-index-specific options
45
+ flag_option :m
46
+ flag_option :cached
47
+ flag_option :merge_base
48
+
49
+ # Output format selection
50
+ flag_option %i[patch p u]
51
+ flag_option %i[no_patch s]
52
+ flag_option :raw
53
+ flag_option :patch_with_raw
54
+ value_option %i[unified U], inline: true
55
+ value_option :output, inline: true
56
+ value_option :output_indicator_new, inline: true
57
+ value_option :output_indicator_old, inline: true
58
+ value_option :output_indicator_context, inline: true
59
+
60
+ # Diff algorithm
61
+ flag_option :indent_heuristic, negatable: true
62
+ flag_option :minimal
63
+ flag_option :patience
64
+ flag_option :histogram
65
+ value_option :anchored, inline: true, repeatable: true
66
+ value_option :diff_algorithm, inline: true
67
+
68
+ # Statistics output formats
69
+ flag_or_value_option :stat, inline: true
70
+ value_option :stat_width, inline: true
71
+ value_option :stat_name_width, inline: true
72
+ value_option :stat_graph_width, inline: true
73
+ value_option :stat_count, inline: true
74
+ flag_option :compact_summary
75
+ flag_option :numstat
76
+ flag_option :shortstat
77
+ flag_or_value_option %i[dirstat X], inline: true
78
+ flag_option :cumulative
79
+ flag_or_value_option :dirstat_by_file, inline: true
80
+ flag_option :summary
81
+ flag_option :patch_with_stat
82
+
83
+ # Name and path display
84
+ flag_option :z
85
+ flag_option :name_only
86
+ flag_option :name_status
87
+ flag_or_value_option :submodule, inline: true
88
+
89
+ # Color output
90
+ flag_or_value_option :color, inline: true, negatable: true
91
+ flag_or_value_option :color_moved, inline: true, negatable: true
92
+ value_option :color_moved_ws, inline: true
93
+ flag_option :no_color_moved_ws
94
+
95
+ # Word diff
96
+ flag_or_value_option :word_diff, inline: true
97
+ value_option :word_diff_regex, inline: true
98
+ flag_or_value_option :color_words, inline: true
99
+
100
+ # Whitespace handling
101
+ flag_option :ignore_cr_at_eol
102
+ flag_option :ignore_space_at_eol
103
+ flag_option %i[ignore_space_change b]
104
+ flag_option %i[ignore_all_space w]
105
+ flag_option :ignore_blank_lines
106
+ value_option %i[ignore_matching_lines I], inline: true, repeatable: true
107
+ flag_option :check
108
+ value_option :ws_error_highlight, inline: true
109
+
110
+ # Rename/copy detection
111
+ flag_option :no_renames
112
+ flag_option :rename_empty, negatable: true
113
+ flag_option :full_index
114
+ flag_option :binary
115
+ flag_or_value_option :abbrev, inline: true
116
+ flag_or_value_option %i[break_rewrites B], inline: true
117
+ flag_or_value_option %i[find_renames M], inline: true
118
+ flag_or_value_option %i[find_copies C], inline: true
119
+ flag_option :find_copies_harder
120
+ flag_option %i[irreversible_delete D]
121
+
122
+ # Pickaxe / filtering
123
+ value_option :l, inline: true
124
+ value_option :diff_filter, inline: true
125
+ value_option :S, inline: true
126
+ value_option :G, inline: true
127
+ value_option :find_object, inline: true
128
+ flag_option :pickaxe_all
129
+ flag_option :pickaxe_regex
130
+ value_option :O, inline: true
131
+ value_option :skip_to, inline: true
132
+ value_option :rotate_to, inline: true
133
+
134
+ # Miscellaneous diff options
135
+ flag_option :R
136
+ flag_or_value_option :relative, inline: true, negatable: true
137
+ flag_option %i[text a]
138
+ value_option :inter_hunk_context, inline: true
139
+ flag_option %i[function_context W]
140
+ flag_option :exit_code
141
+ flag_option :quiet
142
+ flag_option :ext_diff, negatable: true
143
+ flag_option :textconv, negatable: true
144
+ flag_or_value_option :ignore_submodules, inline: true
145
+ value_option :src_prefix, inline: true
146
+ value_option :dst_prefix, inline: true
147
+ flag_option :no_prefix
148
+ flag_option :default_prefix
149
+ value_option :line_prefix, inline: true
150
+ flag_option :ita_invisible_in_index
151
+ value_option :max_depth, inline: true
152
+
153
+ # Operands: git diff-index does not accept -- before <tree-ish>.
154
+ # end_of_options is placed between tree_ish and path so that -- is emitted
155
+ # only when path arguments are present, disambiguating paths from revisions.
156
+ operand :tree_ish, required: true
157
+ end_of_options
158
+ operand :path, repeatable: true
159
+ end
160
+
161
+ # git diff-index exits 1 when differences are found (e.g. with --exit-code)
162
+ allow_exit_status 0..1
163
+
164
+ # @!method call(*, **)
165
+ #
166
+ # @overload call(tree_ish, **options)
167
+ # Compare a tree to the index or working tree
168
+ #
169
+ # @example Compare HEAD to the working tree
170
+ # # git diff-index HEAD
171
+ # DiffIndex.new(ctx).call('HEAD')
172
+ #
173
+ # @example Compare HEAD to the index (staged changes only)
174
+ # # git diff-index --cached HEAD
175
+ # DiffIndex.new(ctx).call('HEAD', cached: true)
176
+ #
177
+ # @param tree_ish [String] the tree object to compare
178
+ # against (e.g., `'HEAD'`, a commit SHA, or a tag
179
+ # name)
180
+ #
181
+ # @param options [Hash] command options
182
+ #
183
+ # @option options [Boolean, nil] :m (nil) treat non-checked-out files as up to date
184
+ #
185
+ # By default, files recorded in the index but not checked out are reported as
186
+ # deleted. This flag makes `git diff-index` report all such files as up to date.
187
+ #
188
+ # @option options [Boolean, nil] :cached (nil) compare the tree to the index only (staged
189
+ # changes), without considering the working tree
190
+ #
191
+ # @option options [Boolean, nil] :merge_base (nil) use the merge base between the tree-ish
192
+ # and `HEAD` rather than the tree-ish directly
193
+ #
194
+ # `tree_ish` must be a commit when this option is used.
195
+ #
196
+ # @option options [Boolean, nil] :patch (nil) generate unified diff patch output
197
+ #
198
+ # Alias: :p, :u
199
+ #
200
+ # @option options [Boolean, nil] :no_patch (nil) suppress all diff output
201
+ #
202
+ # Alias: :s
203
+ #
204
+ # @option options [Boolean, nil] :raw (nil) generate diff in raw format (default output)
205
+ #
206
+ # @option options [Boolean, nil] :patch_with_raw (nil) synonym for `patch: true, raw: true`
207
+ #
208
+ # @option options [Integer, String] :unified (nil) number of context lines around diff
209
+ # hunks (e.g., `3`)
210
+ #
211
+ # Alias: :U
212
+ #
213
+ # @option options [String] :output (nil) write diff output to a file instead of stdout
214
+ #
215
+ # @option options [String] :output_indicator_new (nil) character for new lines in patch output
216
+ #
217
+ # @option options [String] :output_indicator_old (nil) character for old lines in patch output
218
+ #
219
+ # @option options [String] :output_indicator_context (nil) character for context lines in patch output
220
+ #
221
+ # @option options [Boolean, nil] :indent_heuristic (nil) shift hunk boundaries for readability
222
+ # (`--indent-heuristic`)
223
+ #
224
+ # @option options [Boolean, nil] :no_indent_heuristic (nil) do not shift hunk boundaries
225
+ # for readability (`--no-indent-heuristic`)
226
+ #
227
+ # @option options [Boolean, nil] :minimal (nil) spend extra time to minimize diff size
228
+ #
229
+ # @option options [Boolean, nil] :patience (nil) use patience diff algorithm
230
+ #
231
+ # @option options [Boolean, nil] :histogram (nil) use histogram diff algorithm
232
+ #
233
+ # @option options [String, Array<String>] :anchored (nil) anchor lines matching the given
234
+ # text to prevent them from appearing as additions or deletions (repeatable)
235
+ #
236
+ # @option options [String] :diff_algorithm (nil) diff algorithm to use
237
+ #
238
+ # Accepted values: `'default'`, `'myers'`, `'minimal'`, `'patience'`, `'histogram'`.
239
+ #
240
+ # @option options [Boolean, String, nil] :stat (nil) show a diffstat
241
+ #
242
+ # Pass `true` for the default format, or a string like `'80,40,5'` for custom
243
+ # `width,name-width,count` limits.
244
+ #
245
+ # @option options [Integer, String] :stat_width (nil) override diffstat total width
246
+ #
247
+ # @option options [Integer, String] :stat_name_width (nil) override diffstat filename column width
248
+ #
249
+ # @option options [Integer, String] :stat_graph_width (nil) override diffstat graph column width
250
+ #
251
+ # @option options [Integer, String] :stat_count (nil) limit diffstat to this many lines
252
+ #
253
+ # @option options [Boolean, nil] :compact_summary (nil) include creation/deletion mode changes in stat
254
+ #
255
+ # @option options [Boolean, nil] :numstat (nil) show per-file insertion/deletion counts (machine-friendly)
256
+ #
257
+ # @option options [Boolean, nil] :shortstat (nil) show aggregate totals line only
258
+ #
259
+ # @option options [Boolean, String, nil] :dirstat (nil) show distribution of changes per directory
260
+ #
261
+ # Pass `true` for the default, or a string like `'lines,cumulative,10'` to pass params.
262
+ #
263
+ # Alias: :X
264
+ #
265
+ # @option options [Boolean, nil] :cumulative (nil) synonym for `dirstat: 'cumulative'`
266
+ #
267
+ # @option options [Boolean, String, nil] :dirstat_by_file (nil) synonym for `dirstat: 'files,...'`
268
+ #
269
+ # @option options [Boolean, nil] :summary (nil) show condensed extended header information
270
+ #
271
+ # @option options [Boolean, nil] :patch_with_stat (nil) synonym for `patch: true, stat: true`
272
+ #
273
+ # @option options [Boolean, nil] :z (nil) use NUL as output field terminator instead of newline
274
+ #
275
+ # @option options [Boolean, nil] :name_only (nil) show only changed file names
276
+ #
277
+ # @option options [Boolean, nil] :name_status (nil) show changed file names with status letters
278
+ #
279
+ # @option options [Boolean, String, nil] :submodule (nil) how to show submodule differences
280
+ #
281
+ # Pass `true` for the default, or a string like `'log'` or `'diff'` for a format name.
282
+ #
283
+ # @option options [Boolean, String, nil] :color (nil) control diff colorization (`--color`)
284
+ #
285
+ # Pass `true` for `--color` or a string like `'always'` or `'auto'` for a specific mode.
286
+ #
287
+ # @option options [Boolean, nil] :no_color (nil) suppress colorized output (`--no-color`)
288
+ #
289
+ # @option options [Boolean, String, nil] :color_moved (nil) color moved lines differently (`--color-moved`)
290
+ #
291
+ # Pass `true` for the default, or a mode string such as `'zebra'` or `'dimmed-zebra'`.
292
+ #
293
+ # @option options [Boolean, nil] :no_color_moved (nil) disable moved-line coloring (`--no-color-moved`)
294
+ #
295
+ # @option options [String] :color_moved_ws (nil) whitespace handling for moved-line color detection
296
+ #
297
+ # Comma-separated list of modes, e.g. `'ignore-space-at-eol,ignore-space-change'`.
298
+ #
299
+ # @option options [Boolean, nil] :no_color_moved_ws (nil) synonym for `color_moved_ws: 'no'`
300
+ #
301
+ # @option options [Boolean, String, nil] :word_diff (nil) show a word-level diff
302
+ #
303
+ # Pass `true` for the default `plain` mode, or a string like `'color'`, `'porcelain'`,
304
+ # or `'none'` for a specific mode.
305
+ #
306
+ # @option options [String] :word_diff_regex (nil) regular expression defining word boundaries for word diff
307
+ #
308
+ # @option options [Boolean, String, nil] :color_words (nil) equivalent to `word_diff: 'color'`
309
+ # plus an optional word regex
310
+ #
311
+ # @option options [Boolean, nil] :ignore_cr_at_eol (nil) ignore carriage-return at end of line
312
+ #
313
+ # @option options [Boolean, nil] :ignore_space_at_eol (nil) ignore whitespace changes at end of line
314
+ #
315
+ # @option options [Boolean, nil] :ignore_space_change (nil) ignore changes in amount of whitespace
316
+ #
317
+ # Alias: :b
318
+ #
319
+ # @option options [Boolean, nil] :ignore_all_space (nil) ignore all whitespace when comparing lines
320
+ #
321
+ # Alias: :w
322
+ #
323
+ # @option options [Boolean, nil] :ignore_blank_lines (nil) ignore changes whose lines are all blank
324
+ #
325
+ # @option options [String, Array<String>] :ignore_matching_lines (nil) ignore changes whose lines all match
326
+ # the given regex (repeatable)
327
+ #
328
+ # Alias: :I
329
+ #
330
+ # @option options [Boolean, nil] :check (nil) warn if changes introduce whitespace errors or
331
+ # conflict markers
332
+ #
333
+ # @option options [String] :ws_error_highlight (nil) highlight whitespace errors in the
334
+ # given diff line types (e.g. `'new'`, `'old,new'`, `'all'`)
335
+ #
336
+ # @option options [Boolean, nil] :no_renames (nil) disable rename detection
337
+ #
338
+ # @option options [Boolean, nil] :rename_empty (nil) use empty blobs as rename sources (`--rename-empty`)
339
+ #
340
+ # @option options [Boolean, nil] :no_rename_empty (nil) disallow empty blobs as rename
341
+ # sources (`--no-rename-empty`)
342
+ #
343
+ # @option options [Boolean, nil] :full_index (nil) show full blob SHA in index line
344
+ #
345
+ # @option options [Boolean, nil] :binary (nil) output binary diff suitable for `git apply`
346
+ #
347
+ # @option options [Boolean, String, nil] :abbrev (nil) abbreviate blob names in raw output
348
+ #
349
+ # Pass `true` for the default, or an integer string like `'10'` for a specific length.
350
+ #
351
+ # @option options [Boolean, String, nil] :break_rewrites (nil) break total rewrites into
352
+ # delete-and-create pairs
353
+ #
354
+ # Pass `true` for defaults, or a threshold string like `'80%'` or `'50%/70%'` for custom
355
+ # break and rename thresholds.
356
+ #
357
+ # Alias: :B
358
+ #
359
+ # @option options [Boolean, String, nil] :find_renames (nil) detect renames
360
+ #
361
+ # Pass `true` for the default threshold, or a string like `'90%'` for a custom
362
+ # similarity threshold.
363
+ #
364
+ # Alias: :M
365
+ #
366
+ # @option options [Boolean, String, nil] :find_copies (nil) detect copies as well as renames
367
+ #
368
+ # Pass `true` for the default threshold, or a string like `'75%'` for a custom
369
+ # similarity threshold.
370
+ #
371
+ # Alias: :C
372
+ #
373
+ # @option options [Boolean, nil] :find_copies_harder (nil) inspect all unmodified files as copy
374
+ # sources (very expensive for large repos)
375
+ #
376
+ # @option options [Boolean, nil] :irreversible_delete (nil) omit preimage for deleted files
377
+ #
378
+ # Alias: :D
379
+ #
380
+ # @option options [Integer, String] :l (nil) limit the number of rename/copy candidates
381
+ # considered during exhaustive detection
382
+ #
383
+ # @option options [String] :diff_filter (nil) select only certain kinds of changed files
384
+ #
385
+ # A string of status letters such as `'A'`, `'M'`, `'D'`, `'ACDM'`, or lowercase
386
+ # forms to exclude (e.g. `'ad'` excludes added and deleted).
387
+ #
388
+ # @option options [String] :S (nil) find changes that alter the occurrence count of the
389
+ # given string (pickaxe)
390
+ #
391
+ # @option options [String] :G (nil) find changes whose patch text contains lines matching
392
+ # the given regex (pickaxe)
393
+ #
394
+ # @option options [String] :find_object (nil) find changes involving the given object id
395
+ #
396
+ # @option options [Boolean, nil] :pickaxe_all (nil) show all changes in a changeset when using
397
+ # `-S` or `-G`
398
+ #
399
+ # @option options [Boolean, nil] :pickaxe_regex (nil) treat the `-S` string as an extended POSIX
400
+ # regular expression
401
+ #
402
+ # @option options [String] :O (nil) path to an orderfile controlling output file order
403
+ #
404
+ # @option options [String] :skip_to (nil) discard files before the named file in the output
405
+ #
406
+ # @option options [String] :rotate_to (nil) move files before the named file to end of output
407
+ #
408
+ # @option options [Boolean, nil] :R (nil) swap the two diff inputs
409
+ #
410
+ # @option options [Boolean, String, nil] :relative (nil) show paths relative to a directory (`--relative`)
411
+ #
412
+ # Pass `true` to use the current directory, or a path string to name the directory explicitly.
413
+ #
414
+ # @option options [Boolean, nil] :no_relative (nil) use absolute paths in output (`--no-relative`)
415
+ #
416
+ # @option options [Boolean, nil] :text (nil) treat all files as text
417
+ #
418
+ # Alias: :a
419
+ #
420
+ # @option options [Integer, String] :inter_hunk_context (nil) show context between diff hunks
421
+ # up to this many lines, fusing close hunks
422
+ #
423
+ # @option options [Boolean, nil] :function_context (nil) show whole function as context for each change
424
+ #
425
+ # Alias: :W
426
+ #
427
+ # @option options [Boolean, nil] :exit_code (nil) exit with status 1 if differences are found,
428
+ # 0 if none
429
+ #
430
+ # @option options [Boolean, nil] :quiet (nil) suppress all output
431
+ #
432
+ # Implies `--exit-code`.
433
+ #
434
+ # @option options [Boolean, nil] :ext_diff (nil) allow external diff helpers (`--ext-diff`)
435
+ #
436
+ # @option options [Boolean, nil] :no_ext_diff (nil) disallow external diff helpers (`--no-ext-diff`)
437
+ #
438
+ # @option options [Boolean, nil] :textconv (nil) allow external text-conversion filters (`--textconv`)
439
+ #
440
+ # @option options [Boolean, nil] :no_textconv (nil) disallow external text-conversion filters
441
+ # (`--no-textconv`)
442
+ #
443
+ # @option options [Boolean, String, nil] :ignore_submodules (nil) ignore submodule changes
444
+ #
445
+ # Pass `true` for `--ignore-submodules` (equivalent to `'all'`), or a string such as
446
+ # `'untracked'`, `'dirty'`, `'none'`, or `'all'`.
447
+ #
448
+ # @option options [String] :src_prefix (nil) source prefix for diff headers (e.g. `'a/'`)
449
+ #
450
+ # @option options [String] :dst_prefix (nil) destination prefix for diff headers (e.g. `'b/'`)
451
+ #
452
+ # @option options [Boolean, nil] :no_prefix (nil) omit source and destination prefixes
453
+ #
454
+ # @option options [Boolean, nil] :default_prefix (nil) use the default `a/` and `b/` prefixes
455
+ #
456
+ # @option options [String] :line_prefix (nil) prepend this prefix to every output line
457
+ #
458
+ # @option options [Boolean, nil] :ita_invisible_in_index (nil) make `git add -N` entries appear as
459
+ # new files in `git diff` and non-existent in `git diff --cached`
460
+ #
461
+ # @option options [Integer, String] :max_depth (nil) maximum directory depth to descend for
462
+ # each pathspec (tree-to-tree diffs only)
463
+ #
464
+ # @return [Git::CommandLineResult] the result of calling `git diff-index`
465
+ #
466
+ # @raise [ArgumentError] if unsupported options are provided
467
+ #
468
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
469
+ #
470
+ # @overload call(tree_ish, *paths, **options)
471
+ # Compare a tree to the index or working tree, limiting output to specific paths
472
+ #
473
+ # @example Compare HEAD to the index for a single directory
474
+ # # git diff-index --cached HEAD -- lib/
475
+ # DiffIndex.new(ctx).call('HEAD', 'lib/', cached: true)
476
+ #
477
+ # @example Compare HEAD to the working tree for multiple paths
478
+ # # git diff-index HEAD -- lib/ spec/
479
+ # DiffIndex.new(ctx).call('HEAD', 'lib/', 'spec/')
480
+ #
481
+ # @param tree_ish [String] the tree object to compare against
482
+ #
483
+ # @param paths [Array<String>] pathspecs limiting which files are compared
484
+ #
485
+ # @param options [Hash] command options (same as the single-argument overload)
486
+ #
487
+ # @return [Git::CommandLineResult] the result of calling `git diff-index`
488
+ #
489
+ # @raise [ArgumentError] if unsupported options are provided
490
+ #
491
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
492
+ #
493
+ # @api public
494
+ end
495
+ end
496
+ end