py3kcompat: added a "compatibility layer" for py3k
This patch adds some ugly constructs. The first of them is bytesformatter, a
function that formats strings like when '%' is called. The main motivation for
this function is py3k's strange behavior:
>>> 'foo %s' % b'bar'
"foo b'bar'"
>>> b'foo %s' % b'bar'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for %: 'bytes' and 'bytes'
>>> b'foo %s' % 'bar'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for %: 'bytes' and 'str'
In other words, if we can't format bytes with bytes, and recall that all
mercurial strings will be converted by a fixer, then things will break badly if
we don't take a similar approach.
The other addition with this patch is that the os.environ dictionary is
monkeypatched to have bytes items. Hopefully this won't be needed in the
future, as python 3.2 might get a os.environb dictionary that holds bytes
items.
#!/bin/sh
cat >> $HGRCPATH <<EOF
[extensions]
convert=
[convert]
hg.saverev=False
EOF
hg help convert
hg init a
cd a
echo a > a
hg ci -d'0 0' -Ama
hg cp a b
hg ci -d'1 0' -mb
hg rm a
hg ci -d'2 0' -mc
hg mv b a
hg ci -d'3 0' -md
echo a >> a
hg ci -d'4 0' -me
cd ..
hg convert a 2>&1 | grep -v 'subversion python bindings could not be loaded'
hg --cwd a-hg pull ../a
touch bogusfile
echo % should fail
hg convert a bogusfile
mkdir bogusdir
chmod 000 bogusdir
echo % should fail
hg convert a bogusdir
echo % should succeed
chmod 700 bogusdir
hg convert a bogusdir
echo % test pre and post conversion actions
echo 'include b' > filemap
hg convert --debug --filemap filemap a partialb | \
grep 'run hg'
echo % converting empty dir should fail "nicely"
mkdir emptydir
# override $PATH to ensure p4 not visible; use $PYTHON in case we're
# running from a devel copy, not a temp installation
PATH="$BINDIR" $PYTHON "$BINDIR"/hg convert emptydir 2>&1 | sed 's,file://.*/emptydir,.../emptydir,g'
echo % convert with imaginary source type
hg convert --source-type foo a a-foo
echo % convert with imaginary sink type
hg convert --dest-type foo a a-foo
echo
echo % "testing: convert must not produce duplicate entries in fncache"
hg convert a b
echo % "contents of fncache file:"
cat b/.hg/store/fncache
echo '% test bogus URL'
hg convert -q bzr+ssh://foobar@selenic.com/baz baz
true