git 4.3.2 → 5.0.0.beta.2

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 (297) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +73 -2705
  3. data/.github/prompts/iteratively-address-copilot-reviews.prompt.md +188 -0
  4. data/.github/pull_request_template.md +3 -1
  5. data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
  6. data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
  7. data/.github/skills/command-implementation/REFERENCE.md +993 -0
  8. data/.github/skills/command-implementation/SKILL.md +229 -0
  9. data/.github/skills/command-test-conventions/SKILL.md +660 -0
  10. data/.github/skills/command-yard-documentation/SKILL.md +426 -0
  11. data/.github/skills/dependency-management/SKILL.md +72 -0
  12. data/.github/skills/development-workflow/SKILL.md +506 -0
  13. data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
  14. data/.github/skills/extract-facade-from-base-lib/KEYWORD_ARG_REMEDIATION.md +22 -0
  15. data/.github/skills/extract-facade-from-base-lib/SKILL.md +600 -0
  16. data/.github/skills/facade-implementation/REFERENCE.md +840 -0
  17. data/.github/skills/facade-implementation/SKILL.md +274 -0
  18. data/.github/skills/facade-test-conventions/SKILL.md +394 -0
  19. data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
  20. data/.github/skills/make-skill-template/SKILL.md +176 -0
  21. data/.github/skills/pr-readiness-review/SKILL.md +185 -0
  22. data/.github/skills/project-context/SKILL.md +313 -0
  23. data/.github/skills/pull-request-review/SKILL.md +168 -0
  24. data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
  25. data/.github/skills/release-management/SKILL.md +125 -0
  26. data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
  27. data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
  28. data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
  29. data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
  30. data/.github/skills/reviewing-skills/SKILL.md +189 -0
  31. data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
  32. data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
  33. data/.github/skills/test-debugging/SKILL.md +160 -0
  34. data/.github/skills/yard-documentation/SKILL.md +793 -0
  35. data/.github/workflows/continuous_integration.yml +3 -2
  36. data/.github/workflows/enforce_conventional_commits.yml +1 -1
  37. data/.github/workflows/experimental_continuous_integration.yml +2 -2
  38. data/.github/workflows/release.yml +3 -4
  39. data/.gitignore +8 -0
  40. data/.husky/pre-commit +13 -0
  41. data/.release-please-manifest.json +1 -1
  42. data/.rspec +3 -0
  43. data/.rubocop.yml +12 -3
  44. data/.rubocop_todo.yml +23 -5
  45. data/.yardopts +1 -0
  46. data/CHANGELOG.md +0 -40
  47. data/CONTRIBUTING.md +694 -53
  48. data/README.md +67 -15
  49. data/Rakefile +61 -9
  50. data/UPGRADING.md +141 -0
  51. data/commitlint.test +4 -0
  52. data/git.gemspec +18 -7
  53. data/lib/git/args_builder.rb +0 -8
  54. data/lib/git/branch.rb +369 -43
  55. data/lib/git/branch_delete_failure.rb +31 -0
  56. data/lib/git/branch_delete_result.rb +63 -0
  57. data/lib/git/branch_info.rb +178 -0
  58. data/lib/git/branches.rb +122 -24
  59. data/lib/git/command_line/base.rb +255 -0
  60. data/lib/git/command_line/capturing.rb +251 -0
  61. data/lib/git/command_line/result.rb +96 -0
  62. data/lib/git/command_line/streaming.rb +196 -0
  63. data/lib/git/command_line.rb +43 -322
  64. data/lib/git/command_line_result.rb +4 -88
  65. data/lib/git/commands/add.rb +131 -0
  66. data/lib/git/commands/am/abort.rb +43 -0
  67. data/lib/git/commands/am/apply.rb +252 -0
  68. data/lib/git/commands/am/continue.rb +43 -0
  69. data/lib/git/commands/am/quit.rb +43 -0
  70. data/lib/git/commands/am/retry.rb +47 -0
  71. data/lib/git/commands/am/show_current_patch.rb +64 -0
  72. data/lib/git/commands/am/skip.rb +42 -0
  73. data/lib/git/commands/am.rb +33 -0
  74. data/lib/git/commands/apply.rb +237 -0
  75. data/lib/git/commands/archive/list_formats.rb +46 -0
  76. data/lib/git/commands/archive.rb +140 -0
  77. data/lib/git/commands/arguments.rb +3510 -0
  78. data/lib/git/commands/base.rb +404 -0
  79. data/lib/git/commands/branch/copy.rb +94 -0
  80. data/lib/git/commands/branch/create.rb +173 -0
  81. data/lib/git/commands/branch/delete.rb +80 -0
  82. data/lib/git/commands/branch/list.rb +162 -0
  83. data/lib/git/commands/branch/move.rb +94 -0
  84. data/lib/git/commands/branch/set_upstream.rb +86 -0
  85. data/lib/git/commands/branch/show_current.rb +49 -0
  86. data/lib/git/commands/branch/unset_upstream.rb +57 -0
  87. data/lib/git/commands/branch.rb +34 -0
  88. data/lib/git/commands/cat_file/batch.rb +369 -0
  89. data/lib/git/commands/cat_file/filtered.rb +105 -0
  90. data/lib/git/commands/cat_file/raw.rb +216 -0
  91. data/lib/git/commands/cat_file.rb +49 -0
  92. data/lib/git/commands/checkout/branch.rb +151 -0
  93. data/lib/git/commands/checkout/files.rb +115 -0
  94. data/lib/git/commands/checkout.rb +38 -0
  95. data/lib/git/commands/checkout_index.rb +105 -0
  96. data/lib/git/commands/clean.rb +100 -0
  97. data/lib/git/commands/clone.rb +240 -0
  98. data/lib/git/commands/commit.rb +272 -0
  99. data/lib/git/commands/commit_tree.rb +100 -0
  100. data/lib/git/commands/config_option_syntax/add.rb +83 -0
  101. data/lib/git/commands/config_option_syntax/get.rb +117 -0
  102. data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
  103. data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
  104. data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
  105. data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
  106. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +107 -0
  107. data/lib/git/commands/config_option_syntax/list.rb +107 -0
  108. data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
  109. data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
  110. data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
  111. data/lib/git/commands/config_option_syntax/set.rb +114 -0
  112. data/lib/git/commands/config_option_syntax/unset.rb +89 -0
  113. data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
  114. data/lib/git/commands/config_option_syntax.rb +56 -0
  115. data/lib/git/commands/describe.rb +155 -0
  116. data/lib/git/commands/diff.rb +656 -0
  117. data/lib/git/commands/diff_files.rb +518 -0
  118. data/lib/git/commands/diff_index.rb +496 -0
  119. data/lib/git/commands/fetch.rb +352 -0
  120. data/lib/git/commands/fsck.rb +136 -0
  121. data/lib/git/commands/gc.rb +132 -0
  122. data/lib/git/commands/grep.rb +338 -0
  123. data/lib/git/commands/init.rb +99 -0
  124. data/lib/git/commands/log.rb +632 -0
  125. data/lib/git/commands/ls_files.rb +191 -0
  126. data/lib/git/commands/ls_remote.rb +155 -0
  127. data/lib/git/commands/ls_tree.rb +131 -0
  128. data/lib/git/commands/maintenance/register.rb +75 -0
  129. data/lib/git/commands/maintenance/run.rb +104 -0
  130. data/lib/git/commands/maintenance/start.rb +66 -0
  131. data/lib/git/commands/maintenance/stop.rb +55 -0
  132. data/lib/git/commands/maintenance/unregister.rb +79 -0
  133. data/lib/git/commands/maintenance.rb +31 -0
  134. data/lib/git/commands/merge/abort.rb +44 -0
  135. data/lib/git/commands/merge/continue.rb +44 -0
  136. data/lib/git/commands/merge/quit.rb +46 -0
  137. data/lib/git/commands/merge/start.rb +245 -0
  138. data/lib/git/commands/merge.rb +28 -0
  139. data/lib/git/commands/merge_base.rb +86 -0
  140. data/lib/git/commands/mv.rb +77 -0
  141. data/lib/git/commands/name_rev.rb +114 -0
  142. data/lib/git/commands/pull.rb +377 -0
  143. data/lib/git/commands/push.rb +246 -0
  144. data/lib/git/commands/read_tree.rb +149 -0
  145. data/lib/git/commands/remote/add.rb +91 -0
  146. data/lib/git/commands/remote/get_url.rb +66 -0
  147. data/lib/git/commands/remote/list.rb +54 -0
  148. data/lib/git/commands/remote/prune.rb +61 -0
  149. data/lib/git/commands/remote/remove.rb +52 -0
  150. data/lib/git/commands/remote/rename.rb +69 -0
  151. data/lib/git/commands/remote/set_branches.rb +63 -0
  152. data/lib/git/commands/remote/set_head.rb +82 -0
  153. data/lib/git/commands/remote/set_url.rb +71 -0
  154. data/lib/git/commands/remote/set_url_add.rb +61 -0
  155. data/lib/git/commands/remote/set_url_delete.rb +64 -0
  156. data/lib/git/commands/remote/show.rb +71 -0
  157. data/lib/git/commands/remote/update.rb +72 -0
  158. data/lib/git/commands/remote.rb +42 -0
  159. data/lib/git/commands/repack.rb +277 -0
  160. data/lib/git/commands/reset.rb +147 -0
  161. data/lib/git/commands/rev_parse.rb +297 -0
  162. data/lib/git/commands/revert/abort.rb +45 -0
  163. data/lib/git/commands/revert/continue.rb +57 -0
  164. data/lib/git/commands/revert/quit.rb +47 -0
  165. data/lib/git/commands/revert/skip.rb +44 -0
  166. data/lib/git/commands/revert/start.rb +153 -0
  167. data/lib/git/commands/revert.rb +29 -0
  168. data/lib/git/commands/rm.rb +114 -0
  169. data/lib/git/commands/show.rb +632 -0
  170. data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
  171. data/lib/git/commands/show_ref/exists.rb +78 -0
  172. data/lib/git/commands/show_ref/list.rb +145 -0
  173. data/lib/git/commands/show_ref/verify.rb +120 -0
  174. data/lib/git/commands/show_ref.rb +42 -0
  175. data/lib/git/commands/stash/apply.rb +75 -0
  176. data/lib/git/commands/stash/branch.rb +65 -0
  177. data/lib/git/commands/stash/clear.rb +41 -0
  178. data/lib/git/commands/stash/create.rb +58 -0
  179. data/lib/git/commands/stash/drop.rb +67 -0
  180. data/lib/git/commands/stash/list.rb +39 -0
  181. data/lib/git/commands/stash/pop.rb +78 -0
  182. data/lib/git/commands/stash/push.rb +103 -0
  183. data/lib/git/commands/stash/show.rb +149 -0
  184. data/lib/git/commands/stash/store.rb +63 -0
  185. data/lib/git/commands/stash.rb +38 -0
  186. data/lib/git/commands/status.rb +169 -0
  187. data/lib/git/commands/symbolic_ref/delete.rb +68 -0
  188. data/lib/git/commands/symbolic_ref/read.rb +95 -0
  189. data/lib/git/commands/symbolic_ref/update.rb +76 -0
  190. data/lib/git/commands/symbolic_ref.rb +38 -0
  191. data/lib/git/commands/tag/create.rb +139 -0
  192. data/lib/git/commands/tag/delete.rb +55 -0
  193. data/lib/git/commands/tag/list.rb +143 -0
  194. data/lib/git/commands/tag/verify.rb +71 -0
  195. data/lib/git/commands/tag.rb +26 -0
  196. data/lib/git/commands/update_ref/batch.rb +140 -0
  197. data/lib/git/commands/update_ref/delete.rb +92 -0
  198. data/lib/git/commands/update_ref/update.rb +106 -0
  199. data/lib/git/commands/update_ref.rb +42 -0
  200. data/lib/git/commands/version.rb +57 -0
  201. data/lib/git/commands/worktree/add.rb +140 -0
  202. data/lib/git/commands/worktree/list.rb +64 -0
  203. data/lib/git/commands/worktree/lock.rb +58 -0
  204. data/lib/git/commands/worktree/management_base.rb +51 -0
  205. data/lib/git/commands/worktree/move.rb +66 -0
  206. data/lib/git/commands/worktree/prune.rb +67 -0
  207. data/lib/git/commands/worktree/remove.rb +63 -0
  208. data/lib/git/commands/worktree/repair.rb +76 -0
  209. data/lib/git/commands/worktree/unlock.rb +47 -0
  210. data/lib/git/commands/worktree.rb +43 -0
  211. data/lib/git/commands/write_tree.rb +68 -0
  212. data/lib/git/commands.rb +87 -0
  213. data/lib/git/config.rb +17 -0
  214. data/lib/git/config_entry_info.rb +106 -0
  215. data/lib/git/configuring.rb +665 -0
  216. data/lib/git/deprecation.rb +9 -0
  217. data/lib/git/detached_head_info.rb +54 -0
  218. data/lib/git/diff.rb +293 -7
  219. data/lib/git/diff_file_numstat_info.rb +29 -0
  220. data/lib/git/diff_file_patch_info.rb +134 -0
  221. data/lib/git/diff_file_raw_info.rb +127 -0
  222. data/lib/git/diff_info.rb +169 -0
  223. data/lib/git/diff_path_status.rb +67 -19
  224. data/lib/git/diff_result.rb +32 -0
  225. data/lib/git/diff_stats.rb +51 -14
  226. data/lib/git/dirstat_info.rb +86 -0
  227. data/lib/git/errors.rb +65 -2
  228. data/lib/git/execution_context/global.rb +31 -0
  229. data/lib/git/execution_context/repository.rb +136 -0
  230. data/lib/git/execution_context.rb +501 -0
  231. data/lib/git/file_ref.rb +74 -0
  232. data/lib/git/fsck_object.rb +9 -9
  233. data/lib/git/fsck_result.rb +1 -1
  234. data/lib/git/log.rb +9 -2
  235. data/lib/git/object.rb +90 -27
  236. data/lib/git/parsers/branch.rb +224 -0
  237. data/lib/git/parsers/cat_file.rb +111 -0
  238. data/lib/git/parsers/config_entry.rb +110 -0
  239. data/lib/git/parsers/diff.rb +585 -0
  240. data/lib/git/parsers/fsck.rb +133 -0
  241. data/lib/git/parsers/grep.rb +42 -0
  242. data/lib/git/parsers/ls_remote.rb +79 -0
  243. data/lib/git/parsers/ls_tree.rb +58 -0
  244. data/lib/git/parsers/stash.rb +208 -0
  245. data/lib/git/parsers/tag.rb +257 -0
  246. data/lib/git/remote.rb +120 -9
  247. data/lib/git/repository/branching.rb +743 -0
  248. data/lib/git/repository/committing.rb +187 -0
  249. data/lib/git/repository/configuring.rb +351 -0
  250. data/lib/git/repository/context_helpers.rb +264 -0
  251. data/lib/git/repository/diffing.rb +775 -0
  252. data/lib/git/repository/factories.rb +682 -0
  253. data/lib/git/repository/inspecting.rb +252 -0
  254. data/lib/git/repository/logging.rb +247 -0
  255. data/lib/git/repository/maintenance.rb +65 -0
  256. data/lib/git/repository/merging.rb +357 -0
  257. data/lib/git/repository/object_operations.rb +1199 -0
  258. data/lib/git/repository/path_resolver.rb +207 -0
  259. data/lib/git/repository/remote_operations.rb +898 -0
  260. data/lib/git/repository/shared_private.rb +51 -0
  261. data/lib/git/repository/staging.rb +554 -0
  262. data/lib/git/repository/stashing.rb +143 -0
  263. data/lib/git/repository/status_operations.rb +201 -0
  264. data/lib/git/repository/worktree_operations.rb +159 -0
  265. data/lib/git/repository.rb +203 -1
  266. data/lib/git/stash.rb +78 -4
  267. data/lib/git/stash_info.rb +104 -0
  268. data/lib/git/stashes.rb +125 -13
  269. data/lib/git/status.rb +215 -18
  270. data/lib/git/tag_delete_failure.rb +31 -0
  271. data/lib/git/tag_delete_result.rb +63 -0
  272. data/lib/git/tag_info.rb +105 -0
  273. data/lib/git/version.rb +109 -2
  274. data/lib/git/version_constraint.rb +81 -0
  275. data/lib/git/worktree.rb +108 -6
  276. data/lib/git/worktrees.rb +94 -7
  277. data/lib/git.rb +260 -61
  278. data/redesign/1_architecture_existing.md +54 -18
  279. data/redesign/2_architecture_redesign.md +365 -46
  280. data/redesign/3_architecture_implementation.md +1497 -63
  281. data/redesign/Phase 4 - Step A.md +360 -0
  282. data/redesign/beta_release.md +107 -0
  283. data/redesign/c1c2_audit.md +566 -0
  284. data/redesign/c1c2_bucket6_lib_orphans.md +626 -0
  285. data/redesign/config_design.rb +501 -0
  286. data/tasks/gem_tasks.rake +4 -0
  287. data/tasks/npm_tasks.rake +7 -0
  288. data/tasks/rspec.rake +48 -0
  289. data/tasks/test.rake +13 -1
  290. data/tasks/yard.rake +34 -7
  291. metadata +365 -22
  292. data/lib/git/base.rb +0 -1128
  293. data/lib/git/index.rb +0 -6
  294. data/lib/git/lib.rb +0 -2277
  295. data/lib/git/path.rb +0 -38
  296. data/lib/git/working_directory.rb +0 -6
  297. /data/{release-please-config.json → .release-please-config.json} +0 -0
