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,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Branch
8
+ # `git branch` command for creating new branches
9
+ #
10
+ # This command creates a new branch head pointing to the current HEAD
11
+ # or a specified start point.
12
+ #
13
+ # @example Basic branch creation
14
+ # create = Git::Commands::Branch::Create.new(execution_context)
15
+ # create.call('feature-branch')
16
+ #
17
+ # @example Create branch from a specific start point
18
+ # create = Git::Commands::Branch::Create.new(execution_context)
19
+ # create.call('feature-branch', 'main')
20
+ #
21
+ # @example Force create (reset existing branch)
22
+ # create = Git::Commands::Branch::Create.new(execution_context)
23
+ # create.call('feature-branch', 'main', force: true)
24
+ #
25
+ # @example Create with upstream tracking
26
+ # create = Git::Commands::Branch::Create.new(execution_context)
27
+ # create.call('feature-branch', 'origin/main', track: true)
28
+ #
29
+ # @example Create without upstream tracking
30
+ # create = Git::Commands::Branch::Create.new(execution_context)
31
+ # create.call('feature-branch', 'origin/main', no_track: true)
32
+ #
33
+ # @example Create with inherited tracking configuration
34
+ # create = Git::Commands::Branch::Create.new(execution_context)
35
+ # create.call('feature-branch', 'origin/main', track: 'inherit')
36
+ #
37
+ # @note `arguments` block audited against https://git-scm.com/docs/git-branch/2.53.0
38
+ #
39
+ # @see Git::Commands::Branch
40
+ #
41
+ # @see https://git-scm.com/docs/git-branch git-branch
42
+ #
43
+ # @api private
44
+ #
45
+ class Create < Git::Commands::Base
46
+ arguments do
47
+ literal 'branch'
48
+ flag_or_value_option %i[track t], negatable: true, inline: true
49
+ flag_option %i[force f]
50
+ flag_option :recurse_submodules
51
+ flag_option %i[quiet q]
52
+ flag_option :create_reflog, negatable: true
53
+ end_of_options
54
+ operand :branch_name, required: true
55
+ operand :start_point
56
+ end
57
+
58
+ # @overload call(branch_name, **options)
59
+ #
60
+ # Create a new branch from the current HEAD
61
+ #
62
+ # @param branch_name [String] the name of the branch to create
63
+ #
64
+ # @param options [Hash] command options
65
+ #
66
+ # @option options [Boolean, String, nil] :track (nil) configure upstream tracking for
67
+ # the new branch
68
+ #
69
+ # - `true`: Set up tracking using the start-point branch itself (`--track`)
70
+ # - `'direct'`: Same as `true`, explicitly use start-point as upstream (`--track=direct`)
71
+ # - `'inherit'`: Copy upstream configuration from start-point branch (`--track=inherit`)
72
+ #
73
+ # Alias: :t
74
+ #
75
+ # @option options [Boolean, nil] :no_track (nil) do not set up tracking even if
76
+ # `branch.autoSetupMerge` is set (`--no-track`)
77
+ #
78
+ # @option options [Boolean, nil] :force (nil) reset the branch to start point even if
79
+ # it already exists
80
+ #
81
+ # Without this, git branch refuses to change an existing branch
82
+ #
83
+ # Alias: :f
84
+ #
85
+ # @option options [Boolean, nil] :recurse_submodules (nil) create the branch in the
86
+ # superproject and all submodules
87
+ #
88
+ # This is an experimental feature
89
+ #
90
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
91
+ #
92
+ # Alias: :q
93
+ #
94
+ # @option options [Boolean, nil] :create_reflog (nil) create the branch's reflog
95
+ # (`--create-reflog`)
96
+ #
97
+ # Enables date-based sha1 expressions such as `branch@\\{yesterday}`
98
+ # In non-bare repositories, reflogs are usually enabled by default via
99
+ # `core.logAllRefUpdates`
100
+ #
101
+ # @option options [Boolean, nil] :no_create_reflog (nil) forcibly disable the
102
+ # branch's reflog (`--no-create-reflog`)
103
+ #
104
+ # @return [Git::CommandLine::Result] the result of calling `git branch`
105
+ #
106
+ # @raise [ArgumentError] if unsupported options are provided
107
+ #
108
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
109
+ #
110
+ # @api public
111
+ #
112
+ # @overload call(branch_name, start_point, **options)
113
+ #
114
+ # Create a new branch from the specified start point
115
+ #
116
+ # @param branch_name [String] the name of the branch to create
117
+ #
118
+ # @param start_point [String, nil] the commit, branch, or tag to
119
+ # start the new branch from
120
+ #
121
+ # Can also use `<rev-A>...<rev-B>` syntax for merge base
122
+ #
123
+ # @param options [Hash] command options
124
+ #
125
+ # @option options [Boolean, String, nil] :track (nil) configure upstream tracking for
126
+ # the new branch
127
+ #
128
+ # - `true`: Set up tracking using the start-point branch itself (`--track`)
129
+ # - `'direct'`: Same as `true`, explicitly use start-point as upstream (`--track=direct`)
130
+ # - `'inherit'`: Copy upstream configuration from start-point branch (`--track=inherit`)
131
+ #
132
+ # Alias: :t
133
+ #
134
+ # @option options [Boolean, nil] :no_track (nil) do not set up tracking even if
135
+ # `branch.autoSetupMerge` is set (`--no-track`)
136
+ #
137
+ # @option options [Boolean, nil] :force (nil) reset the branch to start point even if
138
+ # it already exists
139
+ #
140
+ # Without this, git branch refuses to change an existing branch
141
+ #
142
+ # Alias: :f
143
+ #
144
+ # @option options [Boolean, nil] :recurse_submodules (nil) create the branch in the
145
+ # superproject and all submodules
146
+ #
147
+ # This is an experimental feature
148
+ #
149
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
150
+ #
151
+ # Alias: :q
152
+ #
153
+ # @option options [Boolean, nil] :create_reflog (nil) create the branch's reflog
154
+ # (`--create-reflog`)
155
+ #
156
+ # Enables date-based sha1 expressions such as `branch@\\{yesterday}`
157
+ # In non-bare repositories, reflogs are usually enabled by default via
158
+ # `core.logAllRefUpdates`
159
+ #
160
+ # @option options [Boolean, nil] :no_create_reflog (nil) forcibly disable the
161
+ # branch's reflog (`--no-create-reflog`)
162
+ #
163
+ # @return [Git::CommandLine::Result] the result of calling `git branch`
164
+ #
165
+ # @raise [ArgumentError] if unsupported options are provided
166
+ #
167
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
168
+ #
169
+ # @api public
170
+ #
171
+ def call(*, **)
172
+ super
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Branch
8
+ # Implements the `git branch --delete` command for deleting branches
9
+ #
10
+ # @example Delete a single branch
11
+ # delete = Git::Commands::Branch::Delete.new(execution_context)
12
+ # result = delete.call('feature-branch')
13
+ #
14
+ # @example Delete multiple branches
15
+ # delete = Git::Commands::Branch::Delete.new(execution_context)
16
+ # result = delete.call('branch1', 'branch2')
17
+ #
18
+ # @example Force delete (works even if not merged)
19
+ # delete = Git::Commands::Branch::Delete.new(execution_context)
20
+ # result = delete.call('feature-branch', force: true)
21
+ #
22
+ # @example Delete remote-tracking branch
23
+ # delete = Git::Commands::Branch::Delete.new(execution_context)
24
+ # result = delete.call('origin/feature', remotes: true)
25
+ #
26
+ # @note `arguments` block audited against https://git-scm.com/docs/git-branch/2.53.0
27
+ #
28
+ # @see Git::Commands::Branch
29
+ #
30
+ # @see https://git-scm.com/docs/git-branch git-branch
31
+ #
32
+ # @api private
33
+ #
34
+ class Delete < Git::Commands::Base
35
+ arguments do
36
+ literal 'branch'
37
+ literal '--delete'
38
+ flag_option %i[force f]
39
+ flag_option %i[remotes r]
40
+
41
+ end_of_options
42
+
43
+ operand :branch_name, repeatable: true, required: true
44
+ end
45
+
46
+ # git branch --delete exits 1 when one or more branches cannot be deleted
47
+ allow_exit_status 0..1
48
+
49
+ # Executes the git branch --delete command to delete branches
50
+ #
51
+ # @overload call(*branch_name, **options)
52
+ #
53
+ # @param branch_name [Array<String>] one or more branch names to delete
54
+ #
55
+ # @param options [Hash] command options
56
+ #
57
+ # @option options [Boolean, nil] :force (nil) allow deleting the branch irrespective of
58
+ # its merged status, or whether it even points to a valid commit
59
+ #
60
+ # Equivalent to the `-D` shortcut (`--delete --force`)
61
+ #
62
+ # Alias: :f
63
+ #
64
+ # @option options [Boolean, nil] :remotes (nil) delete remote-tracking branches
65
+ #
66
+ # Use this together with `--delete` to remove remote-tracking branches that no
67
+ # longer exist in the remote repository, or if `git fetch` was configured not to
68
+ # fetch them again
69
+ #
70
+ # Alias: :r
71
+ #
72
+ # @return [Git::CommandLine::Result] the result of calling `git branch --delete`
73
+ #
74
+ # @raise [ArgumentError] if no branch names are provided
75
+ #
76
+ # @raise [ArgumentError] if unsupported options are provided
77
+ #
78
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 1)
79
+ #
80
+ # @api public
81
+ #
82
+ def call(*, **)
83
+ super
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,178 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Branch
8
+ # Implements the `git branch --list` command
9
+ #
10
+ # @example Basic branch listing
11
+ # list = Git::Commands::Branch::List.new(execution_context)
12
+ # branches = list.call
13
+ #
14
+ # @example List all branches (local and remote)
15
+ # list = Git::Commands::Branch::List.new(execution_context)
16
+ # all_branches = list.call(all: true)
17
+ #
18
+ # @example List branches containing a commit
19
+ # list = Git::Commands::Branch::List.new(execution_context)
20
+ # branches = list.call(contains: 'abc123')
21
+ #
22
+ # @example List branches with patterns
23
+ # list = Git::Commands::Branch::List.new(execution_context)
24
+ # feature_branches = list.call('feature/*')
25
+ #
26
+ # @note `arguments` block audited against https://git-scm.com/docs/git-branch/2.53.0
27
+ #
28
+ # @see Git::Commands::Branch
29
+ #
30
+ # @see https://git-scm.com/docs/git-branch git-branch
31
+ #
32
+ # @api private
33
+ #
34
+ class List < Git::Commands::Base
35
+ arguments do
36
+ literal 'branch'
37
+ literal '--list'
38
+
39
+ flag_or_value_option :color, inline: true, negatable: true
40
+ flag_option %i[verbose v], max_times: 2
41
+ flag_or_value_option :abbrev, inline: true, negatable: true
42
+ flag_or_value_option :column, inline: true, negatable: true
43
+ value_option :sort, inline: true, repeatable: true
44
+ flag_or_value_option :merged
45
+ flag_or_value_option :no_merged
46
+ flag_or_value_option :contains
47
+ flag_or_value_option :no_contains
48
+ value_option :points_at
49
+ value_option :format, inline: true
50
+ flag_option %i[remotes r]
51
+ flag_option %i[all a]
52
+ flag_option %i[ignore_case i]
53
+ flag_option :omit_empty
54
+
55
+ end_of_options
56
+
57
+ operand :pattern, repeatable: true
58
+ end
59
+
60
+ # @overload call(*pattern, **options)
61
+ #
62
+ # Execute the `git branch --list` command
63
+ #
64
+ # @param pattern [Array<String>] shell wildcard patterns to filter branches
65
+ #
66
+ # If multiple patterns are given, a branch is shown if it matches any
67
+ # of the patterns
68
+ #
69
+ # @param options [Hash] command options
70
+ #
71
+ # @option options [Boolean, String, nil] :color (nil) color branches output
72
+ #
73
+ # Pass `true` for `--color` or a string (`'always'`, `'never'`,
74
+ # `'auto'`) for `--color=<when>`
75
+ #
76
+ # @option options [Boolean, nil] :no_color (nil) suppress colored output
77
+ # (`--no-color`)
78
+ #
79
+ # @option options [Boolean, Integer, nil] :verbose (nil) show sha1 and
80
+ # commit subject for each branch
81
+ #
82
+ # Pass `true` for `--verbose` (show sha1 and subject); pass `2` for
83
+ # `--verbose --verbose` (also show the linked worktree path and
84
+ # upstream branch name)
85
+ #
86
+ # Alias: :v
87
+ #
88
+ # @option options [Boolean, Integer, nil] :abbrev (nil) minimum sha1
89
+ # display length when used with verbose mode
90
+ #
91
+ # Pass an integer for `--abbrev=<n>` or `true` for `--abbrev`
92
+ # (default length)
93
+ #
94
+ # @option options [Boolean, nil] :no_abbrev (nil) show full sha1s
95
+ # (`--no-abbrev`)
96
+ #
97
+ # @option options [Boolean, String, nil] :column (nil) display branch
98
+ # listing in columns
99
+ #
100
+ # Pass `true` for `--column` or a string of options for
101
+ # `--column=<options>`
102
+ #
103
+ # Only applicable in non-verbose mode
104
+ #
105
+ # @option options [Boolean, nil] :no_column (nil) disable column output
106
+ # (`--no-column`)
107
+ #
108
+ # @option options [String, Array<String>] :sort (nil) sort branches by
109
+ # the specified key(s)
110
+ #
111
+ # Give an array to add multiple --sort options
112
+ # Prefix each key with '-' for descending order
113
+ # For example, sort: ['refname', '-committerdate']
114
+ #
115
+ # @option options [Boolean, String, nil] :merged (nil) list only branches
116
+ # merged into the specified commit
117
+ #
118
+ # Pass `true` to default to HEAD or a commit ref string to filter by
119
+ # that commit
120
+ #
121
+ # @option options [Boolean, String, nil] :no_merged (nil) list only
122
+ # branches not merged into the specified commit
123
+ #
124
+ # Pass `true` to default to HEAD or a commit ref string to filter by
125
+ # that commit
126
+ #
127
+ # @option options [Boolean, String, nil] :contains (nil) list only
128
+ # branches that contain the specified commit
129
+ #
130
+ # Pass `true` to default to HEAD or a commit ref string to filter by
131
+ # that commit
132
+ #
133
+ # @option options [Boolean, String, nil] :no_contains (nil) list only
134
+ # branches that don't contain the specified commit
135
+ #
136
+ # Pass `true` to default to HEAD or a commit ref string to filter by
137
+ # that commit
138
+ #
139
+ # @option options [String] :points_at (nil) list only branches that
140
+ # point at the specified object
141
+ #
142
+ # @option options [String] :format (nil) output format string for each
143
+ # branch
144
+ #
145
+ # @option options [Boolean, nil] :remotes (nil) list only remote-tracking
146
+ # branches
147
+ #
148
+ # Alias: :r
149
+ #
150
+ # @option options [Boolean, nil] :all (nil) list both local and remote
151
+ # branches
152
+ #
153
+ # Alias: :a
154
+ #
155
+ # @option options [Boolean, nil] :ignore_case (nil) sort and filter
156
+ # branches case insensitively
157
+ #
158
+ # Alias: :i
159
+ #
160
+ # @option options [Boolean, nil] :omit_empty (nil) do not print a
161
+ # newline after formatted refs where the format expands to the empty
162
+ # string
163
+ #
164
+ # @return [Git::CommandLine::Result] the result of calling `git branch --list`
165
+ #
166
+ # @raise [ArgumentError] if unsupported options are provided
167
+ #
168
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
169
+ #
170
+ # @api public
171
+ #
172
+ def call(*, **)
173
+ super
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Branch
8
+ # Implements the `git branch --move` command for renaming branches
9
+ #
10
+ # This command moves/renames a branch, together with its config and reflog.
11
+ # If the old branch name is omitted, renames the current branch.
12
+ #
13
+ # @example Rename the current branch
14
+ # move = Git::Commands::Branch::Move.new(execution_context)
15
+ # move.call('new-branch-name')
16
+ #
17
+ # @example Rename a specific branch
18
+ # move = Git::Commands::Branch::Move.new(execution_context)
19
+ # move.call('old-branch-name', 'new-branch-name')
20
+ #
21
+ # @example Force rename (overwrite existing branch)
22
+ # move = Git::Commands::Branch::Move.new(execution_context)
23
+ # move.call('old-branch', 'existing-branch', force: true)
24
+ #
25
+ # @note `arguments` block audited against https://git-scm.com/docs/git-branch/2.53.0
26
+ #
27
+ # @see Git::Commands::Branch
28
+ #
29
+ # @see https://git-scm.com/docs/git-branch git-branch
30
+ #
31
+ # @api private
32
+ #
33
+ class Move < Git::Commands::Base
34
+ # NOTE: The positional arguments follow Ruby semantics:
35
+ # - When one positional is provided, it fills new_branch (required)
36
+ # - When two positionals are provided, they fill old_branch and new_branch
37
+ #
38
+ # This matches the git CLI: `git branch -m [<old-branch>] <new-branch>`
39
+ arguments do
40
+ literal 'branch'
41
+ literal '--move'
42
+ flag_option %i[force f]
43
+
44
+ end_of_options
45
+
46
+ operand :old_branch
47
+ operand :new_branch, required: true
48
+ end
49
+
50
+ # Executes the git branch --move command to rename a branch
51
+ #
52
+ # @overload call(new_branch, **options)
53
+ #
54
+ # Rename the current branch to new_branch
55
+ #
56
+ # @param new_branch [String] the new name for the branch
57
+ #
58
+ # @param options [Hash] command options
59
+ #
60
+ # @option options [Boolean, nil] :force (nil) allow renaming even if new_branch already
61
+ # exists
62
+ #
63
+ # Alias: :f
64
+ #
65
+ # @return [Git::CommandLine::Result] the result of calling `git branch --move`
66
+ #
67
+ # @raise [ArgumentError] if unsupported options are provided
68
+ #
69
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
70
+ #
71
+ # @api public
72
+ #
73
+ # @overload call(old_branch, new_branch, **options)
74
+ #
75
+ # Rename old_branch to new_branch
76
+ #
77
+ # @param old_branch [String] the current name of the branch
78
+ #
79
+ # @param new_branch [String] the new name for the branch
80
+ #
81
+ # @param options [Hash] command options
82
+ #
83
+ # @option options [Boolean, nil] :force (nil) allow renaming even if new_branch already
84
+ # exists
85
+ #
86
+ # Alias: :f
87
+ #
88
+ # @return [Git::CommandLine::Result] the result of calling `git branch --move`
89
+ #
90
+ # @raise [ArgumentError] if unsupported options are provided
91
+ #
92
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
93
+ #
94
+ # @api public
95
+ #
96
+ def call(*, **)
97
+ super
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Branch
8
+ # Implements the `git branch --set-upstream-to` command for configuring upstream tracking
9
+ #
10
+ # This command sets up tracking information so the specified upstream branch is considered
11
+ # the upstream for the given branch (or current branch if not specified).
12
+ #
13
+ # @example Set upstream for current branch
14
+ # set_upstream = Git::Commands::Branch::SetUpstream.new(execution_context)
15
+ # set_upstream.call(set_upstream_to: 'origin/main')
16
+ #
17
+ # @example Set upstream for a specific branch
18
+ # set_upstream = Git::Commands::Branch::SetUpstream.new(execution_context)
19
+ # set_upstream.call('feature', set_upstream_to: 'origin/main')
20
+ #
21
+ # @note `arguments` block audited against https://git-scm.com/docs/git-branch/2.53.0
22
+ #
23
+ # @see Git::Commands::Branch
24
+ #
25
+ # @see https://git-scm.com/docs/git-branch git-branch
26
+ #
27
+ # @api private
28
+ #
29
+ class SetUpstream < Git::Commands::Base
30
+ # NOTE: The set_upstream_to option maps to git's --set-upstream-to=<upstream> syntax.
31
+ # The branch_name positional is optional; if omitted, git uses the current branch.
32
+ # The set_upstream_to keyword is required by the Ruby method signature, not the DSL.
33
+ arguments do
34
+ literal 'branch'
35
+ value_option %i[set_upstream_to u], inline: true, required: true, allow_nil: false
36
+
37
+ end_of_options
38
+
39
+ operand :branch_name
40
+ end
41
+
42
+ # @!method call(*)
43
+ #
44
+ # @overload call(**options)
45
+ #
46
+ # Set upstream for the current branch
47
+ #
48
+ # @param options [Hash] command options
49
+ #
50
+ # @option options [String] :set_upstream_to (required)
51
+ # upstream branch to set (e.g., `origin/main`)
52
+ #
53
+ # Alias: :u
54
+ #
55
+ # @return [Git::CommandLine::Result] the result of calling `git branch --set-upstream-to`
56
+ #
57
+ # @raise [ArgumentError] if set_upstream_to is not provided
58
+ #
59
+ # @raise [ArgumentError] if unsupported options are provided
60
+ #
61
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
62
+ #
63
+ # @overload call(branch_name, **options)
64
+ #
65
+ # Set upstream for the specified branch
66
+ #
67
+ # @param branch_name [String] the branch to set upstream for
68
+ #
69
+ # @param options [Hash] command options
70
+ #
71
+ # @option options [String] :set_upstream_to (required)
72
+ # upstream branch to set (e.g., `origin/main`)
73
+ #
74
+ # Alias: :u
75
+ #
76
+ # @return [Git::CommandLine::Result] the result of calling `git branch --set-upstream-to`
77
+ #
78
+ # @raise [ArgumentError] if set_upstream_to is not provided
79
+ #
80
+ # @raise [ArgumentError] if unsupported options are provided
81
+ #
82
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Branch
8
+ # Implements the `git branch --show-current` command
9
+ #
10
+ # Prints the name of the current branch. In detached HEAD state, nothing
11
+ # is printed.
12
+ #
13
+ # @example Print the current branch name
14
+ # show_current = Git::Commands::Branch::ShowCurrent.new(execution_context)
15
+ # result = show_current.call
16
+ # puts result.stdout # => "main\n"
17
+ #
18
+ # @example Check for detached HEAD state
19
+ # show_current = Git::Commands::Branch::ShowCurrent.new(execution_context)
20
+ # result = show_current.call
21
+ # # result.stdout is empty ("") when in detached HEAD state
22
+ #
23
+ # @note `arguments` block audited against https://git-scm.com/docs/git-branch/2.53.0
24
+ #
25
+ # @see Git::Commands::Branch
26
+ #
27
+ # @see https://git-scm.com/docs/git-branch git-branch
28
+ #
29
+ # @api private
30
+ #
31
+ class ShowCurrent < Git::Commands::Base
32
+ arguments do
33
+ literal 'branch'
34
+ literal '--show-current'
35
+ end
36
+
37
+ # @!method call(*)
38
+ #
39
+ # @overload call()
40
+ #
41
+ # Execute the `git branch --show-current` command
42
+ #
43
+ # @return [Git::CommandLine::Result] the result of calling `git branch --show-current`
44
+ #
45
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
46
+ end
47
+ end
48
+ end
49
+ end