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

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