data/lib/git/errors.rb CHANGED
@@ -21,7 +21,8 @@ module Git
21
21
  # │ └─> Git::SignaledError
22
22
  # │ └─> Git::TimeoutError
23
23
  # ├─> Git::ProcessIOError
24
- # └─> Git::UnexpectedResultError
24
+ # ├─> Git::UnexpectedResultError
25
+ # └─> Git::VersionError
25
26
  # ```
26
27
  #
27
28
  # | Error Class | Description |
@@ -33,6 +34,7 @@ module Git
33
34
  # | `TimeoutError` | This is a specific type of `SignaledError` that is raised when the git command line operation times out and is killed via the SIGKILL signal. This happens if the operation takes longer than the timeout duration configured in `Git.config.timeout` or via the `:timeout` parameter given in git methods that support timeouts. |
34
35
  # | `ProcessIOError` | An error was encountered reading or writing to a subprocess. |
35
36
  # | `UnexpectedResultError` | The command line ran without error but did not return the expected results. |
37
+ # | `VersionError` | The installed git version does not meet the requirements of the git gem or a specific command. |
36
38
  #
37
39
  # @example Rescuing a generic error
38
40
  # begin
@@ -57,6 +59,7 @@ module Git
57
59
  # @see Git::TimeoutError
58
60
  # @see Git::ProcessIOError
