aboutsummaryrefslogtreecommitdiff
path: root/git-svn.perl
diff options
context:
space:
mode:
Diffstat (limited to 'git-svn.perl')
-rwxr-xr-xgit-svn.perl86
1 files changed, 35 insertions, 51 deletions
diff --git a/git-svn.perl b/git-svn.perl
index 24ca3087d..f4573ed10 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -487,48 +487,24 @@ 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 $k = "svn-remote.$gs->{repo_id}.url";
- 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;
- }
+ 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) };
+ if ($orig_url && ($orig_url ne $gs->{url})) {
+ die "$k already set: $orig_url\n",
+ "wanted to set to: $gs->{url}\n";
}
- if (defined $remote_id) {
- $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",
- "$remote_path:refs/remotes/$pfx*");
+ 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.$gs->{repo_id}.$n",
+ "$remote_path:refs/remotes/$pfx*");
}
sub verify_ref {
@@ -1236,19 +1212,23 @@ sub get_fetch_range {
sub tmp_config {
my (@args) = @_;
my $config = "$ENV{GIT_DIR}/svn/config";
- unless (-f $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 "; 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) };
+ 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 "; 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";
+ }
+ 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",