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,174 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git status` command
8
+ #
9
+ # Shows the working tree status — the differences between the index and
10
+ # the current HEAD commit, and between the working directory and the index.
11
+ #
12
+ # @example Show working tree status
13
+ # status = Git::Commands::Status.new(execution_context)
14
+ # status.call
15
+ #
16
+ # @example Show short-format status
17
+ # status = Git::Commands::Status.new(execution_context)
18
+ # status.call(short: true)
19
+ #
20
+ # @example Show status in porcelain v2 format
21
+ # status = Git::Commands::Status.new(execution_context)
22
+ # status.call(porcelain: 'v2')
23
+ #
24
+ # @example Show status for specific paths
25
+ # status = Git::Commands::Status.new(execution_context)
26
+ # status.call('lib/', 'spec/')
27
+ #
28
+ # @example Show all untracked files
29
+ # status = Git::Commands::Status.new(execution_context)
30
+ # status.call(untracked_files: 'all')
31
+ #
32
+ # @note `arguments` block audited against
33
+ # https://git-scm.com/docs/git-status/2.53.0
34
+ #
35
+ # @see https://git-scm.com/docs/git-status git-status
36
+ #
37
+ # @see Git::Commands
38
+ #
39
+ # @api private
40
+ #
41
+ class Status < Git::Commands::Base
42
+ arguments do
43
+ literal 'status'
44
+
45
+ # Output format
46
+ flag_option %i[short s]
47
+ flag_option %i[branch b]
48
+ flag_option :show_stash
49
+ flag_or_value_option :porcelain, inline: true
50
+ flag_option :long
51
+ flag_option %i[verbose v]
52
+
53
+ # Untracked files
54
+ flag_or_value_option %i[untracked_files u], inline: true
55
+
56
+ # Submodule handling
57
+ flag_or_value_option :ignore_submodules, inline: true
58
+
59
+ # Ignored files
60
+ flag_or_value_option :ignored, inline: true
61
+
62
+ # NUL-terminated output
63
+ flag_option :z
64
+
65
+ # Column display
66
+ flag_or_value_option :column, inline: true, negatable: true
67
+
68
+ # Upstream tracking
69
+ flag_option :ahead_behind, negatable: true
70
+
71
+ # Rename detection
72
+ flag_option :renames, negatable: true
73
+ flag_or_value_option :find_renames, inline: true
74
+
75
+ end_of_options
76
+
77
+ operand :pathspec, repeatable: true
78
+ end
79
+
80
+ # @!method call(*, **options)
81
+ #
82
+ # @param options [Hash] command options
83
+ #
84
+ # @option options [Boolean, nil] :short (nil) command option key; see overload docs
85
+ # for the full option list
86
+ #
87
+ # @overload call(*pathspecs, **options)
88
+ #
89
+ # Execute the git status command
90
+ #
91
+ # @param pathspecs [Array<String>] limit output to the named paths
92
+ #
93
+ # @param options [Hash] command options
94
+ #
95
+ # @option options [Boolean, nil] :short (nil) give output in short format
96
+ #
97
+ # Alias: :s
98
+ #
99
+ # @option options [Boolean, nil] :branch (nil) show the branch and tracking info
100
+ # even in short-format
101
+ #
102
+ # Alias: :b
103
+ #
104
+ # @option options [Boolean, nil] :show_stash (nil) show the number of entries
105
+ # currently stashed away
106
+ #
107
+ # @option options [Boolean, String, nil] :porcelain (nil) give the output in an
108
+ # easy-to-parse format for scripts
109
+ #
110
+ # When `true`, gives porcelain format. When a string (e.g. `'v1'`, `'v2'`),
111
+ # gives the specified porcelain format version.
112
+ #
113
+ # @option options [Boolean, nil] :long (nil) give output in long format (the default)
114
+ #
115
+ # @option options [Boolean, nil] :verbose (nil) in addition to names of files that
116
+ # have been changed, also show the textual changes that are staged
117
+ #
118
+ # Alias: :v
119
+ #
120
+ # @option options [Boolean, String, nil] :untracked_files (nil) show untracked files
121
+ #
122
+ # Mode can be `'no'`, `'normal'`, or `'all'`. When `true`, uses the default
123
+ # mode.
124
+ #
125
+ # Alias: :u
126
+ #
127
+ # @option options [Boolean, String, nil] :ignore_submodules (nil) ignore changes
128
+ # to submodules
129
+ #
130
+ # Mode can be `'none'`, `'untracked'`, `'dirty'`, or `'all'`.
131
+ #
132
+ # @option options [Boolean, String, nil] :ignored (nil) show ignored files as well
133
+ #
134
+ # Mode can be `'traditional'`, `'no'`, or `'matching'`.
135
+ #
136
+ # @option options [Boolean, nil] :z (nil) terminate entries with NUL instead of
137
+ # newline (`-z`)
138
+ #
139
+ # Implies `--porcelain=v1`
140
+ #
141
+ # @option options [Boolean, String, nil] :column (nil) display untracked files in
142
+ # columns (`--column`)
143
+ #
144
+ # Pass `true` for `--column` or a string of options for `--column=<options>`.
145
+ #
146
+ # @option options [Boolean, nil] :no_column (nil) disable column output (`--no-column`)
147
+ #
148
+ # @option options [Boolean, nil] :ahead_behind (nil) show ahead/behind counts for
149
+ # the branch (`--ahead-behind`)
150
+ #
151
+ # @option options [Boolean, nil] :no_ahead_behind (nil) suppress ahead/behind counts
152
+ # for the branch (`--no-ahead-behind`)
153
+ #
154
+ # @option options [Boolean, nil] :renames (nil) turn on rename detection (`--renames`)
155
+ #
156
+ # @option options [Boolean, nil] :no_renames (nil) turn off rename detection
157
+ # (`--no-renames`)
158
+ #
159
+ # @option options [Boolean, String, nil] :find_renames (nil) turn on rename detection
160
+ # with optional similarity threshold
161
+ #
162
+ # When `true`, enables rename detection without a threshold. When a string
163
+ # (e.g. `'50'`), adds `--find-renames=<n>`.
164
+ #
165
+ # @return [Git::CommandLine::Result] the result of calling `git status`
166
+ #
167
+ # @raise [ArgumentError] if unsupported options are provided
168
+ #
169
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
170
+ #
171
+ # @api public
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module SymbolicRef
8
+ # Deletes a symbolic ref via `git symbolic-ref --delete`
9
+ #
10
+ # Removes the named symbolic ref. When `quiet: true`, exit status 1
11
+ # (non-symbolic ref) does not produce an error message.
12
+ #
13
+ # @example Delete a symbolic ref
14
+ # cmd = Git::Commands::SymbolicRef::Delete.new(execution_context)
15
+ # cmd.call('HEAD')
16
+ #
17
+ # @note `arguments` block audited against https://git-scm.com/docs/git-symbolic-ref/2.53.0
18
+ #
19
+ # @see Git::Commands::SymbolicRef
20
+ #
21
+ # @see https://git-scm.com/docs/git-symbolic-ref git-symbolic-ref documentation
22
+ #
23
+ # @api private
24
+ #
25
+ class Delete < Git::Commands::Base
26
+ arguments do
27
+ literal 'symbolic-ref'
28
+
29
+ # Delete the symbolic ref
30
+ literal '--delete'
31
+
32
+ # Suppress error message for non-symbolic (detached) refs
33
+ flag_option %i[quiet q]
34
+
35
+ end_of_options
36
+
37
+ # The symbolic ref name to delete (e.g. `HEAD`)
38
+ operand :name, required: true
39
+ end
40
+
41
+ # Executes the git symbolic-ref --delete command
42
+ #
43
+ # @overload call(name, **options)
44
+ #
45
+ # @param name [String] the symbolic ref name to delete
46
+ # (e.g. `HEAD`)
47
+ #
48
+ # @param options [Hash] command options
49
+ #
50
+ # @option options [Boolean, nil] :quiet (nil) suppress error message
51
+ # when the name is not a symbolic ref
52
+ #
53
+ # Alias: :q
54
+ #
55
+ # @return [Git::CommandLine::Result] the result of calling
56
+ # `git symbolic-ref --delete`
57
+ #
58
+ # @raise [ArgumentError] if unsupported options are provided
59
+ #
60
+ # @raise [ArgumentError] if the name operand is missing
61
+ #
62
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
63
+ #
64
+ # @api public
65
+ #
66
+ def call(*, **)
67
+ super
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module SymbolicRef
8
+ # Reads the target of a symbolic ref via `git symbolic-ref`
9
+ #
10
+ # Given one argument, reads which branch head the given symbolic ref
11
+ # refers to and outputs its path, relative to the `.git/` directory.
12
+ #
13
+ # Exits with status 0 if the contents were printed correctly, or
14
+ # status 1 if the requested name is not a symbolic ref (e.g. a
15
+ # detached HEAD). When `quiet: true`, exit status 1 is silent
16
+ # (no error message on stderr).
17
+ #
18
+ # @example Read current HEAD
19
+ # cmd = Git::Commands::SymbolicRef::Read.new(execution_context)
20
+ # result = cmd.call('HEAD')
21
+ # result.stdout # => "refs/heads/main"
22
+ #
23
+ # @example Read HEAD with shortened output
24
+ # cmd = Git::Commands::SymbolicRef::Read.new(execution_context)
25
+ # result = cmd.call('HEAD', short: true)
26
+ # result.stdout # => "main"
27
+ #
28
+ # @note `arguments` block audited against https://git-scm.com/docs/git-symbolic-ref/2.53.0
29
+ #
30
+ # @see Git::Commands::SymbolicRef
31
+ #
32
+ # @see https://git-scm.com/docs/git-symbolic-ref git-symbolic-ref documentation
33
+ #
34
+ # @api private
35
+ #
36
+ class Read < Git::Commands::Base
37
+ arguments do
38
+ literal 'symbolic-ref'
39
+
40
+ # Suppress error message for non-symbolic (detached) refs
41
+ flag_option %i[quiet q]
42
+
43
+ # Shorten the ref output (e.g. `refs/heads/main` → `main`)
44
+ flag_option :short
45
+
46
+ # Follow (or stop after one level of) symbolic ref chain
47
+ flag_option :recurse, negatable: true
48
+
49
+ end_of_options
50
+
51
+ # The symbolic ref name to read (e.g. `HEAD`)
52
+ operand :name, required: true
53
+ end
54
+
55
+ # Exit status 1 indicates the name is not a symbolic ref
56
+ # (e.g. detached HEAD) — this is not an error
57
+ allow_exit_status 0..1
58
+
59
+ # Executes the git symbolic-ref command to read a symbolic ref
60
+ #
61
+ # @overload call(name, **options)
62
+ #
63
+ # @param name [String] the symbolic ref name to read
64
+ # (e.g. `HEAD`)
65
+ #
66
+ # @param options [Hash] command options
67
+ #
68
+ # @option options [Boolean, nil] :quiet (nil) suppress error message
69
+ # when the name is not a symbolic ref
70
+ #
71
+ # Alias: :q
72
+ #
73
+ # @option options [Boolean, nil] :short (nil) shorten the ref output
74
+ # (e.g. `refs/heads/main` → `main`)
75
+ #
76
+ # @option options [Boolean, nil] :recurse (nil) follow chain of symbolic refs
77
+ # until result no longer points at a symbolic ref (`--recurse`)
78
+ #
79
+ # @option options [Boolean, nil] :no_recurse (nil) stop after a single level
80
+ # of dereferencing (`--no-recurse`)
81
+ #
82
+ # @return [Git::CommandLine::Result] the result of calling
83
+ # `git symbolic-ref`
84
+ #
85
+ # @raise [ArgumentError] if unsupported options are provided
86
+ #
87
+ # @raise [ArgumentError] if the name operand is missing
88
+ #
89
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
90
+ #
91
+ # @api public
92
+ #
93
+ def call(*, **)
94
+ super
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module SymbolicRef
8
+ # Creates or updates a symbolic ref via `git symbolic-ref`
9
+ #
10
+ # Given two arguments, creates or updates a symbolic ref `<name>` to
11
+ # point at the given branch `<ref>`.
12
+ #
13
+ # @example Update HEAD to point to a branch
14
+ # cmd = Git::Commands::SymbolicRef::Update.new(execution_context)
15
+ # cmd.call('HEAD', 'refs/heads/main')
16
+ #
17
+ # @example Update HEAD with a reflog message
18
+ # cmd = Git::Commands::SymbolicRef::Update.new(execution_context)
19
+ # cmd.call('HEAD', 'refs/heads/main', m: 'switching to main')
20
+ #
21
+ # @note `arguments` block audited against https://git-scm.com/docs/git-symbolic-ref/2.53.0
22
+ #
23
+ # @see Git::Commands::SymbolicRef
24
+ #
25
+ # @see https://git-scm.com/docs/git-symbolic-ref git-symbolic-ref documentation
26
+ #
27
+ # @api private
28
+ #
29
+ class Update < Git::Commands::Base
30
+ arguments do
31
+ literal 'symbolic-ref'
32
+
33
+ # Reflog message for the update
34
+ value_option :m
35
+
36
+ end_of_options
37
+
38
+ # The symbolic ref name to update (e.g. `HEAD`)
39
+ operand :name, required: true
40
+
41
+ # The target ref to point to (e.g. `refs/heads/main`)
42
+ operand :ref, required: true
43
+ end
44
+
45
+ # Executes the git symbolic-ref command to create or update a symbolic ref
46
+ #
47
+ # @overload call(name, ref, **options)
48
+ #
49
+ # @param name [String] the symbolic ref name to update
50
+ # (e.g. `HEAD`)
51
+ #
52
+ # @param ref [String] the target ref to point to
53
+ # (e.g. `refs/heads/main`)
54
+ #
55
+ # @param options [Hash] command options
56
+ #
57
+ # @option options [String] :m (nil) a reflog message for
58
+ # the update
59
+ #
60
+ # @return [Git::CommandLine::Result] the result of calling
61
+ # `git symbolic-ref`
62
+ #
63
+ # @raise [ArgumentError] if unsupported options are provided
64
+ #
65
+ # @raise [ArgumentError] if the name operand is missing
66
+ #
67
+ # @raise [ArgumentError] if the ref operand is missing
68
+ #
69
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
70
+ #
71
+ # @api public
72
+ #
73
+ def call(*, **)
74
+ super
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'symbolic_ref/delete'
4
+ require_relative 'symbolic_ref/read'
5
+ require_relative 'symbolic_ref/update'
6
+
7
+ module Git
8
+ module Commands
9
+ # Commands for reading, updating, and deleting symbolic refs via
10
+ # `git symbolic-ref`
11
+ #
12
+ # This module contains command classes split by invocation mode:
13
+ #
14
+ # - {SymbolicRef::Read} — read the target of a symbolic ref
15
+ # - {SymbolicRef::Update} — create or update a symbolic ref to point
16
+ # at a given branch
17
+ # - {SymbolicRef::Delete} — delete a symbolic ref
18
+ #
19
+ # @example Read the current HEAD
20
+ # cmd = Git::Commands::SymbolicRef::Read.new(lib)
21
+ # cmd.call('HEAD')
22
+ #
23
+ # @example Update HEAD to point to a branch
24
+ # cmd = Git::Commands::SymbolicRef::Update.new(lib)
25
+ # cmd.call('HEAD', 'refs/heads/main')
26
+ #
27
+ # @example Delete a symbolic ref
28
+ # cmd = Git::Commands::SymbolicRef::Delete.new(lib)
29
+ # cmd.call('HEAD')
30
+ #
31
+ # @see https://git-scm.com/docs/git-symbolic-ref git-symbolic-ref documentation
32
+ #
33
+ # @api private
34
+ #
35
+ module SymbolicRef
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Tag
8
+ # Implements the `git tag` command for creating new tags
9
+ #
10
+ # This command creates a new tag reference pointing at the current HEAD
11
+ # or a specified commit/object.
12
+ #
13
+ # @example Create a lightweight tag
14
+ # create = Git::Commands::Tag::Create.new(execution_context)
15
+ # create.call('v1.0.0')
16
+ #
17
+ # @example Create an annotated tag
18
+ # create = Git::Commands::Tag::Create.new(execution_context)
19
+ # create.call('v1.0.0', message: 'Release version 1.0.0')
20
+ #
21
+ # @example Create a signed tag at a specific commit
22
+ # create = Git::Commands::Tag::Create.new(execution_context)
23
+ # create.call('v1.0.0', 'abc123', sign: true, message: 'Signed release')
24
+ #
25
+ # @example Force replace an existing tag
26
+ # create = Git::Commands::Tag::Create.new(execution_context)
27
+ # create.call('v1.0.0', force: true)
28
+ #
29
+ # @note `arguments` block audited against https://git-scm.com/docs/git-tag/2.53.0
30
+ #
31
+ # @see Git::Commands::Tag
32
+ #
33
+ # @see https://git-scm.com/docs/git-tag git-tag
34
+ #
35
+ # @api private
36
+ #
37
+ class Create < Git::Commands::Base
38
+ arguments do
39
+ literal 'tag'
40
+ flag_option %i[annotate a]
41
+ flag_option %i[sign s], negatable: true
42
+ value_option %i[local_user u], inline: true
43
+ flag_option %i[force f]
44
+ value_option %i[message m], inline: true, allow_empty: true
45
+ value_option %i[file F], inline: true
46
+ flag_option %i[edit e], negatable: true
47
+ key_value_option :trailer, key_separator: ': '
48
+ value_option :cleanup, inline: true
49
+ flag_option :create_reflog
50
+
51
+ end_of_options
52
+
53
+ operand :tagname, required: true
54
+ operand :commit
55
+ end
56
+
57
+ # Executes the git tag command to create a new tag
58
+ #
59
+ # @overload call(tagname, commit = nil, **options)
60
+ #
61
+ # @param tagname [String] the name of the tag to create
62
+ #
63
+ # @param commit [String, nil] the commit, branch, or object to tag
64
+ #
65
+ # Defaults to HEAD when omitted.
66
+ #
67
+ # @param options [Hash] command options
68
+ #
69
+ # @option options [Boolean, nil] :annotate (nil) make an unsigned, annotated tag object
70
+ #
71
+ # Requires a message via `:message` or `:file`.
72
+ #
73
+ # Alias: :a
74
+ #
75
+ # @option options [Boolean, nil] :sign (nil) make a GPG-signed tag using the default signing
76
+ # key (`--sign`)
77
+ #
78
+ # Requires a message via `:message` or `:file`.
79
+ #
80
+ # Alias: :s
81
+ #
82
+ # @option options [Boolean, nil] :no_sign (nil) override `tag.gpgSign` config to disable
83
+ # signing (`--no-sign`)
84
+ #
85
+ # @option options [String] :local_user (nil) make a cryptographically signed tag using the given key
86
+ #
87
+ # Requires a message via `:message` or `:file`.
88
+ #
89
+ # Alias: :u
90
+ #
91
+ # @option options [Boolean, nil] :force (nil) replace an existing tag with the given name instead of failing
92
+ #
93
+ # Alias: :f
94
+ #
95
+ # @option options [String] :message (nil) use the given message as the tag message
96
+ #
97
+ # Implies `--annotate` if none of `--annotate`, `--sign`, or `--local-user` is given.
98
+ #
99
+ # Alias: :m
100
+ #
101
+ # @option options [String] :file (nil) take the tag message from the given file
102
+ #
103
+ # Use `-` to read from standard input. Implies `--annotate` if none of
104
+ # `--annotate`, `--sign`, or `--local-user` is given.
105
+ #
106
+ # Alias: :F
107
+ #
108
+ # @option options [Boolean, nil] :edit (nil) open an editor to further edit the tag message (`--edit`)
109
+ #
110
+ # Alias: :e
111
+ #
112
+ # @option options [Boolean, nil] :no_edit (nil) suppress the editor (`--no-edit`)
113
+ #
114
+ # @option options [Hash, Array<Array>] :trailer (nil) add trailers to the tag message
115
+ #
116
+ # Can be a Hash `{ 'Key' => 'value' }` or Array of pairs `[['Key', 'value']]`.
117
+ # Multiple trailers can be specified.
118
+ #
119
+ # @option options [String] :cleanup (nil) set how the tag message is cleaned up
120
+ #
121
+ # Must be one of: `verbatim` (no changes), `whitespace` (remove leading/trailing
122
+ # whitespace lines), or `strip` (remove whitespace and commentary). Default is `strip`.
123
+ #
124
+ # @option options [Boolean, nil] :create_reflog (nil) create a reflog for the tag
125
+ #
126
+ # Enables date-based sha1 expressions such as `tag@{yesterday}`.
127
+ #
128
+ # @return [Git::CommandLine::Result] the result of calling `git tag`
129
+ #
130
+ # @raise [ArgumentError] if unsupported options are provided
131
+ #
132
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
133
+ #
134
+ # @api public
135
+ #
136
+ def call(*, **)
137
+ super
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Tag
8
+ # Implements the `git tag --delete` command for deleting tags
9
+ #
10
+ # This command deletes one or more tag references.
11
+ #
12
+ # @example Delete a single tag
13
+ # delete = Git::Commands::Tag::Delete.new(execution_context)
14
+ # delete.call('v1.0.0')
15
+ #
16
+ # @example Delete multiple tags
17
+ # delete = Git::Commands::Tag::Delete.new(execution_context)
18
+ # delete.call('v1.0.0', 'v2.0.0')
19
+ #
20
+ # @note `arguments` block audited against https://git-scm.com/docs/git-tag/2.53.0
21
+ #
22
+ # @see Git::Commands::Tag
23
+ #
24
+ # @see https://git-scm.com/docs/git-tag git-tag
25
+ #
26
+ # @api private
27
+ #
28
+ class Delete < Git::Commands::Base
29
+ arguments do
30
+ literal 'tag'
31
+ literal '--delete'
32
+ operand :tagname, repeatable: true, required: true
33
+ end
34
+
35
+ # git tag --delete exits with status 1 when a tag does not exist, which is acceptable
36
+ allow_exit_status 0..1
37
+
38
+ # @!method call(*)
39
+ #
40
+ # @overload call(*tagname)
41
+ #
42
+ # Execute the `git tag --delete` command to delete one or more tags.
43
+ #
44
+ # @param tagname [Array<String>] one or more tag names to delete
45
+ #
46
+ # @return [Git::CommandLine::Result] the result of calling `git tag --delete`
47
+ #
48
+ # @raise [ArgumentError] if no tag names are provided
49
+ #
50
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
51
+ #
52
+ # @api public
53
+ #
54
+ end
55
+ end
56
+ end
57
+ end