59
61
  # @see Git::UnexpectedResultError
62
+ # @see Git::VersionError
60
63
  #
61
64
  # @api public
62
65
  #
@@ -146,7 +149,7 @@ module Git
146
149
  # The git command executed, status, stdout, and stderr, and the timeout duration
147
150
  # are available from this object.
148
151
  #
149
- # result.status.timeout? will be `true`
152
+ # result.status.timed_out? will be `true`
150
153
  #
151
154
  # @api public
152
155
  #
@@ -209,4 +212,64 @@ module Git
209
212
  # @api public
210
213
  #
211
214
  class UnexpectedResultError < Git::Error; end
215
+
216
+ # Raised when the installed git version does not meet requirements
217
+ #
218
+ # This error is raised when:
219
+ # - The installed git version is below `Git::MINIMUM_GIT_VERSION`
220
+ # - A command requires a minimum git version that isn't met
221
+ # - A command was removed in a git version older than the installed version
222
+ #
223
+ # @example Rescuing a version error
224
+ # begin
225
+ # git.some_command
226
+ # rescue Git::VersionError => e
227
+ # puts "Git version #{e.actual_version} does not meet requirements"
228
+ # puts " #{e.subject}: requires #{e.constraint}"
229
+ # end
230
+ #
231
+ # @api public
232
+ #
233
+ class VersionError < Git::Error
234
+ # Create a VersionError
235
+ #
236
+ # @param subject [#to_s] the entity with the version requirement (e.g., "The git gem", a Class)
237
+ # @param constraint [Git::VersionConstraint] the version constraint that was violated
238
+ # @param actual_version [Git::Version] the installed git version
239
+ #
240
+ def initialize(subject:, constraint:, actual_version:)
241
+ @subject = subject
242
+ @constraint = constraint
243
+ @actual_version = actual_version
244
+ super(build_message)
245
+ end
246
+
247
+ # The entity that has the version requirement
248
+ #
249
+ # @return [#to_s]
250
+ #
251
+ attr_reader :subject
252
+
253
+ # The version constraint that was violated
254
+ #
255
+ # @return [Git::VersionConstraint]
256
+ #
257
+ attr_reader :constraint
258
+
259
+ # The installed git version that caused the error
260
+ #
261
+ # @return [Git::Version]
262
+ #
263
+ attr_reader :actual_version
264
+
265
+ private
266
+
267
+ def build_message
268
+ if constraint.too_new?(actual_version)
269
+ "#{subject} requires git < #{constraint.before} (found #{actual_version})"
270
+ else
271
+ "#{subject} requires git >= #{constraint.min} (found #{actual_version})"
272
+ end
273
+ end
274
+ end
212
275
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/execution_context'
4
+
5
+ module Git
6
+ class ExecutionContext
7
+ # Execution context for global git commands (no repository required)
8
+ #
9
+ # Used for commands that do not require an existing repository — such as
10
+ # `git init`, `git clone`, and `git version`. Unlike
11
+ # {Git::ExecutionContext::Repository}, this class leaves `GIT_DIR`,
12
+ # `GIT_WORK_TREE`, and `GIT_INDEX_FILE` as `nil` (which unsets them), so
13
+ # that the parent environment cannot leak an unintended repository context.
14
+ # `GIT_SSH` is still supported to allow SSH-based remote operations
15
+ # (e.g. `git clone git@github.com:...`).
16
+ #
17
+ # @example Create a context using the default git binary
18
+ # context = Git::ExecutionContext::Global.new
19
+ #
20
+ # @example Create a context targeting a specific binary
21
+ # context = Git::ExecutionContext::Global.new(binary_path: '/usr/local/bin/git2')
22
+ #
23
+ # @see Git::ExecutionContext#initialize for constructor parameters and
24
+ # their semantics
25
+ #
26
+ # @api private
27
+ #
28
+ class Global < ExecutionContext
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/execution_context'
4
+
5
+ module Git
6
+ class ExecutionContext
7
+ # Execution context for repository-bound git commands
8
+ #
9
+ # Manages the git environment for commands that operate within an existing
10
+ # repository — setting `GIT_DIR`, `GIT_WORK_TREE`, `GIT_INDEX_FILE`, and
11
+ # `GIT_SSH` — and prepending `--git-dir` / `--work-tree` to every git
12
+ # invocation via {#global_opts}.
13
+ #
14
+ # ### Construction
15
+ #
16
+ # Use {.from_hash} to build from a configuration hash:
17
+ #
18
+ # context = Git::ExecutionContext::Repository.from_hash(repository: '/repo/.git', ...)
19
+ #
20
+ # @example Build from a configuration hash
21
+ # context = Git::ExecutionContext::Repository.from_hash(
22
+ # repository: '/path/to/.git',
23
+ # working_directory: '/path/to'
24
+ # )
25
+ #
26
+ # @api private
27
+ #
28
+ class Repository < ExecutionContext
29
+ # Creates a Repository context from a Hash
30
+ #
31
+ # Expected keys: `:repository`, `:working_directory`, `:index`, `:git_ssh`,
32
+ # `:binary_path`
33
+ #
34
+ # @example Build from a configuration hash
35
+ # context = Git::ExecutionContext::Repository.from_hash(
36
+ # repository: '/path/to/.git',
37
+ # working_directory: '/path/to'
38
+ # )
39
+ #
40
+ # @param base_hash [Hash] the hash of repository configuration values
41
+ #
42
+ # @param logger [Logger, nil] logger forwarded to the CommandLine layer;
43
+ # `nil` uses a null logger (see {Git::ExecutionContext#initialize})
44
+ #
45
+ # @return [Git::ExecutionContext::Repository] the new repository context
46
+ #
47
+ def self.from_hash(base_hash, logger: nil)
48
+ new(
49
+ git_dir: base_hash[:repository],
50
+ git_index_file: base_hash[:index],
51
+ git_work_dir: base_hash[:working_directory],
52
+ git_ssh: base_hash.fetch(:git_ssh, :use_global_config),
53
+ binary_path: base_hash.fetch(:binary_path, :use_global_config),
54
+ logger: logger
55
+ )
56
+ end
57
+
58
+ # Creates a new repository execution context
59
+ #
60
+ # @example Create with required git_dir
61
+ # Git::ExecutionContext::Repository.new(git_dir: '/path/to/.git')
62
+ #
63
+ # @param git_dir [String, nil] path to the `.git` directory
64
+ #
65
+ # @param git_work_dir [String, nil] path to the working tree
66
+ #
67
+ # @param git_index_file [String, nil] path to the index file
68
+ #
69
+ # @param binary_path [String, :use_global_config] path to the git binary
70
+ #
71
+ # Give `:use_global_config` (the default) to use
72
+ # `Git::Config.instance.binary_path`.
73
+ #
74
+ # Passing `nil` raises `ArgumentError` — there is no "unset the
75
+ # binary" semantic.
76
+ #
77
+ # @param git_ssh [String, nil, :use_global_config] the SSH wrapper path
78
+ #
79
+ # Give `nil` to unset `GIT_SSH`, or `:use_global_config` (default)
80
+ # to use `Git::Config.instance.git_ssh`.
81
+ #
82
+ # @param logger [Logger, nil] the logger to use in the CommandLine layer
83
+ #
84
+ # Give `nil` to use a null logger (`Logger.new(nil)`).
85
+ #
86
+ # @raise [ArgumentError] if `binary_path` is `nil`
87
+ #
88
+ def initialize( # rubocop:disable Metrics/ParameterLists
89
+ git_dir:,
90
+ git_work_dir: nil,
91
+ git_index_file: nil,
92
+ binary_path: :use_global_config,
93
+ git_ssh: :use_global_config,
94
+ logger: nil
95
+ )
96
+ super(binary_path: binary_path, git_ssh: git_ssh, logger: logger)
97
+ @git_dir = git_dir
98
+ @git_work_dir = git_work_dir
99
+ @git_index_file = git_index_file
100
+ end
101
+
102
+ # @return [String, nil] path to the `.git` directory
103
+ attr_reader :git_dir
104
+
105
+ # @return [String, nil] path to the working tree
106
+ attr_reader :git_work_dir
107
+
108
+ # @return [String, nil] path to the index file
109
+ attr_reader :git_index_file
110
+
111
+ # Returns a new instance with the same configuration, applying `overrides`
112
+ #
113
+ # Uses raw stored values for `binary_path`, `git_ssh`, and `logger` so
114
+ # that `:use_global_config` sentinels are preserved across rebuilds and
115
+ # future changes to `Git.configure` continue to take effect.
116
+ #
117
+ # @param overrides [Hash] keyword arguments to override in the new instance
118
+ #
119
+ # @return [Git::ExecutionContext::Repository] the new context
120
+ #
121
+ # @api private
122
+ #
123
+ def dup_with(**overrides)
124
+ self.class.new(
125
+ git_dir: @git_dir,
126
+ git_work_dir: @git_work_dir,
127
+ git_index_file: @git_index_file,
128
+ binary_path: @binary_path,
129
+ git_ssh: @git_ssh,
130
+ logger: @logger,
131
+ **overrides
132
+ )
133
+ end
134
+ end
135
+ end
136
+ end