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.
- checksums.yaml +4 -4
- data/.github/copilot-instructions.md +73 -2705
- data/.github/prompts/iteratively-address-copilot-reviews.prompt.md +188 -0
- data/.github/pull_request_template.md +3 -1
- data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
- data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
- data/.github/skills/command-implementation/REFERENCE.md +993 -0
- data/.github/skills/command-implementation/SKILL.md +229 -0
- data/.github/skills/command-test-conventions/SKILL.md +660 -0
- data/.github/skills/command-yard-documentation/SKILL.md +426 -0
- data/.github/skills/dependency-management/SKILL.md +72 -0
- data/.github/skills/development-workflow/SKILL.md +506 -0
- data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
- data/.github/skills/extract-facade-from-base-lib/KEYWORD_ARG_REMEDIATION.md +22 -0
- data/.github/skills/extract-facade-from-base-lib/SKILL.md +600 -0
- data/.github/skills/facade-implementation/REFERENCE.md +840 -0
- data/.github/skills/facade-implementation/SKILL.md +274 -0
- data/.github/skills/facade-test-conventions/SKILL.md +394 -0
- data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
- data/.github/skills/make-skill-template/SKILL.md +176 -0
- data/.github/skills/pr-readiness-review/SKILL.md +185 -0
- data/.github/skills/project-context/SKILL.md +313 -0
- data/.github/skills/pull-request-review/SKILL.md +168 -0
- data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
- data/.github/skills/release-management/SKILL.md +125 -0
- data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
- data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
- data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
- data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
- data/.github/skills/reviewing-skills/SKILL.md +189 -0
- data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
- data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
- data/.github/skills/test-debugging/SKILL.md +160 -0
- data/.github/skills/yard-documentation/SKILL.md +793 -0
- data/.github/workflows/continuous_integration.yml +3 -2
- data/.github/workflows/enforce_conventional_commits.yml +1 -1
- data/.github/workflows/experimental_continuous_integration.yml +2 -2
- data/.github/workflows/release.yml +3 -4
- data/.gitignore +8 -0
- data/.husky/pre-commit +13 -0
- data/.release-please-manifest.json +1 -1
- data/.rspec +3 -0
- data/.rubocop.yml +12 -3
- data/.rubocop_todo.yml +23 -5
- data/.yardopts +1 -0
- data/CHANGELOG.md +0 -40
- data/CONTRIBUTING.md +694 -53
- data/README.md +67 -15
- data/Rakefile +61 -9
- data/UPGRADING.md +141 -0
- data/commitlint.test +4 -0
- data/git.gemspec +18 -7
- data/lib/git/args_builder.rb +0 -8
- data/lib/git/branch.rb +369 -43
- data/lib/git/branch_delete_failure.rb +31 -0
- data/lib/git/branch_delete_result.rb +63 -0
- data/lib/git/branch_info.rb +178 -0
- data/lib/git/branches.rb +122 -24
- data/lib/git/command_line/base.rb +255 -0
- data/lib/git/command_line/capturing.rb +251 -0
- data/lib/git/command_line/result.rb +96 -0
- data/lib/git/command_line/streaming.rb +196 -0
- data/lib/git/command_line.rb +43 -322
- data/lib/git/command_line_result.rb +4 -88
- data/lib/git/commands/add.rb +131 -0
- data/lib/git/commands/am/abort.rb +43 -0
- data/lib/git/commands/am/apply.rb +252 -0
- data/lib/git/commands/am/continue.rb +43 -0
- data/lib/git/commands/am/quit.rb +43 -0
- data/lib/git/commands/am/retry.rb +47 -0
- data/lib/git/commands/am/show_current_patch.rb +64 -0
- data/lib/git/commands/am/skip.rb +42 -0
- data/lib/git/commands/am.rb +33 -0
- data/lib/git/commands/apply.rb +237 -0
- data/lib/git/commands/archive/list_formats.rb +46 -0
- data/lib/git/commands/archive.rb +140 -0
- data/lib/git/commands/arguments.rb +3510 -0
- data/lib/git/commands/base.rb +404 -0
- data/lib/git/commands/branch/copy.rb +94 -0
- data/lib/git/commands/branch/create.rb +173 -0
- data/lib/git/commands/branch/delete.rb +80 -0
- data/lib/git/commands/branch/list.rb +162 -0
- data/lib/git/commands/branch/move.rb +94 -0
- data/lib/git/commands/branch/set_upstream.rb +86 -0
- data/lib/git/commands/branch/show_current.rb +49 -0
- data/lib/git/commands/branch/unset_upstream.rb +57 -0
- data/lib/git/commands/branch.rb +34 -0
- data/lib/git/commands/cat_file/batch.rb +369 -0
- data/lib/git/commands/cat_file/filtered.rb +105 -0
- data/lib/git/commands/cat_file/raw.rb +216 -0
- data/lib/git/commands/cat_file.rb +49 -0
- data/lib/git/commands/checkout/branch.rb +151 -0
- data/lib/git/commands/checkout/files.rb +115 -0
- data/lib/git/commands/checkout.rb +38 -0
- data/lib/git/commands/checkout_index.rb +105 -0
- data/lib/git/commands/clean.rb +100 -0
- data/lib/git/commands/clone.rb +240 -0
- data/lib/git/commands/commit.rb +272 -0
- data/lib/git/commands/commit_tree.rb +100 -0
- data/lib/git/commands/config_option_syntax/add.rb +83 -0
- data/lib/git/commands/config_option_syntax/get.rb +117 -0
- data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
- data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
- data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
- data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
- data/lib/git/commands/config_option_syntax/get_urlmatch.rb +107 -0
- data/lib/git/commands/config_option_syntax/list.rb +107 -0
- data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
- data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
- data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
- data/lib/git/commands/config_option_syntax/set.rb +114 -0
- data/lib/git/commands/config_option_syntax/unset.rb +89 -0
- data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
- data/lib/git/commands/config_option_syntax.rb +56 -0
- data/lib/git/commands/describe.rb +155 -0
- data/lib/git/commands/diff.rb +656 -0
- data/lib/git/commands/diff_files.rb +518 -0
- data/lib/git/commands/diff_index.rb +496 -0
- data/lib/git/commands/fetch.rb +352 -0
- data/lib/git/commands/fsck.rb +136 -0
- data/lib/git/commands/gc.rb +132 -0
- data/lib/git/commands/grep.rb +338 -0
- data/lib/git/commands/init.rb +99 -0
- data/lib/git/commands/log.rb +632 -0
- data/lib/git/commands/ls_files.rb +191 -0
- data/lib/git/commands/ls_remote.rb +155 -0
- data/lib/git/commands/ls_tree.rb +131 -0
- data/lib/git/commands/maintenance/register.rb +75 -0
- data/lib/git/commands/maintenance/run.rb +104 -0
- data/lib/git/commands/maintenance/start.rb +66 -0
- data/lib/git/commands/maintenance/stop.rb +55 -0
- data/lib/git/commands/maintenance/unregister.rb +79 -0
- data/lib/git/commands/maintenance.rb +31 -0
- data/lib/git/commands/merge/abort.rb +44 -0
- data/lib/git/commands/merge/continue.rb +44 -0
- data/lib/git/commands/merge/quit.rb +46 -0
- data/lib/git/commands/merge/start.rb +245 -0
- data/lib/git/commands/merge.rb +28 -0
- data/lib/git/commands/merge_base.rb +86 -0
- data/lib/git/commands/mv.rb +77 -0
- data/lib/git/commands/name_rev.rb +114 -0
- data/lib/git/commands/pull.rb +377 -0
- data/lib/git/commands/push.rb +246 -0
- data/lib/git/commands/read_tree.rb +149 -0
- data/lib/git/commands/remote/add.rb +91 -0
- data/lib/git/commands/remote/get_url.rb +66 -0
- data/lib/git/commands/remote/list.rb +54 -0
- data/lib/git/commands/remote/prune.rb +61 -0
- data/lib/git/commands/remote/remove.rb +52 -0
- data/lib/git/commands/remote/rename.rb +69 -0
- data/lib/git/commands/remote/set_branches.rb +63 -0
- data/lib/git/commands/remote/set_head.rb +82 -0
- data/lib/git/commands/remote/set_url.rb +71 -0
- data/lib/git/commands/remote/set_url_add.rb +61 -0
- data/lib/git/commands/remote/set_url_delete.rb +64 -0
- data/lib/git/commands/remote/show.rb +71 -0
- data/lib/git/commands/remote/update.rb +72 -0
- data/lib/git/commands/remote.rb +42 -0
- data/lib/git/commands/repack.rb +277 -0
- data/lib/git/commands/reset.rb +147 -0
- data/lib/git/commands/rev_parse.rb +297 -0
- data/lib/git/commands/revert/abort.rb +45 -0
- data/lib/git/commands/revert/continue.rb +57 -0
- data/lib/git/commands/revert/quit.rb +47 -0
- data/lib/git/commands/revert/skip.rb +44 -0
- data/lib/git/commands/revert/start.rb +153 -0
- data/lib/git/commands/revert.rb +29 -0
- data/lib/git/commands/rm.rb +114 -0
- data/lib/git/commands/show.rb +632 -0
- data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
- data/lib/git/commands/show_ref/exists.rb +78 -0
- data/lib/git/commands/show_ref/list.rb +145 -0
- data/lib/git/commands/show_ref/verify.rb +120 -0
- data/lib/git/commands/show_ref.rb +42 -0
- data/lib/git/commands/stash/apply.rb +75 -0
- data/lib/git/commands/stash/branch.rb +65 -0
- data/lib/git/commands/stash/clear.rb +41 -0
- data/lib/git/commands/stash/create.rb +58 -0
- data/lib/git/commands/stash/drop.rb +67 -0
- data/lib/git/commands/stash/list.rb +39 -0
- data/lib/git/commands/stash/pop.rb +78 -0
- data/lib/git/commands/stash/push.rb +103 -0
- data/lib/git/commands/stash/show.rb +149 -0
- data/lib/git/commands/stash/store.rb +63 -0
- data/lib/git/commands/stash.rb +38 -0
- data/lib/git/commands/status.rb +169 -0
- data/lib/git/commands/symbolic_ref/delete.rb +68 -0
- data/lib/git/commands/symbolic_ref/read.rb +95 -0
- data/lib/git/commands/symbolic_ref/update.rb +76 -0
- data/lib/git/commands/symbolic_ref.rb +38 -0
- data/lib/git/commands/tag/create.rb +139 -0
- data/lib/git/commands/tag/delete.rb +55 -0
- data/lib/git/commands/tag/list.rb +143 -0
- data/lib/git/commands/tag/verify.rb +71 -0
- data/lib/git/commands/tag.rb +26 -0
- data/lib/git/commands/update_ref/batch.rb +140 -0
- data/lib/git/commands/update_ref/delete.rb +92 -0
- data/lib/git/commands/update_ref/update.rb +106 -0
- data/lib/git/commands/update_ref.rb +42 -0
- data/lib/git/commands/version.rb +57 -0
- data/lib/git/commands/worktree/add.rb +140 -0
- data/lib/git/commands/worktree/list.rb +64 -0
- data/lib/git/commands/worktree/lock.rb +58 -0
- data/lib/git/commands/worktree/management_base.rb +51 -0
- data/lib/git/commands/worktree/move.rb +66 -0
- data/lib/git/commands/worktree/prune.rb +67 -0
- data/lib/git/commands/worktree/remove.rb +63 -0
- data/lib/git/commands/worktree/repair.rb +76 -0
- data/lib/git/commands/worktree/unlock.rb +47 -0
- data/lib/git/commands/worktree.rb +43 -0
- data/lib/git/commands/write_tree.rb +68 -0
- data/lib/git/commands.rb +87 -0
- data/lib/git/config.rb +17 -0
- data/lib/git/config_entry_info.rb +106 -0
- data/lib/git/configuring.rb +665 -0
- data/lib/git/deprecation.rb +9 -0
- data/lib/git/detached_head_info.rb +54 -0
- data/lib/git/diff.rb +293 -7
- data/lib/git/diff_file_numstat_info.rb +29 -0
- data/lib/git/diff_file_patch_info.rb +134 -0
- data/lib/git/diff_file_raw_info.rb +127 -0
- data/lib/git/diff_info.rb +169 -0
- data/lib/git/diff_path_status.rb +67 -19
- data/lib/git/diff_result.rb +32 -0
- data/lib/git/diff_stats.rb +51 -14
- data/lib/git/dirstat_info.rb +86 -0
- data/lib/git/errors.rb +65 -2
- data/lib/git/execution_context/global.rb +31 -0
- data/lib/git/execution_context/repository.rb +136 -0
- data/lib/git/execution_context.rb +501 -0
- data/lib/git/file_ref.rb +74 -0
- data/lib/git/fsck_object.rb +9 -9
- data/lib/git/fsck_result.rb +1 -1
- data/lib/git/log.rb +9 -2
- data/lib/git/object.rb +90 -27
- data/lib/git/parsers/branch.rb +224 -0
- data/lib/git/parsers/cat_file.rb +111 -0
- data/lib/git/parsers/config_entry.rb +110 -0
- data/lib/git/parsers/diff.rb +585 -0
- data/lib/git/parsers/fsck.rb +133 -0
- data/lib/git/parsers/grep.rb +42 -0
- data/lib/git/parsers/ls_remote.rb +79 -0
- data/lib/git/parsers/ls_tree.rb +58 -0
- data/lib/git/parsers/stash.rb +208 -0
- data/lib/git/parsers/tag.rb +257 -0
- data/lib/git/remote.rb +120 -9
- data/lib/git/repository/branching.rb +743 -0
- data/lib/git/repository/committing.rb +187 -0
- data/lib/git/repository/configuring.rb +351 -0
- data/lib/git/repository/context_helpers.rb +264 -0
- data/lib/git/repository/diffing.rb +775 -0
- data/lib/git/repository/factories.rb +682 -0
- data/lib/git/repository/inspecting.rb +252 -0
- data/lib/git/repository/logging.rb +247 -0
- data/lib/git/repository/maintenance.rb +65 -0
- data/lib/git/repository/merging.rb +357 -0
- data/lib/git/repository/object_operations.rb +1199 -0
- data/lib/git/repository/path_resolver.rb +207 -0
- data/lib/git/repository/remote_operations.rb +898 -0
- data/lib/git/repository/shared_private.rb +51 -0
- data/lib/git/repository/staging.rb +554 -0
- data/lib/git/repository/stashing.rb +143 -0
- data/lib/git/repository/status_operations.rb +201 -0
- data/lib/git/repository/worktree_operations.rb +159 -0
- data/lib/git/repository.rb +203 -1
- data/lib/git/stash.rb +78 -4
- data/lib/git/stash_info.rb +104 -0
- data/lib/git/stashes.rb +125 -13
- data/lib/git/status.rb +215 -18
- data/lib/git/tag_delete_failure.rb +31 -0
- data/lib/git/tag_delete_result.rb +63 -0
- data/lib/git/tag_info.rb +105 -0
- data/lib/git/version.rb +109 -2
- data/lib/git/version_constraint.rb +81 -0
- data/lib/git/worktree.rb +108 -6
- data/lib/git/worktrees.rb +94 -7
- data/lib/git.rb +260 -61
- data/redesign/1_architecture_existing.md +54 -18
- data/redesign/2_architecture_redesign.md +365 -46
- data/redesign/3_architecture_implementation.md +1497 -63
- data/redesign/Phase 4 - Step A.md +360 -0
- data/redesign/beta_release.md +107 -0
- data/redesign/c1c2_audit.md +566 -0
- data/redesign/c1c2_bucket6_lib_orphans.md +626 -0
- data/redesign/config_design.rb +501 -0
- data/tasks/gem_tasks.rake +4 -0
- data/tasks/npm_tasks.rake +7 -0
- data/tasks/rspec.rake +48 -0
- data/tasks/test.rake +13 -1
- data/tasks/yard.rake +34 -7
- metadata +365 -22
- data/lib/git/base.rb +0 -1128
- data/lib/git/index.rb +0 -6
- data/lib/git/lib.rb +0 -2277
- data/lib/git/path.rb +0 -38
- data/lib/git/working_directory.rb +0 -6
- /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
|
-
#
|
|
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.
|
|
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
|