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,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Maintenance
8
+ # Initialize and start background maintenance on the current repository
9
+ #
10
+ # @example Start background maintenance with default scheduler
11
+ # Git::Commands::Maintenance::Start.new(execution_context).call
12
+ #
13
+ # @example Start with a specific scheduler
14
+ # Git::Commands::Maintenance::Start.new(execution_context).call(scheduler: 'crontab')
15
+ #
16
+ # @note `arguments` block audited against https://git-scm.com/docs/git-maintenance/2.54.0
17
+ #
18
+ # @see Git::Commands::Maintenance Git::Commands::Maintenance for the full sub-command list
19
+ #
20
+ # @see https://git-scm.com/docs/git-maintenance git-maintenance documentation
21
+ #
22
+ # @api private
23
+ #
24
+ class Start < Git::Commands::Base
25
+ requires_git_version '2.30.0'
26
+
27
+ arguments do
28
+ literal 'maintenance'
29
+ literal 'start'
30
+
31
+ value_option :scheduler, inline: true
32
+ execution_option :env
33
+ end
34
+
35
+ # @!method call(*, **options)
36
+ #
37
+ # @param options [Hash] command options
38
+ #
39
+ # @option options [String] :scheduler (nil) command option key; see overload docs
40
+ # for the full option list
41
+ #
42
+ # @overload call(**options)
43
+ #
44
+ # Initialize config values and start background maintenance
45
+ #
46
+ # This performs the same config updates as `register`, then updates
47
+ # the background scheduler to run `git maintenance run --scheduled`
48
+ # on an hourly basis.
49
+ #
50
+ # @param options [Hash] command options
51
+ #
52
+ # @option options [String] :scheduler (nil) specify the scheduler to use
53
+ #
54
+ # Must be one of 'auto', 'crontab', 'systemd-timer', 'launchctl', or 'schtasks'.
55
+ # When 'auto', the appropriate platform-specific scheduler is used.
56
+ # Default is 'auto'.
57
+ #
58
+ # @option options [Hash] :env (nil) environment variables to set for the git
59
+ # process; merged with the default environment; not passed to the git CLI
60
+ #
61
+ # @return [Git::CommandLine::Result] the result of calling `git maintenance start`
62
+ #
63
+ # @raise [ArgumentError] if unsupported options are provided
64
+ #
65
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
66
+ #
67
+ # @raise [Git::VersionError] if git version is below 2.30.0
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Maintenance
8
+ # Halt the background maintenance schedule
9
+ #
10
+ # @example Stop background maintenance
11
+ # Git::Commands::Maintenance::Stop.new(execution_context).call
12
+ #
13
+ # @note `arguments` block audited against https://git-scm.com/docs/git-maintenance/2.54.0
14
+ #
15
+ # @see Git::Commands::Maintenance Git::Commands::Maintenance for the full sub-command list
16
+ #
17
+ # @see https://git-scm.com/docs/git-maintenance git-maintenance documentation
18
+ #
19
+ # @api private
20
+ #
21
+ class Stop < Git::Commands::Base
22
+ requires_git_version '2.30.0'
23
+
24
+ arguments do
25
+ literal 'maintenance'
26
+ literal 'stop'
27
+
28
+ execution_option :env
29
+ end
30
+
31
+ # @!method call(*, **options)
32
+ #
33
+ # @param options [Hash] command options
34
+ #
35
+ # @option options [Hash] :env (nil) command option key; see overload docs
36
+ # for the full option list
37
+ #
38
+ # @overload call(**options)
39
+ #
40
+ # Halt the background maintenance schedule
41
+ #
42
+ # The current repository is not removed from the list of maintained
43
+ # repositories, in case the background maintenance is restarted later.
44
+ #
45
+ # @param options [Hash] command options
46
+ #
47
+ # @option options [Hash] :env (nil) environment variables to set for the git
48
+ # process; merged with the default environment; not passed to the git CLI
49
+ #
50
+ # @return [Git::CommandLine::Result] the result of calling `git maintenance stop`
51
+ #
52
+ # @raise [ArgumentError] if unsupported options are provided
53
+ #
54
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
55
+ #
56
+ # @raise [Git::VersionError] if git version is below 2.30.0
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Maintenance
8
+ # Remove the current repository from background maintenance
9
+ #
10
+ # @example Unregister the repository from maintenance
11
+ # Git::Commands::Maintenance::Unregister.new(execution_context).call
12
+ #
13
+ # @example Force unregister even if repository is not registered
14
+ # Git::Commands::Maintenance::Unregister.new(execution_context).call(force: true)
15
+ #
16
+ # @note `arguments` block audited against https://git-scm.com/docs/git-maintenance/2.54.0
17
+ #
18
+ # @see Git::Commands::Maintenance Git::Commands::Maintenance for the full sub-command list
19
+ #
20
+ # @see https://git-scm.com/docs/git-maintenance git-maintenance documentation
21
+ #
22
+ # @api private
23
+ #
24
+ class Unregister < Git::Commands::Base
25
+ requires_git_version '2.30.0'
26
+
27
+ arguments do
28
+ literal 'maintenance'
29
+ literal 'unregister'
30
+
31
+ flag_or_value_option :config_file, negatable: true
32
+ flag_option :force, negatable: true
33
+ execution_option :env
34
+ end
35
+
36
+ # @!method call(*, **options)
37
+ #
38
+ # @param options [Hash] command options
39
+ #
40
+ # @option options [Boolean, String, nil] :config_file (nil) command option key;
41
+ # see overload docs for the full option list
42
+ #
43
+ # @overload call(**options)
44
+ #
45
+ # Remove the current repository from background maintenance
46
+ #
47
+ # This only removes the repository from the configured list.
48
+ # It does not stop the background maintenance processes from running.
49
+ #
50
+ # Reports an error if the current repository is not already registered,
51
+ # unless `--force` is used.
52
+ #
53
+ # @param options [Hash] command options
54
+ #
55
+ # @option options [Boolean, String, nil] :config_file (nil) use a specified
56
+ # config file instead of the global config (`--config-file`)
57
+ #
58
+ # When a String, the path is passed as `--config-file <file>`.
59
+ #
60
+ # @option options [Boolean, nil] :no_config_file (nil) disable the config file
61
+ # (`--no-config-file`)
62
+ #
63
+ # @option options [Boolean, nil] :force (nil) return success even if repository is not registered
64
+ # (`--force`)
65
+ #
66
+ # @option options [Boolean, nil] :no_force (nil) fail if the repository is not registered
67
+ # (`--no-force`)
68
+ #
69
+ # @option options [Hash] :env (nil) environment variables to set for the git
70
+ # process; merged with the default environment; not passed to the git CLI
71
+ #
72
+ # @return [Git::CommandLine::Result] the result of calling `git maintenance unregister`
73
+ #
74
+ # @raise [ArgumentError] if unsupported options are provided
75
+ #
76
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
77
+ #
78
+ # @raise [Git::VersionError] if git version is below 2.30.0
79
+ #
80
+ # @api public
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'maintenance/register'
4
+ require_relative 'maintenance/run'
5
+ require_relative 'maintenance/start'
6
+ require_relative 'maintenance/stop'
7
+ require_relative 'maintenance/unregister'
8
+
9
+ module Git
10
+ module Commands
11
+ # Implements `git maintenance` subcommands for repository optimization
12
+ #
13
+ # Split into subclasses because each subcommand has a distinct purpose
14
+ # and option set:
15
+ #
16
+ # - {Maintenance::Run} — run one or more maintenance tasks
17
+ # - {Maintenance::Start} — initialize and start background maintenance
18
+ # - {Maintenance::Stop} — halt the background maintenance schedule
19
+ # - {Maintenance::Register} — add repository to maintenance config
20
+ # - {Maintenance::Unregister} — remove repository from maintenance config
21
+ #
22
+ # All subcommands require Git 2.30.0 or later.
23
+ #
24
+ # @see https://git-scm.com/docs/git-maintenance git-maintenance documentation
25
+ #
26
+ # @api private
27
+ #
28
+ module Maintenance
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Merge
8
+ # Implements `git merge --abort` to abort an in-progress merge
9
+ #
10
+ # Aborts the current merge and reconstructs the pre-merge state.
11
+ # If an autostash entry is present, applies it to the worktree.
12
+ #
13
+ # @example Abort a merge
14
+ # abort_cmd = Git::Commands::Merge::Abort.new(execution_context)
15
+ # abort_cmd.call
16
+ #
17
+ # @note `arguments` block audited against https://git-scm.com/docs/git-merge/2.53.0
18
+ #
19
+ # @see Git::Commands::Merge
20
+ #
21
+ # @see https://git-scm.com/docs/git-merge git-merge
22
+ #
23
+ # @api private
24
+ #
25
+ class Abort < Git::Commands::Base
26
+ arguments do
27
+ literal 'merge'
28
+ literal '--abort'
29
+ end
30
+
31
+ # @!method call()
32
+ #
33
+ # @overload call()
34
+ #
35
+ # Abort the current merge and reconstruct the pre-merge state
36
+ #
37
+ # @return [Git::CommandLine::Result] the result of calling
38
+ # `git merge --abort`
39
+ #
40
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Merge
8
+ # Implements `git merge --continue` to complete a merge after conflict resolution
9
+ #
10
+ # After the user has resolved conflicts and staged the changes, the
11
+ # merge can be concluded with this command.
12
+ #
13
+ # @example Continue after resolving conflicts
14
+ # continue_cmd = Git::Commands::Merge::Continue.new(execution_context)
15
+ # continue_cmd.call
16
+ #
17
+ # @note `arguments` block audited against https://git-scm.com/docs/git-merge/2.53.0
18
+ #
19
+ # @see Git::Commands::Merge
20
+ #
21
+ # @see https://git-scm.com/docs/git-merge git-merge
22
+ #
23
+ # @api private
24
+ #
25
+ class Continue < Git::Commands::Base
26
+ arguments do
27
+ literal 'merge'
28
+ literal '--continue'
29
+ end
30
+
31
+ # @!method call()
32
+ #
33
+ # @overload call()
34
+ #
35
+ # Resume the in-progress merge after conflicts have been resolved
36
+ #
37
+ # @return [Git::CommandLine::Result] the result of calling
38
+ # `git merge --continue`
39
+ #
40
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Merge
8
+ # Implements `git merge --quit` to quit an in-progress merge
9
+ #
10
+ # Forgets about the current merge in progress. Leaves the index and
11
+ # working tree as-is. If an autostash entry is present, saves it to
12
+ # the stash list.
13
+ #
14
+ # @example Quit the merge, leaving working tree as-is
15
+ # quit_cmd = Git::Commands::Merge::Quit.new(execution_context)
16
+ # quit_cmd.call
17
+ #
18
+ # @note `arguments` block audited against https://git-scm.com/docs/git-merge/2.53.0
19
+ #
20
+ # @see Git::Commands::Merge
21
+ #
22
+ # @see https://git-scm.com/docs/git-merge git-merge
23
+ #
24
+ # @api private
25
+ #
26
+ class Quit < Git::Commands::Base
27
+ arguments do
28
+ literal 'merge'
29
+ literal '--quit'
30
+ end
31
+
32
+ # @!method call()
33
+ #
34
+ # @overload call()
35
+ #
36
+ # Forget about the current merge in progress, leaving the index
37
+ # and working tree as-is
38
+ #
39
+ # @return [Git::CommandLine::Result] the result of calling
40
+ # `git merge --quit`
41
+ #
42
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,250 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Merge
8
+ # Implements `git merge` to incorporate changes from named commits
9
+ #
10
+ # Joins two or more development histories together by incorporating
11
+ # changes from the named commits into the current branch.
12
+ #
13
+ # @example Simple merge
14
+ # merge = Git::Commands::Merge::Start.new(execution_context)
15
+ # merge.call('feature')
16
+ #
17
+ # @example Merge with no fast-forward
18
+ # merge.call('feature', ff: false, m: 'Merge feature branch')
19
+ #
20
+ # @example Squash merge
21
+ # merge.call('feature', squash: true)
22
+ #
23
+ # @example Merge with strategy option
24
+ # merge.call('feature', strategy: 'ort', strategy_option: 'theirs')
25
+ #
26
+ # @example Octopus merge (multiple branches)
27
+ # merge.call('branch1', 'branch2', 'branch3')
28
+ #
29
+ # @note `arguments` block audited against https://git-scm.com/docs/git-merge/2.53.0
30
+ #
31
+ # @see Git::Commands::Merge
32
+ #
33
+ # @see https://git-scm.com/docs/git-merge git-merge
34
+ #
35
+ # @api private
36
+ #
37
+ class Start < Git::Commands::Base
38
+ arguments do
39
+ literal 'merge'
40
+
41
+ # Commit behavior
42
+ flag_option :commit, negatable: true
43
+ flag_option %i[edit e], negatable: true
44
+
45
+ # Commit message cleanup
46
+ value_option :cleanup, inline: true
47
+
48
+ # Fast-forward behavior
49
+ flag_option :ff, negatable: true
50
+ flag_option :ff_only
51
+
52
+ # Signing
53
+ flag_or_value_option %i[gpg_sign S], negatable: true, inline: true
54
+
55
+ # Log message
56
+ flag_or_value_option :log, negatable: true, inline: true
57
+
58
+ # Trailers
59
+ flag_option :signoff, negatable: true
60
+
61
+ # Stat display
62
+ flag_option :stat, negatable: true
63
+ flag_option :compact_summary
64
+
65
+ # Squash
66
+ flag_option :squash
67
+
68
+ # Verification
69
+ flag_option :verify, negatable: true
70
+
71
+ # Strategy options
72
+ value_option %i[strategy s], inline: true
73
+ value_option %i[strategy_option X], inline: true, repeatable: true
74
+
75
+ # Signature verification
76
+ flag_option :verify_signatures, negatable: true
77
+
78
+ # Verbosity and progress
79
+ flag_option %i[quiet q]
80
+ flag_option %i[verbose v]
81
+ flag_option :progress, negatable: true
82
+
83
+ # Stash and history
84
+ flag_option :autostash, negatable: true
85
+ flag_option :allow_unrelated_histories, negatable: true
86
+
87
+ # Message options
88
+ value_option :m
89
+ value_option :into_name
90
+ value_option %i[file F], inline: true
91
+
92
+ # Conflict resolution
93
+ flag_option :rerere_autoupdate, negatable: true
94
+ flag_option :overwrite_ignore, negatable: true
95
+
96
+ end_of_options
97
+
98
+ # Positional: commits to merge (variadic, required)
99
+ operand :commit, repeatable: true, required: true
100
+ end
101
+
102
+ # @!method call(*, **options)
103
+ #
104
+ # @param options [Hash] command options
105
+ #
106
+ # @option options [Boolean, nil] :commit (nil) command option key; see overload
107
+ # docs for the full option list
108
+ #
109
+ # @overload call(*commit, **options)
110
+ #
111
+ # Execute the git merge command
112
+ #
113
+ # @param commit [Array<String>] one or more branch names, commit SHAs,
114
+ # or refs to merge into the current branch; multiple commits create
115
+ # an octopus merge
116
+ #
117
+ # @param options [Hash] command options
118
+ #
119
+ # @option options [Boolean, nil] :commit (nil) perform merge and commit the result (`--commit`)
120
+ #
121
+ # @option options [Boolean, nil] :no_commit (nil) do not perform a merge commit (`--no-commit`)
122
+ #
123
+ # @option options [Boolean, nil] :edit (nil) open an editor for the merge commit message (`--edit`)
124
+ #
125
+ # Alias: `:e`
126
+ #
127
+ # @option options [Boolean, nil] :no_edit (nil) skip the editor for the merge commit message (`--no-edit`)
128
+ #
129
+ # @option options [String] :cleanup (nil) how the merge message will be cleaned
130
+ # up before committing
131
+ #
132
+ # Accepted values include `strip`, `whitespace`, `verbatim`,
133
+ # `scissors`, and `default`. Emits `--cleanup=<mode>`.
134
+ #
135
+ # @option options [Boolean, nil] :ff (nil) allow fast-forward merges (`--ff`)
136
+ #
137
+ # @option options [Boolean, nil] :no_ff (nil) create a merge commit even when fast-forward is
138
+ # possible (`--no-ff`)
139
+ #
140
+ # @option options [Boolean, nil] :ff_only (nil) refuse to merge unless
141
+ # fast-forward is possible; emits `--ff-only`
142
+ #
143
+ # @option options [Boolean, String, nil] :gpg_sign (nil) GPG-sign the resulting
144
+ # merge commit (`--gpg-sign`)
145
+ #
146
+ # Pass a key ID string to select the signing key; pass `true` to use the
147
+ # committer identity. Alias: `:S`
148
+ #
149
+ # @option options [Boolean, nil] :no_gpg_sign (nil) countermand commit.gpgSign
150
+ # configuration (`--no-gpg-sign`)
151
+ #
152
+ # @option options [Boolean, Integer, nil] :log (nil) populate the merge message
153
+ # with one-line commit descriptions (`--log`)
154
+ #
155
+ # Pass an Integer `n` to limit to `n` entries (`--log=<n>`).
156
+ #
157
+ # @option options [Boolean, nil] :no_log (nil) do not list one-line commit descriptions
158
+ # (`--no-log`)
159
+ #
160
+ # @option options [Boolean, nil] :signoff (nil) add a Signed-off-by trailer to the commit
161
+ # message (`--signoff`)
162
+ #
163
+ # @option options [Boolean, nil] :no_signoff (nil) remove a Signed-off-by trailer from the
164
+ # commit message (`--no-signoff`)
165
+ #
166
+ # @option options [Boolean, nil] :stat (nil) show a diffstat at the end of the merge (`--stat`)
167
+ #
168
+ # @option options [Boolean, nil] :no_stat (nil) suppress the diffstat at the end of the merge (`--no-stat`)
169
+ #
170
+ # @option options [Boolean, nil] :compact_summary (nil) show a compact summary
171
+ # at the end of the merge; emits `--compact-summary`
172
+ #
173
+ # @option options [Boolean, nil] :squash (nil) produce working tree and index
174
+ # state as if a real merge happened, but do not commit; emits `--squash`
175
+ #
176
+ # @option options [Boolean, nil] :verify (nil) run pre-merge and commit-msg hooks (`--verify`)
177
+ #
178
+ # @option options [Boolean, nil] :no_verify (nil) bypass pre-merge and commit-msg hooks (`--no-verify`)
179
+ #
180
+ # @option options [String] :strategy (nil) merge strategy to use
181
+ # (e.g., `'ort'`, `'recursive'`, `'resolve'`, `'octopus'`, `'ours'`, `'subtree'`)
182
+ #
183
+ # Emits `--strategy=<strategy>`. Alias: `:s`
184
+ #
185
+ # @option options [String, Array<String>] :strategy_option (nil) pass
186
+ # option(s) to the merge strategy (e.g., `'ours'`, `'theirs'`, `'patience'`)
187
+ #
188
+ # Can be a single value or an array for multiple `--strategy-option` flags.
189
+ # Emits `--strategy-option=<option>`. Alias: `:X`
190
+ #
191
+ # @option options [Boolean, nil] :verify_signatures (nil) verify commit signatures
192
+ # on the tip of the side branch (`--verify-signatures`)
193
+ #
194
+ # @option options [Boolean, nil] :no_verify_signatures (nil) do not verify commit
195
+ # signatures (`--no-verify-signatures`)
196
+ #
197
+ # @option options [Boolean, nil] :quiet (nil) operate quietly; emits `--quiet`
198
+ #
199
+ # Alias: `:q`
200
+ #
201
+ # @option options [Boolean, nil] :verbose (nil) be verbose; emits `--verbose`
202
+ #
203
+ # Alias: `:v`
204
+ #
205
+ # @option options [Boolean, nil] :progress (nil) force progress status reporting (`--progress`)
206
+ #
207
+ # @option options [Boolean, nil] :no_progress (nil) suppress progress status reporting (`--no-progress`)
208
+ #
209
+ # @option options [Boolean, nil] :autostash (nil) automatically stash and unstash
210
+ # the working tree before and after the operation (`--autostash`)
211
+ #
212
+ # @option options [Boolean, nil] :no_autostash (nil) do not automatically stash and unstash
213
+ # the working tree (`--no-autostash`)
214
+ #
215
+ # @option options [Boolean, nil] :allow_unrelated_histories (nil) allow merging
216
+ # histories that do not share a common ancestor (`--allow-unrelated-histories`)
217
+ #
218
+ # @option options [Boolean, nil] :no_allow_unrelated_histories (nil) disallow merging
219
+ # unrelated histories (`--no-allow-unrelated-histories`)
220
+ #
221
+ # @option options [String] :m (nil) commit message for the merge commit;
222
+ # emits `-m <msg>`
223
+ #
224
+ # @option options [String] :into_name (nil) prepare the default merge message
225
+ # as if merging to the named branch; emits `--into-name <branch>`
226
+ #
227
+ # @option options [String] :file (nil) read the commit message from the given
228
+ # file; emits `--file=<file>`. Alias: `:F`
229
+ #
230
+ # @option options [Boolean, nil] :rerere_autoupdate (nil) allow rerere to update
231
+ # the index with the auto-resolved conflict result (`--rerere-autoupdate`)
232
+ #
233
+ # @option options [Boolean, nil] :no_rerere_autoupdate (nil) prevent rerere from
234
+ # auto-updating the index (`--no-rerere-autoupdate`)
235
+ #
236
+ # @option options [Boolean, nil] :overwrite_ignore (nil) silently overwrite ignored
237
+ # files from the merge result (`--overwrite-ignore`)
238
+ #
239
+ # @option options [Boolean, nil] :no_overwrite_ignore (nil) abort if the merge result
240
+ # would overwrite any ignored files (`--no-overwrite-ignore`)
241
+ #
242
+ # @return [Git::CommandLine::Result] the result of calling `git merge`
243
+ #
244
+ # @raise [ArgumentError] if unsupported options are provided
245
+ #
246
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
247
+ end
248
+ end
249
+ end
250
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'merge/abort'
4
+ require_relative 'merge/continue'
5
+ require_relative 'merge/quit'
6
+ require_relative 'merge/start'
7
+
8
+ module Git
9
+ module Commands
10
+ # Commands for joining development histories via `git merge`
11
+ #
12
+ # This module contains command classes for the initial merge ({Start}) and
13
+ # session management ({Continue}, {Abort}, {Quit}):
14
+ #
15
+ # - {Merge::Start} — merge one or more branches into the current branch
16
+ # - {Merge::Continue} — resume after resolving merge conflicts (`--continue`)
17
+ # - {Merge::Abort} — abort the in-progress merge (`--abort`)
18
+ # - {Merge::Quit} — forget the in-progress merge but leave the working tree
19
+ # as-is (`--quit`)
20
+ #
21
+ # @see https://git-scm.com/docs/git-merge git-merge documentation
22
+ #
23
+ # @api private
24
+ #
25
+ module Merge
26
+ end
27
+ end
28
+ end