git 1.19.1 → 5.5.0

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