git 4.3.2 → 5.0.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +67 -2705
  3. data/.github/pull_request_template.md +3 -1
  4. data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
  5. data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
  6. data/.github/skills/command-implementation/REFERENCE.md +993 -0
  7. data/.github/skills/command-implementation/SKILL.md +229 -0
  8. data/.github/skills/command-test-conventions/SKILL.md +660 -0
  9. data/.github/skills/command-yard-documentation/SKILL.md +426 -0
  10. data/.github/skills/dependency-management/SKILL.md +72 -0
  11. data/.github/skills/development-workflow/SKILL.md +506 -0
  12. data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
  13. data/.github/skills/extract-facade-from-base-lib/SKILL.md +586 -0
  14. data/.github/skills/facade-implementation/REFERENCE.md +840 -0
  15. data/.github/skills/facade-implementation/SKILL.md +260 -0
  16. data/.github/skills/facade-test-conventions/SKILL.md +380 -0
  17. data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
  18. data/.github/skills/make-skill-template/SKILL.md +176 -0
  19. data/.github/skills/pr-readiness-review/SKILL.md +185 -0
  20. data/.github/skills/project-context/SKILL.md +313 -0
  21. data/.github/skills/pull-request-review/SKILL.md +168 -0
  22. data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
  23. data/.github/skills/release-management/SKILL.md +125 -0
  24. data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
  25. data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
  26. data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
  27. data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
  28. data/.github/skills/reviewing-skills/SKILL.md +189 -0
  29. data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
  30. data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
  31. data/.github/skills/test-debugging/SKILL.md +160 -0
  32. data/.github/skills/yard-documentation/SKILL.md +793 -0
  33. data/.github/workflows/continuous_integration.yml +3 -2
  34. data/.github/workflows/enforce_conventional_commits.yml +1 -1
  35. data/.github/workflows/experimental_continuous_integration.yml +2 -2
  36. data/.github/workflows/release.yml +3 -4
  37. data/.gitignore +8 -0
  38. data/.husky/pre-commit +13 -0
  39. data/.release-please-manifest.json +1 -1
  40. data/.rspec +3 -0
  41. data/.rubocop.yml +7 -3
  42. data/.rubocop_todo.yml +23 -5
  43. data/.yardopts +1 -0
  44. data/CHANGELOG.md +0 -40
  45. data/CONTRIBUTING.md +694 -53
  46. data/README.md +17 -5
  47. data/Rakefile +61 -9
  48. data/commitlint.test +4 -0
  49. data/git.gemspec +14 -8
  50. data/lib/git/args_builder.rb +0 -8
  51. data/lib/git/base.rb +486 -410
  52. data/lib/git/branch.rb +380 -43
  53. data/lib/git/branch_delete_failure.rb +31 -0
  54. data/lib/git/branch_delete_result.rb +63 -0
  55. data/lib/git/branch_info.rb +178 -0
  56. data/lib/git/branches.rb +130 -24
  57. data/lib/git/command_line/base.rb +245 -0
  58. data/lib/git/command_line/capturing.rb +249 -0
  59. data/lib/git/command_line/result.rb +96 -0
  60. data/lib/git/command_line/streaming.rb +194 -0
  61. data/lib/git/command_line.rb +43 -322
  62. data/lib/git/command_line_result.rb +4 -88
  63. data/lib/git/commands/add.rb +131 -0
  64. data/lib/git/commands/am/abort.rb +43 -0
  65. data/lib/git/commands/am/apply.rb +252 -0
  66. data/lib/git/commands/am/continue.rb +43 -0
  67. data/lib/git/commands/am/quit.rb +43 -0
  68. data/lib/git/commands/am/retry.rb +47 -0
  69. data/lib/git/commands/am/show_current_patch.rb +64 -0
  70. data/lib/git/commands/am/skip.rb +42 -0
  71. data/lib/git/commands/am.rb +33 -0
  72. data/lib/git/commands/apply.rb +237 -0
  73. data/lib/git/commands/archive/list_formats.rb +46 -0
  74. data/lib/git/commands/archive.rb +140 -0
  75. data/lib/git/commands/arguments.rb +3510 -0
  76. data/lib/git/commands/base.rb +403 -0
  77. data/lib/git/commands/branch/copy.rb +94 -0
  78. data/lib/git/commands/branch/create.rb +173 -0
  79. data/lib/git/commands/branch/delete.rb +80 -0
  80. data/lib/git/commands/branch/list.rb +162 -0
  81. data/lib/git/commands/branch/move.rb +94 -0
  82. data/lib/git/commands/branch/set_upstream.rb +86 -0
  83. data/lib/git/commands/branch/show_current.rb +49 -0
  84. data/lib/git/commands/branch/unset_upstream.rb +57 -0
  85. data/lib/git/commands/branch.rb +34 -0
  86. data/lib/git/commands/cat_file/batch.rb +364 -0
  87. data/lib/git/commands/cat_file/filtered.rb +105 -0
  88. data/lib/git/commands/cat_file/raw.rb +210 -0
  89. data/lib/git/commands/cat_file.rb +49 -0
  90. data/lib/git/commands/checkout/branch.rb +151 -0
  91. data/lib/git/commands/checkout/files.rb +115 -0
  92. data/lib/git/commands/checkout.rb +38 -0
  93. data/lib/git/commands/checkout_index.rb +105 -0
  94. data/lib/git/commands/clean.rb +100 -0
  95. data/lib/git/commands/clone.rb +240 -0
  96. data/lib/git/commands/commit.rb +272 -0
  97. data/lib/git/commands/commit_tree.rb +100 -0
  98. data/lib/git/commands/config_option_syntax/add.rb +83 -0
  99. data/lib/git/commands/config_option_syntax/get.rb +117 -0
  100. data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
  101. data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
  102. data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
  103. data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
  104. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +102 -0
  105. data/lib/git/commands/config_option_syntax/list.rb +107 -0
  106. data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
  107. data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
  108. data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
  109. data/lib/git/commands/config_option_syntax/set.rb +114 -0
  110. data/lib/git/commands/config_option_syntax/unset.rb +89 -0
  111. data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
  112. data/lib/git/commands/config_option_syntax.rb +56 -0
  113. data/lib/git/commands/describe.rb +155 -0
  114. data/lib/git/commands/diff.rb +656 -0
  115. data/lib/git/commands/diff_files.rb +518 -0
  116. data/lib/git/commands/diff_index.rb +496 -0
  117. data/lib/git/commands/fetch.rb +352 -0
  118. data/lib/git/commands/fsck.rb +136 -0
  119. data/lib/git/commands/gc.rb +132 -0
  120. data/lib/git/commands/grep.rb +338 -0
  121. data/lib/git/commands/init.rb +99 -0
  122. data/lib/git/commands/log.rb +632 -0
  123. data/lib/git/commands/ls_files.rb +191 -0
  124. data/lib/git/commands/ls_remote.rb +155 -0
  125. data/lib/git/commands/ls_tree.rb +131 -0
  126. data/lib/git/commands/maintenance/register.rb +75 -0
  127. data/lib/git/commands/maintenance/run.rb +104 -0
  128. data/lib/git/commands/maintenance/start.rb +66 -0
  129. data/lib/git/commands/maintenance/stop.rb +55 -0
  130. data/lib/git/commands/maintenance/unregister.rb +79 -0
  131. data/lib/git/commands/maintenance.rb +31 -0
  132. data/lib/git/commands/merge/abort.rb +44 -0
  133. data/lib/git/commands/merge/continue.rb +44 -0
  134. data/lib/git/commands/merge/quit.rb +46 -0
  135. data/lib/git/commands/merge/start.rb +245 -0
  136. data/lib/git/commands/merge.rb +28 -0
  137. data/lib/git/commands/merge_base.rb +86 -0
  138. data/lib/git/commands/mv.rb +77 -0
  139. data/lib/git/commands/name_rev.rb +114 -0
  140. data/lib/git/commands/pull.rb +377 -0
  141. data/lib/git/commands/push.rb +246 -0
  142. data/lib/git/commands/read_tree.rb +149 -0
  143. data/lib/git/commands/remote/add.rb +91 -0
  144. data/lib/git/commands/remote/get_url.rb +66 -0
  145. data/lib/git/commands/remote/list.rb +54 -0
  146. data/lib/git/commands/remote/prune.rb +61 -0
  147. data/lib/git/commands/remote/remove.rb +52 -0
  148. data/lib/git/commands/remote/rename.rb +69 -0
  149. data/lib/git/commands/remote/set_branches.rb +63 -0
  150. data/lib/git/commands/remote/set_head.rb +82 -0
  151. data/lib/git/commands/remote/set_url.rb +71 -0
  152. data/lib/git/commands/remote/set_url_add.rb +61 -0
  153. data/lib/git/commands/remote/set_url_delete.rb +64 -0
  154. data/lib/git/commands/remote/show.rb +71 -0
  155. data/lib/git/commands/remote/update.rb +72 -0
  156. data/lib/git/commands/remote.rb +42 -0
  157. data/lib/git/commands/repack.rb +277 -0
  158. data/lib/git/commands/reset.rb +147 -0
  159. data/lib/git/commands/rev_parse.rb +297 -0
  160. data/lib/git/commands/revert/abort.rb +45 -0
  161. data/lib/git/commands/revert/continue.rb +57 -0
  162. data/lib/git/commands/revert/quit.rb +47 -0
  163. data/lib/git/commands/revert/skip.rb +44 -0
  164. data/lib/git/commands/revert/start.rb +153 -0
  165. data/lib/git/commands/revert.rb +29 -0
  166. data/lib/git/commands/rm.rb +114 -0
  167. data/lib/git/commands/show.rb +632 -0
  168. data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
  169. data/lib/git/commands/show_ref/exists.rb +78 -0
  170. data/lib/git/commands/show_ref/list.rb +145 -0
  171. data/lib/git/commands/show_ref/verify.rb +120 -0
  172. data/lib/git/commands/show_ref.rb +42 -0
  173. data/lib/git/commands/stash/apply.rb +75 -0
  174. data/lib/git/commands/stash/branch.rb +65 -0
  175. data/lib/git/commands/stash/clear.rb +41 -0
  176. data/lib/git/commands/stash/create.rb +58 -0
  177. data/lib/git/commands/stash/drop.rb +67 -0
  178. data/lib/git/commands/stash/list.rb +39 -0
  179. data/lib/git/commands/stash/pop.rb +78 -0
  180. data/lib/git/commands/stash/push.rb +103 -0
  181. data/lib/git/commands/stash/show.rb +149 -0
  182. data/lib/git/commands/stash/store.rb +63 -0
  183. data/lib/git/commands/stash.rb +38 -0
  184. data/lib/git/commands/status.rb +169 -0
  185. data/lib/git/commands/symbolic_ref/delete.rb +68 -0
  186. data/lib/git/commands/symbolic_ref/read.rb +95 -0
  187. data/lib/git/commands/symbolic_ref/update.rb +76 -0
  188. data/lib/git/commands/symbolic_ref.rb +38 -0
  189. data/lib/git/commands/tag/create.rb +139 -0
  190. data/lib/git/commands/tag/delete.rb +55 -0
  191. data/lib/git/commands/tag/list.rb +143 -0
  192. data/lib/git/commands/tag/verify.rb +71 -0
  193. data/lib/git/commands/tag.rb +26 -0
  194. data/lib/git/commands/update_ref/batch.rb +140 -0
  195. data/lib/git/commands/update_ref/delete.rb +92 -0
  196. data/lib/git/commands/update_ref/update.rb +106 -0
  197. data/lib/git/commands/update_ref.rb +42 -0
  198. data/lib/git/commands/version.rb +52 -0
  199. data/lib/git/commands/worktree/add.rb +140 -0
  200. data/lib/git/commands/worktree/list.rb +64 -0
  201. data/lib/git/commands/worktree/lock.rb +58 -0
  202. data/lib/git/commands/worktree/management_base.rb +51 -0
  203. data/lib/git/commands/worktree/move.rb +66 -0
  204. data/lib/git/commands/worktree/prune.rb +67 -0
  205. data/lib/git/commands/worktree/remove.rb +63 -0
  206. data/lib/git/commands/worktree/repair.rb +76 -0
  207. data/lib/git/commands/worktree/unlock.rb +47 -0
  208. data/lib/git/commands/worktree.rb +43 -0
  209. data/lib/git/commands/write_tree.rb +68 -0
  210. data/lib/git/commands.rb +89 -0
  211. data/lib/git/detached_head_info.rb +54 -0
  212. data/lib/git/diff.rb +297 -7
  213. data/lib/git/diff_file_numstat_info.rb +29 -0
  214. data/lib/git/diff_file_patch_info.rb +134 -0
  215. data/lib/git/diff_file_raw_info.rb +127 -0
  216. data/lib/git/diff_info.rb +169 -0
  217. data/lib/git/diff_path_status.rb +78 -19
  218. data/lib/git/diff_result.rb +32 -0
  219. data/lib/git/diff_stats.rb +59 -14
  220. data/lib/git/dirstat_info.rb +86 -0
  221. data/lib/git/errors.rb +65 -2
  222. data/lib/git/execution_context/global.rb +56 -0
  223. data/lib/git/execution_context/repository.rb +147 -0
  224. data/lib/git/execution_context.rb +482 -0
  225. data/lib/git/file_ref.rb +74 -0
  226. data/lib/git/fsck_object.rb +9 -9
  227. data/lib/git/fsck_result.rb +1 -1
  228. data/lib/git/lib.rb +1606 -1028
  229. data/lib/git/log.rb +15 -2
  230. data/lib/git/object.rb +92 -22
  231. data/lib/git/parsers/branch.rb +224 -0
  232. data/lib/git/parsers/cat_file.rb +111 -0
  233. data/lib/git/parsers/diff.rb +585 -0
  234. data/lib/git/parsers/fsck.rb +133 -0
  235. data/lib/git/parsers/grep.rb +42 -0
  236. data/lib/git/parsers/ls_tree.rb +58 -0
  237. data/lib/git/parsers/stash.rb +208 -0
  238. data/lib/git/parsers/tag.rb +257 -0
  239. data/lib/git/remote.rb +133 -9
  240. data/lib/git/repository/branching.rb +572 -0
  241. data/lib/git/repository/committing.rb +191 -0
  242. data/lib/git/repository/configuring.rb +156 -0
  243. data/lib/git/repository/diffing.rb +775 -0
  244. data/lib/git/repository/inspecting.rb +153 -0
  245. data/lib/git/repository/logging.rb +247 -0
  246. data/lib/git/repository/merging.rb +295 -0
  247. data/lib/git/repository/object_operations.rb +1101 -0
  248. data/lib/git/repository/path_resolver.rb +207 -0
  249. data/lib/git/repository/remote_operations.rb +753 -0
  250. data/lib/git/repository/shared_private.rb +51 -0
  251. data/lib/git/repository/staging.rb +390 -0
  252. data/lib/git/repository/stashing.rb +107 -0
  253. data/lib/git/repository/status_operations.rb +180 -0
  254. data/lib/git/repository/worktree_operations.rb +159 -0
  255. data/lib/git/repository.rb +264 -1
  256. data/lib/git/stash.rb +85 -4
  257. data/lib/git/stash_info.rb +104 -0
  258. data/lib/git/stashes.rb +130 -13
  259. data/lib/git/status.rb +224 -18
  260. data/lib/git/tag_delete_failure.rb +31 -0
  261. data/lib/git/tag_delete_result.rb +63 -0
  262. data/lib/git/tag_info.rb +105 -0
  263. data/lib/git/version.rb +109 -2
  264. data/lib/git/version_constraint.rb +81 -0
  265. data/lib/git/worktree.rb +120 -5
  266. data/lib/git/worktrees.rb +107 -7
  267. data/lib/git.rb +114 -18
  268. data/redesign/1_architecture_existing.md +54 -18
  269. data/redesign/2_architecture_redesign.md +365 -46
  270. data/redesign/3_architecture_implementation.md +1451 -54
  271. data/tasks/gem_tasks.rake +4 -0
  272. data/tasks/npm_tasks.rake +7 -0
  273. data/tasks/rspec.rake +48 -0
  274. data/tasks/test.rake +13 -1
  275. data/tasks/yard.rake +34 -7
  276. metadata +349 -20
  277. data/lib/git/index.rb +0 -6
  278. data/lib/git/path.rb +0 -38
  279. data/lib/git/working_directory.rb +0 -6
  280. /data/{release-please-config.json → .release-please-config.json} +0 -0
