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,146 @@
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 --list` command
9
+ #
10
+ # This command lists existing tags with optional filtering and sorting.
11
+ #
12
+ # @example Basic tag listing
13
+ # list = Git::Commands::Tag::List.new(execution_context)
14
+ # tags = list.call
15
+ #
16
+ # @example List tags matching a pattern
17
+ # list = Git::Commands::Tag::List.new(execution_context)
18
+ # tags = list.call('v1.*')
19
+ #
20
+ # @example List tags containing a commit
21
+ # list = Git::Commands::Tag::List.new(execution_context)
22
+ # tags = list.call(contains: 'abc123')
23
+ #
24
+ # @example List tags with multiple patterns
25
+ # list = Git::Commands::Tag::List.new(execution_context)
26
+ # tags = list.call('v1.*', 'v2.*', sort: 'version:refname')
27
+ #
28
+ # @note `arguments` block audited against https://git-scm.com/docs/git-tag/2.53.0
29
+ #
30
+ # @see Git::Commands::Tag
31
+ #
32
+ # @see https://git-scm.com/docs/git-tag git-tag
33
+ #
34
+ # @api private
35
+ #
36
+ class List < Git::Commands::Base
37
+ arguments do
38
+ literal 'tag'
39
+ literal '--list'
40
+
41
+ # Annotation display
42
+ flag_or_value_option :n, inline: true
43
+
44
+ # Output ordering and presentation
45
+ value_option :sort, inline: true, repeatable: true
46
+ flag_or_value_option :color, inline: true
47
+ flag_option %i[ignore_case i]
48
+ flag_option :omit_empty
49
+ flag_or_value_option :column, negatable: true, inline: true
50
+
51
+ # Filtering
52
+ flag_or_value_option :contains
53
+ flag_or_value_option :no_contains
54
+ flag_or_value_option :merged
55
+ flag_or_value_option :no_merged
56
+ flag_or_value_option :points_at
57
+
58
+ # Output format
59
+ value_option :format, inline: true
60
+
61
+ end_of_options
62
+ operand :pattern, repeatable: true
63
+ end
64
+
65
+ # @!method call(*pattern, **options)
66
+ #
67
+ # Execute the `git tag --list` command
68
+ #
69
+ # @param pattern [Array<String>] shell wildcard patterns to filter tags
70
+ #
71
+ # Multiple patterns can be provided; a tag is shown if it matches any pattern.
72
+ #
73
+ # @param options [Hash] command options
74
+ #
75
+ # @option options [Boolean, Integer, nil] :n (nil) number of annotation lines to print
76
+ #
77
+ # Pass `true` to print the first annotation line, or an integer to print that
78
+ # many lines. If the tag is not annotated, the commit message is displayed instead.
79
+ #
80
+ # @option options [String, Array<String>] :sort (nil) sort tags by the specified
81
+ # key(s)
82
+ #
83
+ # Prefix `-` to sort in descending order. Common keys: 'refname',
84
+ # '-refname', 'creatordate', '-creatordate', and 'version:refname'.
85
+ #
86
+ # @option options [Boolean, String, nil] :color (nil) colorize output per colors
87
+ # specified in `--format`
88
+ #
89
+ # Pass `true` for `--color`, or one of `'always'`, `'never'`, `'auto'`.
90
+ #
91
+ # @option options [Boolean, nil] :ignore_case (nil) sort and filter tags without
92
+ # case sensitivity
93
+ #
94
+ # Alias: :i
95
+ #
96
+ # @option options [Boolean, nil] :omit_empty (nil) skip trailing newlines for
97
+ # refs whose formatted output is empty
98
+ #
99
+ # @option options [Boolean, String, nil] :column (nil) display tag listing in
100
+ # columns
101
+ #
102
+ # Pass `true` for `--column` or a comma-separated options string for
103
+ # `--column=<options>`.
104
+ #
105
+ # @option options [Boolean, nil] :no_column (nil) disable column output
106
+ # (`--no-column`)
107
+ #
108
+ # @option options [Boolean, String, nil] :contains (nil) list only tags that
109
+ # contain the specified commit
110
+ #
111
+ # Pass `true` to use HEAD, or a commit reference string.
112
+ #
113
+ # @option options [Boolean, String, nil] :no_contains (nil) list only tags that do
114
+ # not contain the specified commit
115
+ #
116
+ # Pass `true` to use HEAD, or a commit reference string.
117
+ #
118
+ # @option options [Boolean, String, nil] :merged (nil) list only tags whose commits
119
+ # are reachable from the specified commit
120
+ #
121
+ # Pass `true` to use HEAD, or a commit reference string.
122
+ #
123
+ # @option options [Boolean, String, nil] :no_merged (nil) list only tags whose
124
+ # commits are not reachable from the specified commit
125
+ #
126
+ # Pass `true` to use HEAD, or a commit reference string.
127
+ #
128
+ # @option options [Boolean, String, nil] :points_at (nil) list only tags that point
129
+ # at the specified object
130
+ #
131
+ # Pass `true` to use HEAD, or an object reference string.
132
+ #
133
+ # @option options [String] :format (nil) output format string for each tag
134
+ #
135
+ # @return [Git::CommandLine::Result] the result of calling `git tag --list`
136
+ #
137
+ # @raise [ArgumentError] if unsupported options are provided
138
+ #
139
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
140
+ #
141
+ # @api public
142
+ #
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,71 @@
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 --verify` command for verifying tag signatures
9
+ #
10
+ # This command verifies the cryptographic signature of the given tag(s).
11
+ # It requires that the tags were signed with GPG or another supported
12
+ # signing backend.
13
+ #
14
+ # @example Verify a single tag
15
+ # verify = Git::Commands::Tag::Verify.new(execution_context)
16
+ # verify.call('v1.0.0')
17
+ #
18
+ # @example Verify multiple tags
19
+ # verify = Git::Commands::Tag::Verify.new(execution_context)
20
+ # verify.call('v1.0.0', 'v2.0.0')
21
+ #
22
+ # @example Verify with custom format output
23
+ # verify = Git::Commands::Tag::Verify.new(execution_context)
24
+ # verify.call('v1.0.0', format: '%(refname:short) %(contents:subject)')
25
+ #
26
+ # @note `arguments` block audited against https://git-scm.com/docs/git-tag/2.53.0
27
+ #
28
+ # @see Git::Commands::Tag
29
+ #
30
+ # @see https://git-scm.com/docs/git-tag git-tag
31
+ #
32
+ # @api private
33
+ #
34
+ class Verify < Git::Commands::Base
35
+ arguments do
36
+ literal 'tag'
37
+ literal '--verify'
38
+ value_option :format, inline: true
39
+
40
+ end_of_options
41
+
42
+ operand :tagname, repeatable: true, required: true
43
+ end
44
+
45
+ # @!method call(*tagname, **options)
46
+ #
47
+ # Execute the `git tag --verify` command to verify tag signatures
48
+ #
49
+ # @param tagname [Array<String>] one or more tag names to verify
50
+ #
51
+ # @param options [Hash] command options
52
+ #
53
+ # @option options [String] :format (nil) a format string interpolating
54
+ # `%(fieldname)` from the tag ref being shown and the object it points at
55
+ #
56
+ # The format is the same as that of git-for-each-ref(1)
57
+ #
58
+ # @return [Git::CommandLine::Result] the result of calling `git tag --verify`
59
+ #
60
+ # @raise [ArgumentError] if unsupported options are provided
61
+ #
62
+ # @raise [ArgumentError] if no tagname operands are provided
63
+ #
64
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
65
+ #
66
+ # @api public
67
+ #
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'tag/create'
4
+ require_relative 'tag/delete'
5
+ require_relative 'tag/list'
6
+ require_relative 'tag/verify'
7
+
8
+ module Git
9
+ module Commands
10
+ # Commands for managing tags via `git tag`
11
+ #
12
+ # This module contains command classes split by tag operation:
13
+ #
14
+ # - {Tag::Create} — create a new lightweight or annotated tag
15
+ # - {Tag::Delete} — delete one or more tags (`--delete`)
16
+ # - {Tag::List} — list tags with optional filtering (`--list`)
17
+ # - {Tag::Verify} — verify GPG signatures of tags (`--verify`)
18
+ #
19
+ # @see https://git-scm.com/docs/git-tag git-tag documentation
20
+ #
21
+ # @api private
22
+ #
23
+ module Tag
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module UpdateRef
8
+ # Performs batch ref updates via the `git update-ref --stdin` protocol
9
+ #
10
+ # Reads update/create/delete/verify instructions from stdin. By default
11
+ # all modifications are applied atomically — either all succeed or none do.
12
+ # Pass `batch_updates: true` to switch to non-atomic mode, where each
13
+ # instruction is applied independently and individual failures are reported
14
+ # without aborting the remaining updates (requires git 2.47+).
15
+ #
16
+ # This is the batch counterpart to the single-ref {UpdateRef::Update} and
17
+ # {UpdateRef::Delete} commands.
18
+ #
19
+ # Instructions are newline-delimited by default; pass `z: true` to switch
20
+ # to NUL-delimited format. See the
21
+ # {https://git-scm.com/docs/git-update-ref#_stdin_mode git-update-ref}
22
+ # documentation for the full instruction grammar.
23
+ #
24
+ # @example Atomically update two refs
25
+ # cmd = Git::Commands::UpdateRef::Batch.new(execution_context)
26
+ # cmd.call(
27
+ # 'update refs/heads/main newsha oldsha',
28
+ # 'delete refs/heads/old-branch'
29
+ # )
30
+ #
31
+ # @example NUL-delimited instructions
32
+ # cmd = Git::Commands::UpdateRef::Batch.new(execution_context)
33
+ # cmd.call("update refs/heads/main\0newsha\0oldsha", z: true)
34
+ #
35
+ # @example Non-atomic batch (independent failures)
36
+ # cmd = Git::Commands::UpdateRef::Batch.new(execution_context)
37
+ # cmd.call(
38
+ # 'update refs/heads/main newsha oldsha',
39
+ # 'delete refs/heads/old-branch',
40
+ # batch_updates: true
41
+ # )
42
+ #
43
+ # @note `arguments` block audited against https://git-scm.com/docs/git-update-ref/2.53.0
44
+ #
45
+ # @see Git::Commands::UpdateRef
46
+ #
47
+ # @see https://git-scm.com/docs/git-update-ref git-update-ref documentation
48
+ #
49
+ # @api private
50
+ #
51
+ class Batch < Git::Commands::Base
52
+ arguments do
53
+ literal 'update-ref'
54
+
55
+ # Reflog message appended to each update entry
56
+ value_option :m
57
+
58
+ # Overwrite refs themselves rather than following symbolic refs
59
+ flag_option :no_deref
60
+
61
+ # Read instructions from stdin
62
+ literal '--stdin'
63
+
64
+ # Use NUL-delimited input instead of newline-delimited
65
+ flag_option :z
66
+
67
+ # Allow individual updates to fail without aborting the batch
68
+ flag_option :batch_updates
69
+
70
+ execution_option :timeout
71
+
72
+ # Instructions written to stdin, not argv.
73
+ # Using skip_cli: true because these values are fed via stdin —
74
+ # git never sees them as CLI arguments so Ruby must enforce
75
+ # the constraint below.
76
+ operand :instructions, repeatable: true, skip_cli: true, required: true
77
+ end
78
+
79
+ # @overload call(*instructions, **options)
80
+ #
81
+ # Execute `git update-ref --stdin` with instructions fed via stdin
82
+ #
83
+ # @param instructions [Array<String>] one or more instruction lines
84
+ # written to stdin of the `git update-ref` process
85
+ #
86
+ # Each element is written as a separate line (or NUL-terminated
87
+ # record when `z: true`). The instruction format is documented in
88
+ # the
89
+ # {https://git-scm.com/docs/git-update-ref#_stdin_mode git-update-ref}
90
+ # man page.
91
+ #
92
+ # @param options [Hash] command options
93
+ #
94
+ # @option options [String] :m (nil) a reflog message for each
95
+ # update
96
+ #
97
+ # @option options [Boolean, nil] :no_deref (nil) overwrite refs
98
+ # themselves rather than following symbolic refs
99
+ #
100
+ # @option options [Boolean, nil] :z (nil) use NUL-delimited input
101
+ # instead of newline-delimited
102
+ #
103
+ # @option options [Boolean, nil] :batch_updates (nil) allow individual updates to fail
104
+ #
105
+ # When set, each instruction is applied independently; failed instructions are
106
+ # reported but do not abort the remaining updates. System-level failures (I/O,
107
+ # memory) still abort all updates.
108
+ #
109
+ # @option options [Numeric] :timeout (nil) abort the command after this many seconds
110
+ #
111
+ # @return [Git::CommandLine::Result] the result of calling
112
+ # `git update-ref --stdin`
113
+ #
114
+ # @raise [ArgumentError] if unsupported options are provided
115
+ #
116
+ # @raise [ArgumentError] if no instructions are provided
117
+ #
118
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
119
+ def call(*, **)
120
+ bound = args_definition.bind(*, **)
121
+ validate_version!(bound.execution_options)
122
+ with_stdin(build_stdin(bound)) do |reader|
123
+ result = @execution_context.command_capturing(
124
+ *bound, in: reader, **bound.execution_options, raise_on_failure: false
125
+ )
126
+ validate_exit_status!(result)
127
+ result
128
+ end
129
+ end
130
+
131
+ private
132
+
133
+ # Build stdin payload for `git update-ref --stdin`
134
+ #
135
+ # @param bound [Git::Commands::Arguments::Bound] bound command arguments
136
+ #
137
+ # @return [String] instruction stream with delimiter applied per `z:`
138
+ def build_stdin(bound)
139
+ delimiter = bound.z? ? "\0" : "\n"
140
+ Array(bound.instructions).map { |i| "#{i}#{delimiter}" }.join
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module UpdateRef
8
+ # Deletes a ref via `git update-ref -d`
9
+ #
10
+ # Removes the named ref after optionally verifying it still contains
11
+ # `<oldvalue>`. Follows symbolic refs by default unless `no_deref: true`
12
+ # is given.
13
+ #
14
+ # @example Delete a branch ref
15
+ # cmd = Git::Commands::UpdateRef::Delete.new(execution_context)
16
+ # cmd.call('refs/heads/old-branch')
17
+ #
18
+ # @example Delete with old-value verification
19
+ # cmd = Git::Commands::UpdateRef::Delete.new(execution_context)
20
+ # cmd.call('refs/heads/old-branch', 'expected-sha')
21
+ #
22
+ # @note `arguments` block audited against https://git-scm.com/docs/git-update-ref/2.53.0
23
+ #
24
+ # @see Git::Commands::UpdateRef
25
+ #
26
+ # @see https://git-scm.com/docs/git-update-ref git-update-ref documentation
27
+ #
28
+ # @api private
29
+ #
30
+ class Delete < Git::Commands::Base
31
+ arguments do
32
+ literal 'update-ref'
33
+
34
+ # Reflog message appended to the delete entry
35
+ value_option :m
36
+
37
+ # Overwrite the ref itself rather than following symbolic refs
38
+ flag_option :no_deref
39
+
40
+ # Delete the named ref
41
+ literal '-d'
42
+
43
+ execution_option :timeout
44
+
45
+ end_of_options
46
+
47
+ # The ref to delete (e.g. `refs/heads/old-branch`)
48
+ operand :ref, required: true
49
+
50
+ # Optional expected current value — the delete is rejected if
51
+ # the ref does not currently point to this object
52
+ operand :oldvalue
53
+ end
54
+
55
+ # @!method call(ref, oldvalue = nil, **options)
56
+ #
57
+ # Execute the `git update-ref -d` command
58
+ #
59
+ # @param ref [String] the ref to delete
60
+ # (e.g. `refs/heads/old-branch`)
61
+ #
62
+ # @param oldvalue [String, nil] (nil) expected current value of the ref
63
+ #
64
+ # When provided, the delete is rejected unless the ref currently points to this
65
+ # object.
66
+ #
67
+ # @param options [Hash] command options
68
+ #
69
+ # @option options [String] :m (nil) a reflog message for the deletion
70
+ #
71
+ # @option options [Boolean, nil] :no_deref (nil) overwrite the ref itself rather
72
+ # than following symbolic refs
73
+ #
74
+ # @option options [Numeric] :timeout (nil) abort the command after this many
75
+ # seconds
76
+ #
77
+ # @return [Git::CommandLine::Result] the result of calling `git update-ref -d`
78
+ #
79
+ # @raise [ArgumentError] if unsupported options are provided
80
+ #
81
+ # @raise [ArgumentError] if the ref operand is missing
82
+ #
83
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
84
+ #
85
+ # @api public
86
+ #
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module UpdateRef
8
+ # Updates a ref to point to a new object via `git update-ref`
9
+ #
10
+ # Stores `<newvalue>` in `<ref>`, optionally verifying that the current
11
+ # value matches `<oldvalue>` before performing the update. Follows
12
+ # symbolic refs by default unless `no_deref: true` is given.
13
+ #
14
+ # @example Update a branch ref
15
+ # cmd = Git::Commands::UpdateRef::Update.new(execution_context)
16
+ # cmd.call('refs/heads/main', 'abc1234')
17
+ #
18
+ # @example Update with old-value verification
19
+ # cmd = Git::Commands::UpdateRef::Update.new(execution_context)
20
+ # cmd.call('refs/heads/main', 'newsha', 'oldsha')
21
+ #
22
+ # @example Update with a reflog message
23
+ # cmd = Git::Commands::UpdateRef::Update.new(execution_context)
24
+ # cmd.call('refs/heads/main', 'abc1234', m: 'reset to upstream')
25
+ #
26
+ # @note `arguments` block audited against https://git-scm.com/docs/git-update-ref/2.53.0
27
+ #
28
+ # @see Git::Commands::UpdateRef
29
+ #
30
+ # @see https://git-scm.com/docs/git-update-ref git-update-ref documentation
31
+ #
32
+ # @api private
33
+ #
34
+ class Update < Git::Commands::Base
35
+ arguments do
36
+ literal 'update-ref'
37
+
38
+ # Reflog message appended to the update entry
39
+ value_option :m
40
+
41
+ # Overwrite the ref itself rather than following symbolic refs
42
+ flag_option :no_deref
43
+
44
+ # Create a reflog for the ref even if one would not ordinarily
45
+ # be created
46
+ flag_option :create_reflog
47
+
48
+ execution_option :timeout
49
+
50
+ end_of_options
51
+
52
+ # The ref to update (e.g. `refs/heads/main`)
53
+ operand :ref, required: true
54
+
55
+ # The new object name to store in the ref
56
+ operand :newvalue, required: true
57
+
58
+ # Optional expected current value — the update is rejected if
59
+ # the ref does not currently point to this object
60
+ operand :oldvalue
61
+ end
62
+
63
+ # @!method call(ref, newvalue, oldvalue = nil, **options)
64
+ #
65
+ # Execute the `git update-ref` command
66
+ #
67
+ # @param ref [String] the ref to update (e.g. `refs/heads/main`)
68
+ #
69
+ # @param newvalue [String] the new object name to store
70
+ #
71
+ # @param oldvalue [String, nil] (nil) expected current value of the ref
72
+ #
73
+ # When provided, the update is rejected unless the ref currently points to this
74
+ # object. Use 40 `"0"` characters or an empty string to assert the ref does
75
+ # not yet exist.
76
+ #
77
+ # @param options [Hash] command options
78
+ #
79
+ # @option options [String] :m (nil) a reflog message for the update
80
+ #
81
+ # @option options [Boolean, nil] :no_deref (nil) overwrite the ref itself rather
82
+ # than following symbolic refs
83
+ #
84
+ # @option options [Boolean, nil] :create_reflog (nil) create a reflog even if one
85
+ # would not ordinarily be created
86
+ #
87
+ # @option options [Numeric] :timeout (nil) abort the command after this many
88
+ # seconds
89
+ #
90
+ # @return [Git::CommandLine::Result] the result of calling `git update-ref`
91
+ #
92
+ # @raise [ArgumentError] if unsupported options are provided
93
+ #
94
+ # @raise [ArgumentError] if the ref or newvalue operand is missing
95
+ #
96
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
97
+ #
98
+ # @api public
99
+ #
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'update_ref/batch'
4
+ require_relative 'update_ref/delete'
5
+ require_relative 'update_ref/update'
6
+
7
+ module Git
8
+ module Commands
9
+ # Commands for safely updating ref values via `git update-ref`
10
+ #
11
+ # This module contains command classes split by invocation mode:
12
+ #
13
+ # - {UpdateRef::Update} — set a ref to a new value (the default mode);
14
+ # also supports verifying the old value before updating
15
+ # - {UpdateRef::Delete} — delete a ref (`-d` flag); optionally verifies
16
+ # the current value before deleting
17
+ # - {UpdateRef::Batch} — read update/create/delete/verify instructions
18
+ # from stdin (`--stdin`); all modifications are applied atomically
19
+ #
20
+ # @example Update a branch ref to a new commit SHA
21
+ # cmd = Git::Commands::UpdateRef::Update.new(lib)
22
+ # cmd.call('refs/heads/main', 'abc1234')
23
+ #
24
+ # @example Delete a ref
25
+ # cmd = Git::Commands::UpdateRef::Delete.new(lib)
26
+ # cmd.call('refs/heads/old-branch')
27
+ #
28
+ # @example Atomically update multiple refs via stdin
29
+ # cmd = Git::Commands::UpdateRef::Batch.new(execution_context)
30
+ # cmd.call(
31
+ # 'update refs/heads/main newsha oldsha',
32
+ # 'delete refs/heads/old'
33
+ # )
34
+ #
35
+ # @see https://git-scm.com/docs/git-update-ref git-update-ref documentation
36
+ #
37
+ # @api private
38
+ #
39
+ module UpdateRef
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Wrapper for the `git version` command
8
+ #
9
+ # Prints the git suite version.
10
+ #
11
+ # @example Basic usage
12
+ # version = Git::Commands::Version.new(execution_context)
13
+ # result = version.call
14
+ # result.stdout #=> "git version 2.42.0"
15
+ #
16
+ # @note `arguments` block audited against https://git-scm.com/docs/git-version/2.53.0
17
+ #
18
+ # @see Git::Commands
19
+ #
20
+ # @see https://git-scm.com/docs/git-version git-version documentation
21
+ #
22
+ # @api private
23
+ #
24
+ class Version < Git::Commands::Base
25
+ # Skip version validation for this command since this command is used to
26
+ # determine the version.
27
+ #
28
+ skip_version_validation
29
+
30
+ arguments do
31
+ execution_option :timeout
32
+ literal 'version'
33
+ flag_option :build_options
34
+ end
35
+
36
+ # @overload call(**options)
37
+ #
38
+ # Execute the `git version` command
39
+ #
40
+ # @param options [Hash] command options
41
+ #
42
+ # @option options [Numeric, nil] :timeout (nil) the number of seconds to wait
43
+ # for the command to complete; if nil, uses the global timeout from
44
+ # {Git::Config}; if 0, no timeout is enforced
45
+ #
46
+ # @option options [Boolean, nil] :build_options (nil) include build options in
47
+ # the output
48
+ #
49
+ # @return [Git::CommandLine::Result] the result of calling `git version`
50
+ #
51
+ # @raise [ArgumentError] if unsupported options are provided
52
+ #
53
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
54
+ #
55
+ # @api public
56
+ #
57
+ def call(...) = super # rubocop:disable Lint/UselessMethodDefinition
58
+ end
59
+ end
60
+ end