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,656 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git diff` command
8
+ #
9
+ # Compares commits, the index, and the working tree.
10
+ #
11
+ # @example Typical usage
12
+ # diff = Git::Commands::Diff.new(execution_context)
13
+ # diff.call(numstat: true, shortstat: true, src_prefix: 'a/', dst_prefix: 'b/')
14
+ # diff.call(patch: true, no_index: true, path: ['/path/a', '/path/b'])
15
+ # diff.call(patch: true, cached: true)
16
+ # diff.call('abc123', 'def456', raw: true, numstat: true, shortstat: true)
17
+ #
18
+ # @note `arguments` block audited against
19
+ # https://git-scm.com/docs/git-diff/2.53.0
20
+ #
21
+ # @see https://git-scm.com/docs/git-diff git-diff
22
+ #
23
+ # @see Git::Commands
24
+ #
25
+ # @api private
26
+ #
27
+ class Diff < Git::Commands::Base # rubocop:disable Metrics/ClassLength
28
+ arguments do
29
+ literal 'diff'
30
+
31
+ # Output format
32
+ flag_option %i[patch p u]
33
+ flag_option %i[no_patch s]
34
+ value_option %i[unified U], inline: true
35
+ value_option :output, inline: true
36
+ value_option :output_indicator_new, inline: true
37
+ value_option :output_indicator_old, inline: true
38
+ value_option :output_indicator_context, inline: true
39
+ flag_option :raw
40
+ flag_option :patch_with_raw
41
+ flag_option :indent_heuristic, negatable: true
42
+ flag_option :minimal
43
+ flag_option :patience
44
+ flag_option :histogram
45
+ value_option :anchored, inline: true, repeatable: true
46
+ value_option :diff_algorithm, inline: true
47
+ flag_or_value_option :stat, inline: true
48
+ value_option :stat_width, inline: true
49
+ value_option :stat_name_width, inline: true
50
+ value_option :stat_count, inline: true
51
+ value_option :stat_graph_width, inline: true
52
+ flag_option :compact_summary
53
+ flag_option :numstat
54
+ flag_option :shortstat
55
+ flag_or_value_option %i[dirstat X], inline: true
56
+ flag_option :cumulative
57
+ flag_or_value_option :dirstat_by_file, inline: true
58
+ flag_option :summary
59
+ flag_option :patch_with_stat
60
+ flag_option :z
61
+ flag_option :name_only
62
+ flag_option :name_status
63
+ flag_or_value_option :submodule, inline: true
64
+
65
+ # Color and word diff
66
+ flag_or_value_option :color, negatable: true, inline: true
67
+ flag_or_value_option :color_moved, negatable: true, inline: true
68
+ flag_or_value_option :color_moved_ws, negatable: true, inline: true
69
+ flag_or_value_option :word_diff, inline: true
70
+ value_option :word_diff_regex, inline: true
71
+ flag_or_value_option :color_words, inline: true
72
+
73
+ # Rename and copy detection
74
+ flag_option :no_renames
75
+ flag_option :rename_empty, negatable: true
76
+ flag_option :check
77
+ value_option :ws_error_highlight, inline: true
78
+ flag_option :full_index
79
+ flag_option :binary
80
+ flag_or_value_option :abbrev, inline: true
81
+ flag_or_value_option %i[break_rewrites B], inline: true
82
+ flag_or_value_option %i[find_renames M], inline: true
83
+ flag_or_value_option %i[find_copies C], inline: true
84
+ flag_option :find_copies_harder
85
+ flag_option %i[irreversible_delete D]
86
+ value_option :l, inline: true
87
+ value_option :diff_filter, inline: true
88
+
89
+ # Content search (pickaxe)
90
+ value_option :S, inline: true
91
+ value_option :G, inline: true
92
+ value_option :find_object, inline: true
93
+ flag_option :pickaxe_all
94
+ flag_option :pickaxe_regex
95
+
96
+ # Output ordering
97
+ value_option :O, inline: true
98
+ value_option :skip_to, inline: true
99
+ value_option :rotate_to, inline: true
100
+ flag_option :R
101
+
102
+ # Path scope and comparison
103
+ flag_or_value_option :relative, negatable: true, inline: true
104
+ flag_option %i[text a]
105
+
106
+ # Whitespace handling
107
+ flag_option :ignore_cr_at_eol
108
+ flag_option :ignore_space_at_eol
109
+ flag_option %i[ignore_space_change b]
110
+ flag_option %i[ignore_all_space w]
111
+ flag_option :ignore_blank_lines
112
+ value_option %i[ignore_matching_lines I], inline: true, repeatable: true
113
+ value_option :inter_hunk_context, inline: true
114
+ flag_option %i[function_context W]
115
+
116
+ # Behavior control
117
+ flag_option :exit_code
118
+ flag_option :quiet
119
+ flag_option :ext_diff, negatable: true
120
+ flag_option :textconv, negatable: true
121
+ flag_or_value_option :ignore_submodules, inline: true
122
+
123
+ # Prefix and path display
124
+ value_option :src_prefix, inline: true
125
+ value_option :dst_prefix, inline: true
126
+ flag_option :no_prefix
127
+ flag_option :default_prefix
128
+ value_option :line_prefix, inline: true
129
+ flag_option :ita_invisible_in_index
130
+ flag_option :ita_visible_in_index
131
+ value_option :max_depth, inline: true
132
+
133
+ # Combined diff format
134
+ flag_option :c
135
+ flag_option :cc
136
+ flag_option :combined_all_paths
137
+
138
+ # git diff-specific modes
139
+ flag_option %i[cached staged]
140
+ flag_option :merge_base
141
+ flag_option :no_index
142
+
143
+ # Merge conflict stage selection
144
+ flag_option %i[base 1]
145
+ flag_option %i[ours 2]
146
+ flag_option %i[theirs 3]
147
+ flag_option :'0'
148
+
149
+ operand :commit, repeatable: true
150
+ end_of_options
151
+ value_option :path, as_operand: true, repeatable: true
152
+ end
153
+
154
+ # Exit codes: 0 = success; with --exit-code: 1 = differences found;
155
+ # with --check: 2 = whitespace/conflict-marker errors
156
+ allow_exit_status 0..2
157
+
158
+ # @!method call(*, **)
159
+ #
160
+ # @overload call(**options)
161
+ #
162
+ # Compare the index to the working tree
163
+ #
164
+ # @example
165
+ # Diff.new(ctx).call(numstat: true, src_prefix: 'a/', dst_prefix: 'b/')
166
+ #
167
+ # @param options [Hash] command options
168
+ #
169
+ # @return [Git::CommandLineResult] the result of calling `git diff`
170
+ #
171
+ # @raise [ArgumentError] if unsupported options are provided
172
+ #
173
+ # @raise [Git::FailedError] if git exits outside the allowed range
174
+ # (exit code > 2)
175
+ #
176
+ # @api public
177
+ #
178
+ # @overload call(no_index: true, path:, **options)
179
+ #
180
+ # Compare two paths on the filesystem (outside git)
181
+ #
182
+ # Always use the `path:` keyword for the two filesystem paths so
183
+ # that paths beginning with `-` are safely separated by `--` and
184
+ # cannot be mistaken for flags by git.
185
+ #
186
+ # @example
187
+ # Diff.new(ctx).call(patch: true, no_index: true, path: ['/a', '/b'])
188
+ #
189
+ # @param path [Array<String>] two filesystem paths to compare
190
+ # (passed after `--`)
191
+ #
192
+ # @param options [Hash] command options
193
+ #
194
+ # @return [Git::CommandLineResult] the result of calling `git diff`
195
+ #
196
+ # @raise [ArgumentError] if unsupported options are provided
197
+ #
198
+ # @raise [Git::FailedError] if git exits outside the allowed range
199
+ # (exit code > 2)
200
+ #
201
+ # @api public
202
+ #
203
+ # @overload call(commit = nil, cached:, **options)
204
+ #
205
+ # Compare the index to HEAD or the named commit
206
+ #
207
+ # @example
208
+ # Diff.new(ctx).call(patch: true, cached: true)
209
+ # Diff.new(ctx).call('HEAD~3', patch: true, cached: true)
210
+ #
211
+ # @param commit [String, nil] commit to compare the index against
212
+ # (defaults to HEAD)
213
+ #
214
+ # @param options [Hash] command options
215
+ #
216
+ # @return [Git::CommandLineResult] the result of calling `git diff`
217
+ #
218
+ # @raise [ArgumentError] if unsupported options are provided
219
+ #
220
+ # @raise [Git::FailedError] if git exits outside the allowed range
221
+ # (exit code > 2)
222
+ #
223
+ # @api public
224
+ #
225
+ # @overload call(commit, **options)
226
+ #
227
+ # Compare the working tree to the named commit
228
+ #
229
+ # @example
230
+ # Diff.new(ctx).call('HEAD~3', numstat: true, shortstat: true)
231
+ #
232
+ # @param commit [String] commit reference to compare the working
233
+ # tree against
234
+ #
235
+ # @param options [Hash] command options
236
+ #
237
+ # @return [Git::CommandLineResult] the result of calling `git diff`
238
+ #
239
+ # @raise [ArgumentError] if unsupported options are provided
240
+ #
241
+ # @raise [Git::FailedError] if git exits outside the allowed range
242
+ # (exit code > 2)
243
+ #
244
+ # @api public
245
+ #
246
+ # @overload call(commit, *commits, **options)
247
+ #
248
+ # Compare two or more commits or show a combined diff
249
+ #
250
+ # @example Compare two commits
251
+ # Diff.new(ctx).call('abc123', 'def456', raw: true, numstat: true)
252
+ #
253
+ # @example Combined diff of a merge commit
254
+ # Diff.new(ctx).call('main', 'feature-a', 'feature-b',
255
+ # merge_base: true)
256
+ #
257
+ # @param commit [String] first commit reference
258
+ #
259
+ # @param commits [Array<String>] additional commit references
260
+ #
261
+ # @param options [Hash] command options
262
+ #
263
+ # @option options [Boolean, nil] :patch (nil) generate patch output
264
+ #
265
+ # Alias: :p, :u
266
+ #
267
+ # @option options [Boolean, nil] :no_patch (nil) suppress all diff
268
+ # output
269
+ #
270
+ # Alias: :s
271
+ #
272
+ # @option options [Integer, String] :unified (nil) generate diffs
273
+ # with this many lines of context
274
+ #
275
+ # Alias: :U
276
+ #
277
+ # @option options [String] :output (nil) write output to a file
278
+ # instead of stdout
279
+ #
280
+ # @option options [String] :output_indicator_new (nil) character
281
+ # to indicate new lines in the patch
282
+ #
283
+ # @option options [String] :output_indicator_old (nil) character
284
+ # to indicate old lines in the patch
285
+ #
286
+ # @option options [String] :output_indicator_context (nil)
287
+ # character to indicate context lines in the patch
288
+ #
289
+ # @option options [Boolean, nil] :raw (nil) generate the diff in raw
290
+ # format
291
+ #
292
+ # @option options [Boolean, nil] :patch_with_raw (nil) synonym for
293
+ # `--patch --raw`
294
+ #
295
+ # @option options [Boolean, nil] :indent_heuristic (nil) enable the
296
+ # indent heuristic for patch readability (`--indent-heuristic`)
297
+ #
298
+ # @option options [Boolean, nil] :no_indent_heuristic (nil) disable
299
+ # the indent heuristic (`--no-indent-heuristic`)
300
+ #
301
+ # @option options [Boolean, nil] :minimal (nil) spend extra time to
302
+ # produce the smallest possible diff
303
+ #
304
+ # @option options [Boolean, nil] :patience (nil) use the patience
305
+ # diff algorithm
306
+ #
307
+ # @option options [Boolean, nil] :histogram (nil) use the histogram
308
+ # diff algorithm
309
+ #
310
+ # @option options [String, Array<String>] :anchored (nil)
311
+ # generate a diff using the anchored diff algorithm
312
+ #
313
+ # Pass an array for multiple anchored texts. Maps to
314
+ # `--anchored=<text>`.
315
+ #
316
+ # @option options [String] :diff_algorithm (nil) choose a diff
317
+ # algorithm (`patience`, `minimal`, `histogram`, or `myers`)
318
+ #
319
+ # @option options [Boolean, String, nil] :stat (nil) generate a
320
+ # diffstat
321
+ #
322
+ # Pass `true` for `--stat`; pass a string like
323
+ # `'100,40,10'` for `--stat=100,40,10`.
324
+ #
325
+ # @option options [Integer, String] :stat_width (nil) limit the
326
+ # width of `--stat` output
327
+ #
328
+ # @option options [Integer, String] :stat_name_width (nil) limit
329
+ # the filename width of `--stat` output
330
+ #
331
+ # @option options [Integer, String] :stat_count (nil) limit the
332
+ # number of lines in `--stat` output
333
+ #
334
+ # @option options [Integer, String] :stat_graph_width (nil) limit
335
+ # the graph width of `--stat` output
336
+ #
337
+ # @option options [Boolean, nil] :compact_summary (nil) output a
338
+ # condensed summary of extended header information
339
+ #
340
+ # @option options [Boolean, nil] :numstat (nil) show per-file
341
+ # insertion/deletion counts in decimal notation
342
+ #
343
+ # @option options [Boolean, nil] :shortstat (nil) output only the
344
+ # aggregate totals line from `--stat`
345
+ #
346
+ # @option options [Boolean, String, nil] :dirstat (nil) output the
347
+ # distribution of relative amount of changes per sub-directory
348
+ #
349
+ # Pass `true` for `--dirstat`; pass a string like
350
+ # `'lines,cumulative'` for `--dirstat=lines,cumulative`.
351
+ #
352
+ # Alias: :X
353
+ #
354
+ # @option options [Boolean, nil] :cumulative (nil) synonym for
355
+ # `--dirstat=cumulative`
356
+ #
357
+ # @option options [Boolean, String, nil] :dirstat_by_file (nil)
358
+ # synonym for `--dirstat=files,...`
359
+ #
360
+ # @option options [Boolean, nil] :summary (nil) output a condensed
361
+ # summary of extended header information
362
+ #
363
+ # @option options [Boolean, nil] :patch_with_stat (nil) synonym for
364
+ # `--patch --stat`
365
+ #
366
+ # @option options [Boolean, nil] :z (nil) use NUL as output field
367
+ # terminators
368
+ #
369
+ # @option options [Boolean, nil] :name_only (nil) show only the name
370
+ # of each changed file
371
+ #
372
+ # @option options [Boolean, nil] :name_status (nil) show only the
373
+ # name and status of each changed file
374
+ #
375
+ # @option options [Boolean, String, nil] :submodule (nil) specify how
376
+ # differences in submodules are shown
377
+ #
378
+ # Pass `true` for `--submodule`; pass a string like `'log'`
379
+ # or `'diff'` for `--submodule=<format>`.
380
+ #
381
+ # @option options [Boolean, String, nil] :color (nil) show colored
382
+ # diff
383
+ #
384
+ # Pass `true` for `--color` or a string like `'always'` for
385
+ # `--color=always`.
386
+ #
387
+ # @option options [Boolean, nil] :no_color (nil) disable colored
388
+ # diff (`--no-color`)
389
+ #
390
+ # @option options [Boolean, String, nil] :color_moved (nil) color
391
+ # moved lines differently
392
+ #
393
+ # Pass `true` for `--color-moved` or a string like `'zebra'`
394
+ # for `--color-moved=zebra`.
395
+ #
396
+ # @option options [Boolean, nil] :no_color_moved (nil) disable
397
+ # coloring moved lines (`--no-color-moved`)
398
+ #
399
+ # @option options [Boolean, String, nil] :color_moved_ws (nil)
400
+ # configure how whitespace is handled for move detection
401
+ #
402
+ # Pass `true` for `--color-moved-ws` or a string like
403
+ # `'ignore-all-space'` for
404
+ # `--color-moved-ws=ignore-all-space`.
405
+ #
406
+ # @option options [Boolean, nil] :no_color_moved_ws (nil) disable
407
+ # whitespace handling for move detection
408
+ # (`--no-color-moved-ws`)
409
+ #
410
+ # @option options [Boolean, String, nil] :word_diff (nil) show a
411
+ # word diff
412
+ #
413
+ # Pass `true` for `--word-diff`; pass a string like `'color'`
414
+ # for `--word-diff=color`.
415
+ #
416
+ # @option options [String] :word_diff_regex (nil) use this regex
417
+ # to decide what a word is
418
+ #
419
+ # @option options [Boolean, String, nil] :color_words (nil) equivalent
420
+ # to `--word-diff=color` plus optional regex
421
+ #
422
+ # @option options [Boolean, nil] :no_renames (nil) turn off rename
423
+ # detection
424
+ #
425
+ # @option options [Boolean, nil] :rename_empty (nil) use empty blobs
426
+ # as rename source (`--rename-empty`)
427
+ #
428
+ # @option options [Boolean, nil] :no_rename_empty (nil) do not use
429
+ # empty blobs as rename source (`--no-rename-empty`)
430
+ #
431
+ # @option options [Boolean, nil] :check (nil) warn if changes
432
+ # introduce conflict markers or whitespace errors
433
+ #
434
+ # @option options [String] :ws_error_highlight (nil) highlight
435
+ # whitespace errors in `context`, `old`, or `new` lines
436
+ #
437
+ # @option options [Boolean, nil] :full_index (nil) show full
438
+ # pre- and post-image blob object names
439
+ #
440
+ # @option options [Boolean, nil] :binary (nil) output a binary diff
441
+ # that can be applied with `git apply`
442
+ #
443
+ # @option options [Boolean, String, nil] :abbrev (nil) show only a
444
+ # partial prefix of object names
445
+ #
446
+ # Pass `true` for `--abbrev`; pass a string for
447
+ # `--abbrev=<n>`.
448
+ #
449
+ # @option options [Boolean, String, nil] :break_rewrites (nil) break
450
+ # complete rewrite changes into delete/create pairs
451
+ #
452
+ # Alias: :B
453
+ #
454
+ # @option options [Boolean, String, nil] :find_renames (nil) detect
455
+ # renames, optionally specifying a similarity threshold
456
+ #
457
+ # Alias: :M
458
+ #
459
+ # @option options [Boolean, String, nil] :find_copies (nil) detect
460
+ # copies as well as renames
461
+ #
462
+ # Alias: :C
463
+ #
464
+ # @option options [Boolean, nil] :find_copies_harder (nil) inspect
465
+ # all files as candidates for the source of copy
466
+ #
467
+ # @option options [Boolean, nil] :irreversible_delete (nil) omit
468
+ # the preimage for deletes
469
+ #
470
+ # Alias: :D
471
+ #
472
+ # @option options [Integer, String] :l (nil) prevent rename/copy
473
+ # detection from running if the number of targets exceeds this
474
+ #
475
+ # @option options [String] :diff_filter (nil) select only files
476
+ # matching the specified status letters
477
+ #
478
+ # @option options [String] :S (nil) look for differences that
479
+ # change the number of occurrences of a string
480
+ #
481
+ # @option options [String] :G (nil) look for differences whose
482
+ # patch text contains added/removed lines matching a regex
483
+ #
484
+ # @option options [String] :find_object (nil) look for
485
+ # differences that change the number of occurrences of an
486
+ # object
487
+ #
488
+ # @option options [Boolean, nil] :pickaxe_all (nil) when `-S` or
489
+ # `-G` finds a change, show all changes in that changeset
490
+ #
491
+ # @option options [Boolean, nil] :pickaxe_regex (nil) treat the
492
+ # `-S` string as an extended POSIX regular expression
493
+ #
494
+ # @option options [String] :O (nil) control the order in which
495
+ # files appear in the output
496
+ #
497
+ # @option options [String] :skip_to (nil) discard files before
498
+ # the named file from the output
499
+ #
500
+ # @option options [String] :rotate_to (nil) move files before
501
+ # the named file to the end of the output
502
+ #
503
+ # @option options [Boolean, nil] :R (nil) swap two inputs (reverse
504
+ # diff)
505
+ #
506
+ # @option options [Boolean, String, nil] :relative (nil) show
507
+ # pathnames relative to a subdirectory
508
+ #
509
+ # Pass `true` for `--relative` or a string for
510
+ # `--relative=<path>`.
511
+ #
512
+ # @option options [Boolean, nil] :no_relative (nil) show pathnames
513
+ # relative to the working directory (`--no-relative`)
514
+ #
515
+ # @option options [Boolean, nil] :text (nil) treat all files as
516
+ # text
517
+ #
518
+ # Alias: :a
519
+ #
520
+ # @option options [Boolean, nil] :ignore_cr_at_eol (nil) ignore
521
+ # carriage-return at end of line
522
+ #
523
+ # @option options [Boolean, nil] :ignore_space_at_eol (nil) ignore
524
+ # changes in whitespace at end of line
525
+ #
526
+ # @option options [Boolean, nil] :ignore_space_change (nil) ignore
527
+ # changes in amount of whitespace
528
+ #
529
+ # Alias: :b
530
+ #
531
+ # @option options [Boolean, nil] :ignore_all_space (nil) ignore
532
+ # whitespace when comparing lines
533
+ #
534
+ # Alias: :w
535
+ #
536
+ # @option options [Boolean, nil] :ignore_blank_lines (nil) ignore
537
+ # changes whose lines are all blank
538
+ #
539
+ # @option options [String, Array<String>] :ignore_matching_lines
540
+ # (nil) ignore changes whose all lines match the given regex
541
+ #
542
+ # Pass an array for multiple patterns. Maps to
543
+ # `--ignore-matching-lines=<regex>`.
544
+ #
545
+ # Alias: :I
546
+ #
547
+ # @option options [Integer, String] :inter_hunk_context (nil)
548
+ # show the context between diff hunks, fusing nearby hunks
549
+ #
550
+ # @option options [Boolean, nil] :function_context (nil) show whole
551
+ # function as context lines for each change
552
+ #
553
+ # Alias: :W
554
+ #
555
+ # @option options [Boolean, nil] :exit_code (nil) make the program
556
+ # exit with codes similar to `diff(1)`
557
+ #
558
+ # @option options [Boolean, nil] :quiet (nil) disable all output of
559
+ # the program
560
+ #
561
+ # @option options [Boolean, nil] :ext_diff (nil) allow an external
562
+ # diff helper (`--ext-diff`)
563
+ #
564
+ # @option options [Boolean, nil] :no_ext_diff (nil) disallow an
565
+ # external diff helper (`--no-ext-diff`)
566
+ #
567
+ # @option options [Boolean, nil] :textconv (nil) allow external
568
+ # text conversion filters for binary files (`--textconv`)
569
+ #
570
+ # @option options [Boolean, nil] :no_textconv (nil) disallow
571
+ # external text conversion filters for binary files
572
+ # (`--no-textconv`)
573
+ #
574
+ # @option options [Boolean, String, nil] :ignore_submodules (nil)
575
+ # ignore changes to submodules in the diff
576
+ #
577
+ # Pass `true` for `--ignore-submodules`; pass a string like
578
+ # `'all'` for `--ignore-submodules=all`.
579
+ #
580
+ # @option options [String] :src_prefix (nil) source prefix for
581
+ # diff headers (e.g. `'a/'`)
582
+ #
583
+ # @option options [String] :dst_prefix (nil) destination prefix
584
+ # for diff headers (e.g. `'b/'`)
585
+ #
586
+ # @option options [Boolean, nil] :no_prefix (nil) do not show any
587
+ # source or destination prefix
588
+ #
589
+ # @option options [Boolean, nil] :default_prefix (nil) use the
590
+ # default source and destination prefixes
591
+ #
592
+ # @option options [String] :line_prefix (nil) prepend an
593
+ # additional prefix to every line of output
594
+ #
595
+ # @option options [Boolean, nil] :ita_invisible_in_index (nil) make
596
+ # intent-to-add entries appear as new files in `git diff`
597
+ #
598
+ # @option options [Boolean, nil] :ita_visible_in_index (nil) revert
599
+ # `--ita-invisible-in-index`
600
+ #
601
+ # @option options [Integer, String] :max_depth (nil) descend at
602
+ # most this many levels of directories per pathspec
603
+ #
604
+ # @option options [Boolean, nil] :cached (nil) compare the index to
605
+ # HEAD or a named commit
606
+ #
607
+ # Alias: :staged
608
+ #
609
+ # @option options [Boolean, nil] :merge_base (nil) use merge base
610
+ # of commits
611
+ #
612
+ # @option options [Boolean, nil] :no_index (nil) compare two
613
+ # filesystem paths outside a repo
614
+ #
615
+ # @option options [Boolean, nil] :base (nil) compare working tree
616
+ # with the base version (stage #1)
617
+ #
618
+ # Alias: :"1"
619
+ #
620
+ # @option options [Boolean, nil] :ours (nil) compare working tree
621
+ # with our branch (stage #2)
622
+ #
623
+ # Alias: :"2"
624
+ #
625
+ # @option options [Boolean, nil] :theirs (nil) compare working tree
626
+ # with their branch (stage #3)
627
+ #
628
+ # Alias: :"3"
629
+ #
630
+ # @option options [Boolean, nil] :"0" (nil) omit diff output for
631
+ # unmerged entries
632
+ #
633
+ # @option options [Boolean, nil] :c (nil) produce a combined diff
634
+ # (useful when showing a merge)
635
+ #
636
+ # @option options [Boolean, nil] :cc (nil) produce a dense combined
637
+ # diff (useful when showing a merge)
638
+ #
639
+ # @option options [Boolean, nil] :combined_all_paths (nil) show
640
+ # paths from all parents of a combined diff
641
+ #
642
+ # @option options [Array<String>] :path (nil) zero or more paths
643
+ # to limit diff to
644
+ #
645
+ # @return [Git::CommandLineResult] the result of calling
646
+ # `git diff`
647
+ #
648
+ # @raise [ArgumentError] if unsupported options are provided
649
+ #
650
+ # @raise [Git::FailedError] if git exits outside the allowed
651
+ # range (exit code > 2)
652
+ #
653
+ # @api public
654
+ end
655
+ end
656
+ end