@@ -0,0 +1,237 @@
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(*, **)
94
+ #
95
+ # @overload call(*patch, **options)
96
+ #
97
+ # Apply one or more patch files to the working tree or index
98
+ #
99
+ # @param patch [Array<String>] zero or more patch file paths to apply;
100
+ # omit to read from standard input
101
+ #
102
+ # @param options [Hash] command options
103
+ #
104
+ # @option options [Boolean, nil] :stat (nil) show diffstat for the input
105
+ # instead of applying
106
+ #
107
+ # Turns off apply mode.
108
+ #
109
+ # @option options [Boolean, nil] :numstat (nil) show numeric diffstat for
110
+ # the input instead of applying
111
+ #
112
+ # Turns off apply mode. Output is in machine-friendly decimal format.
113
+ #
114
+ # @option options [Boolean, nil] :summary (nil) show a condensed summary of
115
+ # extended header information instead of applying
116
+ #
117
+ # Turns off apply mode.
118
+ #
119
+ # @option options [Boolean, nil] :check (nil) check whether the patch applies
120
+ # cleanly without modifying any files
121
+ #
122
+ # Turns off apply mode.
123
+ #
124
+ # @option options [Boolean, nil] :index (nil) apply the patch to both the
125
+ # index and the working tree
126
+ #
127
+ # @option options [Boolean, nil] :intent_to_add (nil) mark new files added by
128
+ # the patch for later addition to the index
129
+ #
130
+ # Alias: `:N`
131
+ #
132
+ # @option options [Boolean, nil] :three_way (nil) attempt a 3-way merge if
133
+ # the patch does not apply cleanly (`--3way`)
134
+ #
135
+ # @option options [Boolean, nil] :ours (nil) resolve 3-way conflicts by
136
+ # favouring our side of the conflict
137
+ #
138
+ # Requires `:three_way`.
139
+ #
140
+ # @option options [Boolean, nil] :theirs (nil) resolve 3-way conflicts by
141
+ # favouring their side of the conflict
142
+ #
143
+ # Requires `:three_way`.
144
+ #
145
+ # @option options [Boolean, nil] :union (nil) resolve 3-way conflicts by
146
+ # including both sides of the conflict
147
+ #
148
+ # Requires `:three_way`.
149
+ #
150
+ # @option options [Boolean, nil] :apply (nil) re-enable the apply step even
151
+ # when a "turns off apply" flag such as `:stat` is also given
152
+ #
153
+ # @option options [Boolean, nil] :no_add (nil) ignore additions made by the
154
+ # patch; apply only the deletions
155
+ #
156
+ # @option options [String] :build_fake_ancestor (nil) path to a
157
+ # temporary index file for building a fake ancestor from the embedded
158
+ # blob identities in the patch
159
+ #
160
+ # @option options [Boolean, nil] :reverse (nil) apply the patch in reverse
161
+ #
162
+ # Alias: `:R`
163
+ #
164
+ # @option options [Boolean, nil] :allow_binary_replacement (nil) allow
165
+ # binary patch application (no-op in Git 2.28+)
166
+ #
167
+ # Alias: `:binary`
168
+ #
169
+ # @option options [Boolean, nil] :reject (nil) leave rejected hunks in
170
+ # `.rej` files instead of aborting
171
+ #
172
+ # @option options [Boolean, nil] :z (nil) use NUL-terminated output for
173
+ # `--numstat` pathnames (`-z`)
174
+ #
175
+ # @option options [Integer] :p (nil) strip this many leading path
176
+ # components from traditional diff paths (`-p<n>`)
177
+ #
178
+ # @option options [Integer] :C (nil) require at least this many lines
179
+ # of surrounding context before and after each change (`-C<n>`)
180
+ #
181
+ # @option options [Boolean, nil] :unidiff_zero (nil) bypass context-line
182
+ # safety checks for diffs generated with `--unified=0`
183
+ #
184
+ # @option options [Boolean, nil] :inaccurate_eof (nil) work around diffs
185
+ # that do not correctly detect a missing newline at end of file
186
+ #
187
+ # @option options [Boolean, nil] :recount (nil) infer hunk sizes from the
188
+ # patch content rather than trusting the hunk header counts
189
+ #
190
+ # @option options [Boolean, nil] :cached (nil) apply the patch only to the
191
+ # index without touching the working tree
192
+ #
193
+ # @option options [Boolean, nil] :ignore_space_change (nil) ignore changes
194
+ # in the amount of whitespace in context lines
195
+ #
196
+ # @option options [Boolean, nil] :ignore_whitespace (nil) ignore all
197
+ # whitespace differences in context lines
198
+ #
199
+ # @option options [String] :whitespace (nil) whitespace error handling
200
+ # mode: `'nowarn'`, `'warn'`, `'fix'`, `'error'`, or `'error-all'`
201
+ #
202
+ # @option options [String] :exclude (nil) skip changes to files
203
+ # matching this path pattern
204
+ #
205
+ # @option options [String] :include (nil) apply changes only to files
206
+ # matching this path pattern
207
+ #
208
+ # @option options [String] :directory (nil) prepend this root to all
209
+ # filenames in the patch
210
+ #
211
+ # @option options [Boolean, nil] :verbose (nil) report progress to stderr
212
+ #
213
+ # Alias: `:v`
214
+ #
215
+ # @option options [Boolean, nil] :quiet (nil) suppress stderr output
216
+ #
217
+ # Alias: `:q`
218
+ #
219
+ # @option options [Boolean, nil] :unsafe_paths (nil) override the safety
220
+ # check that rejects patches affecting paths outside the working area
221
+ #
222
+ # @option options [Boolean, nil] :allow_empty (nil) do not return an error
223
+ # for patches containing no diff
224
+ #
225
+ # @option options [String] :chdir (nil) change to this directory before
226
+ # running git; not passed to the git CLI
227
+ #
228
+ # @return [Git::CommandLineResult] the result of calling `git apply`
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
+ end
236
+ end
237
+ 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::CommandLineResult] 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,140 @@
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(*, **)
59
+ #
60
+ # @overload call(tree_ish = nil, *path, **options)
61
+ #
62
+ # Execute the `git archive` command.
63
+ #
64
+ # Archive output is binary. On the capturing path (no `out:` option),
65
+ # `normalize` and `chomp` are disabled so stdout bytes are returned
66
+ # unchanged. When `out:` is given, the streaming path is used.
67
+ #
68
+ # @param tree_ish [String, nil] (nil) the tree or commit to produce an archive for;
69
+ # omit when using the `:list` option to enumerate available formats
70
+ #
71
+ # @param path [Array<String>] paths within the tree to include in the archive
72
+ #
73
+ # @param options [Hash] command options
74
+ #
75
+ # @option options [String] :format (nil) archive format — `tar`, `zip`, `tar.gz`,
76
+ # `tgz`, or any format defined via `tar.<format>.command`
77
+ #
78
+ # @option options [Boolean, nil] :list (nil) show all available archive formats
79
+ #
80
+ # Alias: :l
81
+ #
82
+ # @option options [Boolean, nil] :verbose (nil) report progress to stderr
83
+ #
84
+ # Alias: :v
85
+ #
86
+ # @option options [String] :prefix (nil) prepend `<prefix>/` to each filename
87
+ # in the archive
88
+ #
89
+ # @option options [String] :output (nil) write the archive to this file instead
90
+ # of stdout
91
+ #
92
+ # Alias: :o
93
+ #
94
+ # @option options [String, Array<String>] :add_file (nil) add one or more
95
+ # non-tracked files to the archive; may be passed multiple times
96
+ #
97
+ # @option options [String, Array<String>] :add_virtual_file (nil) add one or
98
+ # more virtual files by `<path>:<content>`; may be passed multiple times
99
+ #
100
+ # @option options [Boolean, nil] :worktree_attributes (nil) look for attributes in
101
+ # `.gitattributes` files in the working tree as well
102
+ #
103
+ # @option options [String] :mtime (nil) set modification time of archive entries
104
+ #
105
+ # @option options [String] :remote (nil) retrieve a tar archive from a remote
106
+ # repository instead of the local one
107
+ #
108
+ # @option options [String] :exec (nil) path to `git-upload-archive` on the remote
109
+ # side; used with `:remote`
110
+ #
111
+ # @option options [IO, #write] :out (nil) stream archive output to this IO object
112
+ # instead of capturing it; the result's `.stdout` will be `''`
113
+ #
114
+ # @return [Git::CommandLineResult] the result of calling `git archive`
115
+ #
116
+ # @raise [ArgumentError] if unsupported options are provided
117
+ #
118
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
119
+ #
120
+ # @api public
121
+
122
+ # Archive output is intrinsically binary (tar, zip, etc.) — opt out of
123
+ # Ruby string normalization and trailing-newline chomping so that
124
+ # `result.stdout` bytes are returned unchanged. Only affects the
125
+ # capturing path; streaming via `out:` is never normalized or chomped
126
+ # regardless of these settings.
127
+ #
128
+ # @return [Boolean] `false`
129
+ #
130
+ def normalize_captured_stdout? = false
131
+
132
+ # Archive output is binary, so preserve captured stdout byte-for-byte
133
+ # even when it ends with a newline.
134
+ #
135
+ # @return [Boolean] `false`
136
+ #
137
+ def chomp_captured_stdout? = false
138
+ end
139
+ end
140
+ end