git 4.3.2 → 5.0.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +67 -2705
  3. data/.github/pull_request_template.md +3 -1
  4. data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
  5. data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
  6. data/.github/skills/command-implementation/REFERENCE.md +993 -0
  7. data/.github/skills/command-implementation/SKILL.md +229 -0
  8. data/.github/skills/command-test-conventions/SKILL.md +660 -0
  9. data/.github/skills/command-yard-documentation/SKILL.md +426 -0
  10. data/.github/skills/dependency-management/SKILL.md +72 -0
  11. data/.github/skills/development-workflow/SKILL.md +506 -0
  12. data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
  13. data/.github/skills/extract-facade-from-base-lib/SKILL.md +586 -0
  14. data/.github/skills/facade-implementation/REFERENCE.md +840 -0
  15. data/.github/skills/facade-implementation/SKILL.md +260 -0
  16. data/.github/skills/facade-test-conventions/SKILL.md +380 -0
  17. data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
  18. data/.github/skills/make-skill-template/SKILL.md +176 -0
  19. data/.github/skills/pr-readiness-review/SKILL.md +185 -0
  20. data/.github/skills/project-context/SKILL.md +313 -0
  21. data/.github/skills/pull-request-review/SKILL.md +168 -0
  22. data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
  23. data/.github/skills/release-management/SKILL.md +125 -0
  24. data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
  25. data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
  26. data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
  27. data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
  28. data/.github/skills/reviewing-skills/SKILL.md +189 -0
  29. data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
  30. data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
  31. data/.github/skills/test-debugging/SKILL.md +160 -0
  32. data/.github/skills/yard-documentation/SKILL.md +793 -0
  33. data/.github/workflows/continuous_integration.yml +3 -2
  34. data/.github/workflows/enforce_conventional_commits.yml +1 -1
  35. data/.github/workflows/experimental_continuous_integration.yml +2 -2
  36. data/.github/workflows/release.yml +3 -4
  37. data/.gitignore +8 -0
  38. data/.husky/pre-commit +13 -0
  39. data/.release-please-manifest.json +1 -1
  40. data/.rspec +3 -0
  41. data/.rubocop.yml +7 -3
  42. data/.rubocop_todo.yml +23 -5
  43. data/.yardopts +1 -0
  44. data/CHANGELOG.md +0 -40
  45. data/CONTRIBUTING.md +694 -53
  46. data/README.md +17 -5
  47. data/Rakefile +61 -9
  48. data/commitlint.test +4 -0
  49. data/git.gemspec +14 -8
  50. data/lib/git/args_builder.rb +0 -8
  51. data/lib/git/base.rb +486 -410
  52. data/lib/git/branch.rb +380 -43
  53. data/lib/git/branch_delete_failure.rb +31 -0
  54. data/lib/git/branch_delete_result.rb +63 -0
  55. data/lib/git/branch_info.rb +178 -0
  56. data/lib/git/branches.rb +130 -24
  57. data/lib/git/command_line/base.rb +245 -0
  58. data/lib/git/command_line/capturing.rb +249 -0
  59. data/lib/git/command_line/result.rb +96 -0
  60. data/lib/git/command_line/streaming.rb +194 -0
  61. data/lib/git/command_line.rb +43 -322
  62. data/lib/git/command_line_result.rb +4 -88
  63. data/lib/git/commands/add.rb +131 -0
  64. data/lib/git/commands/am/abort.rb +43 -0
  65. data/lib/git/commands/am/apply.rb +252 -0
  66. data/lib/git/commands/am/continue.rb +43 -0
  67. data/lib/git/commands/am/quit.rb +43 -0
  68. data/lib/git/commands/am/retry.rb +47 -0
  69. data/lib/git/commands/am/show_current_patch.rb +64 -0
  70. data/lib/git/commands/am/skip.rb +42 -0
  71. data/lib/git/commands/am.rb +33 -0
  72. data/lib/git/commands/apply.rb +237 -0
  73. data/lib/git/commands/archive/list_formats.rb +46 -0
  74. data/lib/git/commands/archive.rb +140 -0
  75. data/lib/git/commands/arguments.rb +3510 -0
  76. data/lib/git/commands/base.rb +403 -0
  77. data/lib/git/commands/branch/copy.rb +94 -0
  78. data/lib/git/commands/branch/create.rb +173 -0
  79. data/lib/git/commands/branch/delete.rb +80 -0
  80. data/lib/git/commands/branch/list.rb +162 -0
  81. data/lib/git/commands/branch/move.rb +94 -0
  82. data/lib/git/commands/branch/set_upstream.rb +86 -0
  83. data/lib/git/commands/branch/show_current.rb +49 -0
  84. data/lib/git/commands/branch/unset_upstream.rb +57 -0
  85. data/lib/git/commands/branch.rb +34 -0
  86. data/lib/git/commands/cat_file/batch.rb +364 -0
  87. data/lib/git/commands/cat_file/filtered.rb +105 -0
  88. data/lib/git/commands/cat_file/raw.rb +210 -0
  89. data/lib/git/commands/cat_file.rb +49 -0
  90. data/lib/git/commands/checkout/branch.rb +151 -0
  91. data/lib/git/commands/checkout/files.rb +115 -0
  92. data/lib/git/commands/checkout.rb +38 -0
  93. data/lib/git/commands/checkout_index.rb +105 -0
  94. data/lib/git/commands/clean.rb +100 -0
  95. data/lib/git/commands/clone.rb +240 -0
  96. data/lib/git/commands/commit.rb +272 -0
  97. data/lib/git/commands/commit_tree.rb +100 -0
  98. data/lib/git/commands/config_option_syntax/add.rb +83 -0
  99. data/lib/git/commands/config_option_syntax/get.rb +117 -0
  100. data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
  101. data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
  102. data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
  103. data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
  104. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +102 -0
  105. data/lib/git/commands/config_option_syntax/list.rb +107 -0
  106. data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
  107. data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
  108. data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
  109. data/lib/git/commands/config_option_syntax/set.rb +114 -0
  110. data/lib/git/commands/config_option_syntax/unset.rb +89 -0
  111. data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
  112. data/lib/git/commands/config_option_syntax.rb +56 -0
  113. data/lib/git/commands/describe.rb +155 -0
  114. data/lib/git/commands/diff.rb +656 -0
  115. data/lib/git/commands/diff_files.rb +518 -0
  116. data/lib/git/commands/diff_index.rb +496 -0
  117. data/lib/git/commands/fetch.rb +352 -0
  118. data/lib/git/commands/fsck.rb +136 -0
  119. data/lib/git/commands/gc.rb +132 -0
  120. data/lib/git/commands/grep.rb +338 -0
  121. data/lib/git/commands/init.rb +99 -0
  122. data/lib/git/commands/log.rb +632 -0
  123. data/lib/git/commands/ls_files.rb +191 -0
  124. data/lib/git/commands/ls_remote.rb +155 -0
  125. data/lib/git/commands/ls_tree.rb +131 -0
  126. data/lib/git/commands/maintenance/register.rb +75 -0
  127. data/lib/git/commands/maintenance/run.rb +104 -0
  128. data/lib/git/commands/maintenance/start.rb +66 -0
  129. data/lib/git/commands/maintenance/stop.rb +55 -0
  130. data/lib/git/commands/maintenance/unregister.rb +79 -0
  131. data/lib/git/commands/maintenance.rb +31 -0
  132. data/lib/git/commands/merge/abort.rb +44 -0
  133. data/lib/git/commands/merge/continue.rb +44 -0
  134. data/lib/git/commands/merge/quit.rb +46 -0
  135. data/lib/git/commands/merge/start.rb +245 -0
  136. data/lib/git/commands/merge.rb +28 -0
  137. data/lib/git/commands/merge_base.rb +86 -0
  138. data/lib/git/commands/mv.rb +77 -0
  139. data/lib/git/commands/name_rev.rb +114 -0
  140. data/lib/git/commands/pull.rb +377 -0
  141. data/lib/git/commands/push.rb +246 -0
  142. data/lib/git/commands/read_tree.rb +149 -0
  143. data/lib/git/commands/remote/add.rb +91 -0
  144. data/lib/git/commands/remote/get_url.rb +66 -0
  145. data/lib/git/commands/remote/list.rb +54 -0
  146. data/lib/git/commands/remote/prune.rb +61 -0
  147. data/lib/git/commands/remote/remove.rb +52 -0
  148. data/lib/git/commands/remote/rename.rb +69 -0
  149. data/lib/git/commands/remote/set_branches.rb +63 -0
  150. data/lib/git/commands/remote/set_head.rb +82 -0
  151. data/lib/git/commands/remote/set_url.rb +71 -0
  152. data/lib/git/commands/remote/set_url_add.rb +61 -0
  153. data/lib/git/commands/remote/set_url_delete.rb +64 -0
  154. data/lib/git/commands/remote/show.rb +71 -0
  155. data/lib/git/commands/remote/update.rb +72 -0
  156. data/lib/git/commands/remote.rb +42 -0
  157. data/lib/git/commands/repack.rb +277 -0
  158. data/lib/git/commands/reset.rb +147 -0
  159. data/lib/git/commands/rev_parse.rb +297 -0
  160. data/lib/git/commands/revert/abort.rb +45 -0
  161. data/lib/git/commands/revert/continue.rb +57 -0
  162. data/lib/git/commands/revert/quit.rb +47 -0
  163. data/lib/git/commands/revert/skip.rb +44 -0
  164. data/lib/git/commands/revert/start.rb +153 -0
  165. data/lib/git/commands/revert.rb +29 -0
  166. data/lib/git/commands/rm.rb +114 -0
  167. data/lib/git/commands/show.rb +632 -0
  168. data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
  169. data/lib/git/commands/show_ref/exists.rb +78 -0
  170. data/lib/git/commands/show_ref/list.rb +145 -0
  171. data/lib/git/commands/show_ref/verify.rb +120 -0
  172. data/lib/git/commands/show_ref.rb +42 -0
  173. data/lib/git/commands/stash/apply.rb +75 -0
  174. data/lib/git/commands/stash/branch.rb +65 -0
  175. data/lib/git/commands/stash/clear.rb +41 -0
  176. data/lib/git/commands/stash/create.rb +58 -0
  177. data/lib/git/commands/stash/drop.rb +67 -0
  178. data/lib/git/commands/stash/list.rb +39 -0
  179. data/lib/git/commands/stash/pop.rb +78 -0
  180. data/lib/git/commands/stash/push.rb +103 -0
  181. data/lib/git/commands/stash/show.rb +149 -0
  182. data/lib/git/commands/stash/store.rb +63 -0
  183. data/lib/git/commands/stash.rb +38 -0
  184. data/lib/git/commands/status.rb +169 -0
  185. data/lib/git/commands/symbolic_ref/delete.rb +68 -0
  186. data/lib/git/commands/symbolic_ref/read.rb +95 -0
  187. data/lib/git/commands/symbolic_ref/update.rb +76 -0
  188. data/lib/git/commands/symbolic_ref.rb +38 -0
  189. data/lib/git/commands/tag/create.rb +139 -0
  190. data/lib/git/commands/tag/delete.rb +55 -0
  191. data/lib/git/commands/tag/list.rb +143 -0
  192. data/lib/git/commands/tag/verify.rb +71 -0
  193. data/lib/git/commands/tag.rb +26 -0
  194. data/lib/git/commands/update_ref/batch.rb +140 -0
  195. data/lib/git/commands/update_ref/delete.rb +92 -0
  196. data/lib/git/commands/update_ref/update.rb +106 -0
  197. data/lib/git/commands/update_ref.rb +42 -0
  198. data/lib/git/commands/version.rb +52 -0
  199. data/lib/git/commands/worktree/add.rb +140 -0
  200. data/lib/git/commands/worktree/list.rb +64 -0
  201. data/lib/git/commands/worktree/lock.rb +58 -0
  202. data/lib/git/commands/worktree/management_base.rb +51 -0
  203. data/lib/git/commands/worktree/move.rb +66 -0
  204. data/lib/git/commands/worktree/prune.rb +67 -0
  205. data/lib/git/commands/worktree/remove.rb +63 -0
  206. data/lib/git/commands/worktree/repair.rb +76 -0
  207. data/lib/git/commands/worktree/unlock.rb +47 -0
  208. data/lib/git/commands/worktree.rb +43 -0
  209. data/lib/git/commands/write_tree.rb +68 -0
  210. data/lib/git/commands.rb +89 -0
  211. data/lib/git/detached_head_info.rb +54 -0
  212. data/lib/git/diff.rb +297 -7
  213. data/lib/git/diff_file_numstat_info.rb +29 -0
  214. data/lib/git/diff_file_patch_info.rb +134 -0
  215. data/lib/git/diff_file_raw_info.rb +127 -0
  216. data/lib/git/diff_info.rb +169 -0
  217. data/lib/git/diff_path_status.rb +78 -19
  218. data/lib/git/diff_result.rb +32 -0
  219. data/lib/git/diff_stats.rb +59 -14
  220. data/lib/git/dirstat_info.rb +86 -0
  221. data/lib/git/errors.rb +65 -2
  222. data/lib/git/execution_context/global.rb +56 -0
  223. data/lib/git/execution_context/repository.rb +147 -0
  224. data/lib/git/execution_context.rb +482 -0
  225. data/lib/git/file_ref.rb +74 -0
  226. data/lib/git/fsck_object.rb +9 -9
  227. data/lib/git/fsck_result.rb +1 -1
  228. data/lib/git/lib.rb +1606 -1028
  229. data/lib/git/log.rb +15 -2
  230. data/lib/git/object.rb +92 -22
  231. data/lib/git/parsers/branch.rb +224 -0
  232. data/lib/git/parsers/cat_file.rb +111 -0
  233. data/lib/git/parsers/diff.rb +585 -0
  234. data/lib/git/parsers/fsck.rb +133 -0
  235. data/lib/git/parsers/grep.rb +42 -0
  236. data/lib/git/parsers/ls_tree.rb +58 -0
  237. data/lib/git/parsers/stash.rb +208 -0
  238. data/lib/git/parsers/tag.rb +257 -0
  239. data/lib/git/remote.rb +133 -9
  240. data/lib/git/repository/branching.rb +572 -0
  241. data/lib/git/repository/committing.rb +191 -0
  242. data/lib/git/repository/configuring.rb +156 -0
  243. data/lib/git/repository/diffing.rb +775 -0
  244. data/lib/git/repository/inspecting.rb +153 -0
  245. data/lib/git/repository/logging.rb +247 -0
  246. data/lib/git/repository/merging.rb +295 -0
  247. data/lib/git/repository/object_operations.rb +1101 -0
  248. data/lib/git/repository/path_resolver.rb +207 -0
  249. data/lib/git/repository/remote_operations.rb +753 -0
  250. data/lib/git/repository/shared_private.rb +51 -0
  251. data/lib/git/repository/staging.rb +390 -0
  252. data/lib/git/repository/stashing.rb +107 -0
  253. data/lib/git/repository/status_operations.rb +180 -0
  254. data/lib/git/repository/worktree_operations.rb +159 -0
  255. data/lib/git/repository.rb +264 -1
  256. data/lib/git/stash.rb +85 -4
  257. data/lib/git/stash_info.rb +104 -0
  258. data/lib/git/stashes.rb +130 -13
  259. data/lib/git/status.rb +224 -18
  260. data/lib/git/tag_delete_failure.rb +31 -0
  261. data/lib/git/tag_delete_result.rb +63 -0
  262. data/lib/git/tag_info.rb +105 -0
  263. data/lib/git/version.rb +109 -2
  264. data/lib/git/version_constraint.rb +81 -0
  265. data/lib/git/worktree.rb +120 -5
  266. data/lib/git/worktrees.rb +107 -7
  267. data/lib/git.rb +114 -18
  268. data/redesign/1_architecture_existing.md +54 -18
  269. data/redesign/2_architecture_redesign.md +365 -46
  270. data/redesign/3_architecture_implementation.md +1451 -54
  271. data/tasks/gem_tasks.rake +4 -0
  272. data/tasks/npm_tasks.rake +7 -0
  273. data/tasks/rspec.rake +48 -0
  274. data/tasks/test.rake +13 -1
  275. data/tasks/yard.rake +34 -7
  276. metadata +349 -20
  277. data/lib/git/index.rb +0 -6
  278. data/lib/git/path.rb +0 -38
  279. data/lib/git/working_directory.rb +0 -6
  280. /data/{release-please-config.json → .release-please-config.json} +0 -0
