git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Michael G. Schwern" <schwern@pobox.com>
To: git@vger.kernel.org, gitster@pobox.com
Cc: robbat2@gentoo.org, bwalton@artsci.utoronto.ca,
	normalperson@yhbt.net, jrnieder@gmail.com, schwern@pobox.com
Subject: [PATCH 3/8] Improve our URL canonicalization to be more like SVN 1.7's.
Date: Sat, 28 Jul 2012 02:47:47 -0700	[thread overview]
Message-ID: <1343468872-72133-4-git-send-email-schwern@pobox.com> (raw)
In-Reply-To: <1343468872-72133-1-git-send-email-schwern@pobox.com>

From: "Michael G. Schwern" <schwern@pobox.com>

Previously, our URL canonicalization didn't do much of anything.
Now it actually escapes and collapses slashes.  This is mostly a cut & paste
of escape_url from git-svn.

This is closer to how SVN 1.7's canonicalization behaves.  Doing it with
1.6 lets us chase down some problems caused by more effective canonicalization
without having to deal with all the other 1.7 issues on top of that.

* Remote URLs have to be canonicalized otherwise Git::SVN->find_existing_remote
  will think they're different.

* The SVN remote is now written to the git config canonicalized.  That
  should be ok.  Adjust a test to account for that.
---
 perl/Git/SVN.pm                    |  4 ++--
 perl/Git/SVN/Utils.pm              | 19 +++++++++++++++++--
 t/Git-SVN/Utils/canonicalize_url.t | 26 ++++++++++++++++++++++++++
 t/t9107-git-svn-migrate.sh         |  4 +++-
 4 files changed, 48 insertions(+), 5 deletions(-)
 create mode 100644 t/Git-SVN/Utils/canonicalize_url.t

diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index 798f6c4..cb6d83a 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -201,9 +201,9 @@ sub read_all_remotes {
 		} elsif (m!^(.+)\.usesvmprops=\s*(.*)\s*$!) {
 			$r->{$1}->{svm} = {};
 		} elsif (m!^(.+)\.url=\s*(.*)\s*$!) {
-			$r->{$1}->{url} = $2;
+			$r->{$1}->{url} = canonicalize_url($2);
 		} elsif (m!^(.+)\.pushurl=\s*(.*)\s*$!) {
-			$r->{$1}->{pushurl} = $2;
+			$r->{$1}->{pushurl} = canonicalize_url($2);
 		} elsif (m!^(.+)\.ignore-refs=\s*(.*)\s*$!) {
 			$r->{$1}->{ignore_refs_regex} = $2;
 		} elsif (m!^(.+)\.(branches|tags)=$svn_refspec$!) {
diff --git a/perl/Git/SVN/Utils.pm b/perl/Git/SVN/Utils.pm
index 7ae6fac..dab6e4d 100644
--- a/perl/Git/SVN/Utils.pm
+++ b/perl/Git/SVN/Utils.pm
@@ -147,10 +147,25 @@ sub canonicalize_url {
 }
 
 
+sub _canonicalize_url_path {
+	my ($uri_path) = @_;
+
+	my @parts;
+	foreach my $part (split m{/+}, $uri_path) {
+		$part =~ s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
+		push @parts, $part;
+	}
+
+	return join('/', @parts);
+}
+
 sub _canonicalize_url_ourselves {
 	my ($url) = @_;
-	$url =~ s#^([^:]+://[^/]*/)(.*)$#$1 . canonicalize_path($2)#e;
-	return $url;
+	if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) {
+		my ($scheme, $domain, $uri) = ($1, $2, _canonicalize_url_path(canonicalize_path($3)));
+		$url = "$scheme://$domain$uri";
+	}
+	$url;
 }
 
 
diff --git a/t/Git-SVN/Utils/canonicalize_url.t b/t/Git-SVN/Utils/canonicalize_url.t
new file mode 100644
index 0000000..05795ab
--- /dev/null
+++ b/t/Git-SVN/Utils/canonicalize_url.t
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+
+# Test our own home rolled URL canonicalizer.  Test the private one
+# directly because we can't predict what the SVN API is doing to do.
+
+use strict;
+use warnings;
+
+use Test::More 'no_plan';
+
+use Git::SVN::Utils;
+my $canonicalize_url = \&Git::SVN::Utils::_canonicalize_url_ourselves;
+
+my %tests = (
+	"http://x.com"			=> "http://x.com",
+	"http://x.com/"			=> "http://x.com",
+	"http://x.com/foo/bar"		=> "http://x.com/foo/bar",
+	"http://x.com//foo//bar//"	=> "http://x.com/foo/bar",
+	"http://x.com/  /%/"		=> "http://x.com/%20%20/%25",
+);
+
+for my $arg (keys %tests) {
+	my $want = $tests{$arg};
+
+	is $canonicalize_url->($arg), $want, "canonicalize_url('$arg') => $want";
+}
diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh
index cfb4453..ee73013 100755
--- a/t/t9107-git-svn-migrate.sh
+++ b/t/t9107-git-svn-migrate.sh
@@ -27,6 +27,8 @@ test_expect_success 'setup old-looking metadata' '
 head=`git rev-parse --verify refs/heads/git-svn-HEAD^0`
 test_expect_success 'git-svn-HEAD is a real HEAD' "test -n '$head'"
 
