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,246 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git push` command
8
+ #
9
+ # Updates remote refs using local refs, while sending objects necessary to
10
+ # complete the given refs.
11
+ #
12
+ # @example Push to the default remote
13
+ # push = Git::Commands::Push.new(execution_context)
14
+ # push.call
15
+ #
16
+ # @example Push to a named remote
17
+ # push = Git::Commands::Push.new(execution_context)
18
+ # push.call('origin')
19
+ #
20
+ # @example Push a specific branch to a remote
21
+ # push = Git::Commands::Push.new(execution_context)
22
+ # push.call('origin', 'main')
23
+ #
24
+ # @example Force push to a remote branch
25
+ # push = Git::Commands::Push.new(execution_context)
26
+ # push.call('origin', 'main', force: true)
27
+ #
28
+ # @example Push with a server-side option
29
+ # push = Git::Commands::Push.new(execution_context)
30
+ # push.call('origin', push_option: 'ci.skip')
31
+ #
32
+ # @example Push all tags to a remote
33
+ # push = Git::Commands::Push.new(execution_context)
34
+ # push.call('origin', tags: true)
35
+ #
36
+ # @note `arguments` block audited against https://git-scm.com/docs/git-push/2.53.0
37
+ #
38
+ # @see https://git-scm.com/docs/git-push git-push
39
+ #
40
+ # @see Git::Commands
41
+ #
42
+ # @api private
43
+ #
44
+ class Push < Git::Commands::Base
45
+ arguments do
46
+ literal 'push'
47
+
48
+ # Push scope (SYNOPSIS order: [--all | --branches | --mirror | --tags])
49
+ flag_option %i[all branches]
50
+ flag_option :mirror
51
+ flag_option :tags
52
+ flag_option :follow_tags, negatable: true
53
+ flag_option :atomic, negatable: true
54
+
55
+ # Transfer options
56
+ flag_option %i[dry_run n]
57
+ flag_option :porcelain
58
+ value_option %i[receive_pack exec], inline: true
59
+ value_option :repo, inline: true
60
+
61
+ # Safety
62
+ flag_option %i[force f]
63
+ flag_option %i[delete d]
64
+ flag_option :prune
65
+
66
+ # Output verbosity
67
+ flag_option %i[quiet q]
68
+ flag_option %i[verbose v]
69
+
70
+ # Tracking
71
+ flag_option %i[set_upstream u]
72
+
73
+ # Push options (server-side)
74
+ value_option %i[push_option o], repeatable: true, inline: true
75
+
76
+ # GPG signing
77
+ flag_or_value_option :signed,
78
+ negatable: true, inline: true
79
+
80
+ # Force safety
81
+ flag_or_value_option :force_with_lease,
82
+ negatable: true, inline: true
83
+ flag_option :force_if_includes, negatable: true
84
+
85
+ # Hooks
86
+ flag_option :verify, negatable: true
87
+
88
+ # Submodules
89
+ flag_or_value_option :recurse_submodules,
90
+ negatable: true, inline: true, type: String
91
+
92
+ # Transfer
93
+ flag_option :thin, negatable: true
94
+ flag_option :progress
95
+
96
+ # Protocol and connectivity
97
+ flag_option %i[ipv4 4]
98
+ flag_option %i[ipv6 6]
99
+
100
+ # Execution options (not emitted as CLI flags)
101
+ execution_option :timeout
102
+
103
+ end_of_options
104
+
105
+ operand :repository
106
+ operand :refspec, repeatable: true
107
+ end
108
+
109
+ # @!method call(*, **)
110
+ #
111
+ # Execute the `git push` command
112
+ #
113
+ # @overload call(repository = nil, *refspecs, **options)
114
+ #
115
+ # @param repository [String, nil] The remote name or URL to push to
116
+ #
117
+ # When nil, git uses the default remote configured for the current branch.
118
+ #
119
+ # @param refspecs [Array<String>] Zero or more refspecs specifying which refs to push
120
+ #
121
+ # Each may be a branch name or a full refspec pattern such as
122
+ # `refs/heads/main:refs/heads/main`. When no refspecs are given, git uses
123
+ # the push configuration for the current branch.
124
+ #
125
+ # @param options [Hash] command options
126
+ #
127
+ # @option options [Boolean, nil] :all (nil) push all branches
128
+ #
129
+ # Alias: :branches
130
+ #
131
+ # @option options [Boolean, nil] :mirror (nil) push all refs under `refs/` to the remote
132
+ #
133
+ # @option options [Boolean, nil] :tags (nil) push all refs under `refs/tags/`
134
+ #
135
+ # @option options [Boolean, nil] :follow_tags (nil) push reachable annotated tags (`--follow-tags`)
136
+ #
137
+ # @option options [Boolean, nil] :no_follow_tags (nil) do not push reachable annotated tags
138
+ # (`--no-follow-tags`)
139
+ #
140
+ # @option options [Boolean, nil] :atomic (nil) use an atomic transaction to update remote refs (`--atomic`)
141
+ #
142
+ # @option options [Boolean, nil] :no_atomic (nil) disable atomic transaction for remote updates
143
+ # (`--no-atomic`)
144
+ #
145
+ # @option options [Boolean, nil] :dry_run (nil) do not send updates, only report what would be pushed
146
+ #
147
+ # Alias: :n
148
+ #
149
+ # @option options [Boolean, nil] :porcelain (nil) produce machine-readable output
150
+ #
151
+ # @option options [String] :receive_pack (nil) path to the git-receive-pack program on the remote end
152
+ #
153
+ # Alias: :exec
154
+ #
155
+ # @option options [String] :repo (nil) use this repository instead of the
156
+ # positional repository argument
157
+ #
158
+ # Equivalent to the positional `<repository>` argument. If both are given, the
159
+ # positional argument takes precedence.
160
+ #
161
+ # @option options [Boolean, nil] :force (nil) force updates, overriding the fast-forward check
162
+ #
163
+ # Alias: :f
164
+ #
165
+ # @option options [Boolean, nil] :delete (nil) delete all listed refs from the remote repository
166
+ #
167
+ # Alias: :d
168
+ #
169
+ # @option options [Boolean, nil] :prune (nil) remove remote branches that have no local counterpart
170
+ #
171
+ # @option options [Boolean, nil] :quiet (nil) suppress all output
172
+ #
173
+ # Alias: :q
174
+ #
175
+ # @option options [Boolean, nil] :verbose (nil) run verbosely
176
+ #
177
+ # Alias: :v
178
+ #
179
+ # @option options [Boolean, nil] :set_upstream (nil) set upstream tracking for each successfully pushed branch
180
+ #
181
+ # Alias: :u
182
+ #
183
+ # @option options [String, Array<String>] :push_option (nil) transmit one or more server-side options
184
+ #
185
+ # Repeatable. Each occurrence emits a separate `--push-option=<value>` flag.
186
+ #
187
+ # Alias: :o
188
+ #
189
+ # @option options [Boolean, String, nil] :signed (nil) GPG-sign the push certificate (`--signed`)
190
+ #
191
+ # When a String (`'true'`, `'false'`, `'if-asked'`), emits `--signed=<value>`.
192
+ #
193
+ # @option options [Boolean, nil] :no_signed (nil) disable GPG signing of the push certificate (`--no-signed`)
194
+ #
195
+ # @option options [Boolean, String, nil] :force_with_lease (nil) refuse force pushes unless the
196
+ # remote ref matches the expected value (`--force-with-lease`)
197
+ #
198
+ # When a String (e.g. `'main:abc123'`), emits `--force-with-lease=<string>`.
199
+ #
200
+ # @option options [Boolean, nil] :no_force_with_lease (nil) disable force-with-lease (`--no-force-with-lease`)
201
+ #
202
+ # @option options [Boolean, nil] :force_if_includes (nil) force pushes only if commits being
203
+ # pushed are already in the remote-tracking branch (`--force-if-includes`)
204
+ #
205
+ # @option options [Boolean, nil] :no_force_if_includes (nil) disable force-if-includes
206
+ # (`--no-force-if-includes`)
207
+ #
208
+ # @option options [Boolean, nil] :verify (nil) run the pre-push hook (`--verify`)
209
+ #
210
+ # @option options [Boolean, nil] :no_verify (nil) bypass the pre-push hook (`--no-verify`)
211
+ #
212
+ # @option options [String] :recurse_submodules (nil) control whether submodule
213
+ # commits are pushed
214
+ #
215
+ # Pass a String (`'check'`, `'on-demand'`, `'only'`, `'no'`) to emit
216
+ # `--recurse-submodules=<value>`. Note: passing `true` is not valid; git requires
217
+ # an explicit value for this option.
218
+ #
219
+ # @option options [Boolean, nil] :no_recurse_submodules (nil) disable submodule push
220
+ # (`--no-recurse-submodules`)
221
+ #
222
+ # @option options [Boolean, nil] :thin (nil) send a "thin" pack to reduce network traffic (`--thin`)
223
+ #
224
+ # @option options [Boolean, nil] :no_thin (nil) send a full pack instead of a thin pack (`--no-thin`)
225
+ #
226
+ # @option options [Boolean, nil] :progress (nil) force progress reporting even when stderr is not a terminal
227
+ #
228
+ # @option options [Boolean, nil] :ipv4 (nil) use IPv4 addresses only
229
+ #
230
+ # Alias: :"4"
231
+ #
232
+ # @option options [Boolean, nil] :ipv6 (nil) use IPv6 addresses only
233
+ #
234
+ # Alias: :"6"
235
+ #
236
+ # @option options [Integer] :timeout (nil) maximum seconds to wait for the command to complete
237
+ #
238
+ # @return [Git::CommandLineResult] the result of calling `git push`
239
+ #
240
+ # @raise [ArgumentError] if unsupported options are provided
241
+ #
242
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
243
+ #
244
+ end
245
+ end
246
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git read-tree` command
8
+ #
9
+ # Reads tree information into the index. Optionally performs a merge
10
+ # (single-tree, two-way fast-forward, or three-way) with the `-m` flag,
11
+ # and updates the working tree files with `-u`.
12
+ #
13
+ # @example Read a single tree into the index
14
+ # read_tree = Git::Commands::ReadTree.new(execution_context)
15
+ # result = read_tree.call('HEAD')
16
+ #
17
+ # @example Read a tree under a prefix directory
18
+ # read_tree = Git::Commands::ReadTree.new(execution_context)
19
+ # result = read_tree.call('HEAD', prefix: 'subdir/')
20
+ #
21
+ # @example Perform a three-way merge
22
+ # read_tree = Git::Commands::ReadTree.new(execution_context)
23
+ # result = read_tree.call('base', 'ours', 'theirs', m: true, u: true)
24
+ #
25
+ # @example Empty the index
26
+ # read_tree = Git::Commands::ReadTree.new(execution_context)
27
+ # result = read_tree.call(empty: true)
28
+ #
29
+ # @note `arguments` block audited against https://git-scm.com/docs/git-read-tree/2.53.0
30
+ #
31
+ # @see https://git-scm.com/docs/git-read-tree git-read-tree
32
+ #
33
+ # @see Git::Commands
34
+ #
35
+ # @api private
36
+ #
37
+ class ReadTree < Git::Commands::Base
38
+ arguments do
39
+ literal 'read-tree'
40
+
41
+ # Merge mode
42
+ flag_option :m
43
+ flag_option :trivial
44
+ flag_option :aggressive
45
+ flag_option :reset
46
+ value_option :prefix, inline: true
47
+
48
+ # Working tree update
49
+ flag_option :u
50
+ flag_option :i
51
+
52
+ # Dry run and progress
53
+ flag_option %i[dry_run n]
54
+ flag_option :v
55
+
56
+ # Filtering and output
57
+ value_option :index_output, inline: true
58
+ flag_option :recurse_submodules, negatable: true
59
+ flag_option :no_sparse_checkout
60
+ flag_option :empty
61
+
62
+ # Feedback control
63
+ flag_option %i[quiet q]
64
+
65
+ end_of_options
66
+
67
+ operand :tree_ish, repeatable: true
68
+ end
69
+
70
+ # @!method call(*, **)
71
+ #
72
+ # @overload call(*tree_ish, **options)
73
+ #
74
+ # Execute the `git read-tree` command
75
+ #
76
+ # @param tree_ish [Array<String>] zero or more tree-ish objects to
77
+ # read into the index
78
+ #
79
+ # Pass one tree-ish for a simple read or single-tree merge, two
80
+ # for a fast-forward (two-way) merge, or three for a three-way
81
+ # merge. Omit when using the `:empty` option.
82
+ #
83
+ # @param options [Hash] command options
84
+ #
85
+ # @option options [Boolean, nil] :m (nil) perform a merge, not just a
86
+ # read
87
+ #
88
+ # @option options [Boolean, nil] :trivial (nil) restrict three-way merge
89
+ # to happen only if there is no file-level merging required
90
+ #
91
+ # @option options [Boolean, nil] :aggressive (nil) resolve a few more
92
+ # three-way merge cases internally beyond the trivial defaults
93
+ #
94
+ # @option options [Boolean, nil] :reset (nil) same as `-m`, except that
95
+ # unmerged entries are discarded instead of failing
96
+ #
97
+ # @option options [String] :prefix (nil) keep the current index
98
+ # contents, and read the named tree-ish under the directory at
99
+ # the given prefix
100
+ #
101
+ # Maps to `--prefix=<prefix>`.
102
+ #
103
+ # @option options [Boolean, nil] :u (nil) after a successful merge,
104
+ # update the files in the work tree with the result
105
+ #
106
+ # @option options [Boolean, nil] :i (nil) disable the check with the
107
+ # working tree, meant for creating a merge of trees not directly
108
+ # related to the current working tree status
109
+ #
110
+ # @option options [Boolean, nil] :dry_run (nil) check if the command
111
+ # would error out, without updating the index or files for real
112
+ #
113
+ # Alias: `:n`
114
+ #
115
+ # @option options [Boolean, nil] :v (nil) show the progress of checking
116
+ # files out
117
+ #
118
+ # @option options [String] :index_output (nil) write the resulting
119
+ # index in the named file instead of `$GIT_INDEX_FILE`
120
+ #
121
+ # Maps to `--index-output=<file>`.
122
+ #
123
+ # @option options [Boolean, nil] :recurse_submodules (nil) update the
124
+ # content of all active submodules according to the commit
125
+ # recorded in the superproject (`--recurse-submodules`)
126
+ #
127
+ # @option options [Boolean, nil] :no_recurse_submodules (nil) disable
128
+ # recursive submodule update (`--no-recurse-submodules`)
129
+ #
130
+ # @option options [Boolean, nil] :no_sparse_checkout (nil) disable
131
+ # sparse checkout support even if `core.sparseCheckout` is true
132
+ #
133
+ # @option options [Boolean, nil] :empty (nil) empty the index instead of
134
+ # reading tree object(s)
135
+ #
136
+ # @option options [Boolean, nil] :quiet (nil) suppress feedback messages
137
+ #
138
+ # Alias: `:q`
139
+ #
140
+ # @return [Git::CommandLineResult] the result of calling
141
+ # `git read-tree`
142
+ #
143
+ # @raise [ArgumentError] if unsupported options are provided
144
+ #
145
+ # @raise [Git::FailedError] if git exits with a non-zero exit
146
+ # status
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Remote
8
+ # `git remote add` command
9
+ #
10
+ # Adds a new remote to the repository, associating a name with a URL and
11
+ # configuring how tracking branches and tags are handled.
12
+ #
13
+ # @example Add a remote with a name and URL
14
+ # add = Git::Commands::Remote::Add.new(execution_context)
15
+ # add.call('origin', 'https://example.com/repo.git')
16
+ #
17
+ # @example Add a remote and immediately fetch
18
+ # add = Git::Commands::Remote::Add.new(execution_context)
19
+ # add.call('upstream', 'https://example.com/upstream.git', fetch: true)
20
+ #
21
+ # @example Track a specific branch and disable tag import
22
+ # add = Git::Commands::Remote::Add.new(execution_context)
23
+ # add.call('origin', 'https://example.com/repo.git', track: 'main', no_tags: true)
24
+ #
25
+ # @note `arguments` block audited against https://git-scm.com/docs/git-remote/2.53.0
26
+ #
27
+ # @see Git::Commands::Remote
28
+ #
29
+ # @see https://git-scm.com/docs/git-remote git-remote
30
+ #
31
+ # @api private
32
+ #
33
+ class Add < Git::Commands::Base
34
+ arguments do
35
+ literal 'remote'
36
+ literal 'add'
37
+ value_option %i[track t], repeatable: true
38
+ value_option %i[master m]
39
+ flag_option %i[fetch f]
40
+ flag_option :tags, negatable: true
41
+ value_option :mirror, inline: true
42
+
43
+ end_of_options
44
+
45
+ operand :name, required: true
46
+ operand :url, required: true
47
+ end
48
+
49
+ # @!method call(*, **)
50
+ #
51
+ # @overload call(name, url, **options)
52
+ #
53
+ # Execute the `git remote add` command
54
+ #
55
+ # @param name [String] the remote name to create
56
+ #
57
+ # @param url [String] the remote URL to configure
58
+ #
59
+ # @param options [Hash] command options
60
+ #
61
+ # @option options [String, Array<String>] :track (nil) track only the given branch(es) during fetch
62
+ #
63
+ # Accepts a single branch name or an array; each value causes a separate `--track` flag.
64
+ #
65
+ # Alias: :t
66
+ #
67
+ # @option options [String] :master (nil) set the remote HEAD symbolic ref to the given branch
68
+ #
69
+ # Alias: :m
70
+ #
71
+ # @option options [Boolean, nil] :fetch (nil) fetch the remote immediately after adding it
72
+ #
73
+ # Alias: :f
74
+ #
75
+ # @option options [Boolean, nil] :tags (nil) import all tags from the remote (`--tags`)
76
+ #
77
+ # @option options [Boolean, nil] :no_tags (nil) disable importing tags from the remote (`--no-tags`)
78
+ #
79
+ # @option options [String] :mirror (nil) set mirror mode
80
+ #
81
+ # Common values are `'fetch'` and `'push'`.
82
+ #
83
+ # @return [Git::CommandLineResult] the result of calling `git remote add`
84
+ #
85
+ # @raise [ArgumentError] if unsupported options are provided
86
+ #
87
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Remote
8
+ # `git remote get-url` command
9
+ #
10
+ # Retrieves the fetch or push URL configured for the named remote.
11
+ #
12
+ # @example Retrieve the fetch URL for a remote
13
+ # get_url = Git::Commands::Remote::GetUrl.new(execution_context)
14
+ # get_url.call('origin')
15
+ #
16
+ # @example Retrieve the push URL for a remote
17
+ # get_url = Git::Commands::Remote::GetUrl.new(execution_context)
18
+ # get_url.call('origin', push: true)
19
+ #
20
+ # @example Retrieve all configured URLs for a remote
21
+ # get_url = Git::Commands::Remote::GetUrl.new(execution_context)
22
+ # get_url.call('origin', all: true)
23
+ #
24
+ # @note `arguments` block audited against https://git-scm.com/docs/git-remote/2.53.0
25
+ #
26
+ # @see Git::Commands::Remote
27
+ #
28
+ # @see https://git-scm.com/docs/git-remote git-remote
29
+ #
30
+ # @api private
31
+ #
32
+ class GetUrl < Git::Commands::Base
33
+ arguments do
34
+ literal 'remote'
35
+ literal 'get-url'
36
+ flag_option :push
37
+ flag_option :all
38
+
39
+ end_of_options
40
+
41
+ operand :name, required: true
42
+ end
43
+
44
+ # @!method call(*, **)
45
+ #
46
+ # @overload call(name, **options)
47
+ #
48
+ # Execute the `git remote get-url` command
49
+ #
50
+ # @param name [String] the remote name to query
51
+ #
52
+ # @param options [Hash] command options
53
+ #
54
+ # @option options [Boolean, nil] :push (nil) query push URLs instead of fetch URLs
55
+ #
56
+ # @option options [Boolean, nil] :all (nil) return all configured URLs instead of only the first one
57
+ #
58
+ # @return [Git::CommandLineResult] the result of calling `git remote get-url`
59
+ #
60
+ # @raise [ArgumentError] if unsupported options are provided
61
+ #
62
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Remote
8
+ # `git remote` command (list remotes)
9
+ #
10
+ # Lists all configured remote connections.
11
+ #
12
+ # @example List all remotes
13
+ # list = Git::Commands::Remote::List.new(execution_context)
14
+ # list.call
15
+ #
16
+ # @example List remotes with URLs
17
+ # list = Git::Commands::Remote::List.new(execution_context)
18
+ # list.call(verbose: true)
19
+ #
20
+ # @note `arguments` block audited against https://git-scm.com/docs/git-remote/2.53.0
21
+ #
22
+ # @see Git::Commands::Remote
23
+ #
24
+ # @see https://git-scm.com/docs/git-remote git-remote
25
+ #
26
+ # @api private
27
+ #
28
+ class List < Git::Commands::Base
29
+ arguments do
30
+ literal 'remote'
31
+ flag_option %i[verbose v]
32
+ end
33
+
34
+ # @!method call(*, **)
35
+ #
36
+ # @overload call(**options)
37
+ #
38
+ # Execute the `git remote` command
39
+ #
40
+ # @param options [Hash] command options
41
+ #
42
+ # @option options [Boolean, nil] :verbose (nil) show remote URLs alongside remote names
43
+ #
44
+ # Alias: :v
45
+ #
46
+ # @return [Git::CommandLineResult] the result of calling `git remote`
47
+ #
48
+ # @raise [ArgumentError] if unsupported options are provided
49
+ #
50
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Remote
8
+ # `git remote prune` command
9
+ #
10
+ # Deletes stale remote-tracking refs that no longer exist on the named remote.
11
+ #
12
+ # @example Dry-run to preview which refs would be pruned
13
+ # prune = Git::Commands::Remote::Prune.new(execution_context)
14
+ # prune.call('origin', dry_run: true)
15
+ #
16
+ # @example Prune stale tracking refs for a remote
17
+ # prune = Git::Commands::Remote::Prune.new(execution_context)
18
+ # prune.call('origin')
19
+ #
20
+ # @note `arguments` block audited against https://git-scm.com/docs/git-remote/2.53.0
21
+ #
22
+ # @see Git::Commands::Remote
23
+ #
24
+ # @see https://git-scm.com/docs/git-remote git-remote
25
+ #
26
+ # @api private
27
+ #
28
+ class Prune < Git::Commands::Base
29
+ arguments do
30
+ literal 'remote'
31
+ literal 'prune'
32
+ flag_option %i[dry_run n]
33
+
34
+ end_of_options
35
+
36
+ operand :name, repeatable: true, required: true
37
+ end
38
+
39
+ # @!method call(*, **)
40
+ #
41
+ # @overload call(*name, **options)
42
+ #
43
+ # Prune stale remote-tracking refs for one or more remotes
44
+ #
45
+ # @param name [Array<String>] one or more remote names to prune
46
+ #
47
+ # @param options [Hash] command options
48
+ #
49
+ # @option options [Boolean, nil] :dry_run (nil) report what would be pruned without deleting refs
50
+ #
51
+ # Alias: :n
52
+ #
53
+ # @return [Git::CommandLineResult] the result of calling `git remote prune`
54
+ #
55
+ # @raise [ArgumentError] if unsupported options are provided
56
+ #
57
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
58
+ end
59
+ end
60
+ end
61
+ end