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,195 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git ls-files` command.
8
+ #
9
+ # This command shows information about files in the index and the working tree.
10
+ # It is used to list tracked, untracked, ignored, and staged files.
11
+ #
12
+ # @example List staged files with stage info
13
+ # ls_files = Git::Commands::LsFiles.new(execution_context)
14
+ # ls_files.call('.', stage: true)
15
+ #
16
+ # @example List untracked files not ignored
17
+ # ls_files = Git::Commands::LsFiles.new(execution_context)
18
+ # ls_files.call(others: true, exclude_standard: true)
19
+ #
20
+ # @example List ignored files
21
+ # ls_files = Git::Commands::LsFiles.new(execution_context)
22
+ # ls_files.call(others: true, ignored: true, exclude_standard: true)
23
+ #
24
+ # @example List untracked files in a specific directory
25
+ # ls_files = Git::Commands::LsFiles.new(execution_context)
26
+ # ls_files.call(others: true, exclude_standard: true, chdir: '/path/to/workdir')
27
+ #
28
+ # @note `arguments` block audited against https://git-scm.com/docs/git-ls-files/2.53.0
29
+ #
30
+ # @see https://git-scm.com/docs/git-ls-files git-ls-files documentation
31
+ #
32
+ # @see Git::Commands
33
+ #
34
+ # @api private
35
+ #
36
+ class LsFiles < Git::Commands::Base
37
+ arguments do
38
+ literal 'ls-files'
39
+ flag_option :z
40
+ flag_option :t
41
+ flag_option :v
42
+ flag_option :f
43
+ flag_option %i[cached c]
44
+ flag_option %i[deleted d]
45
+ flag_option %i[others o]
46
+ flag_option %i[ignored i]
47
+ flag_option %i[stage s]
48
+ flag_option %i[unmerged u]
49
+ flag_option %i[killed k]
50
+ flag_option %i[modified m]
51
+ flag_option :resolve_undo
52
+ flag_option :directory
53
+ flag_option :no_empty_directory
54
+ flag_option :eol
55
+ flag_option :deduplicate
56
+ value_option %i[exclude x], inline: true
57
+ value_option %i[exclude_from X], inline: true
58
+ value_option :exclude_per_directory, inline: true
59
+ flag_option :exclude_standard
60
+ flag_option :error_unmatch
61
+ value_option :with_tree, inline: true
62
+ flag_option :full_name
63
+ flag_option :recurse_submodules
64
+ flag_or_value_option :abbrev, inline: true
65
+ flag_option :debug
66
+ flag_option :sparse
67
+ value_option :format, inline: true
68
+
69
+ end_of_options
70
+
71
+ operand :file, repeatable: true
72
+
73
+ execution_option :chdir
74
+ end
75
+
76
+ #
77
+ # @overload call(*file, **options)
78
+ #
79
+ # Execute the `git ls-files` command.
80
+ #
81
+ # @param file [Array<String>] paths to limit file listing
82
+ #
83
+ # @param options [Hash] command options
84
+ #
85
+ # @option options [Boolean, nil] :z (nil) use NUL line termination and do not quote filenames
86
+ #
87
+ # @option options [Boolean, nil] :t (nil) show status tags together with filenames
88
+ #
89
+ # @option options [Boolean, nil] :v (nil) similar to `-t` but use lowercase letters for files
90
+ # that are marked as assume unchanged
91
+ #
92
+ # @option options [Boolean, nil] :f (nil) similar to `-t` but use lowercase letters for files
93
+ # that are marked as fsmonitor valid
94
+ #
95
+ # @option options [Boolean, nil] :cached (nil) show all files cached in the index
96
+ #
97
+ # Alias: :c
98
+ #
99
+ # @option options [Boolean, nil] :deleted (nil) show files with an unstaged deletion
100
+ #
101
+ # Alias: :d
102
+ #
103
+ # @option options [Boolean, nil] :others (nil) show other (i.e. untracked) files in the output
104
+ #
105
+ # Alias: :o
106
+ #
107
+ # @option options [Boolean, nil] :ignored (nil) show only ignored files in the output
108
+ #
109
+ # Must be used with either `:cached` or `:others`. When used with `:cached`, shows only
110
+ # cached files matching an exclude pattern. When used with `:others`, shows only
111
+ # untracked files matched by an exclude pattern.
112
+ #
113
+ # Alias: :i
114
+ #
115
+ # @option options [Boolean, nil] :stage (nil) show object name, mode bits, and stage number
116
+ #
117
+ # Alias: :s
118
+ #
119
+ # @option options [Boolean, nil] :unmerged (nil) show information about unmerged files
120
+ #
121
+ # Alias: :u
122
+ #
123
+ # @option options [Boolean, nil] :killed (nil) show untracked files that need to be removed
124
+ # due to file/directory conflicts for tracked files
125
+ #
126
+ # Alias: :k
127
+ #
128
+ # @option options [Boolean, nil] :modified (nil) show files with an unstaged modification
129
+ #
130
+ # Alias: :m
131
+ #
132
+ # @option options [Boolean, nil] :resolve_undo (nil) show files having resolve-undo information
133
+ #
134
+ # @option options [Boolean, nil] :directory (nil) show just the directory name (with trailing
135
+ # slash) when a whole directory is classified as "other"
136
+ #
137
+ # @option options [Boolean, nil] :no_empty_directory (nil) do not list empty directories
138
+ #
139
+ # @option options [Boolean, nil] :eol (nil) show EOL and encoding attributes of files
140
+ #
141
+ # @option options [Boolean, nil] :deduplicate (nil) suppress duplicate filenames when showing
142
+ # only filenames
143
+ #
144
+ # @option options [String] :exclude (nil) skip untracked files matching the given pattern
145
+ #
146
+ # Alias: :x
147
+ #
148
+ # @option options [String] :exclude_from (nil) read exclude patterns from the given file
149
+ #
150
+ # Alias: :X
151
+ #
152
+ # @option options [String] :exclude_per_directory (nil) read additional exclude patterns
153
+ # from the named file in each directory
154
+ #
155
+ # @option options [Boolean, nil] :exclude_standard (nil) add the standard git exclusions
156
+ #
157
+ # @option options [Boolean, nil] :error_unmatch (nil) treat unmatched files as an error
158
+ #
159
+ # @option options [String] :with_tree (nil) pretend paths removed since the named
160
+ # tree-ish are still present when using `--error-unmatch`
161
+ #
162
+ # @option options [Boolean, nil] :full_name (nil) force paths to be output relative to the
163
+ # project top-level directory
164
+ #
165
+ # @option options [Boolean, nil] :recurse_submodules (nil) recursively calls ls-files on each
166
+ # active submodule in the repository
167
+ #
168
+ # @option options [Boolean, Integer, String, nil] :abbrev (nil) show only a partial prefix of the
169
+ # object name; pass `true` for the default number of hex digits, or an Integer or String
170
+ # for a specific prefix length (e.g., `abbrev: 10` or `abbrev: "10"`)
171
+ #
172
+ # @option options [Boolean, nil] :debug (nil) after each filename, output raw index information
173
+ # (ctime data, mtime data, dev, ino, uid, gid, size, flags, flagsx)
174
+ #
175
+ # @option options [Boolean, nil] :sparse (nil) if the index is sparse, show the sparse directory
176
+ # entries rather than expanding to the contained files
177
+ #
178
+ # @option options [String] :format (nil) a string that interpolates %(fieldname) from
179
+ # the index entry for each file
180
+ #
181
+ # @option options [String] :chdir (nil) run the command from the specified directory
182
+ #
183
+ # @return [Git::CommandLine::Result] the result of calling `git ls-files`
184
+ #
185
+ # @raise [ArgumentError] if unsupported options are provided
186
+ #
187
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
188
+ #
189
+ # @api public
190
+ def call(*, **)
191
+ super
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git ls-remote` command
8
+ #
9
+ # Lists references available in a remote repository along with the
10
+ # associated commit IDs. Can be used to detect changes in a remote
11
+ # repository without cloning or fetching.
12
+ #
13
+ # @example List all refs in a remote
14
+ # ls_remote = Git::Commands::LsRemote.new(execution_context)
15
+ # ls_remote.call('origin')
16
+ #
17
+ # @example List only branches and tags
18
+ # ls_remote = Git::Commands::LsRemote.new(execution_context)
19
+ # ls_remote.call('origin', branches: true, tags: true)
20
+ #
21
+ # @example List only refs (no symbolic refs like HEAD)
22
+ # ls_remote = Git::Commands::LsRemote.new(execution_context)
23
+ # ls_remote.call('origin', refs: true)
24
+ #
25
+ # @example Filter by pattern
26
+ # ls_remote = Git::Commands::LsRemote.new(execution_context)
27
+ # ls_remote.call('origin', 'refs/heads/main')
28
+ #
29
+ # @example Detect the default branch of a remote
30
+ # ls_remote = Git::Commands::LsRemote.new(execution_context)
31
+ # ls_remote.call('origin', 'HEAD', symref: true)
32
+ #
33
+ # @note `arguments` block audited against https://git-scm.com/docs/git-ls-remote/2.53.0
34
+ #
35
+ # @see https://git-scm.com/docs/git-ls-remote git-ls-remote documentation
36
+ #
37
+ # @see Git::Commands
38
+ #
39
+ # @api private
40
+ #
41
+ class LsRemote < Git::Commands::Base
42
+ arguments do
43
+ literal 'ls-remote'
44
+
45
+ flag_option %i[branches b]
46
+ flag_option %i[heads h]
47
+ flag_option %i[tags t]
48
+ flag_option :refs
49
+
50
+ # Connectivity
51
+ value_option :upload_pack, inline: true
52
+
53
+ flag_option %i[quiet q]
54
+ flag_option :exit_code
55
+ flag_option :get_url
56
+ value_option :sort, inline: true
57
+ flag_option :symref
58
+
59
+ value_option %i[server_option o],
60
+ inline: true, repeatable: true
61
+
62
+ # Execution-only options (not emitted as CLI flags)
63
+ execution_option :timeout
64
+
65
+ end_of_options
66
+
67
+ operand :repository
68
+ operand :pattern, repeatable: true
69
+ end
70
+
71
+ # Exit status 2 means no matching refs were found (used with --exit-code)
72
+ allow_exit_status 0..2
73
+
74
+ #
75
+ # @overload call(repository = nil, *patterns, **options)
76
+ #
77
+ # Execute the `git ls-remote` command
78
+ #
79
+ # @param repository [String, nil] the remote name or URL to query
80
+ #
81
+ # When nil, git uses the remote inferred from the current branch's
82
+ # tracking configuration, or "origin" if no tracking remote is set.
83
+ #
84
+ # @param patterns [Array<String>] one or more ref patterns to filter results
85
+ #
86
+ # When omitted, all references (after filtering via `--branches`, `--tags`,
87
+ # `--refs`) are shown. When specified, only refs matching one or more
88
+ # patterns are displayed.
89
+ #
90
+ # @param options [Hash] command options
91
+ #
92
+ # @option options [Boolean, nil] :branches (nil) limit output to refs under `refs/heads/`
93
+ #
94
+ # Alias: :b
95
+ #
96
+ # @option options [Boolean, nil] :heads (nil) limit output to refs under `refs/heads/`
97
+ #
98
+ # Deprecated: use `:branches` instead. Kept for backward compatibility with
99
+ # older git versions where `--heads` is the only supported flag.
100
+ #
101
+ # Alias: :h
102
+ #
103
+ # @option options [Boolean, nil] :tags (nil) limit output to refs under `refs/tags/`
104
+ #
105
+ # Alias: :t
106
+ #
107
+ # @option options [Boolean, nil] :refs (nil) exclude peeled tags and pseudorefs
108
+ # like `HEAD` from the output
109
+ #
110
+ # @option options [String] :upload_pack (nil) full path to `git-upload-pack`
111
+ # on the remote host
112
+ #
113
+ # Useful when accessing repositories via SSH where the daemon does not
114
+ # use the PATH configured by the user.
115
+ #
116
+ # @option options [Boolean, nil] :quiet (nil) do not print the remote URL to stderr
117
+ #
118
+ # Alias: :q
119
+ #
120
+ # @option options [Boolean, nil] :exit_code (nil) exit with status `2` when no
121
+ # matching refs are found in the remote repository
122
+ #
123
+ # Without this option, the command exits `0` whenever it successfully
124
+ # communicates with the remote, even if no refs match.
125
+ #
126
+ # @option options [Boolean, nil] :get_url (nil) expand and print the remote URL
127
+ # (respecting `url.<base>.insteadOf` config) and exit without contacting
128
+ # the remote
129
+ #
130
+ # @option options [String] :sort (nil) sort output by the given key
131
+ #
132
+ # Prefix `-` for descending order. Supports `"version:refname"` or
133
+ # `"v:refname"`. See `git for-each-ref` for sort key documentation.
134
+ #
135
+ # @option options [Boolean, nil] :symref (nil) show the underlying ref pointed to by
136
+ # symbolic refs
137
+ #
138
+ # The `upload-pack` protocol currently surfaces only the `HEAD` symref,
139
+ # so that is typically the only symref shown.
140
+ #
141
+ # @option options [String, Array<String>] :server_option (nil) transmit a
142
+ # string to the server when communicating using protocol version 2
143
+ #
144
+ # The string must not contain NUL or LF characters. Repeatable by
145
+ # passing an Array. Alias: :o
146
+ #
147
+ # @option options [Numeric] :timeout (nil) execution timeout in seconds
148
+ #
149
+ # @return [Git::CommandLine::Result] the result of calling `git ls-remote`
150
+ #
151
+ # @raise [ArgumentError] if unsupported options are provided
152
+ #
153
+ # @raise [Git::FailedError] if git exits outside the allowed range (exit code > 2)
154
+ #
155
+ # @api public
156
+ def call(*, **)
157
+ super
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git ls-tree` command
8
+ #
9
+ # Lists the contents of a tree object, showing the mode, type, object
10
+ # name, and file name of each item. Supports recursive listing, output
11
+ # format control, and path filtering.
12
+ #
13
+ # @example List the top-level tree of HEAD
14
+ # ls_tree = Git::Commands::LsTree.new(execution_context)
15
+ # ls_tree.call('HEAD')
16
+ #
17
+ # @example Recursively list all files under HEAD
18
+ # ls_tree = Git::Commands::LsTree.new(execution_context)
19
+ # ls_tree.call('HEAD', r: true)
20
+ #
21
+ # @example List only file names recursively
22
+ # ls_tree = Git::Commands::LsTree.new(execution_context)
23
+ # ls_tree.call('HEAD', r: true, name_only: true)
24
+ #
25
+ # @example List entries under a specific path
26
+ # ls_tree = Git::Commands::LsTree.new(execution_context)
27
+ # ls_tree.call('HEAD', 'lib/')
28
+ #
29
+ # @note `arguments` block audited against https://git-scm.com/docs/git-ls-tree/2.53.0
30
+ #
31
+ # @see https://git-scm.com/docs/git-ls-tree git-ls-tree
32
+ #
33
+ # @api private
34
+ #
35
+ class LsTree < Git::Commands::Base
36
+ arguments do
37
+ literal 'ls-tree'
38
+
39
+ # Listing behavior
40
+ flag_option :d
41
+ flag_option :r
42
+ flag_option :t
43
+ flag_option %i[long l]
44
+ flag_option :z
45
+
46
+ # Output format
47
+ flag_option %i[name_only name_status]
48
+ flag_option :object_only
49
+ flag_option :full_name
50
+ flag_option :full_tree
51
+ flag_or_value_option :abbrev, inline: true
52
+ value_option :format, inline: true
53
+
54
+ end_of_options
55
+
56
+ operand :tree_ish, required: true
57
+ operand :path, repeatable: true
58
+ end
59
+
60
+ #
61
+ # @overload call(tree_ish, *path, **options)
62
+ #
63
+ # Execute the git ls-tree command
64
+ #
65
+ # @param tree_ish [String] the tree object to list (SHA, branch name, tag, etc.)
66
+ #
67
+ # @param path [Array<String>] optional path(s) to restrict the listing
68
+ #
69
+ # When given, only entries matching these paths are shown.
70
+ #
71
+ # @param options [Hash] command options
72
+ #
73
+ # @option options [Boolean, nil] :d (nil) show only the named tree entry itself,
74
+ # not its children
75
+ #
76
+ # @option options [Boolean, nil] :r (nil) recurse into sub-trees
77
+ #
78
+ # @option options [Boolean, nil] :t (nil) show tree entries even when going to
79
+ # recurse them
80
+ #
81
+ # Implies recursive listing (`:r`) in git.
82
+ #
83
+ # @option options [Boolean, nil] :long (nil) show object size of blob (file)
84
+ # objects
85
+ #
86
+ # Cannot be combined with `:name_only` or `:object_only`.
87
+ #
88
+ # Alias: :l
89
+ #
90
+ # @option options [Boolean, nil] :z (nil) use NUL (`\0`) as line terminator
91
+ # instead of newline, and do not quote filenames
92
+ #
93
+ # @option options [Boolean, nil] :name_only (nil) list only filenames, one per
94
+ # line
95
+ #
96
+ # Cannot be combined with `:object_only` or `:long`.
97
+ #
98
+ # Alias: :name_status
99
+ #
100
+ # @option options [Boolean, nil] :object_only (nil) list only the object names
101
+ # (SHAs), one per line
102
+ #
103
+ # Cannot be combined with `:name_only` or `:long`.
104
+ #
105
+ # @option options [Boolean, nil] :full_name (nil) show full path names instead
106
+ # of paths relative to the current working directory
107
+ #
108
+ # @option options [Boolean, nil] :full_tree (nil) do not limit the listing to
109
+ # the current working directory; implies `:full_name`
110
+ #
111
+ # @option options [Boolean, String, nil] :abbrev (nil) use abbreviated object names
112
+ #
113
+ # When `true`, uses git's default abbreviated name length. When a string
114
+ # (e.g. `'8'`), uses exactly that many hex digits.
115
+ #
116
+ # @option options [String] :format (nil) a format string that interpolates
117
+ # `%(fieldname)` placeholders from tree entries
118
+ #
119
+ # Cannot be combined with `:long`, `:name_only`, or `:object_only`.
120
+ #
121
+ # @return [Git::CommandLine::Result] the result of calling `git ls-tree`
122
+ #
123
+ # @raise [ArgumentError] if unsupported options are provided
124
+ #
125
+ # @raise [ArgumentError] if the tree-ish operand is missing
126
+ #
127
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
128
+ #
129
+ # @api public
130
+ def call(*, **)
131
+ super
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Maintenance
8
+ # Add the current repository to the maintenance config
9
+ #
10
+ # @example Register the repository for maintenance
11
+ # Git::Commands::Maintenance::Register.new(execution_context).call
12
+ #
13
+ # @example Register with a custom config file
14
+ # Git::Commands::Maintenance::Register.new(execution_context).call(config_file: '/path/to/config')
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 Register < Git::Commands::Base
25
+ requires_git_version '2.30.0'
26
+
27
+ arguments do
28
+ literal 'maintenance'
29
+ literal 'register'
30
+
31
+ flag_or_value_option :config_file, negatable: true
32
+ execution_option :env
33
+ end
34
+
35
+ #
36
+ # @overload call(**options)
37
+ #
38
+ # Initialize config values so scheduled maintenance will start running
39
+ #
40
+ # This adds the repository to the `maintenance.repo` config variable
41
+ # in the current user's global config (or the specified config file)
42
+ # and enables recommended configuration values for
43
+ # `maintenance.<task>.schedule`.
44
+ #
45
+ # Also sets `maintenance.strategy` to 'incremental' if not previously set,
46
+ # and disables foreground maintenance by setting `maintenance.auto = false`
47
+ # in the current repository.
48
+ #
49
+ # @param options [Hash] command options
50
+ #
51
+ # @option options [Boolean, String, nil] :config_file (nil) use a specified
52
+ # config file instead of the global config (`--config-file`)
53
+ #
54
+ # When a String, the path is passed as `--config-file <file>`.
55
+ #
56
+ # @option options [Boolean, nil] :no_config_file (nil) disable the config file
57
+ # (`--no-config-file`)
58
+ #
59
+ # @option options [Hash] :env (nil) environment variables to set for the git
60
+ # process; merged with the default environment; not passed to the git CLI
61
+ #
62
+ # @return [Git::CommandLine::Result] the result of calling `git maintenance register`
63
+ #
64
+ # @raise [ArgumentError] if unsupported options are provided
65
+ #
66
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
67
+ #
68
+ # @raise [Git::VersionError] if git version is below 2.30.0
69
+ #
70
+ # @api public
71
+ def call(*, **)
72
+ super
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Maintenance
8
+ # Run one or more maintenance tasks
9
+ #
10
+ # @example Run all enabled maintenance tasks
11
+ # Git::Commands::Maintenance::Run.new(execution_context).call
12
+ #
13
+ # @example Run specific tasks in order
14
+ # Git::Commands::Maintenance::Run.new(execution_context).call(task: ['gc', 'commit-graph'])
15
+ #
16
+ # @example Run tasks only if thresholds are met
17
+ # Git::Commands::Maintenance::Run.new(execution_context).call(auto: true)
18
+ #
19
+ # @example Run scheduled tasks at a specific frequency
20
+ # Git::Commands::Maintenance::Run.new(execution_context).call(schedule: 'hourly')
21
+ #
22
+ # @note `arguments` block audited against https://git-scm.com/docs/git-maintenance/2.54.0
23
+ #
24
+ # @see Git::Commands::Maintenance Git::Commands::Maintenance for the full sub-command list
25
+ #
26
+ # @see https://git-scm.com/docs/git-maintenance git-maintenance documentation
27
+ #
28
+ # @api private
29
+ #
30
+ class Run < Git::Commands::Base
31
+ requires_git_version '2.30.0'
32
+
33
+ arguments do
34
+ literal 'maintenance'
35
+ literal 'run'
36
+
37
+ flag_option :auto, negatable: true
38
+ flag_option :detach, negatable: true
39
+ flag_option :scheduled, negatable: true
40
+ flag_or_value_option :schedule, negatable: true, inline: true
41
+ flag_option :quiet, negatable: true
42
+ value_option :task, inline: true, repeatable: true
43
+ execution_option :env
44
+ end
45
+
46
+ # @!method call(*, **options)
47
+ #
48
+ # @param options [Hash] command options
49
+ #
50
+ # @option options [Boolean, nil] :auto (nil) command option key; see overload docs
51
+ # for the full option list
52
+ #
53
+ # @overload call(**options)
54
+ #
55
+ # Run one or more maintenance tasks
56
+ #
57
+ # @param options [Hash] command options
58
+ #
59
+ # @option options [Boolean, nil] :auto (nil) run tasks only if thresholds are met (`--auto`)
60
+ #
61
+ # Not compatible with the `:schedule` option.
62
+ #
63
+ # @option options [Boolean, nil] :no_auto (nil) disable threshold-based execution (`--no-auto`)
64
+ #
65
+ # @option options [Boolean, nil] :detach (nil) detach the maintenance process from the current terminal
66
+ # (`--detach`)
67
+ #
68
+ # @option options [Boolean, nil] :no_detach (nil) do not detach the maintenance process (`--no-detach`)
69
+ #
70
+ # @option options [Boolean, nil] :scheduled (nil) run tasks that are due according to schedule config
71
+ # (`--scheduled`)
72
+ #
73
+ # @option options [Boolean, nil] :no_scheduled (nil) do not limit runs to scheduled tasks (`--no-scheduled`)
74
+ #
75
+ # @option options [Boolean, String, nil] :schedule (nil) run tasks only if time conditions are met
76
+ # (`--schedule`)
77
+ #
78
+ # When a String (`'hourly'`, `'daily'`, or `'weekly'`), runs only tasks scheduled
79
+ # for that frequency; the string is emitted as `--schedule=<frequency>`.
80
+ #
81
+ # @option options [Boolean, nil] :no_schedule (nil) disable schedule-based filtering (`--no-schedule`)
82
+ #
83
+ # @option options [Boolean, nil] :quiet (nil) suppress progress and informational messages (`--quiet`)
84
+ #
85
+ # @option options [Boolean, nil] :no_quiet (nil) enable progress and informational messages (`--no-quiet`)
86
+ #
87
+ # @option options [Array<String>, String] :task (nil) specify which task(s) to run
88
+ #
89
+ # If specified, only the given tasks are run in the specified order.
90
+ # Otherwise, tasks are determined by config options.
91
+ # Valid task names: `commit-graph`, `prefetch`, `gc`, `loose-objects`,
92
+ # `incremental-repack`, `pack-refs`, `reflog-expire`, `rerere-gc`, `worktree-prune`.
93
+ #
94
+ # @option options [Hash] :env (nil) environment variables to set for the git
95
+ # process; merged with the default environment; not passed to the git CLI
96
+ #
97
+ # @return [Git::CommandLine::Result] the result of calling `git maintenance run`
98
+ #
99
+ # @raise [ArgumentError] if unsupported options are provided
100
+ #
101
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
102
+ #
103
+ # @raise [Git::VersionError] if git version is below 2.30.0
104
+ #
105
+ # @api public
106
+ end
107
+ end
108
+ end
109
+ end