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

Re: [PATCH 1/2] git-svn: use platform specific auth providers

From
Junio C Hamano <gitster@pobox.com>
Date
May 1, 2012, 01:08 UTC
Message-ID
<7vy5pcd7xu.fsf@alter.siamese.dyndns.org>
In-Reply-To
<20120430192016.GQ4023@login.drsnuggles.stderr.nl>
Matthijs Kooijman <matthijs@stdin.nl> writes:
Show 21 quoted lines
> Hi Eric,
>
>> > This does textual comparison, so 1.6.6 > 1.6.12. To do proper version
>> > comparison, I think the version numbers should be split into
>> > major/minor/revision and each be compared numerically.
>> 
>> Ah, thanks for the analysis, we were lucky in the past that all version
>> components only had a single character.
> Indeed. Note that this includes the released subversion versions. For
> example, the code contains this check:
>
>     $SVN::Core::VERSION le '1.5.4'
>
> and 1.5.10 < 1.5.4. Fortunately, 1.5.9 was the last release in the 1.5
> series, and no other checks compare against 1.6.x.
>
> If subversion would ever reach the 1.10.x version number, things would
> also start breaking.
>
>> I think the former is preferable for git.  Sort::Versions isn't used
>> anywhere else in git and I don't think it's widely installed.

Ok, something along the lines of this. Perhaps instead of "compare_", we may want to call it "require_", so that negative return maps naturally to a failure.

diff --git a/git-svn.perl b/git-svn.perl
index 427da9e..4a2ec43 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -41,11 +41,28 @@ sub fatal (@) { print STDERR "@_\n"; exit 1 }
 # repository decides to close the connection which we expect to be kept alive.
 $SIG{PIPE} = 'IGNORE';
 
