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,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git checkout-index` command
8
+ #
9
+ # This command copies all files listed in the index to the working directory
10
+ # (not overwriting existing files). It is typically used to populate a new
11
+ # working directory from the current index, optionally scoped to a specific
12
+ # path or prefix.
13
+ #
14
+ # @example Typical usage
15
+ # checkout_index = Git::Commands::CheckoutIndex.new(execution_context)
16
+ # checkout_index.call(all: true)
17
+ # checkout_index.call(all: true, force: true)
18
+ # checkout_index.call('path/to/file.txt')
19
+ # checkout_index.call(all: true, prefix: 'output/')
20
+ #
21
+ # @note `arguments` block audited against https://git-scm.com/docs/git-checkout-index/2.53.0
22
+ #
23
+ # @see https://git-scm.com/docs/git-checkout-index git-checkout-index
24
+ #
25
+ # @see Git::Commands
26
+ #
27
+ # @api private
28
+ #
29
+ class CheckoutIndex < Git::Commands::Base
30
+ arguments do
31
+ literal 'checkout-index'
32
+ flag_option %i[index u]
33
+ flag_option %i[quiet q]
34
+ flag_option %i[all a]
35
+ flag_option %i[force f]
36
+ flag_option %i[no_create n]
37
+ value_option :prefix, inline: true
38
+ value_option :stage, inline: true
39
+ flag_option :temp
40
+ flag_option :ignore_skip_worktree_bits
41
+ end_of_options
42
+ operand :file, required: false, repeatable: true
43
+ end
44
+
45
+ # @overload call(*file, **options)
46
+ #
47
+ # Execute the `git checkout-index` command
48
+ #
49
+ # @param file [Array<String>] zero or more file paths to check out
50
+ #
51
+ # When empty, no files are checked out individually (use `:all` to check
52
+ # out everything).
53
+ #
54
+ # @param options [Hash] command options
55
+ #
56
+ # @option options [Boolean, nil] :index (nil) update stat information for the
57
+ # checked out entries in the index file
58
+ #
59
+ # Alias: `:u`
60
+ #
61
+ # @option options [Boolean, nil] :quiet (nil) suppress messages when files
62
+ # exist or are not in the index
63
+ #
64
+ # Alias: `:q`
65
+ #
66
+ # @option options [Boolean, nil] :all (nil) check out all files in the index
67
+ #
68
+ # Alias: `:a`
69
+ #
70
+ # @option options [Boolean, nil] :force (nil) force overwrite of existing files
71
+ #
72
+ # Alias: `:f`
73
+ #
74
+ # @option options [Boolean, nil] :no_create (nil) don't checkout new files,
75
+ # only refresh files already checked out
76
+ #
77
+ # Alias: `:n`
78
+ #
79
+ # @option options [String] :prefix (nil) write file content under the given
80
+ # directory prefix instead of the working directory root
81
+ #
82
+ # @option options [String] :stage (nil) check out from the named stage
83
+ #
84
+ # Pass `'1'`, `'2'`, or `'3'` for a specific stage number, or `'all'` to
85
+ # check out all stages (automatically implies `--temp`).
86
+ #
87
+ # @option options [Boolean, nil] :temp (nil) write file content to temporary
88
+ # files near the target location instead of checking them out
89
+ #
90
+ # @option options [Boolean, nil] :ignore_skip_worktree_bits (nil) check out
91
+ # all files, including those with the skip-worktree bit set
92
+ #
93
+ # @return [Git::CommandLine::Result] the result of calling `git checkout-index`
94
+ #
95
+ # @raise [ArgumentError] if unsupported options are provided
96
+ #
97
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
98
+ #
99
+ # @api public
100
+ #
101
+ def call(*, **)
102
+ super
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Remove untracked files from the working tree
8
+ #
9
+ # Cleans the working tree by recursively removing files that are not under
10
+ # version control. Only files unknown to Git are removed by default; with
11
+ # `:x` also removes ignored files; with `:X` removes only ignored files.
12
+ #
13
+ # @example Typical usage
14
+ # clean = Git::Commands::Clean.new(execution_context)
15
+ # clean.call(force: true)
16
+ # clean.call(force: true, d: true)
17
+ # clean.call(force: 2)
18
+ # clean.call(dry_run: true)
19
+ # clean.call(force: true, exclude: '*.log')
20
+ # clean.call(force: true, X: true)
21
+ # clean.call(force: true, pathspec: ['tmp/', 'build/'])
22
+ #
23
+ # @note `arguments` block audited against https://git-scm.com/docs/git-clean/2.53.0
24
+ #
25
+ # @see Git::Commands
26
+ #
27
+ # @see https://git-scm.com/docs/git-clean git-clean
28
+ #
29
+ # @api private
30
+ #
31
+ class Clean < Git::Commands::Base
32
+ arguments do
33
+ literal 'clean'
34
+ flag_option :d
35
+ flag_option %i[force f], max_times: 2
36
+ flag_option %i[dry_run n]
37
+ flag_option %i[quiet q]
38
+ value_option %i[exclude e], inline: true, repeatable: true
39
+ flag_option :x
40
+ flag_option :X
41
+ execution_option :chdir
42
+ end_of_options
43
+ value_option :pathspec, as_operand: true, repeatable: true
44
+ end
45
+
46
+ # @overload call(**options)
47
+ #
48
+ # Execute the git clean command
49
+ #
50
+ # @param options [Hash] command options
51
+ #
52
+ # @option options [Boolean, nil] :d (nil) recurse into untracked directories
53
+ #
54
+ # @option options [Boolean, Integer, nil] :force (nil) force the removal of untracked files
55
+ #
56
+ # When `clean.requireForce` is not set to `false`, git-clean will refuse to
57
+ # delete files or directories unless this option is given.
58
+ #
59
+ # Pass `true` or `1` to emit `--force` once. Pass `2` to emit `--force --force`,
60
+ # which also removes untracked nested git repositories (directories with a
61
+ # `.git` subdirectory).
62
+ #
63
+ # Alias: `:f`
64
+ #
65
+ # @option options [Boolean, nil] :dry_run (nil) don't actually remove anything, just
66
+ # show what would be done
67
+ #
68
+ # Alias: `:n`
69
+ #
70
+ # @option options [Boolean, nil] :quiet (nil) be quiet, only report errors
71
+ #
72
+ # Alias: `:q`
73
+ #
74
+ # @option options [String, Array<String>] :exclude (nil) use the given exclude
75
+ # pattern in addition to the standard ignore rules
76
+ #
77
+ # May be specified multiple times. Alias: `:e`
78
+ #
79
+ # @option options [Boolean, nil] :x (nil) don't use the standard ignore rules
80
+ #
81
+ # @option options [Boolean, nil] :X (nil) remove only files ignored by Git
82
+ #
83
+ # @option options [String, Array<String>] :pathspec (nil) limit cleaning to files
84
+ # matching the given pathspec(s)
85
+ #
86
+ # @option options [String, nil] :chdir (nil) change to this directory before
87
+ # running git; not passed to the git CLI
88
+ #
89
+ # @return [Git::CommandLine::Result] the result of calling `git clean`
90
+ #
91
+ # @raise [ArgumentError] if unsupported options are provided
92
+ #
93
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
94
+ #
95
+ # @api public
96
+ #
97
+ def call(*, **)
98
+ super
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,241 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git clone` command
8
+ #
9
+ # Clones a repository into a newly created directory.
10
+ #
11
+ # @example Typical usage
12
+ # clone = Git::Commands::Clone.new(execution_context)
13
+ # clone.call('https://github.com/user/repo.git')
14
+ # clone.call('https://github.com/user/repo.git', 'local-dir')
15
+ # clone.call('https://github.com/user/repo.git', 'local-dir', bare: true)
16
+ # clone.call('https://github.com/user/repo.git', 'local-dir', depth: 1)
17
+ #
18
+ # @note `arguments` block audited against https://git-scm.com/docs/git-clone/2.53.0
19
+ #
20
+ # @see https://git-scm.com/docs/git-clone git-clone
21
+ #
22
+ # @see Git::Commands
23
+ #
24
+ # @api private
25
+ #
26
+ class Clone < Git::Commands::Base
27
+ arguments do
28
+ literal 'clone'
29
+ value_option :template, inline: true
30
+ flag_option %i[local l], negatable: true
31
+ flag_option %i[shared s]
32
+ flag_option :no_hardlinks
33
+ flag_option %i[quiet q]
34
+ flag_option %i[verbose v]
35
+ flag_option :progress
36
+ flag_option %i[no_checkout n]
37
+ flag_option :bare
38
+ flag_option :mirror
39
+ value_option %i[origin o]
40
+ value_option %i[branch b]
41
+ value_option :revision, inline: true
42
+ value_option %i[upload_pack u]
43
+ value_option :reference, repeatable: true
44
+ value_option :reference_if_able, repeatable: true
45
+ flag_option :dissociate
46
+ value_option :separate_git_dir, inline: true
47
+ value_option :server_option, inline: true, repeatable: true
48
+ value_option :depth
49
+ value_option :shallow_since, inline: true
50
+ value_option :shallow_exclude, inline: true, repeatable: true
51
+ flag_option :single_branch, negatable: true
52
+ flag_option :tags, negatable: true
53
+ flag_or_value_option :recurse_submodules, inline: true, repeatable: true
54
+ flag_option :shallow_submodules, negatable: true
55
+ flag_option :remote_submodules, negatable: true
56
+ value_option %i[jobs j]
57
+ flag_option :sparse
58
+ flag_option :reject_shallow, negatable: true
59
+ value_option :filter, inline: true
60
+ flag_option :also_filter_submodules
61
+ value_option %i[config c], repeatable: true
62
+ value_option :bundle_uri, inline: true
63
+ value_option :ref_format, inline: true
64
+ end_of_options
65
+ operand :repository, required: true
66
+ operand :directory
67
+ execution_option :timeout
68
+ execution_option :chdir
69
+ end
70
+
71
+ # @overload call(repository, directory = nil, **options)
72
+ #
73
+ # Execute the `git clone` command
74
+ #
75
+ # @param repository [String] the URL or path of the repository to clone
76
+ #
77
+ # @param directory [String, nil] the directory to clone into; git derives the
78
+ # name from the repository URL when omitted
79
+ #
80
+ # @param options [Hash] command options
81
+ #
82
+ # @option options [String] :template (nil) directory from which templates
83
+ # will be used
84
+ #
85
+ # @option options [Boolean, nil] :local (nil) bypass the normal Git-aware transport
86
+ # for local clones (`--local`)
87
+ #
88
+ # Alias: `:l`
89
+ #
90
+ # @option options [Boolean, nil] :no_local (nil) disable the local optimization
91
+ # and use the normal transport (`--no-local`)
92
+ #
93
+ # @option options [Boolean, nil] :shared (nil) set up a shared clone using
94
+ # alternates instead of hardlinks
95
+ #
96
+ # Alias: `:s`
97
+ #
98
+ # @option options [Boolean, nil] :no_hardlinks (nil) force file-copy instead of
99
+ # hardlinks when cloning from a local filesystem
100
+ #
101
+ # @option options [Boolean, nil] :quiet (nil) suppress progress output to stderr
102
+ #
103
+ # Alias: `:q`
104
+ #
105
+ # @option options [Boolean, nil] :verbose (nil) run verbosely
106
+ #
107
+ # Alias: `:v`
108
+ #
109
+ # @option options [Boolean, nil] :progress (nil) force progress status even when
110
+ # stderr is not a terminal
111
+ #
112
+ # @option options [Boolean, nil] :no_checkout (nil) skip checking out HEAD after
113
+ # the clone
114
+ #
115
+ # Alias: `:n`
116
+ #
117
+ # @option options [Boolean, nil] :bare (nil) clone as a bare repository
118
+ #
119
+ # @option options [Boolean, nil] :mirror (nil) set up a mirror clone (implies
120
+ # --bare)
121
+ #
122
+ # @option options [String] :origin (nil) name of the remote to use instead of
123
+ # "origin"
124
+ #
125
+ # Alias: `:o`
126
+ #
127
+ # @option options [String] :branch (nil) branch to check out after cloning
128
+ #
129
+ # Alias: `:b`
130
+ #
131
+ # @option options [String] :revision (nil) detach HEAD at the given revision
132
+ # after cloning; incompatible with :branch and :mirror
133
+ #
134
+ # @option options [String] :upload_pack (nil) path to git-upload-pack on the
135
+ # remote (ssh only)
136
+ #
137
+ # Alias: `:u`
138
+ #
139
+ # @option options [String, Array<String>] :reference (nil) borrow objects from
140
+ # one or more reference repositories
141
+ #
142
+ # @option options [String, Array<String>] :reference_if_able (nil) like
143
+ # :reference but skip with a warning when the reference does not exist
144
+ #
145
+ # @option options [Boolean, nil] :dissociate (nil) stop borrowing from reference
146
+ # repositories after the clone is complete
147
+ #
148
+ # @option options [String] :separate_git_dir (nil) place the git directory at
149
+ # the given path and create a gitfile symlink in the working tree
150
+ #
151
+ # @option options [String, Array<String>] :server_option (nil) protocol-v2
152
+ # server options
153
+ #
154
+ # @option options [Integer, String] :depth (nil) create a shallow clone with
155
+ # the specified number of commits
156
+ #
157
+ # @option options [String] :shallow_since (nil) create a shallow clone with
158
+ # history after the specified date
159
+ #
160
+ # @option options [String, Array<String>] :shallow_exclude (nil) exclude
161
+ # commits reachable from the specified remote branch or tag
162
+ #
163
+ # @option options [Boolean, nil] :single_branch (nil) clone only the history for
164
+ # one branch (`--single-branch`)
165
+ #
166
+ # @option options [Boolean, nil] :no_single_branch (nil) clone history for all
167
+ # branches (`--no-single-branch`)
168
+ #
169
+ # @option options [Boolean, nil] :tags (nil) include tags in the clone (`--tags`)
170
+ #
171
+ # @option options [Boolean, nil] :no_tags (nil) exclude tags from the clone
172
+ # (`--no-tags`)
173
+ #
174
+ # @option options [Boolean, String, Array<String>, nil] :recurse_submodules (nil)
175
+ # initialize submodules after cloning; pass true for all submodules or a
176
+ # pathspec string/array for a subset
177
+ #
178
+ # @option options [Boolean, nil] :shallow_submodules (nil) clone submodules with
179
+ # depth 1 (`--shallow-submodules`)
180
+ #
181
+ # @option options [Boolean, nil] :no_shallow_submodules (nil) clone submodules
182
+ # with full history (`--no-shallow-submodules`)
183
+ #
184
+ # @option options [Boolean, nil] :remote_submodules (nil) use submodule
185
+ # remote-tracking branch status (`--remote-submodules`)
186
+ #
187
+ # @option options [Boolean, nil] :no_remote_submodules (nil) use the locally
188
+ # recorded SHA-1 for submodules (`--no-remote-submodules`)
189
+ #
190
+ # @option options [Integer, String] :jobs (nil) number of submodules fetched
191
+ # concurrently
192
+ #
193
+ # Alias: `:j`
194
+ #
195
+ # @option options [Boolean, nil] :sparse (nil) enable sparse checkout with
196
+ # top-level files only
197
+ #
198
+ # @option options [Boolean, nil] :reject_shallow (nil) fail if source is shallow
199
+ # (`--reject-shallow`)
200
+ #
201
+ # @option options [Boolean, nil] :no_reject_shallow (nil) allow cloning from
202
+ # shallow sources (`--no-reject-shallow`)
203
+ #
204
+ # @option options [String] :filter (nil) specify a partial clone filter
205
+ # (e.g., 'blob:none', 'tree:0')
206
+ #
207
+ # @option options [Boolean, nil] :also_filter_submodules (nil) apply the partial
208
+ # clone filter to submodules; requires :filter and :recurse_submodules
209
+ #
210
+ # @option options [String, Array<String>] :config (nil) set configuration
211
+ # variables in the newly-created repository
212
+ #
213
+ # Alias: `:c`
214
+ #
215
+ # @option options [String] :bundle_uri (nil) fetch a bundle from the given URI
216
+ # before fetching from the remote
217
+ #
218
+ # @option options [String] :ref_format (nil) specify the ref storage format
219
+ # (e.g., 'files', 'reftable')
220
+ #
221
+ # @option options [Numeric, nil] :timeout (nil) the number of seconds to wait
222
+ # for the command to complete; if nil, uses the global timeout from
223
+ # {Git::Config}; if 0, no timeout is enforced
224
+ #
225
+ # @option options [String, nil] :chdir (nil) the working directory in which to
226
+ # run the git clone command
227
+ #
228
+ # @return [Git::CommandLine::Result] the result of calling `git clone`
229
+ #
230
+ # @raise [ArgumentError] if unsupported options are provided
231
+ #
232
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
233
+ #
234
+ # @api public
235
+ #
236
+ def call(*, **)
237
+ super
238
+ end
239
+ end
240
+ end
241
+ end