зеркало из https://github.com/microsoft/git.git
git-svn: replace URL escapes with canonicalization
The old hand-rolled URL escape functions were inferior to canonicalization functions. Continuing to move towards getting everything canonicalizing the same way. * Git::SVN->init_remote_config and Git::SVN::Ra->minimize_url both have to canonicalize the same way else init_remote_config will incorrectly think they're different URLs causing t9107-git-svn-migrate.sh to fail. [ew: commit title] Signed-off-by: Eric Wong <normalperson@yhbt.net>
This commit is contained in:
Родитель
93c3fcbe4d
Коммит
9c27a57b2d
24
git-svn.perl
24
git-svn.perl
|
@ -1412,24 +1412,6 @@ sub cmd_commit_diff {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub escape_uri_only {
|
|
||||||
my ($uri) = @_;
|
|
||||||
my @tmp;
|
|
||||||
foreach (split m{/}, $uri) {
|
|
||||||
s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
|
|
||||||
push @tmp, $_;
|
|
||||||
}
|
|
||||||
join('/', @tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub escape_url {
|
|
||||||
my ($url) = @_;
|
|
||||||
if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) {
|
|
||||||
my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3));
|
|
||||||
$url = "$scheme://$domain$uri";
|
|
||||||
}
|
|
||||||
$url;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub cmd_info {
|
sub cmd_info {
|
||||||
my $path = canonicalize_path(defined($_[0]) ? $_[0] : ".");
|
my $path = canonicalize_path(defined($_[0]) ? $_[0] : ".");
|
||||||
|
@ -1457,18 +1439,18 @@ sub cmd_info {
|
||||||
my $full_url = $url . ($fullpath eq "" ? "" : "/$fullpath");
|
my $full_url = $url . ($fullpath eq "" ? "" : "/$fullpath");
|
||||||
|
|
||||||
if ($_url) {
|
if ($_url) {
|
||||||
print escape_url($full_url), "\n";
|
print canonicalize_url($full_url), "\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $result = "Path: $path\n";
|
my $result = "Path: $path\n";
|
||||||
$result .= "Name: " . basename($path) . "\n" if $file_type ne "dir";
|
$result .= "Name: " . basename($path) . "\n" if $file_type ne "dir";
|
||||||
$result .= "URL: " . escape_url($full_url) . "\n";
|
$result .= "URL: " . canonicalize_url($full_url) . "\n";
|
||||||
|
|
||||||
eval {
|
eval {
|
||||||
my $repos_root = $gs->repos_root;
|
my $repos_root = $gs->repos_root;
|
||||||
Git::SVN::remove_username($repos_root);
|
Git::SVN::remove_username($repos_root);
|
||||||
$result .= "Repository Root: " . escape_url($repos_root) . "\n";
|
$result .= "Repository Root: " . canonicalize_url($repos_root) . "\n";
|
||||||
};
|
};
|
||||||
if ($@) {
|
if ($@) {
|
||||||
$result .= "Repository Root: (offline)\n";
|
$result .= "Repository Root: (offline)\n";
|
||||||
|
|
|
@ -296,7 +296,7 @@ sub find_existing_remote {
|
||||||
|
|
||||||
sub init_remote_config {
|
sub init_remote_config {
|
||||||
my ($self, $url, $no_write) = @_;
|
my ($self, $url, $no_write) = @_;
|
||||||
$url =~ s!/+$!!; # strip trailing slash
|
$url = canonicalize_url($url);
|
||||||
my $r = read_all_remotes();
|
my $r = read_all_remotes();
|
||||||
my $existing = find_existing_remote($url, $r);
|
my $existing = find_existing_remote($url, $r);
|
||||||
if ($existing) {
|
if ($existing) {
|
||||||
|
|
|
@ -66,24 +66,6 @@ sub _auth_providers () {
|
||||||
\@rv;
|
\@rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub escape_uri_only {
|
|
||||||
my ($uri) = @_;
|
|
||||||
my @tmp;
|
|
||||||
foreach (split m{/}, $uri) {
|
|
||||||
s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
|
|
||||||
push @tmp, $_;
|
|
||||||
}
|
|
||||||
join('/', @tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub escape_url {
|
|
||||||
my ($url) = @_;
|
|
||||||
if ($url =~ m#^(https?)://([^/]+)(.*)$#) {
|
|
||||||
my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3));
|
|
||||||
$url = "$scheme://$domain$uri";
|
|
||||||
}
|
|
||||||
$url;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
my ($class, $url) = @_;
|
my ($class, $url) = @_;
|
||||||
|
@ -119,7 +101,7 @@ sub new {
|
||||||
$Git::SVN::Prompt::_no_auth_cache = 1;
|
$Git::SVN::Prompt::_no_auth_cache = 1;
|
||||||
}
|
}
|
||||||
} # no warnings 'once'
|
} # no warnings 'once'
|
||||||
my $self = SVN::Ra->new(url => escape_url($url), auth => $baton,
|
my $self = SVN::Ra->new(url => canonicalize_url($url), auth => $baton,
|
||||||
config => $config,
|
config => $config,
|
||||||
pool => SVN::Pool->new,
|
pool => SVN::Pool->new,
|
||||||
auth_provider_callbacks => $callbacks);
|
auth_provider_callbacks => $callbacks);
|
||||||
|
@ -312,7 +294,7 @@ sub gs_do_switch {
|
||||||
|
|
||||||
if ($old_url =~ m#^svn(\+ssh)?://# ||
|
if ($old_url =~ m#^svn(\+ssh)?://# ||
|
||||||
($full_url =~ m#^https?://# &&
|
($full_url =~ m#^https?://# &&
|
||||||
escape_url($full_url) ne $full_url)) {
|
canonicalize_url($full_url) ne $full_url)) {
|
||||||
$_[0] = undef;
|
$_[0] = undef;
|
||||||
$self = undef;
|
$self = undef;
|
||||||
$RA = undef;
|
$RA = undef;
|
||||||
|
@ -325,7 +307,7 @@ sub gs_do_switch {
|
||||||
}
|
}
|
||||||
|
|
||||||
$ra ||= $self;
|
$ra ||= $self;
|
||||||
$url_b = escape_url($url_b);
|
$url_b = canonicalize_url($url_b);
|
||||||
my $reporter = $ra->do_switch($rev_b, '', 1, $url_b, $editor, $pool);
|
my $reporter = $ra->do_switch($rev_b, '', 1, $url_b, $editor, $pool);
|
||||||
my @lock = (::compare_svn_version('1.2.0') >= 0) ? (undef) : ();
|
my @lock = (::compare_svn_version('1.2.0') >= 0) ? (undef) : ();
|
||||||
$reporter->set_path('', $rev_a, 0, @lock, $pool);
|
$reporter->set_path('', $rev_a, 0, @lock, $pool);
|
||||||
|
@ -580,7 +562,8 @@ sub minimize_url {
|
||||||
$ra->get_log("", $latest, 0, 1, 0, 1, sub {});
|
$ra->get_log("", $latest, 0, 1, 0, 1, sub {});
|
||||||
};
|
};
|
||||||
} while ($@ && ($c = shift @components));
|
} while ($@ && ($c = shift @components));
|
||||||
$url;
|
|
||||||
|
return canonicalize_url($url);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub can_do_switch {
|
sub can_do_switch {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче