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,242 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements `git apply` to apply a patch to files and/or to the index
8
+ #
9
+ # Reads the supplied diff output (a patch) and applies it to files.
10
+ # Without options, the command applies the patch only to working tree files.
11
+ # With `index: true`, the patch is also applied to the index.
12
+ # With `cached: true`, the patch is only applied to the index.
13
+ #
14
+ # @example Typical usage
15
+ # apply = Git::Commands::Apply.new(execution_context)
16
+ # apply.call('fix.patch')
17
+ # apply.call('fix.patch', cached: true)
18
+ # apply.call('fix.patch', check: true)
19
+ # apply.call('fix.patch', reverse: true)
20
+ #
21
+ # @note `arguments` block audited against https://git-scm.com/docs/git-apply/2.53.0
22
+ #
23
+ # @see https://git-scm.com/docs/git-apply git-apply
24
+ #
25
+ # @see Git::Commands
26
+ #
27
+ # @api private
28
+ #
29
+ class Apply < Git::Commands::Base
30
+ arguments do
31
+ literal 'apply'
32
+
33
+ # Informational flags (turn off actual apply)
34
+ flag_option :stat
35
+ flag_option :numstat
36
+ flag_option :summary
37
+ flag_option :check
38
+
39
+ # Application mode
40
+ flag_option :index
41
+ flag_option %i[intent_to_add N]
42
+ flag_option :three_way, as: '--3way'
43
+
44
+ # 3-way merge conflict resolution
45
+ flag_option :ours
46
+ flag_option :theirs
47
+ flag_option :union
48
+
49
+ # Apply behavior
50
+ flag_option :apply
51
+ flag_option :no_add
52
+ value_option :build_fake_ancestor, inline: true
53
+ flag_option %i[reverse R]
54
+ flag_option %i[allow_binary_replacement binary]
55
+ flag_option :reject
56
+ flag_option :z
57
+
58
+ # Strip/context levels
59
+ value_option :p, inline: true
60
+ value_option :C, inline: true
61
+
62
+ # Patch parsing
63
+ flag_option :unidiff_zero
64
+ flag_option :inaccurate_eof
65
+ flag_option :recount
66
+
67
+ # Application scope
68
+ flag_option :cached
69
+
70
+ # Whitespace handling
71
+ flag_option :ignore_space_change
72
+ flag_option :ignore_whitespace
73
+ value_option :whitespace, inline: true
74
+
75
+ # Path filtering
76
+ value_option :exclude, inline: true
77
+ value_option :include, inline: true
78
+ value_option :directory, inline: true
79
+
80
+ # Verbosity
81
+ flag_option %i[verbose v]
82
+ flag_option %i[quiet q]
83
+ flag_option :unsafe_paths
84
+ flag_option :allow_empty
85
+
86
+ # Execution
87
+ execution_option :chdir
88
+
89
+ end_of_options
90
+ operand :patch, repeatable: true
91
+ end
92
+
93
+ # @!method call(*, **options)
94
+ #
95
+ # @param options [Hash] command options
96
+ #
97
+ # @option options [Boolean, nil] :stat (nil) command option key; see overload
98
+ # docs for the full option list
99
+ #
100
+ # @overload call(*patch, **options)
101
+ #
102
+ # Apply one or more patch files to the working tree or index
103
+ #
104
+ # @param patch [Array<String>] zero or more patch file paths to apply;
105
+ # omit to read from standard input
106
+ #
107
+ # @param options [Hash] command options
108
+ #
109
+ # @option options [Boolean, nil] :stat (nil) show diffstat for the input
110
+ # instead of applying
111
+ #
112
+ # Turns off apply mode.
113
+ #
114
+ # @option options [Boolean, nil] :numstat (nil) show numeric diffstat for
115
+ # the input instead of applying
116
+ #
117
+ # Turns off apply mode. Output is in machine-friendly decimal format.
118
+ #
119
+ # @option options [Boolean, nil] :summary (nil) show a condensed summary of
120
+ # extended header information instead of applying
121
+ #
122
+ # Turns off apply mode.
123
+ #
124
+ # @option options [Boolean, nil] :check (nil) check whether the patch applies
125
+ # cleanly without modifying any files
126
+ #
127
+ # Turns off apply mode.
128
+ #
129
+ # @option options [Boolean, nil] :index (nil) apply the patch to both the
130
+ # index and the working tree
131
+ #
132
+ # @option options [Boolean, nil] :intent_to_add (nil) mark new files added by
133
+ # the patch for later addition to the index
134
+ #
135
+ # Alias: `:N`
136
+ #
137
+ # @option options [Boolean, nil] :three_way (nil) attempt a 3-way merge if
138
+ # the patch does not apply cleanly (`--3way`)
139
+ #
140
+ # @option options [Boolean, nil] :ours (nil) resolve 3-way conflicts by
141
+ # favouring our side of the conflict
142
+ #
143
+ # Requires `:three_way`.
144
+ #
145
+ # @option options [Boolean, nil] :theirs (nil) resolve 3-way conflicts by
146
+ # favouring their side of the conflict
147
+ #
148
+ # Requires `:three_way`.
149
+ #
150
+ # @option options [Boolean, nil] :union (nil) resolve 3-way conflicts by
151
+ # including both sides of the conflict
152
+ #
153
+ # Requires `:three_way`.
154
+ #
155
+ # @option options [Boolean, nil] :apply (nil) re-enable the apply step even
156
+ # when a "turns off apply" flag such as `:stat` is also given
157
+ #
158
+ # @option options [Boolean, nil] :no_add (nil) ignore additions made by the
159
+ # patch; apply only the deletions
160
+ #
161
+ # @option options [String] :build_fake_ancestor (nil) path to a
162
+ # temporary index file for building a fake ancestor from the embedded
163
+ # blob identities in the patch
164
+ #
165
+ # @option options [Boolean, nil] :reverse (nil) apply the patch in reverse
166
+ #
167
+ # Alias: `:R`
168
+ #
169
+ # @option options [Boolean, nil] :allow_binary_replacement (nil) allow
170
+ # binary patch application (no-op in Git 2.28+)
171
+ #
172
+ # Alias: `:binary`
173
+ #
174
+ # @option options [Boolean, nil] :reject (nil) leave rejected hunks in
175
+ # `.rej` files instead of aborting
176
+ #
177
+ # @option options [Boolean, nil] :z (nil) use NUL-terminated output for
178
+ # `--numstat` pathnames (`-z`)
179
+ #
180
+ # @option options [Integer] :p (nil) strip this many leading path
181
+ # components from traditional diff paths (`-p<n>`)
182
+ #
183
+ # @option options [Integer] :C (nil) require at least this many lines
184
+ # of surrounding context before and after each change (`-C<n>`)
185
+ #
186
+ # @option options [Boolean, nil] :unidiff_zero (nil) bypass context-line
187
+ # safety checks for diffs generated with `--unified=0`
188
+ #
189
+ # @option options [Boolean, nil] :inaccurate_eof (nil) work around diffs
190
+ # that do not correctly detect a missing newline at end of file
191
+ #
192
+ # @option options [Boolean, nil] :recount (nil) infer hunk sizes from the
193
+ # patch content rather than trusting the hunk header counts
194
+ #
195
+ # @option options [Boolean, nil] :cached (nil) apply the patch only to the
196
+ # index without touching the working tree
197
+ #
198
+ # @option options [Boolean, nil] :ignore_space_change (nil) ignore changes
199
+ # in the amount of whitespace in context lines
200
+ #
201
+ # @option options [Boolean, nil] :ignore_whitespace (nil) ignore all
202
+ # whitespace differences in context lines
203
+ #
204
+ # @option options [String] :whitespace (nil) whitespace error handling
205
+ # mode: `'nowarn'`, `'warn'`, `'fix'`, `'error'`, or `'error-all'`
206
+ #
207
+ # @option options [String] :exclude (nil) skip changes to files
208
+ # matching this path pattern
209
+ #
210
+ # @option options [String] :include (nil) apply changes only to files
211
+ # matching this path pattern
212
+ #
213
+ # @option options [String] :directory (nil) prepend this root to all
214
+ # filenames in the patch
215
+ #
216
+ # @option options [Boolean, nil] :verbose (nil) report progress to stderr
217
+ #
218
+ # Alias: `:v`
219
+ #
220
+ # @option options [Boolean, nil] :quiet (nil) suppress stderr output
221
+ #
222
+ # Alias: `:q`
223
+ #
224
+ # @option options [Boolean, nil] :unsafe_paths (nil) override the safety
225
+ # check that rejects patches affecting paths outside the working area
226
+ #
227
+ # @option options [Boolean, nil] :allow_empty (nil) do not return an error
228
+ # for patches containing no diff
229
+ #
230
+ # @option options [String] :chdir (nil) change to this directory before
231
+ # running git; not passed to the git CLI
232
+ #
233
+ # @return [Git::CommandLine::Result] the result of calling `git apply`
234
+ #
235
+ # @raise [ArgumentError] if unsupported options are provided
236
+ #
237
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
238
+ #
239
+ # @api public
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+ require 'git/commands/archive'
5
+
6
+ module Git
7
+ module Commands
8
+ class Archive
9
+ # Format lister for `git archive --list`
10
+ #
11
+ # Lists all available archive formats supported by the current git
12
+ # installation. This is a standalone mode of `git archive` that does not
13
+ # require a tree-ish operand.
14
+ #
15
+ # @example List available archive formats
16
+ # cmd = Git::Commands::Archive::ListFormats.new(execution_context)
17
+ # result = cmd.call
18
+ # result.stdout # => "tar\ntgz\ntar.gz\nzip\n"
19
+ #
20
+ # @note `arguments` block audited against https://git-scm.com/docs/git-archive/2.53.0
21
+ #
22
+ # @see Git::Commands::Archive Git::Commands::Archive for the full archive command interface
23
+ #
24
+ # @see https://git-scm.com/docs/git-archive git-archive documentation
25
+ #
26
+ # @api private
27
+ #
28
+ class ListFormats < Git::Commands::Base
29
+ arguments do
30
+ literal 'archive'
31
+ literal '--list'
32
+ end
33
+
34
+ # @!method call()
35
+ #
36
+ # @overload call()
37
+ #
38
+ # Execute `git archive --list` to show available formats.
39
+ #
40
+ # @return [Git::CommandLine::Result] the result of calling `git archive --list`
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,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Archive creator for files from a named tree via `git archive`
8
+ #
9
+ # Produces an archive of the specified format containing the tree structure
10
+ # for the named tree, and writes it to stdout (or to a file when `out:` or
11
+ # `output:` is given). If `prefix:` is specified it is prepended to the
12
+ # filenames in the archive.
13
+ #
14
+ # @example Archive HEAD as a tar stream to a file
15
+ # cmd = Git::Commands::Archive.new(execution_context)
16
+ # File.open('release.tar', 'wb') do |f|
17
+ # cmd.call('HEAD', format: 'tar', out: f)
18
+ # end
19
+ #
20
+ # @example Archive a tag with a prefix
21
+ # cmd = Git::Commands::Archive.new(execution_context)
22
+ # cmd.call('v1.0', format: 'zip', prefix: 'myproject-1.0/', output: 'release.zip')
23
+ #
24
+ # @example Archive a subdirectory only
25
+ # cmd = Git::Commands::Archive.new(execution_context)
26
+ # cmd.call('HEAD', 'src/', format: 'tar', out: io)
27
+ #
28
+ # @note `arguments` block audited against https://git-scm.com/docs/git-archive/2.53.0
29
+ #
30
+ # @see Git::Commands
31
+ #
32
+ # @see https://git-scm.com/docs/git-archive git-archive
33
+ #
34
+ # @api private
35
+ #
36
+ class Archive < Base
37
+ arguments do
38
+ literal 'archive'
39
+ value_option :format, inline: true
40
+ flag_option %i[list l]
41
+ flag_option %i[verbose v]
42
+ value_option :prefix, inline: true
43
+ value_option %i[output o], inline: true
44
+ value_option :add_file, inline: true, repeatable: true
45
+ value_option :add_virtual_file, inline: true, repeatable: true
46
+ flag_option :worktree_attributes
47
+ value_option :mtime, inline: true
48
+ value_option :remote, inline: true
49
+ value_option :exec, inline: true
50
+ execution_option :out
51
+ conflicts :output, :out
52
+
53
+ end_of_options
54
+ operand :tree_ish
55
+ operand :path, repeatable: true
56
+ end
57
+
58
+ # @!method call(*, **options)
59
+ #
60
+ # @param options [Hash] command options
61
+ #
62
+ # @option options [String] :format (nil) command option key; see overload docs
63
+ # for the full option list
64
+ #
65
+ # @overload call(tree_ish = nil, *path, **options)
66
+ #
67
+ # Execute the `git archive` command.
68
+ #
69
+ # Archive output is binary. On the capturing path (no `out:` option),
70
+ # `normalize` and `chomp` are disabled so stdout bytes are returned
71
+ # unchanged. When `out:` is given, the streaming path is used.
72
+ #
73
+ # @param tree_ish [String, nil] (nil) the tree or commit to produce an archive for;
74
+ # omit when using the `:list` option to enumerate available formats
75
+ #
76
+ # @param path [Array<String>] paths within the tree to include in the archive
77
+ #
78
+ # @param options [Hash] command options
79
+ #
80
+ # @option options [String] :format (nil) archive format — `tar`, `zip`, `tar.gz`,
81
+ # `tgz`, or any format defined via `tar.<format>.command`
82
+ #
83
+ # @option options [Boolean, nil] :list (nil) show all available archive formats
84
+ #
85
+ # Alias: :l
86
+ #
87
+ # @option options [Boolean, nil] :verbose (nil) report progress to stderr
88
+ #
89
+ # Alias: :v
90
+ #
91
+ # @option options [String] :prefix (nil) prepend `<prefix>/` to each filename
92
+ # in the archive
93
+ #
94
+ # @option options [String] :output (nil) write the archive to this file instead
95
+ # of stdout
96
+ #
97
+ # Alias: :o
98
+ #
99
+ # @option options [String, Array<String>] :add_file (nil) add one or more
100
+ # non-tracked files to the archive; may be passed multiple times
101
+ #
102
+ # @option options [String, Array<String>] :add_virtual_file (nil) add one or
103
+ # more virtual files by `<path>:<content>`; may be passed multiple times
104
+ #
105
+ # @option options [Boolean, nil] :worktree_attributes (nil) look for attributes in
106
+ # `.gitattributes` files in the working tree as well
107
+ #
108
+ # @option options [String] :mtime (nil) set modification time of archive entries
109
+ #
110
+ # @option options [String] :remote (nil) retrieve a tar archive from a remote
111
+ # repository instead of the local one
112
+ #
113
+ # @option options [String] :exec (nil) path to `git-upload-archive` on the remote
114
+ # side; used with `:remote`
115
+ #
116
+ # @option options [IO, #write] :out (nil) stream archive output to this IO object
117
+ # instead of capturing it; the result's `.stdout` will be `''`
118
+ #
119
+ # @return [Git::CommandLine::Result] the result of calling `git archive`
120
+ #
121
+ # @raise [ArgumentError] if unsupported options are provided
122
+ #
123
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
124
+ #
125
+ # @api public
126
+
127
+ # Archive output is intrinsically binary (tar, zip, etc.) — opt out of
128
+ # Ruby string normalization and trailing-newline chomping so that
129
+ # `result.stdout` bytes are returned unchanged. Only affects the
130
+ # capturing path; streaming via `out:` is never normalized or chomped
131
+ # regardless of these settings.
132
+ #
133
+ # @return [Boolean] `false`
134
+ #
135
+ def normalize_captured_stdout? = false
136
+
137
+ # Archive output is binary, so preserve captured stdout byte-for-byte
138
+ # even when it ends with a newline.
139
+ #
140
+ # @return [Boolean] `false`
141
+ #
142
+ def chomp_captured_stdout? = false
143
+ end
144
+ end
145
+ end