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,273 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git commit` command
8
+ #
9
+ # This command records changes to the repository by creating a new commit
10
+ # with the staged changes.
11
+ #
12
+ # @example Typical usage
13
+ # commit = Git::Commands::Commit.new(execution_context)
14
+ # commit.call(message: 'Initial commit')
15
+ # commit.call(message: 'Add feature', all: true, author: 'Jane <jane@example.com>')
16
+ # commit.call(amend: true, no_verify: true) # emits --no-verify
17
+ # commit.call('src/foo.rb', message: 'Update foo')
18
+ #
19
+ # @note `arguments` block audited against https://git-scm.com/docs/git-commit/2.53.0
20
+ #
21
+ # @see https://git-scm.com/docs/git-commit git-commit
22
+ #
23
+ # @see Git::Commands
24
+ #
25
+ # @api private
26
+ #
27
+ class Commit < Git::Commands::Base
28
+ arguments do
29
+ literal 'commit'
30
+
31
+ # Stage selection
32
+ flag_option %i[all a]
33
+
34
+ # Message source and editing
35
+ flag_option %i[edit e], negatable: true
36
+ flag_option :amend
37
+ value_option %i[reuse_message C], inline: true
38
+ value_option :fixup, inline: true
39
+ value_option :squash, inline: true
40
+ value_option %i[message m], inline: true, allow_empty: true
41
+ value_option %i[file F], inline: true
42
+ value_option %i[template t], inline: true
43
+
44
+ # Author / date
45
+ flag_option :reset_author
46
+ value_option :author, inline: true
47
+ value_option :date, inline: true, type: String
48
+
49
+ # Message cleanup and trailers
50
+ value_option :cleanup, inline: true
51
+ value_option :trailer, repeatable: true
52
+
53
+ # Hooks
54
+ flag_option %i[verify n], negatable: true
55
+
56
+ # Behavior
57
+ flag_option :allow_empty
58
+ flag_option :allow_empty_message
59
+ flag_option :no_post_rewrite
60
+ flag_option %i[include i]
61
+ flag_option %i[only o]
62
+
63
+ # Output / dry-run
64
+ flag_option :dry_run
65
+ flag_option :short
66
+ flag_option :branch
67
+ flag_option :porcelain
68
+ flag_option :long
69
+ flag_option %i[null z]
70
+ flag_option %i[verbose v], max_times: 2
71
+ flag_option %i[quiet q]
72
+ flag_option :status, negatable: true
73
+
74
+ # Verbose diff options
75
+ value_option %i[unified U], inline: true, type: Integer
76
+ value_option :inter_hunk_context, inline: true, type: Integer
77
+
78
+ # Signoff
79
+ flag_option %i[signoff s], negatable: true
80
+
81
+ # GPG signing
82
+ flag_or_value_option %i[gpg_sign S], negatable: true, inline: true
83
+
84
+ # Untracked files
85
+ flag_or_value_option %i[untracked_files u], inline: true
86
+
87
+ # Pathspec from file
88
+ value_option :pathspec_from_file, inline: true
89
+ flag_option :pathspec_file_nul
90
+
91
+ # Path selection
92
+ end_of_options
93
+ operand :pathspec, repeatable: true
94
+ end
95
+
96
+ # @overload call(*pathspec, **options)
97
+ #
98
+ # Execute the `git commit` command.
99
+ #
100
+ # @param pathspec [Array<String>] zero or more paths to commit
101
+ #
102
+ # When given, only changes to the listed paths are committed, ignoring
103
+ # staged changes for other paths.
104
+ #
105
+ # @param options [Hash] command options
106
+ #
107
+ # @option options [Boolean, nil] :all (nil) automatically stage modified and deleted
108
+ # files before committing
109
+ #
110
+ # Alias: `:a`
111
+ #
112
+ # @option options [Boolean, nil] :edit (nil) open an editor for the commit message (`--edit`)
113
+ #
114
+ # Alias: `:e`
115
+ #
116
+ # @option options [Boolean, nil] :no_edit (nil) suppress the editor (`--no-edit`)
117
+ #
118
+ # @option options [Boolean, nil] :amend (nil) replace the tip of the current branch
119
+ # with a new commit
120
+ #
121
+ # @option options [String] :reuse_message (nil) reuse the log message and
122
+ # authorship from the given commit without invoking an editor
123
+ #
124
+ # Alias: `:C`
125
+ #
126
+ # @option options [String] :fixup (nil) create a fixup or amend commit targeting
127
+ # the given commit
128
+ #
129
+ # Pass `<commit>` for a plain "fixup!" commit, `amend:<commit>` to also replace
130
+ # the log message, or `reword:<commit>` to replace only the log message.
131
+ #
132
+ # @option options [String] :squash (nil) construct a "squash!" commit message for
133
+ # use with `git rebase --autosquash`
134
+ #
135
+ # @option options [String] :message (nil) use the given string as the commit message
136
+ #
137
+ # Alias: `:m`
138
+ #
139
+ # @option options [String] :file (nil) read the commit message from the given file;
140
+ # use `-` to read from standard input
141
+ #
142
+ # Alias: `:F`
143
+ #
144
+ # @option options [String] :template (nil) start the editor with the contents of
145
+ # the given file as the commit message template
146
+ #
147
+ # Alias: `:t`
148
+ #
149
+ # @option options [Boolean, nil] :reset_author (nil) when used with `:reuse_message`
150
+ # or `:amend`, declare the committer as the new author
151
+ #
152
+ # @option options [String] :author (nil) override the commit author
153
+ #
154
+ # @option options [String] :date (nil) override the author date
155
+ #
156
+ # @option options [String] :cleanup (nil) how to clean up the commit message before
157
+ # committing; one of `strip`, `whitespace`, `verbatim`, `scissors`, or `default`
158
+ #
159
+ # @option options [String, Array<String>] :trailer (nil) add one or more
160
+ # `<token>[=<value>]` trailers to the commit message
161
+ #
162
+ # @option options [Boolean, nil] :verify (nil) run pre-commit and commit-msg hooks (`--verify`)
163
+ #
164
+ # Alias: `:n`
165
+ #
166
+ # @option options [Boolean, nil] :no_verify (nil) bypass pre-commit and commit-msg hooks (`--no-verify`)
167
+ #
168
+ # @option options [Boolean, nil] :allow_empty (nil) allow committing with no changes
169
+ #
170
+ # @option options [Boolean, nil] :allow_empty_message (nil) allow committing with an
171
+ # empty message
172
+ #
173
+ # @option options [Boolean, nil] :no_post_rewrite (nil) bypass the post-rewrite hook
174
+ #
175
+ # @option options [Boolean, nil] :include (nil) stage the listed paths before
176
+ # committing in addition to already-staged contents
177
+ #
178
+ # Alias: `:i`
179
+ #
180
+ # @option options [Boolean, nil] :only (nil) commit only the listed paths from the
181
+ # working tree, ignoring staged changes for other paths
182
+ #
183
+ # Alias: `:o`
184
+ #
185
+ # @option options [Boolean, nil] :dry_run (nil) do not create a commit; show what
186
+ # would be committed
187
+ #
188
+ # @option options [Boolean, nil] :short (nil) show short-format dry-run output;
189
+ # implies `:dry_run`
190
+ #
191
+ # @option options [Boolean, nil] :branch (nil) show branch and tracking info in
192
+ # short-format dry-run output
193
+ #
194
+ # @option options [Boolean, nil] :porcelain (nil) show porcelain-format dry-run
195
+ # output; implies `:dry_run`
196
+ #
197
+ # @option options [Boolean, nil] :long (nil) show long-format dry-run output;
198
+ # implies `:dry_run`
199
+ #
200
+ # @option options [Boolean, nil] :null (nil) terminate dry-run output entries with
201
+ # NUL instead of LF
202
+ #
203
+ # Alias: `:z`
204
+ #
205
+ # @option options [Boolean, Integer, nil] :verbose (nil) show unified diff between
206
+ # HEAD and what would be committed at the bottom of the commit message template
207
+ #
208
+ # Pass `2` to also show the unified diff between staged and working-tree changes.
209
+ #
210
+ # Alias: `:v`
211
+ #
212
+ # @option options [Boolean, nil] :quiet (nil) suppress commit summary message
213
+ #
214
+ # Alias: `:q`
215
+ #
216
+ # @option options [Boolean, nil] :status (nil) include `git status` output in the
217
+ # commit message template (`--status`)
218
+ #
219
+ # @option options [Boolean, nil] :no_status (nil) omit `git status` output from the
220
+ # commit message template (`--no-status`)
221
+ #
222
+ # @option options [Integer] :unified (nil) generate verbose diff with the given
223
+ # number of context lines
224
+ #
225
+ # Alias: `:U`
226
+ #
227
+ # @option options [Integer] :inter_hunk_context (nil) show context between diff
228
+ # hunks up to the given number of lines (for use with `:verbose`)
229
+ #
230
+ # @option options [Boolean, nil] :signoff (nil) add a `Signed-off-by` trailer to
231
+ # the commit message (`--signoff`)
232
+ #
233
+ # Alias: `:s`
234
+ #
235
+ # @option options [Boolean, nil] :no_signoff (nil) suppress the `Signed-off-by` trailer (`--no-signoff`)
236
+ #
237
+ # @option options [Boolean, String, nil] :gpg_sign (nil) GPG-sign the commit (`--gpg-sign`)
238
+ #
239
+ # When `true`, uses the default key. When a `String`, uses the specified key ID.
240
+ #
241
+ # Alias: `:S`
242
+ #
243
+ # @option options [Boolean, nil] :no_gpg_sign (nil) disable GPG signing, overriding
244
+ # `commit.gpgSign` config (`--no-gpg-sign`)
245
+ #
246
+ # @option options [Boolean, String, nil] :untracked_files (nil) show untracked files
247
+ # in the dry-run status output
248
+ #
249
+ # When `true`, uses git's default mode (`all`). Pass a `String` (`"no"`,
250
+ # `"normal"`, or `"all"`) to set the mode explicitly.
251
+ #
252
+ # Alias: `:u`
253
+ #
254
+ # @option options [String] :pathspec_from_file (nil) read pathspec from the given
255
+ # file instead of the command line
256
+ #
257
+ # @option options [Boolean, nil] :pathspec_file_nul (nil) pathspec elements in
258
+ # `:pathspec_from_file` are NUL-separated instead of newline-separated
259
+ #
260
+ # @return [Git::CommandLine::Result] the result of calling `git commit`
261
+ #
262
+ # @raise [ArgumentError] if unsupported options are provided
263
+ #
264
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
265
+ #
266
+ # @api public
267
+ #
268
+ def call(*, **)
269
+ super
270
+ end
271
+ end
272
+ end
273
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git commit-tree` command
8
+ #
9
+ # Creates a new commit object based on the provided tree object and emits the
10
+ # new commit object id on stdout. The log message is provided via `-m` or `-F`
11
+ # options; multiple instances of either are concatenated as separate paragraphs.
12
+ #
13
+ # @example Typical usage
14
+ # commit_tree = Git::Commands::CommitTree.new(execution_context)
15
+ # commit_tree.call('abc123', m: 'Initial commit')
16
+ # commit_tree.call('abc123', p: %w[parent1 parent2], m: 'Merge')
17
+ # commit_tree.call('abc123', m: 'Signed', gpg_sign: true)
18
+ #
19
+ # @note `arguments` block audited against https://git-scm.com/docs/git-commit-tree/2.53.0
20
+ #
21
+ # @see Git::Commands
22
+ #
23
+ # @see https://git-scm.com/docs/git-commit-tree git-commit-tree
24
+ #
25
+ # @api private
26
+ #
27
+ class CommitTree < Git::Commands::Base
28
+ arguments do
29
+ literal 'commit-tree'
30
+
31
+ # Parent commits — each -p adds a parent object
32
+ value_option :p, repeatable: true
33
+
34
+ # GPG signing — -S[<keyid>] / --gpg-sign[=<keyid>] / --no-gpg-sign
35
+ flag_or_value_option %i[gpg_sign S], negatable: true, inline: true
36
+
37
+ # Commit log message paragraphs
38
+ value_option :m, repeatable: true, allow_empty: true
39
+
40
+ # Read commit log message from file(s)
41
+ value_option :F, repeatable: true
42
+
43
+ end_of_options
44
+
45
+ # The tree object to create a commit from
46
+ operand :tree, required: true
47
+ end
48
+
49
+ # @overload call(tree, **options)
50
+ #
51
+ # Execute the `git commit-tree` command
52
+ #
53
+ # @param tree [String] an existing tree object SHA
54
+ #
55
+ # @param options [Hash] command options
56
+ #
57
+ # @option options [String, Array<String>] :p (nil) parent commit
58
+ # object id(s)
59
+ #
60
+ # Each value adds a `-p <parent>` flag. A commit may have zero or
61
+ # more parents. With exactly one parent it is an ordinary commit;
62
+ # with more than one it is a merge commit. Initial (root) commits
63
+ # have no parents.
64
+ #
65
+ # @option options [Boolean, String, nil] :gpg_sign (nil) sign the
66
+ # commit with GPG (`--gpg-sign`)
67
+ #
68
+ # Pass a key-ID string to select the signing key; pass `true` to use
69
+ # the committer identity. Alias: `:S`
70
+ #
71
+ # @option options [Boolean, nil] :no_gpg_sign (nil) countermand commit.gpgSign
72
+ # configuration (`--no-gpg-sign`)
73
+ #
74
+ # @option options [String, Array<String>] :m (nil) a paragraph
75
+ # in the commit log message
76
+ #
77
+ # Can be given more than once; each message becomes its own paragraph.
78
+ #
79
+ # @option options [String, Array<String>] :F (nil) read the commit
80
+ # log message from the given file
81
+ #
82
+ # Use `"-"` to read from standard input. Can be given more than
83
+ # once; each file's content becomes its own paragraph.
84
+ #
85
+ # @return [Git::CommandLine::Result] the result of calling
86
+ # `git commit-tree`
87
+ #
88
+ # @raise [ArgumentError] if unsupported options are provided
89
+ #
90
+ # @raise [ArgumentError] if the tree operand is missing
91
+ #
92
+ # @raise [Git::FailedError] if git exits with a non-zero exit
93
+ # status
94
+ #
95
+ # @api public
96
+ def call(*, **)
97
+ super
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module ConfigOptionSyntax
8
+ # Append a value to a multi-valued config key
9
+ #
10
+ # Wraps `git config --add` to add a new line to a config key without
11
+ # altering existing values.
12
+ #
13
+ # @example Add a value to a multi-valued key
14
+ # cmd = Git::Commands::ConfigOptionSyntax::Add.new(lib)
15
+ # cmd.call('remote.origin.fetch', '+refs/heads/*:refs/remotes/origin/*')
16
+ #
17
+ # @note `arguments` block audited against https://git-scm.com/docs/git-config/2.53.0
18
+ #
19
+ # @see Git::Commands::ConfigOptionSyntax
20
+ #
21
+ # @see https://git-scm.com/docs/git-config git-config documentation
22
+ #
23
+ # @api private
24
+ #
25
+ class Add < Git::Commands::Base
26
+ arguments do
27
+ literal 'config'
28
+ literal '--add'
29
+
30
+ # File-scope options
31
+ flag_option :global
32
+ flag_option :system
33
+ flag_option :local
34
+ flag_option :worktree
35
+ value_option %i[file f]
36
+ value_option :blob
37
+
38
+ # Type constraint
39
+ value_option :type, inline: true
40
+
41
+ # Operands
42
+ end_of_options
43
+ operand :name, required: true
44
+ operand :value, required: true
45
+ end
46
+
47
+ # @overload call(name, value, **options)
48
+ #
49
+ # Execute the `git config --add` command
50
+ #
51
+ # @param name [String] the config key name
52
+ #
53
+ # @param value [String] the value to append
54
+ #
55
+ # @param options [Hash] command options
56
+ #
57
+ # @option options [Boolean, nil] :global (nil) write to global config (`~/.gitconfig`)
58
+ #
59
+ # @option options [Boolean, nil] :system (nil) write to system config
60
+ #
61
+ # @option options [Boolean, nil] :local (nil) write to repository config (`.git/config`)
62
+ #
63
+ # @option options [Boolean, nil] :worktree (nil) write to worktree config
64
+ #
65
+ # @option options [String] :file (nil) write to the specified file
66
+ #
67
+ # Alias: :f
68
+ #
69
+ # @option options [String] :blob (nil) read from the specified blob
70
+ #
71
+ # @option options [String] :type (nil) ensure the value conforms to the given type
72
+ #
73
+ # @return [Git::CommandLine::Result] the result of calling `git config --add`
74
+ #
75
+ # @raise [ArgumentError] if unsupported options are provided
76
+ #
77
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
78
+ #
79
+ # @api public
80
+ def call(*, **)
81
+ super
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module ConfigOptionSyntax
8
+ # Retrieve a single config value by exact key name
9
+ #
10
+ # Wraps `git config --get` to return the value of the last-matching
11
+ # config entry for the given key name.
12
+ #
13
+ # @example Get a local config value
14
+ # cmd = Git::Commands::ConfigOptionSyntax::Get.new(lib)
15
+ # cmd.call('user.name')
16
+ #
17
+ # @example Get a global config value
18
+ # cmd = Git::Commands::ConfigOptionSyntax::Get.new(lib)
19
+ # cmd.call('user.name', global: true)
20
+ #
21
+ # @example Get a value with a type constraint
22
+ # cmd = Git::Commands::ConfigOptionSyntax::Get.new(lib)
23
+ # cmd.call('core.bare', type: 'bool')
24
+ #
25
+ # @note `arguments` block audited against https://git-scm.com/docs/git-config/2.53.0
26
+ #
27
+ # @see Git::Commands::ConfigOptionSyntax
28
+ #
29
+ # @see https://git-scm.com/docs/git-config git-config documentation
30
+ #
31
+ # @api private
32
+ class Get < Git::Commands::Base
33
+ arguments do
34
+ literal 'config'
35
+ literal '--get'
36
+
37
+ # File-scope options
38
+ flag_option :global
39
+ flag_option :system
40
+ flag_option :local
41
+ flag_option :worktree
42
+ value_option %i[file f]
43
+ value_option :blob
44
+
45
+ # General read options
46
+ flag_option :includes, negatable: true
47
+
48
+ # Type constraint
49
+ value_option :type, inline: true
50
+
51
+ # Output modifiers
52
+ flag_option :show_origin
53
+ flag_option :show_scope
54
+ flag_option %i[null z]
55
+ value_option :default
56
+
57
+ # Operands
58
+ end_of_options
59
+ operand :name, required: true
60
+ operand :value_regex
61
+ end
62
+
63
+ # git config --get exits 1 when the key is not found (not an error)
64
+ allow_exit_status 0..1
65
+
66
+ # @overload call(name, value_regex = nil, **options)
67
+ #
68
+ # Execute the `git config --get` command
69
+ #
70
+ # @param name [String] the config key name to look up
71
+ #
72
+ # @param value_regex [String, nil] (nil) optional regex to filter the value
73
+ #
74
+ # @param options [Hash] command options
75
+ #
76
+ # @option options [Boolean, nil] :global (nil) read from global config (`~/.gitconfig`)
77
+ #
78
+ # @option options [Boolean, nil] :system (nil) read from system config
79
+ #
80
+ # @option options [Boolean, nil] :local (nil) read from repository config (`.git/config`)
81
+ #
82
+ # @option options [Boolean, nil] :worktree (nil) read from worktree config
83
+ #
84
+ # @option options [String] :file (nil) read from the specified file
85
+ #
86
+ # Alias: :f
87
+ #
88
+ # @option options [String] :blob (nil) read from the specified blob
89
+ #
90
+ # @option options [Boolean, nil] :includes (nil) respect include directives in config files (`--includes`)
91
+ #
92
+ # @option options [Boolean, nil] :no_includes (nil) do not respect include directives
93
+ # in config files (`--no-includes`)
94
+ #
95
+ # @option options [String] :type (nil) ensure the value conforms to the given type
96
+ #
97
+ # @option options [Boolean, nil] :show_origin (nil) show the origin of the config value
98
+ #
99
+ # @option options [Boolean, nil] :show_scope (nil) show the scope of the config value
100
+ #
101
+ # @option options [Boolean, nil] :null (nil) terminate values with NUL byte instead of newline
102
+ #
103
+ # Alias: :z
104
+ #
105
+ # @option options [String] :default (nil) default value when the key is not found
106
+ #
107
+ # @return [Git::CommandLine::Result] the result of calling `git config --get`
108
+ #
109
+ # @raise [ArgumentError] if unsupported options are provided
110
+ #
111
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
112
+ #
113
+ # @api public
114
+ #
115
+ def call(*, **)
116
+ super
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module ConfigOptionSyntax
8
+ # Retrieve all values for a multi-valued config key
9
+ #
10
+ # Wraps `git config --get-all` to return all values matching the given
11
+ # key name, one per line.
12
+ #
13
+ # @example Get all values for a key
14
+ # cmd = Git::Commands::ConfigOptionSyntax::GetAll.new(lib)
15
+ # cmd.call('remote.origin.fetch')
16
+ #
17
+ # @example Get all values with a value pattern
18
+ # cmd = Git::Commands::ConfigOptionSyntax::GetAll.new(lib)
19
+ # cmd.call('remote.origin.fetch', '\\+refs/heads/.*')
20
+ #
21
+ # @note `arguments` block audited against https://git-scm.com/docs/git-config/2.53.0
22
+ #
23
+ # @see Git::Commands::ConfigOptionSyntax
24
+ #
25
+ # @see https://git-scm.com/docs/git-config git-config documentation
26
+ #
27
+ # @api private
28
+ class GetAll < Git::Commands::Base
29
+ arguments do
30
+ literal 'config'
31
+ literal '--get-all'
32
+
33
+ # File-scope options
34
+ flag_option :global
35
+ flag_option :system
36
+ flag_option :local
37
+ flag_option :worktree
38
+ value_option %i[file f]
39
+ value_option :blob
40
+
41
+ # General read options
42
+ flag_option :includes, negatable: true
43
+
44
+ # Type constraint
45
+ value_option :type, inline: true
46
+ flag_option :no_type
47
+
48
+ # Output modifiers
49
+ flag_option :show_origin
50
+ flag_option :show_scope
51
+ flag_option %i[null z]
52
+
53
+ # Operands
54
+ end_of_options
55
+ operand :name, required: true
56
+ operand :value_regex
57
+ end
58
+
59
+ # git config --get-all exits 1 when the key is not found (not an error)
60
+ allow_exit_status 0..1
61
+
62
+ # @overload call(name, value_regex = nil, **options)
63
+ #
64
+ # Execute the `git config --get-all` command
65
+ #
66
+ # @param name [String] the config key name to look up
67
+ #
68
+ # @param value_regex [String, nil] (nil) optional regex to filter values
69
+ #
70
+ # @param options [Hash] command options
71
+ #
72
+ # @option options [Boolean, nil] :global (nil) read from global config (`~/.gitconfig`)
73
+ #
74
+ # @option options [Boolean, nil] :system (nil) read from system config
75
+ #
76
+ # @option options [Boolean, nil] :local (nil) read from repository config (`.git/config`)
77
+ #
78
+ # @option options [Boolean, nil] :worktree (nil) read from worktree config
79
+ #
80
+ # @option options [String] :file (nil) read from the specified file
81
+ #
82
+ # Alias: :f
83
+ #
84
+ # @option options [String] :blob (nil) read from the specified blob
85
+ #
86
+ # @option options [Boolean, nil] :includes (nil) follow include directives in config files
87
+ # (`--includes`)
88
+ #
89
+ # @option options [Boolean, nil] :no_includes (nil) suppress include directive processing
90
+ # (`--no-includes`)
91
+ #
92
+ # @option options [String] :type (nil) ensure values conform to the given type
93
+ #
94
+ # @option options [Boolean, nil] :no_type (nil) unset the previously set type specifier;
95
+ # `true` emits `--no-type`
96
+ #
97
+ # @option options [Boolean, nil] :show_origin (nil) show the origin of each config value
98
+ #
99
+ # @option options [Boolean, nil] :show_scope (nil) show the scope of each config value
100
+ #
101
+ # @option options [Boolean, nil] :null (nil) terminate values with NUL byte instead of newline
102
+ #
103
+ # Alias: :z
104
+ #
105
+ # @return [Git::CommandLine::Result] the result of calling `git config --get-all`
106
+ #
107
+ # @raise [ArgumentError] if unsupported options are provided
108
+ #
109
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
110
+ #
111
+ # @api public
112
+ def call(*, **)
113
+ super
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end