pure: provide more correct implementation of posixfile for Windows
requires ctypes
Why is posixfile a class?
Because the implementation needs to use the Python library call os.fdopen [1],
which sets the 'name' attribute on the Python file object it creates to the
mostly meaningless string '<fdopen>', since file descriptors don't have a name.
But users of posixfile depend on the name attribute [2] being set to a proper
value, like Python's built-in 'open' function sets it on file objects.
Python file's name attribute is read-only, so we can't just assign to it after
the file object has alrady been created.
To solve this problem, we save the name of the file on a wrapper object,
and delegate the file function calls to the wrapped (private) file object
using __getattr__.
[1] http://docs.python.org/library/os.html#os.fdopen
[2] http://docs.python.org/library/stdtypes.html#file.name
$ "$TESTDIR/hghave" svn svn-bindings || exit 80
$ fix_path()
> {
> tr '\\' /
> }
$ echo "[extensions]" >> $HGRCPATH
$ echo "convert = " >> $HGRCPATH
$ echo "mq = " >> $HGRCPATH
$ svnpath=`pwd | fix_path`/svn-repo
$ svnadmin create "$svnpath"
$ cat > "$svnpath"/hooks/pre-revprop-change <<EOF
> #!/bin/sh
>
> REPOS="$1"
> REV="$2"
> USER="$3"
> PROPNAME="$4"
> ACTION="$5"
>
> if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
> if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-branch" ]; then exit 0; fi
> if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-rev" ]; then exit 0; fi
>
> echo "Changing prohibited revision property" >&2
> exit 1
> EOF
$ chmod +x "$svnpath"/hooks/pre-revprop-change
$
$ # SVN wants all paths to start with a slash. Unfortunately,
$ # Windows ones don't. Handle that.
$ svnurl="$svnpath"
$ expr "$svnurl" : "\/" > /dev/null || svnurl="/$svnurl"
$ svnurl="file://$svnurl"
$ svn co "$svnurl" "$svnpath"-wc
Checked out revision 0.
$ cd "$svnpath"-wc
$ echo a > a
$ svn add a
A a
$ svn ci -m'added a' a
Adding a
Transmitting file data .
Committed revision 1.
$ cd ..
initial roundtrip
$ hg convert -s svn -d hg "$svnpath"-wc "$svnpath"-hg | grep -v initializing
scanning source...
sorting...
converting...
0 added a
$ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
scanning source...
sorting...
converting...
second roundtrip should do nothing
$ hg convert -s svn -d hg "$svnpath"-wc "$svnpath"-hg
scanning source...
sorting...
converting...
$ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
scanning source...
sorting...
converting...
new hg rev
$ hg clone "$svnpath"-hg "$svnpath"-work
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd "$svnpath"-work
$ echo b > b
$ hg add b
$ hg ci -mb
adding an empty revision
$ hg qnew -m emtpy empty
$ hg qfinish -a
$ cd ..
echo hg to svn
$ hg --cwd "$svnpath"-hg pull -q "$svnpath"-work
$ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
scanning source...
sorting...
converting...
1 b
0 emtpy
svn back to hg should do nothing
$ hg convert -s svn -d hg "$svnpath"-wc "$svnpath"-hg
scanning source...
sorting...
converting...
hg back to svn should do nothing
$ hg convert -s hg -d svn "$svnpath"-hg "$svnpath"-wc
scanning source...
sorting...
converting...