@@ -0,0 +1,143 @@
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(*, **)
66
+ #
67
+ # Execute the git tag --list command
68
+ #
69
+ # @overload call(*pattern, **options)
70
+ #
71
+ # @param pattern [Array<String>] Shell wildcard patterns to filter tags
72
+ #
73
+ # Multiple patterns can be provided; a tag is shown if it matches any pattern.
74
+ #
75
+ # @param options [Hash] command options
76
+ #
77
+ # @option options [Boolean, Integer, nil] :n (nil) Number of annotation lines to print
78
+ #
79
+ # Pass `true` to print the first annotation line, or an integer to print that
80
+ # many lines. If the tag is not annotated, the commit message is displayed instead.
81
+ #
82
+ # @option options [String, Array<String>] :sort (nil) Sort tags by the specified
83
+ # key(s)
84
+ #
85
+ # Prefix `-` to sort in descending order. Common keys: 'refname',
86
+ # '-refname', 'creatordate', '-creatordate', 'version:refname' (for semantic
87
+ # version sorting).
88
+ #
89
+ # @option options [Boolean, String, nil] :color (nil) Colorize output per colors
90
+ # specified in `--format`
91
+ #
92
+ # Pass `true` for `--color`, or one of `'always'`, `'never'`, `'auto'`.
93
+ #
94
+ # @option options [Boolean, nil] :ignore_case (nil) Sorting and filtering tags are
95
+ # case insensitive
96
+ #
97
+ # Alias: :i
98
+ #
99
+ # @option options [Boolean, nil] :omit_empty (nil) Do not print a newline after
100
+ # formatted refs where the format expands to the empty string
101
+ #
102
+ # @option options [Boolean, String, nil] :column (nil) Display tag listing in columns
103
+ #
104
+ # Pass `true` for `--column` or a comma-separated options string
105
+ # (see `column.tag` configuration for syntax) for `--column=<options>`.
106
+ #
107
+ # @option options [Boolean, nil] :no_column (nil) disable column output (`--no-column`)
108
+ #
109
+ # @option options [Boolean, String, nil] :contains (nil) List only tags that contain the
110
+ # specified commit
111
+ #
112
+ # Pass `true` to use HEAD, or a commit reference string.
113
+ #
114
+ # @option options [Boolean, String, nil] :no_contains (nil) List only tags that don't contain
115
+ # the specified commit
116
+ #
117
+ # Pass `true` to use HEAD, or a commit reference string.
118
+ #
119
+ # @option options [Boolean, String, nil] :merged (nil) List only tags whose commits are
120
+ # reachable from the specified commit
121
+ #
122
+ # Pass `true` to use HEAD, or a commit reference string.
123
+ #
124
+ # @option options [Boolean, String, nil] :no_merged (nil) List only tags whose commits are
125
+ # not reachable from the specified commit
126
+ #
127
+ # Pass `true` to use HEAD, or a commit reference string.
128
+ #
129
+ # @option options [Boolean, String, nil] :points_at (nil) List only tags that point at the
130
+ # specified object
131
+ #
132
+ # Pass `true` to use HEAD, or an object reference string.
133
+ #
134
+ # @option options [String] :format (nil) Output format string for each tag
135
+ #
136
+ # @return [Git::CommandLineResult] the result of calling `git tag --list`
137
+ #
138
+ # @raise [Git::FailedError] if git returns a non-zero exit code
139
+ #
140
+ end
141
+ end
142
+ end
143
+ 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(*, **)
46
+ #
47
+ # Execute the git tag --verify command to verify tag signatures
48
+ #
49
+ # @overload call(*tagname, **options)
50
+ #
51
+ # @param tagname [Array<String>] one or more tag names to verify
52
+ #
53
+ # @param options [Hash] command options
54
+ #
55
+ # @option options [String] :format (nil) a format string interpolating
56
+ # `%(fieldname)` from the tag ref being shown and the object it points at
57
+ #
58
+ # The format is the same as that of git-for-each-ref(1).
59
+ #
60
+ # @return [Git::CommandLineResult] the result of calling `git tag --verify`
61
+ #
62
+ # @raise [ArgumentError] if unsupported options are provided
63
+ #
64
+ # @raise [ArgumentError] if no tagname operands are provided
65
+ #
66
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
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
+ # @api private
20
+ #
21
+ # @see https://git-scm.com/docs/git-tag git-tag documentation
22
+ #
23
+ module Tag
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,140 @@
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::CommandLineResult] 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!
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
+ def build_stdin(bound)
134
+ delimiter = bound.z? ? "\0" : "\n"
135
+ Array(bound.instructions).map { |i| "#{i}#{delimiter}" }.join
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,92 @@
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(*, **)
56
+ #
57
+ # @overload call(ref, oldvalue = nil, **options)
58
+ #
59
+ # Execute the `git update-ref -d` command
60
+ #
61
+ # @param ref [String] the ref to delete
62
+ # (e.g. `refs/heads/old-branch`)
63
+ #
64
+ # @param oldvalue [String, nil] (nil) expected current value of
65
+ # the ref
66
+ #
67
+ # When provided, the delete is rejected unless the ref
68
+ # currently points to this object.
69
+ #
70
+ # @param options [Hash] command options
71
+ #
72
+ # @option options [String] :m (nil) a reflog message for
73
+ # the deletion
74
+ #
75
+ # @option options [Boolean, nil] :no_deref (nil) overwrite the ref
76
+ # itself rather than following symbolic refs
77
+ #
78
+ # @option options [Numeric] :timeout (nil) abort the command after this many
79
+ # seconds
80
+ #
81
+ # @return [Git::CommandLineResult] the result of calling
82
+ # `git update-ref -d`
83
+ #
84
+ # @raise [ArgumentError] if unsupported options are provided
85
+ #
86
+ # @raise [ArgumentError] if the ref operand is missing
87
+ #
88
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,106 @@
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(*, **)
64
+ #
65
+ # @overload call(ref, newvalue, oldvalue = nil, **options)
66
+ #
67
+ # Execute the `git update-ref` command
68
+ #
69
+ # @param ref [String] the ref to update (e.g. `refs/heads/main`)
70
+ #
71
+ # @param newvalue [String] the new object name to store
72
+ #
73
+ # @param oldvalue [String, nil] (nil) expected current value of
74
+ # the ref
75
+ #
76
+ # When provided, the update is rejected unless the ref
77
+ # currently points to this object. Use 40 `"0"` characters
78
+ # or an empty string to assert the ref does not yet exist.
79
+ #
80
+ # @param options [Hash] command options
81
+ #
82
+ # @option options [String] :m (nil) a reflog message for
83
+ # the update
84
+ #
85
+ # @option options [Boolean, nil] :no_deref (nil) overwrite the ref
86
+ # itself rather than following symbolic refs
87
+ #
88
+ # @option options [Boolean, nil] :create_reflog (nil) create a reflog
89
+ # even if one would not ordinarily be created
90
+ #
91
+ # @option options [Numeric] :timeout (nil) abort the command after this many
92
+ # seconds
93
+ #
94
+ # @return [Git::CommandLineResult] the result of calling
95
+ # `git update-ref`
96
+ #
97
+ # @raise [ArgumentError] if unsupported options are provided
98
+ #
99
+ # @raise [ArgumentError] if the ref or newvalue operand is
100
+ # missing
101
+ #
102
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
103
+ end
104
+ end
105
+ end
106
+ 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
+ # @api private
21
+ #
22
+ # @see https://git-scm.com/docs/git-update-ref git-update-ref documentation
23
+ #
24
+ # @example Update a branch ref to a new commit SHA
25
+ # cmd = Git::Commands::UpdateRef::Update.new(lib)
26
+ # cmd.call('refs/heads/main', 'abc1234')
27
+ #
28
+ # @example Delete a ref
29
+ # cmd = Git::Commands::UpdateRef::Delete.new(lib)
30
+ # cmd.call('refs/heads/old-branch')
31
+ #
32
+ # @example Atomically update multiple refs via stdin
33
+ # cmd = Git::Commands::UpdateRef::Batch.new(execution_context)
34
+ # cmd.call(
35
+ # 'update refs/heads/main newsha oldsha',
36
+ # 'delete refs/heads/old'
37
+ # )
38
+ #
39
+ module UpdateRef
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,52 @@
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
+ literal 'version'
32
+ flag_option :build_options
33
+ end
34
+
35
+ # @!method call(*, **)
36
+ #
37
+ # @overload call(**options)
38
+ #
39
+ # Execute the `git version` command.
40
+ #
41
+ # @param options [Hash] command options
42
+ #
43
+ # @option options [Boolean, nil] :build_options (nil) include build options in the output
44
+ #
45
+ # @return [Git::CommandLineResult] the result of calling `git version`
46
+ #
47
+ # @raise [ArgumentError] if unsupported options are provided
48
+ #
49
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
50
+ end
51
+ end
52
+ end