A "git worktree" separates out some of the things which used to be
found in .git, into "common" things and "gitdir" things.
In this patch we simply collect the relevant informaation. No-one
uses it yet so there is no significant functional change.
However, while we are here, we do improve an error message slightly.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
# implicitly uses $main::us
%EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO NOCOMMITCHECK)],
playground => [qw(record_maindir $maindir $local_git_cfg
# implicitly uses $main::us
%EXPORT_TAGS = ( policyflags => [qw(NOFFCHECK FRESHREPO NOCOMMITCHECK)],
playground => [qw(record_maindir $maindir $local_git_cfg
+ $maindir_gitdir $maindir_gitcommon
fresh_playground $playground
ensure_a_playground)]);
@EXPORT_OK = ( @{ $EXPORT_TAGS{policyflags} },
fresh_playground $playground
ensure_a_playground)]);
@EXPORT_OK = ( @{ $EXPORT_TAGS{policyflags} },
+# these three all go together
+our $maindir_gitdir;
+our $maindir_gitcommon;
+
our $local_git_cfg;
sub record_maindir () {
our $local_git_cfg;
sub record_maindir () {
- $maindir //= must_getcwd();
+ if (!defined $maindir) {
+ $maindir = must_getcwd();
+ if (!stat "$maindir/.git") {
+ fail "cannot stat $maindir/.git: $!";
+ }
+ if (-d _) {
+ # we fall back to this in case we have a pre-worktree
+ # git, which may not know git rev-parse --git-common-dir
+ $maindir_gitdir = "$maindir/.git";
+ $maindir_gitcommon = "$maindir/.git";
+ } else {
+ $maindir_gitdir = cmdoutput qw(git rev-parse --git-dir);
+ $maindir_gitcommon = cmdoutput qw(git rev-parse --git-common-dir);
+ }
+ }
$local_git_cfg //= git_slurp_config_src 'local';
}
$local_git_cfg //= git_slurp_config_src 'local';
}
record_maindir();
$spc = ".git/$spc";
my $parent = dirname $spc;
record_maindir();
$spc = ".git/$spc";
my $parent = dirname $spc;
- mkdir $parent or $!==EEXIST or fail "failed to mkdir $parent: $!";
+ mkdir $parent or $!==EEXIST
+ or fail "failed to mkdir playground parent $parent: $!";