Skip to content

Commit

Permalink
git-svn: disallow ambigious local refspecs
Browse files Browse the repository at this point in the history
Having multiple fetch refspecs pointing to the same local ref
would be a very bad thing.  Start avoiding the use of fatal() or
exit() inside the modules so we can libify more easily.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
  • Loading branch information
Eric Wong committed Feb 23, 2007
1 parent 8b8fc06 commit b805b44
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 7 deletions.
40 changes: 33 additions & 7 deletions git-svn.perl
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,11 @@ BEGIN
unless ($cmd =~ /^(?:init|rebuild|multi-init|commit-diff)$/) {
Git::SVN::Migration::migration_check();
}
$cmd{$cmd}->[0]->(@ARGV);
eval {
Git::SVN::verify_remotes_sanity();
$cmd{$cmd}->[0]->(@ARGV);
};
fatal $@ if $@;
exit 0;

####################### primary functions ######################
Expand Down Expand Up @@ -715,6 +719,22 @@ sub read_all_remotes {
$r;
}

sub verify_remotes_sanity {
my %seen;
foreach (command(qw/config -l/)) {
if (m!^svn-remote\.(?:.+)\.fetch=.*:refs/remotes/(\S+)\s*$!) {
if ($seen{$1}) {
die "Remote ref refs/remote/$1 is tracked by",
"\n \"$_\"\nand\n \"$seen{$1}\"\n",
"Please resolve this ambiguity in ",
"your git configuration file before ",
"continuing\n";
}
$seen{$1} = $_;
}
}
}

# we allow more chars than remotes2config.sh...
sub sanitize_remote_name {
my ($name) = @_;
Expand All @@ -727,16 +747,22 @@ sub init {
my $self = _new($class, $repo_id, $ref_id, $path);
if (defined $url) {
$url =~ s!/+$!!; # strip trailing slash

# verify that we aren't overwriting anything:
my $orig_url = eval {
command_oneline('config', '--get',
"svn-remote.$repo_id.url")
};
if ($orig_url) {
if ($orig_url ne $url) {
die "svn-remote.$repo_id.url already set: ",
"$orig_url\nwanted to set to: $url\n";
}
} else {
if ($orig_url && ($orig_url ne $url)) {
die "svn-remote.$repo_id.url already set: ",
"$orig_url\nwanted to set to: $url\n";
}
my ($xrepo_id, $xpath) = find_ref($self->refname);
if (defined $xpath) {
die "svn-remote.$xrepo_id.fetch already set to track ",
"$xpath:refs/remotes/", $self->refname, "\n";
}
if (!$orig_url) {
command_noisy('config',
"svn-remote.$repo_id.url", $url);
}
Expand Down
11 changes: 11 additions & 0 deletions t/t9100-git-svn-basic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -215,4 +215,15 @@ echo tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 >> expected

test_expect_success "$name" "diff -u a expected"

test_expect_failure 'exit if remote refs are ambigious' "
git-repo-config --add svn-remote.git-svn.fetch \
bar:refs/remotes/git-svn &&
git-svn migrate
"
test_expect_failure 'exit if init-ing a would clobber a URL' "
git-repo-config --unset svn-remote.git-svn.fetch \
'^bar:refs/remotes/git-svn$' &&
git-svn init $svnrepo/bar
"

test_done

0 comments on commit b805b44

Please sign in to comment.