+# Given a dot separated version number, "subtract" it from
+# the SVN::Core::VERSION; non-negaitive return means the SVN::Core
+# is at least at the version the caller asked for.
+sub compare_svn_version {
+	my (@ours) = split(/\./, $SVN::Core::VERSION);
+	my (@theirs) = split(/\./, $_[0]);
+	my ($i, $diff);
+
+	for ($i = 0; $i < @ours && $i < @theirs; $i++) {
+		$diff = $ours[$i] - $theirs[$i];
+		return $diff if ($diff);
+	}
+	return 1 if ($i < @ours);
+	return -1 if ($i < @theirs);
+	return 0;
+}
+
 sub _req_svn {
 	require SVN::Core; # use()-ing this causes segfaults for me... *shrug*
 	require SVN::Ra;
 	require SVN::Delta;
-	if ($SVN::Core::VERSION lt '1.1.0') {
+	if (compare_svn_version('1.1.0') < 0) {
 		fatal "Need SVN::Core 1.1.0 or better (got $SVN::Core::VERSION)";
 	}
 }
@@ -1474,7 +1491,7 @@ sub cmd_info {
 	}
 	::_req_svn();
 	$result .= "Repository UUID: $uuid\n" unless $diff_status eq "A" &&
-		($SVN::Core::VERSION le '1.5.4' || $file_type ne "dir");
+		(compare_svn_version('1.5.4') <= 0 || $file_type ne "dir");
 	$result .= "Revision: " . ($diff_status eq "A" ? 0 : $rev) . "\n";
 
 	$result .= "Node Kind: " .
@@ -5464,7 +5481,7 @@ sub _auth_providers () {
 
 	# earlier 1.6.x versions would segfault, and <= 1.5.x didn't have
 	# this function
-	if ($SVN::Core::VERSION gt '1.6.12') {
+	if (compare_svn_version('1.6.12') > 0) {
 		my $config = SVN::Core::config_get_config($config_dir);
 		my ($p, @a);
 		# config_get_config returns all config files from
@@ -5623,7 +5640,7 @@ sub get_log {
 	# drop it.  Therefore, the receiver callback passed to it
 	# is made aware of this limitation by being wrapped if
 	# the limit passed to is being wrapped.
-	if ($SVN::Core::VERSION le '1.2.0') {
+	if (compare_svn_version('1.2.0') <= 0) {
 		my $limit = splice(@args, 3, 1);
 		if ($limit > 0) {
 			my $receiver = pop @args;
@@ -5655,7 +5672,8 @@ sub trees_match {
 
 sub get_commit_editor {
 	my ($self, $log, $cb, $pool) = @_;
-	my @lock = $SVN::Core::VERSION ge '1.2.0' ? (undef, 0) : ();
+	
+	my @lock = (compare_svn_version('1.2.0') >= 0) ? (undef, 0) : ();
 	$self->SUPER::get_commit_editor($log, $cb, @lock, $pool);
 }
 
@@ -5673,7 +5691,7 @@ sub gs_do_update {
 	my (@pc) = split m#/#, $path;
 	my $reporter = $self->do_update($rev_b, (@pc ? shift @pc : ''),
 	                                1, $editor, $pool);
-	my @lock = $SVN::Core::VERSION ge '1.2.0' ? (undef) : ();
+	my @lock = (compare_svn_version('1.2.0') >= 0) ? (undef) : ();
 
 	# Since we can't rely on svn_ra_reparent being available, we'll
 	# just have to do some magic with set_path to make it so
@@ -5723,7 +5741,7 @@ sub gs_do_switch {
 	$ra ||= $self;
 	$url_b = escape_url($url_b);
 	my $reporter = $ra->do_switch($rev_b, '', 1, $url_b, $editor, $pool);
-	my @lock = $SVN::Core::VERSION ge '1.2.0' ? (undef) : ();
+	my @lock = (compare_svn_version('1.2.0') >= 0) ? (undef) : ();
 	$reporter->set_path('', $rev_a, 0, @lock, $pool);
 	$reporter->finish_report($pool);
 
Previous: Matthijs KooijmanNext: Charles Bailey
Message 29 of 35 in “git-svn won't remember pem password”
  1. IgorFeb 18, 2012
  2. Jakub NarebskiFeb 18, 2012
  3. Nikolaus DemmelFeb 19, 2012
  4. Jeff KingFeb 20, 2012
  5. Nikolaus DemmelFeb 20, 2012
  6. Eric WongFeb 19, 2012
  7. Matthijs KooijmanApr 26, 2012
  8. IgorApr 26, 2012
  9. Matthijs KooijmanApr 26, 2012
  10. 1/2 git-svn: use platform specific auth providersMatthijs Kooijman, Apr 26, 2012
  11. 2/2 git-svn: Configure a prompt callback for gnome_keyring.Matthijs Kooijman, Apr 26, 2012
  12. Eric WongApr 27, 2012
  13. Matthijs KooijmanApr 27, 2012
  14. Matthijs KooijmanJun 18, 2013
  15. git-svn: Configure a prompt callback for gnome_keyring.Matthijs Kooijman, Jun 18, 2013
  16. Matthijs KooijmanAug 29, 2013
  17. Eric WongAug 29, 2013
  18. Matthijs KooijmanApr 27, 2012
  19. Eric WongApr 27, 2012
  20. Matthijs KooijmanApr 27, 2012
  21. Eric WongApr 29, 2012
  22. Junio C HamanoApr 30, 2012
  23. Junio C HamanoApr 30, 2012
  24. Eric WongApr 30, 2012
  25. Junio C HamanoApr 30, 2012
  26. Matthijs KooijmanApr 30, 2012
  27. Eric WongApr 30, 2012
  28. Matthijs KooijmanApr 30, 2012
  29. Junio C HamanoMay 1, 2012
  30. Charles BaileyJun 3, 2012
  31. Junio C HamanoJun 3, 2012
  32. Matthijs KooijmanJun 4, 2012
  33. Junio C HamanoJun 4, 2012
  34. Eric WongJun 4, 2012
  35. Eric WongAug 29, 2013

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.