git-svn: fix commiting renames over DAV with funky file names
Renaming files with non-URI friendly characters caused breakage when committing to DAV repositories (over http(s)). Even if I try leaving out the $self->{url} from the return value of url_path(), a partial (without host), unescaped path name does not work. Filenames for DAV repos need to be URI-encoded before being passed to the library. Since this bug did not affect file:// and svn:// repos, the git-svn test library needed to be expanded to include support for starting Apache with mod_dav_svn enabled. This new test is not enabled by default, but can be enabled by setting SVN_HTTPD_PORT to any available TCP/IP port on 127.0.0.1. Additionally, for running this test, the following variables (with defaults shown) can be changed for the suitable system. The default values are set for Debian systems: SVN_HTTPD_MODULE_PATH=/usr/lib/apache2/modules SVN_HTTPD_PATH=/usr/sbin/apache2 Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
99c01de402
commit
29633bb91c
@ -2724,6 +2724,9 @@ sub repo_path {
|
||||
|
||||
sub url_path {
|
||||
my ($self, $path) = @_;
|
||||
if ($self->{url} =~ m#^https?://#) {
|
||||
$path =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
|
||||
}
|
||||
$self->{url} . '/' . $self->repo_path($path);
|
||||
}
|
||||
|
||||
|
@ -48,3 +48,37 @@ svnrepo="file://$svnrepo"
|
||||
poke() {
|
||||
test-chmtime +1 "$1"
|
||||
}
|
||||
|
||||
SVN_HTTPD_MODULE_PATH=${SVN_HTTPD_MODULE_PATH-'/usr/lib/apache2/modules'}
|
||||
SVN_HTTPD_PATH=${SVN_HTTPD_PATH-'/usr/sbin/apache2'}
|
||||
|
||||
start_httpd () {
|
||||
if test -z "$SVN_HTTPD_PORT"
|
||||
then
|
||||
echo >&2 'SVN_HTTPD_PORT is not defined!'
|
||||
return
|
||||
fi
|
||||
|
||||
mkdir "$GIT_DIR"/logs
|
||||
|
||||
cat > "$GIT_DIR/httpd.conf" <<EOF
|
||||
ServerName "git-svn test"
|
||||
ServerRoot "$GIT_DIR"
|
||||
DocumentRoot "$GIT_DIR"
|
||||
PidFile "$GIT_DIR/httpd.pid"
|
||||
Listen 127.0.0.1:$SVN_HTTPD_PORT
|
||||
LoadModule dav_module $SVN_HTTPD_MODULE_PATH/mod_dav.so
|
||||
LoadModule dav_svn_module $SVN_HTTPD_MODULE_PATH/mod_dav_svn.so
|
||||
<Location /svn>
|
||||
DAV svn
|
||||
SVNPath $rawsvnrepo
|
||||
</Location>
|
||||
EOF
|
||||
"$SVN_HTTPD_PATH" -f "$GIT_DIR"/httpd.conf -k start
|
||||
svnrepo=http://127.0.0.1:$SVN_HTTPD_PORT/svn
|
||||
}
|
||||
|
||||
stop_httpd () {
|
||||
test -z "$SVN_HTTPD_PORT" && return
|
||||
"$SVN_HTTPD_PATH" -f "$GIT_DIR"/httpd.conf -k stop
|
||||
}
|
||||
|
54
t/t9115-git-svn-dcommit-funky-renames.sh
Executable file
54
t/t9115-git-svn-dcommit-funky-renames.sh
Executable file
@ -0,0 +1,54 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2007 Eric Wong
|
||||
|
||||
|
||||
test_description='git-svn dcommit can commit renames of files with ugly names'
|
||||
|
||||
. ./lib-git-svn.sh
|
||||
|
||||
test_expect_success 'load repository with strange names' "
|
||||
svnadmin load -q $rawsvnrepo < ../t9115/funky-names.dump &&
|
||||
start_httpd
|
||||
"
|
||||
|
||||
test_expect_success 'init and fetch repository' "
|
||||
git svn init $svnrepo &&
|
||||
git svn fetch &&
|
||||
git reset --hard git-svn
|
||||
"
|
||||
|
||||
test_expect_success 'create file in existing ugly and empty dir' '
|
||||
mkdir "#{bad_directory_name}" &&
|
||||
echo hi > "#{bad_directory_name}/ foo" &&
|
||||
git update-index --add "#{bad_directory_name}/ foo" &&
|
||||
git commit -m "new file in ugly parent" &&
|
||||
git svn dcommit
|
||||
'
|
||||
|
||||
test_expect_success 'rename ugly file' '
|
||||
git mv "#{bad_directory_name}/ foo" "file name with feces" &&
|
||||
git commit -m "rename ugly file" &&
|
||||
git svn dcommit
|
||||
'
|
||||
|
||||
test_expect_success 'rename pretty file' '
|
||||
echo :x > pretty &&
|
||||
git update-index --add pretty &&
|
||||
git commit -m "pretty :x" &&
|
||||
git svn dcommit &&
|
||||
mkdir regular_dir_name &&
|
||||
git mv pretty regular_dir_name/pretty &&
|
||||
git commit -m "moved pretty file" &&
|
||||
git svn dcommit
|
||||
'
|
||||
|
||||
test_expect_success 'rename pretty file into ugly one' '
|
||||
git mv regular_dir_name/pretty "#{bad_directory_name}/ booboo" &&
|
||||
git commit -m booboo &&
|
||||
git svn dcommit
|
||||
'
|
||||
|
||||
stop_httpd
|
||||
|
||||
test_done
|
103
t/t9115/funky-names.dump
Normal file
103
t/t9115/funky-names.dump
Normal file
@ -0,0 +1,103 @@
|
||||
SVN-fs-dump-format-version: 2
|
||||
|
||||
UUID: 819c44fe-2bcc-4066-88e4-985e2bc0b418
|
||||
|
||||
Revision-number: 0
|
||||
Prop-content-length: 56
|
||||
Content-length: 56
|
||||
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2007-07-12T07:54:26.062914Z
|
||||
PROPS-END
|
||||
|
||||
Revision-number: 1
|
||||
Prop-content-length: 152
|
||||
Content-length: 152
|
||||
|
||||
K 7
|
||||
svn:log
|
||||
V 44
|
||||
what will those wacky people think of next?
|
||||
|
||||
K 10
|
||||
svn:author
|
||||
V 12
|
||||
normalperson
|
||||
K 8
|
||||
svn:date
|
||||
V 27
|
||||
2007-07-12T08:00:05.011573Z
|
||||
PROPS-END
|
||||
|
||||
Node-path: leading space
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
|
||||
Node-path: leading space file
|
||||
Node-kind: file
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Text-content-length: 5
|
||||
Text-content-md5: e4fa20c67542cdc21271e08d329397ab
|
||||
Content-length: 15
|
||||
|
||||
PROPS-END
|
||||
ugly
|
||||
|
||||
|
||||
Node-path: #{bad_directory_name}
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
|
||||
Node-path: #{cool_name}
|
||||
Node-kind: file
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Text-content-length: 18
|
||||
Text-content-md5: 87dac40ca337dfa3dcc8911388c3ddda
|
||||
Content-length: 28
|
||||
|
||||
PROPS-END
|
||||
strange name here
|
||||
|
||||
|
||||
Node-path: dir name with spaces
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
||||
|
||||
|
||||
Node-path: file name with spaces
|
||||
Node-kind: file
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Text-content-length: 7
|
||||
Text-content-md5: c1f10cfd640618484a2a475c11410fd3
|
||||
Content-length: 17
|
||||
|
||||
PROPS-END
|
||||
spaces
|
||||
|
||||
|
||||
Node-path: regular_dir_name
|
||||
Node-kind: dir
|
||||
Node-action: add
|
||||
Prop-content-length: 10
|
||||
Content-length: 10
|
||||
|
||||
PROPS-END
|
Loading…
Reference in New Issue
Block a user