git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[1/2 PATCH] git-svn: make multi-init less confusing

From
EWEric Wong <normalperson@yhbt.net>
Date
Jan 5, 2007, 02:02 UTC
Message-ID
<20070105020158.GA21925@localdomain>
In-Reply-To
<87fyaqvgoz.fsf@morpheus.local>

It now requires at least one of the (trunk|branch|tags) arguments (either from the command-line or in .git/config). Also we make sure that anything that is passed as a URL ('help') in David's case is actually a URL.

Thanks to David Kågedal for reporting this issue.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
 git-svn.perl |   78 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 40 insertions(+), 38 deletions(-)
diff --git a/git-svn.perl b/git-svn.perl
index b28c5bb..0fc386a 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -571,28 +571,25 @@ sub graft_branches {
 
 sub multi_init {
 	my $url = shift;
-	$_trunk ||= 'trunk';
-	$_trunk =~ s#/+$##;
-	$url =~ s#/+$## if $url;
-	if ($_trunk !~ m#^[a-z\+]+://#) {
-		$_trunk = '/' . $_trunk if ($_trunk !~ m#^/#);
-		unless ($url) {
-			print STDERR "E: '$_trunk' is not a complete URL ",
-				"and a separate URL is not specified\n";
-			exit 1;
-		}
-		$_trunk = $url . $_trunk;
-	}
-	my $ch_id;
-	if ($GIT_SVN eq 'git-svn') {
-		$ch_id = 1;
-		$GIT_SVN = $ENV{GIT_SVN_ID} = 'trunk';
+	unless (defined $_trunk || defined $_branches || defined $_tags) {
+		usage(1);
 	}
-	init_vars();
-	unless (-d $GIT_SVN_DIR) {
-		print "GIT_SVN_ID set to 'trunk' for $_trunk\n" if $ch_id;
-		init($_trunk);
-		command_noisy('repo-config', 'svn.trunk', $_trunk);
+	if (defined $_trunk) {
+		my $trunk_url = complete_svn_url($url, $_trunk);
+		my $ch_id;
+		if ($GIT_SVN eq 'git-svn') {
+			$ch_id = 1;
+			$GIT_SVN = $ENV{GIT_SVN_ID} = 'trunk';
+		}
+		init_vars();
+		unless (-d $GIT_SVN_DIR) {
+			if ($ch_id) {
+				print "GIT_SVN_ID set to 'trunk' for ",
+				      "$trunk_url ($_trunk)\n";
+			}
+			init($trunk_url);
+			command_noisy('repo-config', 'svn.trunk', $trunk_url);
+		}
 	}
 	complete_url_ls_init($url, $_branches, '--branches/-b', '');
 	complete_url_ls_init($url, $_tags, '--tags/-t', 'tags/');
@@ -872,29 +869,34 @@ sub rec_fetch {
 	}
 }
 
+sub complete_svn_url {
+	my ($url, $path) = @_;
+	$path =~ s#/+$##;
+	$url =~ s#/+$## if $url;
+	if ($path !~ m#^[a-z\+]+://#) {
+		$path = '/' . $path if ($path !~ m#^/#);
+		if (!defined $url || $url !~ m#^[a-z\+]+://#) {
+			fatal("E: '$path' is not a complete URL ",
+			      "and a separate URL is not specified\n");
+		}
+		$path = $url . $path;
+	}
+	return $path;
+}
+
 sub complete_url_ls_init {
-	my ($url, $var, $switch, $pfx) = @_;
-	unless ($var) {
+	my ($url, $path, $switch, $pfx) = @_;
+	unless ($path) {
 		print STDERR "W: $switch not specified\n";
 		return;
 	}
-	$var =~ s#/+$##;
-	if ($var !~ m#^[a-z\+]+://#) {
-		$var = '/' . $var if ($var !~ m#^/#);
-		unless ($url) {
-			print STDERR "E: '$var' is not a complete URL ",
-				"and a separate URL is not specified\n";
-			exit 1;
-		}
-		$var = $url . $var;
-	}
-	my @ls = libsvn_ls_fullurl($var);
-	my $old = $GIT_SVN;
+	my $full_url = complete_svn_url($url, $path);
+	my @ls = libsvn_ls_fullurl($full_url);
 	defined(my $pid = fork) or croak $!;
 	if (!$pid) {
-		foreach my $u (map { "$var/$_" } (grep m!/$!, @ls)) {
+		foreach my $u (map { "$full_url/$_" } (grep m!/$!, @ls)) {
 			$u =~ s#/+$##;
-			if ($u !~ m!\Q$var\E/(.+)$!) {
+			if ($u !~ m!\Q$full_url\E/(.+)$!) {
 				print STDERR "W: Unrecognized URL: $u\n";
 				die "This should never happen\n";
 			}
@@ -912,7 +914,7 @@ sub complete_url_ls_init {
 	waitpid $pid, 0;
 	croak $? if $?;
 	my ($n) = ($switch =~ /^--(\w+)/);
-	command_noisy('repo-config', "svn.$n", $var);
+	command_noisy('repo-config', "svn.$n", $full_url);
 }
 
 sub common_prefix {
-- 
Eric Wong
Previous: David KågedalNext: David Kågedal
Message 2 of 8 in “git-svn usability”
  1. David KågedalJan 4, 2007
  2. 1/2 git-svn: make multi-init less confusingEric Wong, Jan 5, 2007
  3. David KågedalJan 5, 2007
  4. Seth FalconJan 5, 2007
  5. David KågedalJan 8, 2007
  6. David KågedalJan 8, 2007
  7. David KågedalJan 8, 2007
  8. 2/2 git-svn: update documentation for multi-{init|fetch}Eric Wong, Jan 5, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.