+svnrepo_escaped=`echo $svnrepo | sed 's/ /%20/'`
+
 test_expect_success 'initialize old-style (v0) git svn layout' '
 	mkdir -p "$GIT_DIR"/git-svn/info "$GIT_DIR"/svn/info &&
 	echo "$svnrepo" > "$GIT_DIR"/git-svn/info/url &&
@@ -35,7 +37,7 @@ test_expect_success 'initialize old-style (v0) git svn layout' '
 	! test -d "$GIT_DIR"/git-svn &&
 	git rev-parse --verify refs/${remotes_git_svn}^0 &&
 	git rev-parse --verify refs/remotes/svn^0 &&
-	test "$(git config --get svn-remote.svn.url)" = "$svnrepo" &&
+	test "$(git config --get svn-remote.svn.url)" = "$svnrepo_escaped" &&
 	test `git config --get svn-remote.svn.fetch` = \
              ":refs/${remotes_git_svn}"
 	'
-- 
1.7.11.3

  parent reply	other threads:[~2012-07-28  9:49 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-28  9:47 Fix git-svn for SVN 1.7 Michael G. Schwern
2012-07-28  9:47 ` [PATCH 1/8] SVN 1.7 will truncate "not-a%40{0}" to just "not-a" Michael G. Schwern
2012-07-28 14:16   ` Jonathan Nieder
2012-07-28 19:32     ` Michael G Schwern
2012-10-09  8:41       ` [PATCH/RFC] svn test: escape peg revision separator using empty peg rev Jonathan Nieder
2012-10-09  9:47         ` Michael J Gruber
2012-10-09 10:19           ` Jonathan Nieder
2012-10-10 20:37             ` Eric Wong
2012-10-10 21:02               ` Jonathan Nieder
2012-10-10 21:31                 ` Eric Wong
2012-10-10 21:42                   ` Jonathan Nieder
2012-10-10 22:16                     ` Eric Wong
2012-10-10 22:33               ` Junio C Hamano
2012-07-28  9:47 ` [PATCH 2/8] Fix typo in test Michael G. Schwern
2012-07-28  9:47 ` Michael G. Schwern [this message]
2012-07-28  9:47 ` [PATCH 4/8] Replace hand rolled URL escapes with canonicalization Michael G. Schwern
2012-07-28  9:47 ` [PATCH 5/8] Canonicalize earlier in a couple spots Michael G. Schwern
2012-07-28  9:47 ` [PATCH 6/8] Add function to append a path to a URL Michael G. Schwern
2012-07-28  9:47 ` [PATCH 7/8] Turn on canonicalization on newly minted URLs Michael G. Schwern
2012-10-06 19:24   ` [PATCH/RFC] test: work around SVN 1.7 mishandling of svn:special changes Jonathan Nieder
2012-10-09 10:12     ` [PATCH/RFC v2] git svn: " Jonathan Nieder
2012-10-10 20:11       ` Eric Wong
2012-10-10 20:47         ` [PATCH v3] " Jonathan Nieder
2012-07-28  9:47 ` [PATCH 8/8] Remove some ad hoc canonicalizations Michael G. Schwern
2012-07-30 20:38 ` Fix git-svn for SVN 1.7 Eric Wong
2012-07-30 21:10   ` Michael G Schwern
2012-07-30 22:15     ` Eric Wong
2012-07-31  1:04       ` Michael G Schwern
2012-07-31  2:18         ` Eric Wong
2012-07-31  4:30           ` Michael G Schwern
2012-07-31  6:53   ` Junio C Hamano
2012-07-31  9:54     ` Michael G Schwern
2012-07-31 20:01       ` Eric Wong
2012-07-31 23:05         ` Junio C Hamano
2012-07-31 23:28           ` Michael G Schwern
2012-07-31 23:24         ` Michael G Schwern
2012-08-01 21:30           ` Eric Wong
2012-08-02 10:31 ` Eric Wong
2012-08-02 16:07   ` Jonathan Nieder
2012-08-02 18:58     ` Junio C Hamano
2012-08-02 19:50       ` Robin H. Johnson
2012-08-02 22:10         ` Eric Wong
2012-08-21  4:04       ` Junio C Hamano
2012-08-21 21:03         ` Eric Wong
2012-08-21 21:34           ` Junio C Hamano
2012-08-02 20:51     ` Eric Wong
2012-08-02 21:22       ` Junio C Hamano
2012-08-02 21:42         ` Eric Wong
2012-08-02 21:55           ` Eric Wong
2012-08-02 22:05             ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1343468872-72133-4-git-send-email-schwern@pobox.com \
    --to=schwern@pobox.com \
    --cc=bwalton@artsci.utoronto.ca \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=normalperson@yhbt.net \
    --cc=robbat2@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).