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.
- checksums.yaml +4 -4
- data/.github/copilot-instructions.md +67 -2705
- 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/SKILL.md +586 -0
- data/.github/skills/facade-implementation/REFERENCE.md +840 -0
- data/.github/skills/facade-implementation/SKILL.md +260 -0
- data/.github/skills/facade-test-conventions/SKILL.md +380 -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 +7 -3
- data/.rubocop_todo.yml +23 -5
- data/.yardopts +1 -0
- data/CHANGELOG.md +0 -40
- data/CONTRIBUTING.md +694 -53
- data/README.md +17 -5
- data/Rakefile +61 -9
- data/commitlint.test +4 -0
- data/git.gemspec +14 -8
- data/lib/git/args_builder.rb +0 -8
- data/lib/git/base.rb +486 -410
- data/lib/git/branch.rb +380 -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 +130 -24
- data/lib/git/command_line/base.rb +245 -0
- data/lib/git/command_line/capturing.rb +249 -0
- data/lib/git/command_line/result.rb +96 -0
- data/lib/git/command_line/streaming.rb +194 -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 +403 -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 +364 -0
- data/lib/git/commands/cat_file/filtered.rb +105 -0
- data/lib/git/commands/cat_file/raw.rb +210 -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 +102 -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 +52 -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 +89 -0
- data/lib/git/detached_head_info.rb +54 -0
- data/lib/git/diff.rb +297 -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 +78 -19
- data/lib/git/diff_result.rb +32 -0
- data/lib/git/diff_stats.rb +59 -14
- data/lib/git/dirstat_info.rb +86 -0
- data/lib/git/errors.rb +65 -2
- data/lib/git/execution_context/global.rb +56 -0
- data/lib/git/execution_context/repository.rb +147 -0
- data/lib/git/execution_context.rb +482 -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/lib.rb +1606 -1028
- data/lib/git/log.rb +15 -2
- data/lib/git/object.rb +92 -22
- data/lib/git/parsers/branch.rb +224 -0
- data/lib/git/parsers/cat_file.rb +111 -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_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 +133 -9
- data/lib/git/repository/branching.rb +572 -0
- data/lib/git/repository/committing.rb +191 -0
- data/lib/git/repository/configuring.rb +156 -0
- data/lib/git/repository/diffing.rb +775 -0
- data/lib/git/repository/inspecting.rb +153 -0
- data/lib/git/repository/logging.rb +247 -0
- data/lib/git/repository/merging.rb +295 -0
- data/lib/git/repository/object_operations.rb +1101 -0
- data/lib/git/repository/path_resolver.rb +207 -0
- data/lib/git/repository/remote_operations.rb +753 -0
- data/lib/git/repository/shared_private.rb +51 -0
- data/lib/git/repository/staging.rb +390 -0
- data/lib/git/repository/stashing.rb +107 -0
- data/lib/git/repository/status_operations.rb +180 -0
- data/lib/git/repository/worktree_operations.rb +159 -0
- data/lib/git/repository.rb +264 -1
- data/lib/git/stash.rb +85 -4
- data/lib/git/stash_info.rb +104 -0
- data/lib/git/stashes.rb +130 -13
- data/lib/git/status.rb +224 -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 +120 -5
- data/lib/git/worktrees.rb +107 -7
- data/lib/git.rb +114 -18
- data/redesign/1_architecture_existing.md +54 -18
- data/redesign/2_architecture_redesign.md +365 -46
- data/redesign/3_architecture_implementation.md +1451 -54
- 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 +349 -20
- data/lib/git/index.rb +0 -6
- 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
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'git/commands/rev_parse'
|
|
4
|
+
require 'git/errors'
|
|
5
|
+
require 'git/execution_context'
|
|
6
|
+
|
|
7
|
+
module Git
|
|
8
|
+
class Repository
|
|
9
|
+
# Resolves and normalizes the filesystem paths that locate a Git repository
|
|
10
|
+
#
|
|
11
|
+
# `PathResolver` is the single home for the path-resolution logic used by the
|
|
12
|
+
# `Git::Repository` factory class methods ({Git::Repository.open} and
|
|
13
|
+
# {Git::Repository.bare}). It computes the absolute working-directory,
|
|
14
|
+
# repository (`.git`), and index paths from the caller-supplied values,
|
|
15
|
+
# following the same rules Git itself uses (including gitdir-pointer files for
|
|
16
|
+
# submodules and linked worktrees).
|
|
17
|
+
#
|
|
18
|
+
# @api private
|
|
19
|
+
#
|
|
20
|
+
module PathResolver
|
|
21
|
+
module_function
|
|
22
|
+
|
|
23
|
+
# Resolve and normalize the paths that locate a Git repository
|
|
24
|
+
#
|
|
25
|
+
# Returns a new hash containing the resolved absolute paths for:
|
|
26
|
+
# * `:working_directory` — the working tree root (`nil` for bare repos)
|
|
27
|
+
# * `:repository` — the `.git` directory
|
|
28
|
+
# * `:index` — the index file
|
|
29
|
+
#
|
|
30
|
+
# This method does not mutate any inputs.
|
|
31
|
+
#
|
|
32
|
+
# @example Resolve paths for a working tree
|
|
33
|
+
# Git::Repository::PathResolver.resolve_paths(working_directory: '/repo')
|
|
34
|
+
# #=> { working_directory: '/repo', repository: '/repo/.git', index: '/repo/.git/index' }
|
|
35
|
+
#
|
|
36
|
+
# @param working_directory [String, nil] the working directory path
|
|
37
|
+
#
|
|
38
|
+
# @param repository [String, nil] the repository (`.git`) directory path
|
|
39
|
+
#
|
|
40
|
+
# @param index [String, nil] the index file path
|
|
41
|
+
#
|
|
42
|
+
# @param bare [Boolean] whether this is a bare repository
|
|
43
|
+
#
|
|
44
|
+
# @return [Hash{Symbol => (String, nil)}] a hash with `:working_directory`,
|
|
45
|
+
# `:repository`, and `:index` keys
|
|
46
|
+
#
|
|
47
|
+
def resolve_paths(working_directory: nil, repository: nil, index: nil, bare: false)
|
|
48
|
+
working_dir = resolve_working_directory(working_directory, bare: bare)
|
|
49
|
+
# For bare repos, use working_directory as the default repository location
|
|
50
|
+
repo_path = resolve_repository(repository, working_dir, bare: bare, bare_default: working_directory)
|
|
51
|
+
index_path = resolve_index(index, repo_path)
|
|
52
|
+
|
|
53
|
+
{
|
|
54
|
+
working_directory: working_dir,
|
|
55
|
+
repository: repo_path,
|
|
56
|
+
index: index_path
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Find the root of the working tree that contains `working_dir`
|
|
61
|
+
#
|
|
62
|
+
# Runs `git rev-parse --show-toplevel` from `working_dir` to locate the
|
|
63
|
+
# top-level directory of the working tree.
|
|
64
|
+
#
|
|
65
|
+
# @example Find the worktree root from a subdirectory
|
|
66
|
+
# Git::Repository::PathResolver.root_of_worktree('/repo/subdir') #=> '/repo'
|
|
67
|
+
#
|
|
68
|
+
# @param working_dir [String] a path inside the working tree
|
|
69
|
+
#
|
|
70
|
+
# @param binary_path [String, :use_global_config] path to the git binary
|
|
71
|
+
#
|
|
72
|
+
# Controls which git binary is invoked during root detection. Defaults to
|
|
73
|
+
# `:use_global_config`, which resolves to `Git::Base.config.binary_path`.
|
|
74
|
+
#
|
|
75
|
+
# @param git_ssh [String, nil, :use_global_config] the SSH wrapper path
|
|
76
|
+
#
|
|
77
|
+
# Forwarded as `GIT_SSH`. Defaults to `:use_global_config`.
|
|
78
|
+
#
|
|
79
|
+
# @return [String] the absolute path to the root of the working tree
|
|
80
|
+
#
|
|
81
|
+
# @raise [ArgumentError] if `working_dir` does not exist, is not a
|
|
82
|
+
# directory, or is not inside a git working tree
|
|
83
|
+
#
|
|
84
|
+
# Also raised if the git binary cannot be found.
|
|
85
|
+
#
|
|
86
|
+
def root_of_worktree(working_dir, binary_path: :use_global_config, git_ssh: :use_global_config)
|
|
87
|
+
raise ArgumentError, "'#{working_dir}' does not exist or is not a directory" unless Dir.exist?(working_dir)
|
|
88
|
+
|
|
89
|
+
execute_rev_parse_toplevel(working_dir, binary_path: binary_path, git_ssh: git_ssh)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Run `git rev-parse --show-toplevel` from `working_dir` and return stdout
|
|
93
|
+
#
|
|
94
|
+
# @param working_dir [String] a path inside the working tree
|
|
95
|
+
#
|
|
96
|
+
# @param binary_path [String, :use_global_config] path to the git binary
|
|
97
|
+
#
|
|
98
|
+
# @param git_ssh [String, nil, :use_global_config] the SSH wrapper path
|
|
99
|
+
#
|
|
100
|
+
# @return [String] the top-level directory reported by git
|
|
101
|
+
#
|
|
102
|
+
# @raise [ArgumentError] if the git binary is not found or `working_dir` is
|
|
103
|
+
# not inside a git working tree
|
|
104
|
+
#
|
|
105
|
+
# @api private
|
|
106
|
+
#
|
|
107
|
+
def execute_rev_parse_toplevel(working_dir, binary_path: :use_global_config, git_ssh: :use_global_config)
|
|
108
|
+
execution_context = Git::ExecutionContext::Global.new(binary_path: binary_path, git_ssh: git_ssh)
|
|
109
|
+
Git::Commands::RevParse.new(execution_context).call(
|
|
110
|
+
show_toplevel: true, chdir: File.expand_path(working_dir)
|
|
111
|
+
).stdout
|
|
112
|
+
rescue Errno::ENOENT
|
|
113
|
+
raise ArgumentError, 'Failed to find the root of the worktree: git binary not found'
|
|
114
|
+
rescue Git::FailedError
|
|
115
|
+
raise ArgumentError, "'#{working_dir}' is not in a git working tree"
|
|
116
|
+
end
|
|
117
|
+
private_class_method :execute_rev_parse_toplevel
|
|
118
|
+
|
|
119
|
+
# Resolve the working directory path
|
|
120
|
+
#
|
|
121
|
+
# @param path [String, nil] the working directory path or `nil`
|
|
122
|
+
#
|
|
123
|
+
# @param bare [Boolean] whether this is a bare repository
|
|
124
|
+
#
|
|
125
|
+
# @return [String, nil] the absolute path, or `nil` for bare repos
|
|
126
|
+
#
|
|
127
|
+
# @api private
|
|
128
|
+
#
|
|
129
|
+
def resolve_working_directory(path, bare:)
|
|
130
|
+
return nil if bare
|
|
131
|
+
|
|
132
|
+
File.expand_path(path || Dir.pwd)
|
|
133
|
+
end
|
|
134
|
+
private_class_method :resolve_working_directory
|
|
135
|
+
|
|
136
|
+
# Resolve the repository (`.git`) directory path
|
|
137
|
+
#
|
|
138
|
+
# Handles the gitdir-pointer file case for submodules and linked worktrees.
|
|
139
|
+
#
|
|
140
|
+
# @param path [String, nil] the repository path or `nil`
|
|
141
|
+
#
|
|
142
|
+
# @param working_dir [String, nil] the working directory used for relative
|
|
143
|
+
# path resolution
|
|
144
|
+
#
|
|
145
|
+
# @param bare [Boolean] whether this is a bare repository
|
|
146
|
+
#
|
|
147
|
+
# @param bare_default [String, nil] for bare repos, used as the default when
|
|
148
|
+
# `path` is `nil`
|
|
149
|
+
#
|
|
150
|
+
# @return [String] the absolute path to the repository
|
|
151
|
+
#
|
|
152
|
+
# @api private
|
|
153
|
+
#
|
|
154
|
+
def resolve_repository(path, working_dir, bare:, bare_default: nil)
|
|
155
|
+
initial_path = if bare
|
|
156
|
+
File.expand_path(path || bare_default || Dir.pwd)
|
|
157
|
+
else
|
|
158
|
+
File.expand_path(path || '.git', working_dir)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
resolve_gitdir_pointer(initial_path)
|
|
162
|
+
end
|
|
163
|
+
private_class_method :resolve_repository
|
|
164
|
+
|
|
165
|
+
# Resolve gitdir-pointer files used by submodules and linked worktrees
|
|
166
|
+
#
|
|
167
|
+
# If `path` points to a file containing `"gitdir: <path>"`, returns the
|
|
168
|
+
# resolved target path. Otherwise returns `path` unchanged.
|
|
169
|
+
#
|
|
170
|
+
# @param path [String] the path to check
|
|
171
|
+
#
|
|
172
|
+
# @return [String] the resolved absolute path
|
|
173
|
+
#
|
|
174
|
+
# Relative pointer targets are resolved from the directory containing the
|
|
175
|
+
# pointer file itself, matching git's pointer-file semantics.
|
|
176
|
+
#
|
|
177
|
+
# @api private
|
|
178
|
+
#
|
|
179
|
+
def resolve_gitdir_pointer(path)
|
|
180
|
+
return path unless File.file?(path)
|
|
181
|
+
|
|
182
|
+
gitdir_content = File.read(path).strip
|
|
183
|
+
return path unless gitdir_content.start_with?('gitdir: ')
|
|
184
|
+
|
|
185
|
+
gitdir_path = gitdir_content.sub(/\Agitdir: /, '')
|
|
186
|
+
File.expand_path(gitdir_path, File.dirname(path))
|
|
187
|
+
end
|
|
188
|
+
private_class_method :resolve_gitdir_pointer
|
|
189
|
+
|
|
190
|
+
# Resolve the index file path
|
|
191
|
+
#
|
|
192
|
+
# @param path [String, nil] the index path or `nil`
|
|
193
|
+
#
|
|
194
|
+
# @param repository [String] the repository directory used for relative
|
|
195
|
+
# path resolution
|
|
196
|
+
#
|
|
197
|
+
# @return [String] the absolute path to the index file
|
|
198
|
+
#
|
|
199
|
+
# @api private
|
|
200
|
+
#
|
|
201
|
+
def resolve_index(path, repository)
|
|
202
|
+
File.expand_path(path || 'index', repository)
|
|
203
|
+
end
|
|
204
|
+
private_class_method :resolve_index
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|