From: Eric Wong Date: Mon, 22 Jan 2007 21:52:04 +0000 (-0800) Subject: git-svn: disallow ambigious local refspecs X-Git-Tag: v1.5.1-rc1~232 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=b805b44a923e32251af1abd4e8d7bf5f7d4d8ef6;p=git.git git-svn: disallow ambigious local refspecs 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 --- diff --git a/git-svn.perl b/git-svn.perl index 84f467957..f01fb9a35 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -169,7 +169,11 @@ load_authors() if $_authors; 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 ###################### @@ -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) = @_; @@ -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); } diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh index 040da9275..af617486d 100755 --- a/t/t9100-git-svn-basic.sh +++ b/t/t9100-git-svn-basic.sh @@ -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