git-svn: "git worktree" awareness
git-svn internals were previously not aware of repository layout differences for users of the "git worktree" command. Introduce this awareness by using "git rev-parse --git-path" instead of relying on outdated uses of GIT_DIR and friends. Thanks-to: Duy Nguyen <pclouds@gmail.com> Reported-by: Mathieu Arnold <mat@freebsd.org> Signed-off-by: Eric Wong <e@80x24.org>
This commit is contained in:
@ -44,7 +44,9 @@ use Git qw(
|
||||
command_noisy
|
||||
command_output_pipe
|
||||
command_close_pipe
|
||||
command_oneline
|
||||
);
|
||||
use Git::SVN;
|
||||
|
||||
sub migrate_from_v0 {
|
||||
my $git_dir = $ENV{GIT_DIR};
|
||||
@ -55,7 +57,9 @@ sub migrate_from_v0 {
|
||||
chomp;
|
||||
my ($id, $orig_ref) = ($_, $_);
|
||||
next unless $id =~ s#^refs/heads/(.+)-HEAD$#$1#;
|
||||
next unless -f "$git_dir/$id/info/url";
|
||||
my $info_url = command_oneline(qw(rev-parse --git-path),
|
||||
"$id/info/url");
|
||||
next unless -f $info_url;
|
||||
my $new_ref = "refs/remotes/$id";
|
||||
if (::verify_ref("$new_ref^0")) {
|
||||
print STDERR "W: $orig_ref is probably an old ",
|
||||
@ -82,7 +86,7 @@ sub migrate_from_v1 {
|
||||
my $git_dir = $ENV{GIT_DIR};
|
||||
my $migrated = 0;
|
||||
return $migrated unless -d $git_dir;
|
||||
my $svn_dir = "$git_dir/svn";
|
||||
my $svn_dir = Git::SVN::svn_dir();
|
||||
|
||||
# just in case somebody used 'svn' as their $id at some point...
|
||||
return $migrated if -d $svn_dir && ! -f "$svn_dir/info/url";
|
||||
@ -97,27 +101,28 @@ sub migrate_from_v1 {
|
||||
my $x = $_;
|
||||
next unless $x =~ s#^refs/remotes/##;
|
||||
chomp $x;
|
||||
next unless -f "$git_dir/$x/info/url";
|
||||
my $u = eval { ::file_to_s("$git_dir/$x/info/url") };
|
||||
my $info_url = command_oneline(qw(rev-parse --git-path),
|
||||
"$x/info/url");
|
||||
next unless -f $info_url;
|
||||
my $u = eval { ::file_to_s($info_url) };
|
||||
next unless $u;
|
||||
my $dn = dirname("$git_dir/svn/$x");
|
||||
my $dn = dirname("$svn_dir/$x");
|
||||
mkpath([$dn]) unless -d $dn;
|
||||
if ($x eq 'svn') { # they used 'svn' as GIT_SVN_ID:
|
||||
mkpath(["$git_dir/svn/svn"]);
|
||||
mkpath(["$svn_dir/svn"]);
|
||||
print STDERR " - $git_dir/$x/info => ",
|
||||
"$git_dir/svn/$x/info\n";
|
||||
rename "$git_dir/$x/info", "$git_dir/svn/$x/info" or
|
||||
"$svn_dir/$x/info\n";
|
||||
rename "$git_dir/$x/info", "$svn_dir/$x/info" or
|
||||
croak "$!: $x";
|
||||
# don't worry too much about these, they probably
|
||||
# don't exist with repos this old (save for index,
|
||||
# and we can easily regenerate that)
|
||||
foreach my $f (qw/unhandled.log index .rev_db/) {
|
||||
rename "$git_dir/$x/$f", "$git_dir/svn/$x/$f";
|
||||
rename "$git_dir/$x/$f", "$svn_dir/$x/$f";
|
||||
}
|
||||
} else {
|
||||
print STDERR " - $git_dir/$x => $git_dir/svn/$x\n";
|
||||
rename "$git_dir/$x", "$git_dir/svn/$x" or
|
||||
croak "$!: $x";
|
||||
print STDERR " - $git_dir/$x => $svn_dir/$x\n";
|
||||
rename "$git_dir/$x", "$svn_dir/$x" or croak "$!: $x";
|
||||
}
|
||||
$migrated++;
|
||||
}
|
||||
@ -139,9 +144,10 @@ sub read_old_urls {
|
||||
push @dir, $_;
|
||||
}
|
||||
}
|
||||
my $svn_dir = Git::SVN::svn_dir();
|
||||
foreach (@dir) {
|
||||
my $x = $_;
|
||||
$x =~ s!^\Q$ENV{GIT_DIR}\E/svn/!!o;
|
||||
$x =~ s!^\Q$svn_dir\E/!!o;
|
||||
read_old_urls($l_map, $x, $_);
|
||||
}
|
||||
}
|
||||
@ -150,7 +156,7 @@ sub migrate_from_v2 {
|
||||
my @cfg = command(qw/config -l/);
|
||||
return if grep /^svn-remote\..+\.url=/, @cfg;
|
||||
my %l_map;
|
||||
read_old_urls(\%l_map, '', "$ENV{GIT_DIR}/svn");
|
||||
read_old_urls(\%l_map, '', Git::SVN::svn_dir());
|
||||
my $migrated = 0;
|
||||
|
||||
require Git::SVN;
|
||||
@ -239,7 +245,8 @@ sub minimize_connections {
|
||||
}
|
||||
}
|
||||
if (@emptied) {
|
||||
my $file = $ENV{GIT_CONFIG} || "$ENV{GIT_DIR}/config";
|
||||
my $file = $ENV{GIT_CONFIG} ||
|
||||
command_oneline(qw(rev-parse --git-path config));
|
||||
print STDERR <<EOF;
|
||||
The following [svn-remote] sections in your config file ($file) are empty
|
||||
and can be safely removed:
|
||||
|
Reference in New Issue
Block a user