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,169 @@
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(*, **)
81
+ #
82
+ # @overload call(*pathspecs, **options)
83
+ #
84
+ # Execute the git status command
85
+ #
86
+ # @param pathspecs [Array<String>] limit output to the named paths
87
+ #
88
+ # @param options [Hash] command options
89
+ #
90
+ # @option options [Boolean, nil] :short (nil) give output in short format
91
+ #
92
+ # Alias: :s
93
+ #
94
+ # @option options [Boolean, nil] :branch (nil) show the branch and tracking info
95
+ # even in short-format
96
+ #
97
+ # Alias: :b
98
+ #
99
+ # @option options [Boolean, nil] :show_stash (nil) show the number of entries
100
+ # currently stashed away
101
+ #
102
+ # @option options [Boolean, String, nil] :porcelain (nil) give the output in an
103
+ # easy-to-parse format for scripts
104
+ #
105
+ # When `true`, gives porcelain format. When a string (e.g. `'v1'`, `'v2'`),
106
+ # gives the specified porcelain format version.
107
+ #
108
+ # @option options [Boolean, nil] :long (nil) give output in long format (the default)
109
+ #
110
+ # @option options [Boolean, nil] :verbose (nil) in addition to names of files that
111
+ # have been changed, also show the textual changes that are staged
112
+ #
113
+ # Alias: :v
114
+ #
115
+ # @option options [Boolean, String, nil] :untracked_files (nil) show untracked files
116
+ #
117
+ # Mode can be `'no'`, `'normal'`, or `'all'`. When `true`, uses the default
118
+ # mode.
119
+ #
120
+ # Alias: :u
121
+ #
122
+ # @option options [Boolean, String, nil] :ignore_submodules (nil) ignore changes
123
+ # to submodules
124
+ #
125
+ # Mode can be `'none'`, `'untracked'`, `'dirty'`, or `'all'`.
126
+ #
127
+ # @option options [Boolean, String, nil] :ignored (nil) show ignored files as well
128
+ #
129
+ # Mode can be `'traditional'`, `'no'`, or `'matching'`.
130
+ #
131
+ # @option options [Boolean, nil] :z (nil) terminate entries with NUL instead of
132
+ # newline (`-z`)
133
+ #
134
+ # Implies `--porcelain=v1`
135
+ #
136
+ # @option options [Boolean, String, nil] :column (nil) display untracked files in
137
+ # columns (`--column`)
138
+ #
139
+ # Pass `true` for `--column` or a string of options for `--column=<options>`.
140
+ #
141
+ # @option options [Boolean, nil] :no_column (nil) disable column output (`--no-column`)
142
+ #
143
+ # @option options [Boolean, nil] :ahead_behind (nil) show ahead/behind counts for
144
+ # the branch (`--ahead-behind`)
145
+ #
146
+ # @option options [Boolean, nil] :no_ahead_behind (nil) suppress ahead/behind counts
147
+ # for the branch (`--no-ahead-behind`)
148
+ #
149
+ # @option options [Boolean, nil] :renames (nil) turn on rename detection (`--renames`)
150
+ #
151
+ # @option options [Boolean, nil] :no_renames (nil) turn off rename detection
152
+ # (`--no-renames`)
153
+ #
154
+ # @option options [Boolean, String, nil] :find_renames (nil) turn on rename detection
155
+ # with optional similarity threshold
156
+ #
157
+ # When `true`, enables rename detection without a threshold. When a string
158
+ # (e.g. `'50'`), adds `--find-renames=<n>`.
159
+ #
160
+ # @return [Git::CommandLineResult] the result of calling `git status`
161
+ #
162
+ # @raise [ArgumentError] if unsupported options are provided
163
+ #
164
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
165
+ #
166
+ # @api public
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,68 @@
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
+ # @!method call(*, **)
42
+ #
43
+ # @overload call(name, **options)
44
+ #
45
+ # Execute the `git symbolic-ref --delete` command
46
+ #
47
+ # @param name [String] the symbolic ref name to delete
48
+ # (e.g. `HEAD`)
49
+ #
50
+ # @param options [Hash] command options
51
+ #
52
+ # @option options [Boolean, nil] :quiet (nil) suppress error message
53
+ # when the name is not a symbolic ref
54
+ #
55
+ # Alias: :q
56
+ #
57
+ # @return [Git::CommandLineResult] the result of calling
58
+ # `git symbolic-ref --delete`
59
+ #
60
+ # @raise [ArgumentError] if unsupported options are provided
61
+ #
62
+ # @raise [ArgumentError] if the name operand is missing
63
+ #
64
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,95 @@
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
+ # @!method call(*, **)
60
+ #
61
+ # @overload call(name, **options)
62
+ #
63
+ # Execute the `git symbolic-ref` command to read a symbolic ref
64
+ #
65
+ # @param name [String] the symbolic ref name to read
66
+ # (e.g. `HEAD`)
67
+ #
68
+ # @param options [Hash] command options
69
+ #
70
+ # @option options [Boolean, nil] :quiet (nil) suppress error message
71
+ # when the name is not a symbolic ref
72
+ #
73
+ # Alias: :q
74
+ #
75
+ # @option options [Boolean, nil] :short (nil) shorten the ref output
76
+ # (e.g. `refs/heads/main` → `main`)
77
+ #
78
+ # @option options [Boolean, nil] :recurse (nil) follow chain of symbolic refs
79
+ # until result no longer points at a symbolic ref (`--recurse`)
80
+ #
81
+ # @option options [Boolean, nil] :no_recurse (nil) stop after a single level
82
+ # of dereferencing (`--no-recurse`)
83
+ #
84
+ # @return [Git::CommandLineResult] the result of calling
85
+ # `git symbolic-ref`
86
+ #
87
+ # @raise [ArgumentError] if unsupported options are provided
88
+ #
89
+ # @raise [ArgumentError] if the name operand is missing
90
+ #
91
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,76 @@
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
+ # @!method call(*, **)
46
+ #
47
+ # @overload call(name, ref, **options)
48
+ #
49
+ # Execute the `git symbolic-ref` command to create or update a
50
+ # symbolic ref
51
+ #
52
+ # @param name [String] the symbolic ref name to update
53
+ # (e.g. `HEAD`)
54
+ #
55
+ # @param ref [String] the target ref to point to
56
+ # (e.g. `refs/heads/main`)
57
+ #
58
+ # @param options [Hash] command options
59
+ #
60
+ # @option options [String] :m (nil) a reflog message for
61
+ # the update
62
+ #
63
+ # @return [Git::CommandLineResult] the result of calling
64
+ # `git symbolic-ref`
65
+ #
66
+ # @raise [ArgumentError] if unsupported options are provided
67
+ #
68
+ # @raise [ArgumentError] if the name operand is missing
69
+ #
70
+ # @raise [ArgumentError] if the ref operand is missing
71
+ #
72
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
73
+ end
74
+ end
75
+ end
76
+ 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
+ # @api private
20
+ #
21
+ # @see https://git-scm.com/docs/git-symbolic-ref git-symbolic-ref documentation
22
+ #
23
+ # @example Read the current HEAD
24
+ # cmd = Git::Commands::SymbolicRef::Read.new(lib)
25
+ # cmd.call('HEAD')
26
+ #
27
+ # @example Update HEAD to point to a branch
28
+ # cmd = Git::Commands::SymbolicRef::Update.new(lib)
29
+ # cmd.call('HEAD', 'refs/heads/main')
30
+ #
31
+ # @example Delete a symbolic ref
32
+ # cmd = Git::Commands::SymbolicRef::Delete.new(lib)
33
+ # cmd.call('HEAD')
34
+ #
35
+ module SymbolicRef
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,139 @@
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
+ # @!method call(*, **)
58
+ #
59
+ # Execute the git tag command to create a new tag
60
+ #
61
+ # @overload call(tagname, commit = nil, **options)
62
+ #
63
+ # @param tagname [String] the name of the tag to create
64
+ #
65
+ # @param commit [String, nil] the commit, branch, or object to tag
66
+ #
67
+ # Defaults to HEAD when omitted.
68
+ #
69
+ # @param options [Hash] command options
70
+ #
71
+ # @option options [Boolean, nil] :annotate (nil) make an unsigned, annotated tag object
72
+ #
73
+ # Requires a message via `:message` or `:file`.
74
+ #
75
+ # Alias: :a
76
+ #
77
+ # @option options [Boolean, nil] :sign (nil) make a GPG-signed tag using the default signing
78
+ # key (`--sign`)
79
+ #
80
+ # Requires a message via `:message` or `:file`.
81
+ #
82
+ # Alias: :s
83
+ #
84
+ # @option options [Boolean, nil] :no_sign (nil) override `tag.gpgSign` config to disable
85
+ # signing (`--no-sign`)
86
+ #
87
+ # @option options [String] :local_user (nil) make a cryptographically signed tag using the given key
88
+ #
89
+ # Requires a message via `:message` or `:file`.
90
+ #
91
+ # Alias: :u
92
+ #
93
+ # @option options [Boolean, nil] :force (nil) replace an existing tag with the given name instead of failing
94
+ #
95
+ # Alias: :f
96
+ #
97
+ # @option options [String] :message (nil) use the given message as the tag message
98
+ #
99
+ # Implies `--annotate` if none of `--annotate`, `--sign`, or `--local-user` is given.
100
+ #
101
+ # Alias: :m
102
+ #
103
+ # @option options [String] :file (nil) take the tag message from the given file
104
+ #
105
+ # Use `-` to read from standard input. Implies `--annotate` if none of
106
+ # `--annotate`, `--sign`, or `--local-user` is given.
107
+ #
108
+ # Alias: :F
109
+ #
110
+ # @option options [Boolean, nil] :edit (nil) open an editor to further edit the tag message (`--edit`)
111
+ #
112
+ # Alias: :e
113
+ #
114
+ # @option options [Boolean, nil] :no_edit (nil) suppress the editor (`--no-edit`)
115
+ #
116
+ # @option options [Hash, Array<Array>] :trailer (nil) add trailers to the tag message
117
+ #
118
+ # Can be a Hash `{ 'Key' => 'value' }` or Array of pairs `[['Key', 'value']]`.
119
+ # Multiple trailers can be specified.
120
+ #
121
+ # @option options [String] :cleanup (nil) set how the tag message is cleaned up
122
+ #
123
+ # Must be one of: `verbatim` (no changes), `whitespace` (remove leading/trailing
124
+ # whitespace lines), or `strip` (remove whitespace and commentary). Default is `strip`.
125
+ #
126
+ # @option options [Boolean, nil] :create_reflog (nil) create a reflog for the tag
127
+ #
128
+ # Enables date-based sha1 expressions such as `tag@{yesterday}`.
129
+ #
130
+ # @return [Git::CommandLineResult] the result of calling `git tag`
131
+ #
132
+ # @raise [ArgumentError] if unsupported options are provided
133
+ #
134
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
135
+ #
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,55 @@
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::CommandLineResult] the result of calling `git tag --delete`
47
+ #
48
+ # @raise [ArgumentError] if no tag names are provided or unsupported options are provided
49
+ #
50
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
51
+ #
52
+ end
53
+ end
54
+ end
55
+ end