git-svn: simplify the (multi-)init methods of fetching

Also, some changes to avoid creating dead dirs under
.git/svn/.  We now create all directories as late as
possible.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
This commit is contained in:
Eric Wong 2007-02-14 15:10:44 -08:00
parent 28710f74ea
commit b4d57e5ea3

View File

@ -487,49 +487,25 @@ sub complete_url_ls_init {
"and a separate URL is not specified\n");
}
}
my $r = defined $_revision ? $_revision : $ra->get_latest_revnum;
my ($dirent, undef, undef) = $ra->get_dir($repo_path, $r);
my $url = $ra->{url};
my $remote_id;
my $remote_path;
foreach my $d (sort keys %$dirent) {
next if ($dirent->{$d}->kind != $SVN::Node::dir);
my $path = "$repo_path/$d";
my $ref = "$pfx$d";
my $gs = eval { Git::SVN->new($ref) };
# don't try to init already existing refs
unless ($gs) {
print "init $url/$path => $ref\n";
$gs = Git::SVN->init($url, $path, undef, $ref, 1);
}
if ($gs) {
my $gs = Git::SVN->init($url, undef, undef, undef, 1);
my $k = "svn-remote.$gs->{repo_id}.url";
my $orig_url = eval {
command_oneline(qw/config --get/, $k)
};
my $orig_url = eval { command_oneline(qw/config --get/, $k) };
if ($orig_url && ($orig_url ne $gs->{url})) {
die "$k already set: $orig_url\n",
"wanted to set to: $gs->{url}\n";
}
unless ($orig_url) {
command_oneline('config', $k, $gs->{url});
}
$remote_id = $gs->{repo_id};
last;
}
}
if (defined $remote_id) {
$remote_path = "$ra->{svn_path}/$repo_path/*";
command_oneline('config', $k, $gs->{url}) unless $orig_url;
my $remote_path = "$ra->{svn_path}/$repo_path/*";
$remote_path =~ s#/+#/#g;
$remote_path =~ s#^/##g;
my ($n) = ($switch =~ /^--(\w+)/);
if (length $pfx && $pfx !~ m#/$#) {
die "--prefix='$pfx' must have a trailing slash '/'\n";
}
command_noisy('config', "svn-remote.$remote_id.$n",
command_noisy('config', "svn-remote.$gs->{repo_id}.$n",
"$remote_path:refs/remotes/$pfx*");
}
}
sub verify_ref {
my ($ref) = @_;
@ -1236,19 +1212,23 @@ sub get_fetch_range {
sub tmp_config {
my (@args) = @_;
my $config = "$ENV{GIT_DIR}/svn/config";
my $old_config = $ENV{GIT_CONFIG};
$ENV{GIT_CONFIG} = $config;
$@ = undef;
my @ret = eval {
unless (-f $config) {
mkfile($config);
open my $fh, '>', $config or
die "Can't open $config: $!\n";
print $fh "; This file is used internally by git-svn\n" or
die "Couldn't write to $config: $!\n";
print $fh "; This file is used internally by ",
"git-svn\n" or die
"Couldn't write to $config: $!\n";
print $fh "; You should not have to edit it\n" or
die "Couldn't write to $config: $!\n";
close $fh or die "Couldn't close $config: $!\n";
}
my $old_config = $ENV{GIT_CONFIG};
$ENV{GIT_CONFIG} = $config;
$@ = undef;
my @ret = eval { command('config', @args) };
command('config', @args);
};
my $err = $@;
if (defined $old_config) {
$ENV{GIT_CONFIG} = $old_config;
@ -1264,7 +1244,11 @@ sub tmp_index_do {
my $old_index = $ENV{GIT_INDEX_FILE};
$ENV{GIT_INDEX_FILE} = $self->{index};
$@ = undef;
my @ret = eval { &$sub };
my @ret = eval {
my ($dir, $base) = ($self->{index} =~ m#^(.*?)/?([^/]+)$#);
mkpath([$dir]) unless -d $dir;
&$sub;
};
my $err = $@;
if (defined $old_index) {
$ENV{GIT_INDEX_FILE} = $old_index;
@ -1846,7 +1830,7 @@ sub _new {
$_[1] = $repo_id = sanitize_remote_name($repo_id);
my $dir = "$ENV{GIT_DIR}/svn/$ref_id";
$_[3] = $path = '' unless (defined $path);
mkpath([$dir]);
mkpath(["$ENV{GIT_DIR}/svn"]);
bless {
ref_id => $ref_id, dir => $dir, index => "$dir/index",
path => $path, config => "$ENV{GIT_DIR}/svn/config",