Merge branch 'master' of git://repo.or.cz/alt-git

This commit is contained in:
Johannes Sixt
2008-03-25 08:45:26 +01:00
21 changed files with 321 additions and 92 deletions

View File

@@ -124,6 +124,9 @@ Updates since v1.5.4
* "git gc" now automatically prunes unreachable objects that are two
weeks old or older.
* "git gc --auto" can be disabled more easily by just setting gc.auto
to zero. It also tolerates more packfiles by default.
* "git grep" now knows "--name-only" is a synonym for the "-l" option.
* "git help <alias>" now reports "'git <alias>' is alias to <what>",
@@ -201,6 +204,6 @@ this release, unless otherwise noted.
---
exec >/var/tmp/1
O=v1.5.4.4-620-gc817faa
O=v1.5.5-rc1
echo O=`git describe refs/heads/master`
git shortlog --no-merges $O..refs/heads/master ^refs/heads/maint

View File

@@ -582,7 +582,7 @@ gc.autopacklimit::
When there are more than this many packs that are not
marked with `*.keep` file in the repository, `git gc
--auto` consolidates them into one larger pack. The
default value is 20. Setting this to 0 disables it.
default value is 50. Setting this to 0 disables it.
gc.packrefs::
`git gc` does not run `git pack-refs` in a bare repository by

View File

@@ -385,6 +385,9 @@ new commit.
Omitting the `from` command in the first commit of a new branch
will cause fast-import to create that commit with no ancestor. This
tends to be desired only for the initial commit of a project.
If the frontend creates all files from scratch when making a new
branch, a `merge` command may be used instead of `from` to start
the commit with an empty tree.
Omitting the `from` command on existing branches is usually desired,
as the current commit on that branch is automatically assumed to
be the first ancestor of the new commit.
@@ -427,13 +430,15 @@ existing value of the branch.
`merge`
^^^^^^^
Includes one additional ancestor commit, and makes the current
commit a merge commit. An unlimited number of `merge` commands per
Includes one additional ancestor commit. If the `from` command is
omitted when creating a new branch, the first `merge` commit will be
the first ancestor of the current commit, and the branch will start
out with no files. An unlimited number of `merge` commands per
commit are permitted by fast-import, thereby establishing an n-way merge.
However Git's other tools never create commits with more than 15
additional ancestors (forming a 16-way merge). For this reason
it is suggested that frontends do not use more than 15 `merge`
commands per commit.
commands per commit; 16, if starting a new, empty branch.
Here `<committish>` is any of the commit specification expressions
also accepted by `from` (see above).

View File

@@ -25,7 +25,7 @@ Otherwise, all information (including original commit times or merge
information) will be preserved.
The command will only rewrite the _positive_ refs mentioned in the
command line (i.e. if you pass 'a..b', only 'b' will be rewritten).
command line (e.g. if you pass 'a..b', only 'b' will be rewritten).
If you specify no filters, the commits will be recommitted without any
changes, which would normally have no effect. Nevertheless, this may be
useful in the future for compensating for some git bugs or such,
@@ -42,7 +42,7 @@ Always verify that the rewritten version is correct: The original refs,
if different from the rewritten ones, will be stored in the namespace
'refs/original/'.
Note that since this operation is extensively I/O expensive, it might
Note that since this operation is very I/O expensive, it might
be a good idea to redirect the temporary directory off-disk with the
'-d' option, e.g. on tmpfs. Reportedly the speedup is very noticeable.
@@ -51,14 +51,15 @@ Filters
~~~~~~~
The filters are applied in the order as listed below. The <command>
argument is always evaluated in shell using the 'eval' command (with the
notable exception of the commit filter, for technical reasons).
argument is always evaluated in the shell context using the 'eval' command
(with the notable exception of the commit filter, for technical reasons).
Prior to that, the $GIT_COMMIT environment variable will be set to contain
the id of the commit being rewritten. Also, GIT_AUTHOR_NAME,
GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL,
and GIT_COMMITTER_DATE are set according to the current commit. If any
evaluation of <command> returns a non-zero exit status, the whole operation
will be aborted.
and GIT_COMMITTER_DATE are set according to the current commit. The values
of these variables after the filters have run, are used for the new commit.
If any evaluation of <command> returns a non-zero exit status, the whole
operation will be aborted.
A 'map' function is available that takes an "original sha1 id" argument
and outputs a "rewritten sha1 id" if the commit has been already
@@ -71,9 +72,9 @@ OPTIONS
-------
--env-filter <command>::
This is the filter for modifying the environment in which
the commit will be performed. Specifically, you might want
to rewrite the author/committer name/email/time environment
This filter may be used if you only need to modify the environment
in which the commit will be performed. Specifically, you might
want to rewrite the author/committer name/email/time environment
variables (see linkgit:git-commit[1] for details). Do not forget
to re-export the variables.
@@ -149,7 +150,7 @@ definition impossible to preserve signatures at any rate.)
-d <directory>::
Use this option to set the path to the temporary directory used for
rewriting. When applying a tree filter, the command needs to
temporary checkout the tree to some directory, which may consume
temporarily check out the tree to some directory, which may consume
considerable space in case of large projects. By default it
does this in the '.git-rewrite/' directory but you can override
that choice by this parameter.

