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
$ hg init t
$ cd t
$ echo a > a
$ hg add a
$ hg commit -m "test"
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 1 changesets, 1 total revisions
$ hg parents
changeset: 0:acb14030fe0a
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: test
$ hg status
$ hg rollback
repository tip rolled back to revision -1 (undo commit)
working directory now based on revision -1
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
0 files, 0 changesets, 0 total revisions
$ hg parents
$ hg status
A a
Test issue 902
$ hg commit -m "test2"
$ hg branch test
marked working directory as branch test
$ hg rollback
repository tip rolled back to revision -1 (undo commit)
working directory now based on revision -1
$ hg branch
default
Test issue 1635 (commit message saved)
.hg/last-message.txt:
$ cat .hg/last-message.txt ; echo
test2
Test rollback of hg before issue 902 was fixed
$ hg commit -m "test3"
$ hg branch test
marked working directory as branch test
$ rm .hg/undo.branch
$ hg rollback
repository tip rolled back to revision -1 (undo commit)
named branch could not be reset, current branch is still: test
working directory now based on revision -1
$ hg branch
test
rollback by pretxncommit saves commit message (issue 1635)
$ echo a >> a
$ hg --config hooks.pretxncommit=false commit -m"precious commit message"
transaction abort!
rollback completed
abort: pretxncommit hook exited with status * (glob)
[255]
.hg/last-message.txt:
$ cat .hg/last-message.txt ; echo
precious commit message
same thing, but run $EDITOR
$ cat > editor << '__EOF__'
> #!/bin/sh
> echo "another precious commit message" > "$1"
> __EOF__
$ chmod +x editor
$ HGEDITOR="'`pwd`'"/editor hg --config hooks.pretxncommit=false commit 2>&1
transaction abort!
rollback completed
note: commit message saved in .hg/last-message.txt
abort: pretxncommit hook exited with status * (glob)
[255]
$ cat .hg/last-message.txt
another precious commit message
test rollback on served repository
$ hg commit -m "precious commit message"
$ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
$ cat hg.pid >> $DAEMON_PIDS
$ cd ..
$ hg clone http://localhost:$HGPORT u
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
updating to branch test
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd u
$ hg id default
1df294f7b1a2
now rollback and observe that 'hg serve' reloads the repository and
presents the correct tip changeset:
$ hg -R ../t rollback
repository tip rolled back to revision -1 (undo commit)
working directory now based on revision -1
$ hg id default
000000000000