View File

@@ -19,8 +19,15 @@ created from prior invocations of linkgit:git-add[1].
Users are encouraged to run this task on a regular basis within
each repository to maintain good disk space utilization and good
operating performance. Some git commands may automatically run
`git-gc`; see the `--auto` flag below for details.
operating performance.
Some git commands may automatically run `git-gc`; see the `--auto` flag
below for details. If you know what you're doing and all you want is to
disable this behavior permanently without further considerations, just do:
----------------------
$ git config --global gc.auto 0
----------------------
OPTIONS
-------

View File

@@ -216,6 +216,9 @@ sendemail.chainreplyto::
sendemail.smtpserver::
Default SMTP server to use.
sendemail.smtpserverport::
Default SMTP server port to use.
sendemail.smtpuser::
Default SMTP-AUTH username.

View File

@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
DEF_VER=v1.5.4.GIT
DEF_VER=v1.5.5-rc1.GIT
LF='
'

View File

@@ -652,5 +652,6 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
signal(SIGINT, unlock_pack_on_signal);
atexit(unlock_pack);
return do_fetch(transport, parse_ref_spec(ref_nr, refs), ref_nr);
return do_fetch(transport,
parse_fetch_refspec(ref_nr, refs), ref_nr);
}

View File

@@ -25,7 +25,7 @@ static const char * const builtin_gc_usage[] = {
static int pack_refs = 1;
static int aggressive_window = -1;
static int gc_auto_threshold = 6700;
static int gc_auto_pack_limit = 20;
static int gc_auto_pack_limit = 50;
static char *prune_expire = "2.weeks.ago";
#define MAX_ADD 10
@@ -160,10 +160,10 @@ static int too_many_packs(void)
static int need_to_gc(void)
{
/*
* Setting gc.auto and gc.autopacklimit to 0 or negative can
* disable the automatic gc.
* Setting gc.auto to 0 or negative can disable the
* automatic gc.
*/
if (gc_auto_threshold <= 0 && gc_auto_pack_limit <= 0)
if (gc_auto_threshold <= 0)
return 0;
/*

View File

@@ -207,7 +207,10 @@ static int handle_one_branch(const char *refname,
if (!remote_find_tracking(states->remote, &refspec)) {
struct path_list_item *item;
const char *name = skip_prefix(refspec.src, "refs/heads/");
if (unsorted_path_list_has_path(&states->tracked, name) ||
/* symbolic refs pointing nowhere were handled already */
if ((flags & REF_ISSYMREF) ||
unsorted_path_list_has_path(&states->tracked,
name) ||
unsorted_path_list_has_path(&states->new,
name))
return 0;

View File

@@ -33,6 +33,7 @@ static const char rev_list_usage[] =
" ordering output:\n"
" --topo-order\n"
" --date-order\n"
" --reverse\n"
" formatting output:\n"
" --parents\n"
" --objects | --objects-edge\n"

View File

@@ -537,7 +537,7 @@ static void verify_remote_names(int nr_heads, const char **heads)
int i;
for (i = 0; i < nr_heads; i++) {
const char *remote = strchr(heads[i], ':');
const char *remote = strrchr(heads[i], ':');
remote = remote ? (remote + 1) : heads[i];
switch (check_ref_format(remote)) {

View File

@@ -627,6 +627,8 @@ class P4Submit(Command):
if self.interactive:
submitTemplate = self.prepareLogMessage(template, logMessage)
if os.environ.has_key("P4DIFF"):
del(os.environ["P4DIFF"])
diff = read_pipe("p4 diff -du ...")
for newFile in filesToAdd:
@@ -650,7 +652,10 @@ class P4Submit(Command):
defaultEditor = "vi"
if platform.system() == "Windows":
defaultEditor = "notepad"
editor = os.environ.get("EDITOR", defaultEditor);
if os.environ.has_key("P4EDITOR"):
editor = os.environ.get("P4EDITOR")
else:
editor = os.environ.get("EDITOR", defaultEditor);
system(editor + " " + fileName)
tmpFile = open(fileName, "rb")
message = tmpFile.read()
@@ -882,21 +887,21 @@ class P4Sync(Command):
while j < len(filedata):
stat = filedata[j]
j += 1
text = ''
text = [];
while j < len(filedata) and filedata[j]['code'] in ('text', 'unicode', 'binary'):
tmp = filedata[j]['data']
if stat['type'] in ('text+ko', 'unicode+ko', 'binary+ko'):
tmp = re.sub(r'(?i)\$(Id|Header):[^$]*\$',r'$\1$', tmp)
elif stat['type'] in ('text+k', 'ktext', 'kxtext', 'unicode+k', 'binary+k'):
tmp = re.sub(r'(?i)\$(Id|Header|Author|Date|DateTime|Change|File|Revision):[^$]*\$',r'$\1$', tmp)
text += tmp
text.append(filedata[j]['data'])
j += 1
text = ''.join(text)
if not stat.has_key('depotFile'):
sys.stderr.write("p4 print fails with: %s\n" % repr(stat))
continue
if stat['type'] in ('text+ko', 'unicode+ko', 'binary+ko'):
text = re.sub(r'(?i)\$(Id|Header):[^$]*\$',r'$\1$', text)
elif stat['type'] in ('text+k', 'ktext', 'kxtext', 'unicode+k', 'binary+k'):
text = re.sub(r'(?i)\$(Id|Header|Author|Date|DateTime|Change|File|Revision):[^$]*\$',r'$\1$', text)
contents[stat['depotFile']] = text
for f in filesForCommit:

View File

@@ -3665,7 +3665,7 @@ sub escape_uri_only {
my ($uri) = @_;
my @tmp;
foreach (split m{/}, $uri) {
s/([^\w.-])/sprintf("%%%02X",ord($1))/eg;
s/([^\w.%-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
push @tmp, $_;
}
join('/', @tmp);

159
remote.c
View File

@@ -393,58 +393,123 @@ static void read_config(void)
alias_all_urls();
}
struct refspec *parse_ref_spec(int nr_refspec, const char **refspec)
static struct refspec *parse_refspec_internal(int nr_refspec, const char **refspec, int fetch)
{
int i;
int st;
struct refspec *rs = xcalloc(sizeof(*rs), nr_refspec);
for (i = 0; i < nr_refspec; i++) {
const char *sp, *ep, *gp;
sp = refspec[i];
if (*sp == '+') {
size_t llen, rlen;
int is_glob;
const char *lhs, *rhs;
llen = rlen = is_glob = 0;
lhs = refspec[i];
if (*lhs == '+') {
rs[i].force = 1;
sp++;
lhs++;
}
gp = strstr(sp, "/*");
ep = strchr(sp, ':');
if (gp && ep && gp > ep)
gp = NULL;
if (ep) {
if (ep[1]) {
const char *glob = strstr(ep + 1, "/*");
if (glob && glob[2])
glob = NULL;
if (!glob)
gp = NULL;
if (gp)
rs[i].dst = xstrndup(ep + 1,
glob - ep - 1);
else
rs[i].dst = xstrdup(ep + 1);
rhs = strrchr(lhs, ':');
if (rhs) {
rhs++;
rlen = strlen(rhs);
is_glob = (2 <= rlen && !strcmp(rhs + rlen - 2, "/*"));
rs[i].dst = xstrndup(rhs, rlen - is_glob * 2);
}
llen = (rhs ? (rhs - lhs - 1) : strlen(lhs));
if (is_glob != (2 <= llen && !memcmp(lhs + llen - 2, "/*", 2)))
goto invalid;
if (is_glob) {
llen -= 2;
rlen -= 2;
}
rs[i].pattern = is_glob;
rs[i].src = xstrndup(lhs, llen);
if (fetch) {
/*
* LHS
* - empty is allowed; it means HEAD.
* - otherwise it must be a valid looking ref.
*/
if (!*rs[i].src)
; /* empty is ok */
else {
st = check_ref_format(rs[i].src);
if (st && st != CHECK_REF_FORMAT_ONELEVEL)
goto invalid;
}
/*
* RHS
* - missing is allowed.
* - empty is ok; it means not to store.
* - otherwise it must be a valid looking ref.
*/
if (!rs[i].dst) {
; /* ok */
} else if (!*rs[i].dst) {
; /* ok */
} else {
st = check_ref_format(rs[i].dst);
if (st && st != CHECK_REF_FORMAT_ONELEVEL)
goto invalid;
}
} else {
ep = sp + strlen(sp);
}
if (gp && gp + 2 != ep)
gp = NULL;
if (gp) {
rs[i].pattern = 1;
ep = gp;
}
rs[i].src = xstrndup(sp, ep - sp);
if (*rs[i].src) {
st = check_ref_format(rs[i].src);
if (st && st != CHECK_REF_FORMAT_ONELEVEL)
die("Invalid refspec '%s'", refspec[i]);
}
if (rs[i].dst && *rs[i].dst) {
st = check_ref_format(rs[i].dst);
if (st && st != CHECK_REF_FORMAT_ONELEVEL)
die("Invalid refspec '%s'", refspec[i]);
/*
* LHS
* - empty is allowed; it means delete.
* - when wildcarded, it must be a valid looking ref.
* - otherwise, it must be an extended SHA-1, but
* there is no existing way to validate this.
*/
if (!*rs[i].src)
; /* empty is ok */
else if (is_glob) {
st = check_ref_format(rs[i].src);
if (st && st != CHECK_REF_FORMAT_ONELEVEL)
goto invalid;
}
else
; /* anything goes, for now */
/*
* RHS
* - missing is allowed, but LHS then must be a
* valid looking ref.
* - empty is not allowed.
* - otherwise it must be a valid looking ref.
*/
if (!rs[i].dst) {
st = check_ref_format(rs[i].src);
if (st && st != CHECK_REF_FORMAT_ONELEVEL)
goto invalid;
} else if (!*rs[i].dst) {
goto invalid;
} else {
st = check_ref_format(rs[i].dst);
if (st && st != CHECK_REF_FORMAT_ONELEVEL)
goto invalid;
}
}
}
return rs;
invalid:
die("Invalid refspec '%s'", refspec[i]);
}
struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec)
{
return parse_refspec_internal(nr_refspec, refspec, 1);
}
struct refspec *parse_push_refspec(int nr_refspec, const char **refspec)
{
return parse_refspec_internal(nr_refspec, refspec, 0);
}
static int valid_remote_nick(const char *name)
@@ -475,8 +540,8 @@ struct remote *remote_get(const char *name)
add_url_alias(ret, name);
if (!ret->url)
return NULL;
ret->fetch = parse_ref_spec(ret->fetch_refspec_nr, ret->fetch_refspec);
ret->push = parse_ref_spec(ret->push_refspec_nr, ret->push_refspec);
ret->fetch = parse_fetch_refspec(ret->fetch_refspec_nr, ret->fetch_refspec);
ret->push = parse_push_refspec(ret->push_refspec_nr, ret->push_refspec);
return ret;
}
@@ -489,11 +554,11 @@ int for_each_remote(each_remote_fn fn, void *priv)
if (!r)
continue;
if (!r->fetch)
r->fetch = parse_ref_spec(r->fetch_refspec_nr,
r->fetch_refspec);
r->fetch = parse_fetch_refspec(r->fetch_refspec_nr,
r->fetch_refspec);
if (!r->push)
r->push = parse_ref_spec(r->push_refspec_nr,
r->push_refspec);
r->push = parse_push_refspec(r->push_refspec_nr,
r->push_refspec);
result = fn(r, priv);
}
return result;
@@ -824,7 +889,7 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
int nr_refspec, const char **refspec, int flags)
{
struct refspec *rs =
parse_ref_spec(nr_refspec, (const char **) refspec);
parse_push_refspec(nr_refspec, (const char **) refspec);
int send_all = flags & MATCH_REFS_ALL;
int send_mirror = flags & MATCH_REFS_MIRROR;

View File

@@ -67,7 +67,8 @@ void free_refs(struct ref *ref);
*/
void ref_remove_duplicates(struct ref *ref_map);
struct refspec *parse_ref_spec(int nr_refspec, const char **refspec);
struct refspec *parse_fetch_refspec(int nr_refspec, const char **refspec);
struct refspec *parse_push_refspec(int nr_refspec, const char **refspec);
int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
int nr_refspec, const char **refspec, int all);

View File

@@ -49,8 +49,28 @@ 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'}
for d in \
"$SVN_HTTPD_PATH" \
/usr/sbin/apache2 \
/usr/sbin/httpd \
; do
if test -f "$d"
then
SVN_HTTPD_PATH="$d"
break
fi
done
for d in \
"$SVN_HTTPD_MODULE_PATH" \
/usr/lib/apache2/modules \
/usr/libexec/apache2 \
; do
if test -d "$d"
then
SVN_HTTPD_MODULE_PATH="$d"
break
fi
done
start_httpd () {
if test -z "$SVN_HTTPD_PORT"
@@ -66,6 +86,7 @@ ServerName "git-svn test"
ServerRoot "$GIT_DIR"
DocumentRoot "$GIT_DIR"
PidFile "$GIT_DIR/httpd.pid"
LockFile logs/accept.lock
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

View File

@@ -237,4 +237,14 @@ test_expect_success 'update default (overridden, with funny whitespace)' '
'
test_expect_success '"remote show" does not show symbolic refs' '
git clone one three &&
(cd three &&
git remote show origin > output &&
! grep HEAD < output &&
! grep -i stale < output)
'
test_done

72
t/t5511-refspec.sh Executable file
View File

@@ -0,0 +1,72 @@
#!/bin/sh
test_description='refspec parsing'
. ./test-lib.sh
test_refspec () {
kind=$1 refspec=$2 expect=$3
git config remote.frotz.url "." &&
git config --remove-section remote.frotz &&
git config remote.frotz.url "." &&
git config "remote.frotz.$kind" "$refspec" &&
if test "$expect" != invalid
then
title="$kind $refspec"
test='git ls-remote frotz'
else
title="$kind $refspec (invalid)"
test='test_must_fail git ls-remote frotz'
fi
test_expect_success "$title" "$test"
}
test_refspec push '' invalid
test_refspec push ':' invalid
test_refspec fetch ''
test_refspec fetch ':'
test_refspec push 'refs/heads/*:refs/remotes/frotz/*'
test_refspec push 'refs/heads/*:refs/remotes/frotz' invalid
test_refspec push 'refs/heads:refs/remotes/frotz/*' invalid
test_refspec push 'refs/heads/master:refs/remotes/frotz/xyzzy'
# These have invalid LHS, but we do not have a formal "valid sha-1
# expression syntax checker" so they are not checked with the current
# code. They will be caught downstream anyway, but we may want to
# have tighter check later...
: test_refspec push 'refs/heads/master::refs/remotes/frotz/xyzzy' invalid
: test_refspec push 'refs/heads/maste :refs/remotes/frotz/xyzzy' invalid
test_refspec fetch 'refs/heads/*:refs/remotes/frotz/*'
test_refspec fetch 'refs/heads/*:refs/remotes/frotz' invalid
test_refspec fetch 'refs/heads:refs/remotes/frotz/*' invalid
test_refspec fetch 'refs/heads/master:refs/remotes/frotz/xyzzy'
test_refspec fetch 'refs/heads/master::refs/remotes/frotz/xyzzy' invalid
test_refspec fetch 'refs/heads/maste :refs/remotes/frotz/xyzzy' invalid
test_refspec push 'master~1:refs/remotes/frotz/backup'
test_refspec fetch 'master~1:refs/remotes/frotz/backup' invalid
test_refspec push 'HEAD~4:refs/remotes/frotz/new'
test_refspec fetch 'HEAD~4:refs/remotes/frotz/new' invalid
test_refspec push 'HEAD'
test_refspec fetch 'HEAD'
test_refspec push 'refs/heads/ nitfol' invalid
test_refspec fetch 'refs/heads/ nitfol' invalid
test_refspec push 'HEAD:' invalid
test_refspec fetch 'HEAD:'
test_refspec push 'refs/heads/ nitfol:' invalid
test_refspec fetch 'refs/heads/ nitfol:' invalid
test_refspec push ':refs/remotes/frotz/deleteme'
test_refspec fetch ':refs/remotes/frotz/HEAD-to-me'
test_refspec push ':refs/remotes/frotz/delete me' invalid
test_refspec fetch ':refs/remotes/frotz/HEAD to me' invalid
test_done

View File

@@ -78,7 +78,7 @@ test_expect_success 'filter subdirectory only' '
test_expect_success 'subdirectory filter result looks okay' '
test 2 = $(git rev-list sub | wc -l) &&
git show sub:new &&
! git show sub:subdir
test_must_fail git show sub:subdir
'
test_expect_success 'setup and filter history that requires --full-history' '
@@ -100,7 +100,7 @@ test_expect_success 'subdirectory filter result looks okay' '
test 3 = $(git rev-list -1 --parents sub-master | wc -w) &&
git show sub-master^:new &&
git show sub-master^2:new &&
! git show sub:subdir
test_must_fail git show sub:subdir
'
test_expect_success 'use index-filter to move into a subdirectory' '
@@ -114,7 +114,7 @@ test_expect_success 'use index-filter to move into a subdirectory' '
test_expect_success 'stops when msg filter fails' '
old=$(git rev-parse HEAD) &&
! git-filter-branch -f --msg-filter false HEAD &&
test_must_fail git-filter-branch -f --msg-filter false HEAD &&
test $old = $(git rev-parse HEAD) &&
rm -rf .git-rewrite
'
@@ -151,8 +151,8 @@ test_expect_success "remove a certain author's commits" '
'
test_expect_success 'barf on invalid name' '
! git filter-branch -f master xy-problem &&
! git filter-branch -f HEAD^
test_must_fail git filter-branch -f master xy-problem &&
test_must_fail git filter-branch -f HEAD^
'
test_expect_success '"map" works in commit filter' '
@@ -174,7 +174,7 @@ test_expect_success 'Name needing quotes' '
git add foo &&
git commit -m "Adding a file" &&
git filter-branch --tree-filter "rm -fr foo" &&
! git ls-files --error-unmatch "foo/$name" &&
test_must_fail git ls-files --error-unmatch "foo/$name" &&
test $(git rev-parse --verify rerere) != $(git rev-parse --verify A)
'

View File

@@ -0,0 +1,31 @@
#!/bin/sh
#
# Copyright (c) 2008 Kevin Ballard
#
test_description='git-svn clone with percent escapes'
. ./lib-git-svn.sh
test_expect_success 'setup svnrepo' "
mkdir project project/trunk project/branches project/tags &&
echo foo > project/trunk/foo &&
svn import -m '$test_description' project '$svnrepo/pr ject' &&
rm -rf project &&
start_httpd
"
if test "$SVN_HTTPD_PORT" = ""
then
test_expect_failure 'test clone with percent escapes - needs SVN_HTTPD_PORT set' 'false'
else
test_expect_success 'test clone with percent escapes' '
git svn clone "$svnrepo/pr%20ject" clone &&
cd clone &&
git rev-parse refs/remotes/git-svn &&
cd ..
'
fi
stop_httpd
test_done