test-rollback.t
467 lines
| 12.3 KiB
| text/troff
|
Tads3Lexer
/ tests / test-rollback.t
|
r15108 | setup repo | ||
|
r13956 | $ hg init t | ||
|
r12485 | $ cd t | ||
$ echo a > a | ||||
|
r15108 | $ hg commit -Am'add a' | ||
adding a | ||||
|
r12485 | $ hg verify | ||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
|
r39525 | checked 1 changesets with 1 changes to 1 files | ||
|
r12485 | $ hg parents | ||
|
r15108 | changeset: 0:1f0dee641bb7 | ||
|
r12485 | tag: tip | ||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
|
r15108 | summary: add a | ||
|
r12485 | |||
|
r15108 | |||
rollback to null revision | ||||
|
r12485 | $ hg status | ||
$ hg rollback | ||||
|
r13446 | repository tip rolled back to revision -1 (undo commit) | ||
working directory now based on revision -1 | ||||
|
r12485 | $ hg verify | ||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
|
r39525 | checked 0 changesets with 0 changes to 0 files | ||
|
r12485 | $ hg parents | ||
$ hg status | ||||
A a | ||||
|
r15108 | Two changesets this time so we rollback to a real changeset | ||
$ hg commit -m'add a again' | ||||
$ echo a >> a | ||||
$ hg commit -m'modify a' | ||||
|
r12485 | |||
|
r15108 | Test issue 902 (current branch is preserved) | ||
|
r12485 | $ hg branch test | ||
marked working directory as branch test | ||||
|
r15615 | (branches are permanent and global, did you want a bookmark?) | ||
|
r12485 | $ hg rollback | ||
|
r15108 | repository tip rolled back to revision 0 (undo commit) | ||
working directory now based on revision 0 | ||||
|
r12485 | $ hg branch | ||
default | ||||
Test issue 1635 (commit message saved) | ||||
$ cat .hg/last-message.txt ; echo | ||||
|
r15108 | modify a | ||
|
r12485 | |||
Test rollback of hg before issue 902 was fixed | ||||
$ hg commit -m "test3" | ||||
$ hg branch test | ||||
marked working directory as branch test | ||||
|
r15615 | (branches are permanent and global, did you want a bookmark?) | ||
|
r12485 | $ rm .hg/undo.branch | ||
$ hg rollback | ||||
|
r15108 | repository tip rolled back to revision 0 (undo commit) | ||
|
r15130 | named branch could not be reset: current branch is still 'test' | ||
|
r15108 | working directory now based on revision 0 | ||
|
r12485 | $ hg branch | ||
test | ||||
|
r15131 | working dir unaffected by rollback: do not restore dirstate et. al. | ||
$ hg log --template '{rev} {branch} {desc|firstline}\n' | ||||
0 default add a again | ||||
$ hg status | ||||
M a | ||||
$ hg bookmark foo | ||||
$ hg commit -m'modify a again' | ||||
$ echo b > b | ||||
|
r25744 | $ hg bookmark bar -r default #making bar active, before the transaction | ||
|
r15131 | $ hg commit -Am'add b' | ||
adding b | ||||
$ hg log --template '{rev} {branch} {desc|firstline}\n' | ||||
2 test add b | ||||
1 test modify a again | ||||
0 default add a again | ||||
|
r25744 | $ hg update bar | ||
|
r15131 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||
|
r25744 | (activating bookmark bar) | ||
|
r15131 | $ cat .hg/undo.branch ; echo | ||
test | ||||
|
r15183 | $ hg rollback -f | ||
|
r15131 | repository tip rolled back to revision 1 (undo commit) | ||
$ hg id -n | ||||
0 | ||||
$ hg branch | ||||
default | ||||
$ cat .hg/bookmarks.current ; echo | ||||
bar | ||||
|
r25744 | $ hg bookmark --delete foo bar | ||
|
r15131 | |||
|
r22183 | rollback by pretxncommit saves commit message (issue1635) | ||
|
r12485 | |||
$ 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] | ||||
$ cat .hg/last-message.txt ; echo | ||||
precious commit message | ||||
|
r13185 | |||
same thing, but run $EDITOR | ||||
|
r16901 | $ cat > editor.sh << '__EOF__' | ||
|
r12485 | > echo "another precious commit message" > "$1" | ||
> __EOF__ | ||||
|
r16901 | $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg --config hooks.pretxncommit=false commit 2>&1 | ||
|
r12485 | transaction abort! | ||
rollback completed | ||||
|
r41398 | note: commit message saved in .hg/last-message.txt | ||
|
r12485 | abort: pretxncommit hook exited with status * (glob) | ||
|
r12642 | [255] | ||
$ cat .hg/last-message.txt | ||||
|
r12485 | another precious commit message | ||
|
r13958 | test rollback on served repository | ||
|
r16916 | #if serve | ||
|
r13958 | $ 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 | ||||
|
r15131 | added 3 changesets with 2 changes to 1 files (+1 heads) | ||
|
r34662 | new changesets 23b0221f3370:068774709090 | ||
|
r15108 | updating to branch default | ||
|
r13958 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ cd u | ||||
$ hg id default | ||||
|
r15131 | 068774709090 | ||
|
r13958 | |||
now rollback and observe that 'hg serve' reloads the repository and | ||||
presents the correct tip changeset: | ||||
$ hg -R ../t rollback | ||||
|
r15131 | repository tip rolled back to revision 1 (undo commit) | ||
|
r15108 | working directory now based on revision 0 | ||
|
r13958 | $ hg id default | ||
|
r15131 | 791dd2169706 | ||
|
r31770 | |||
$ killdaemons.py | ||||
|
r16916 | #endif | ||
|
r15183 | |||
update to older changeset and then refuse rollback, because | ||||
that would lose data (issue2998) | ||||
$ cd ../t | ||||
$ hg -q update | ||||
$ rm `hg status -un` | ||||
$ template='{rev}:{node|short} [{branch}] {desc|firstline}\n' | ||||
$ echo 'valuable new file' > b | ||||
$ echo 'valuable modification' >> a | ||||
$ hg commit -A -m'a valuable change' | ||||
adding b | ||||
$ hg update 0 | ||||
1 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
$ hg rollback | ||||
|
r15187 | abort: rollback of last commit while not checked out may lose data | ||
(use -f to force) | ||||
|
r15183 | [255] | ||
$ hg tip -q | ||||
2:4d9cd3795eea | ||||
$ hg rollback -f | ||||
repository tip rolled back to revision 1 (undo commit) | ||||
$ hg status | ||||
$ hg log --removed b # yep, it's gone | ||||
same again, but emulate an old client that doesn't write undo.desc | ||||
$ hg -q update | ||||
$ echo 'valuable modification redux' >> a | ||||
$ hg commit -m'a valuable change redux' | ||||
$ rm .hg/undo.desc | ||||
$ hg update 0 | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ hg rollback | ||||
rolling back unknown transaction | ||||
$ cat a | ||||
a | ||||
|
r16913 | |||
|
r20524 | corrupt journal test | ||
$ echo "foo" > .hg/store/journal | ||||
$ hg recover | ||||
rolling back interrupted transaction | ||||
couldn't read journal entry 'foo\n'! | ||||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
|
r39525 | checked 2 changesets with 2 changes to 1 files | ||
|
r20524 | |||
|
r29086 | rollback disabled by config | ||
$ cat >> $HGRCPATH <<EOF | ||||
> [ui] | ||||
> rollback = false | ||||
> EOF | ||||
$ echo narf >> pinky-sayings.txt | ||||
$ hg add pinky-sayings.txt | ||||
$ hg ci -m 'First one.' | ||||
$ hg rollback | ||||
abort: rollback is disabled because it is unsafe | ||||
(see `hg help -v rollback` for information) | ||||
[255] | ||||
|
r33858 | |||
$ cd .. | ||||
I/O errors on stdio are handled properly (issue5658) | ||||
$ cat > badui.py << EOF | ||||
> import errno | ||||
> from mercurial.i18n import _ | ||||
> from mercurial import ( | ||||
|
r36663 | > error, | ||
|
r34767 | > registrar, | ||
|
r33858 | > ui as uimod, | ||
> ) | ||||
> | ||||
|
r34767 | > configtable = {} | ||
> configitem = registrar.configitem(configtable) | ||||
> | ||||
|
r36504 | > configitem(b'ui', b'ioerrors', | ||
|
r34767 | > default=list, | ||
> ) | ||||
> | ||||
|
r33858 | > def pretxncommit(ui, repo, **kwargs): | ||
|
r36504 | > ui.warn(b'warn during pretxncommit\n') | ||
|
r33858 | > | ||
> def pretxnclose(ui, repo, **kwargs): | ||||
|
r36504 | > ui.warn(b'warn during pretxnclose\n') | ||
|
r33858 | > | ||
> def txnclose(ui, repo, **kwargs): | ||||
|
r36504 | > ui.warn(b'warn during txnclose\n') | ||
|
r33858 | > | ||
> def txnabort(ui, repo, **kwargs): | ||||
|
r36504 | > ui.warn(b'warn during abort\n') | ||
|
r33858 | > | ||
> class fdproxy(object): | ||||
> def __init__(self, ui, o): | ||||
> self._ui = ui | ||||
> self._o = o | ||||
> | ||||
> def __getattr__(self, attr): | ||||
> return getattr(self._o, attr) | ||||
> | ||||
> def write(self, msg): | ||||
|
r36504 | > errors = set(self._ui.configlist(b'ui', b'ioerrors')) | ||
> pretxncommit = msg == b'warn during pretxncommit\n' | ||||
> pretxnclose = msg == b'warn during pretxnclose\n' | ||||
> txnclose = msg == b'warn during txnclose\n' | ||||
> txnabort = msg == b'warn during abort\n' | ||||
> msgabort = msg == _(b'transaction abort!\n') | ||||
> msgrollback = msg == _(b'rollback completed\n') | ||||
|
r33858 | > | ||
|
r36504 | > if pretxncommit and b'pretxncommit' in errors: | ||
|
r33858 | > raise IOError(errno.EPIPE, 'simulated epipe') | ||
|
r36504 | > if pretxnclose and b'pretxnclose' in errors: | ||
|
r33858 | > raise IOError(errno.EIO, 'simulated eio') | ||
|
r36504 | > if txnclose and b'txnclose' in errors: | ||
|
r33858 | > raise IOError(errno.EBADF, 'simulated badf') | ||
|
r36504 | > if txnabort and b'txnabort' in errors: | ||
|
r33858 | > raise IOError(errno.EPIPE, 'simulated epipe') | ||
|
r36504 | > if msgabort and b'msgabort' in errors: | ||
|
r33858 | > raise IOError(errno.EBADF, 'simulated ebadf') | ||
|
r36504 | > if msgrollback and b'msgrollback' in errors: | ||
|
r33858 | > raise IOError(errno.EIO, 'simulated eio') | ||
> | ||||
> return self._o.write(msg) | ||||
> | ||||
> def uisetup(ui): | ||||
> class badui(ui.__class__): | ||||
|
r40577 | > def _write(self, dest, *args, **kwargs): | ||
|
r33858 | > olderr = self.ferr | ||
> try: | ||||
|
r40577 | > if dest is self.ferr: | ||
> self.ferr = dest = fdproxy(self, olderr) | ||||
> return super(badui, self)._write(dest, *args, **kwargs) | ||||
|
r33858 | > finally: | ||
> self.ferr = olderr | ||||
> | ||||
> ui.__class__ = badui | ||||
> | ||||
> def reposetup(ui, repo): | ||||
|
r36504 | > ui.setconfig(b'hooks', b'pretxnclose.badui', pretxnclose, b'badui') | ||
> ui.setconfig(b'hooks', b'txnclose.badui', txnclose, b'badui') | ||||
> ui.setconfig(b'hooks', b'pretxncommit.badui', pretxncommit, b'badui') | ||||
> ui.setconfig(b'hooks', b'txnabort.badui', txnabort, b'badui') | ||||
|
r33858 | > EOF | ||
$ cat >> $HGRCPATH << EOF | ||||
> [extensions] | ||||
> badui = $TESTTMP/badui.py | ||||
> EOF | ||||
An I/O error during pretxncommit is handled | ||||
$ hg init ioerror-pretxncommit | ||||
$ cd ioerror-pretxncommit | ||||
$ echo 0 > foo | ||||
$ hg -q commit -A -m initial | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ echo 1 > foo | ||||
$ hg --config ui.ioerrors=pretxncommit commit -m 'error during pretxncommit' | ||||
|
r33859 | warn during pretxnclose | ||
warn during txnclose | ||||
|
r33858 | |||
$ hg commit -m 'commit 1' | ||||
|
r33859 | nothing changed | ||
[1] | ||||
|
r33858 | |||
$ cd .. | ||||
An I/O error during pretxnclose is handled | ||||
$ hg init ioerror-pretxnclose | ||||
$ cd ioerror-pretxnclose | ||||
$ echo 0 > foo | ||||
$ hg -q commit -A -m initial | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ echo 1 > foo | ||||
$ hg --config ui.ioerrors=pretxnclose commit -m 'error during pretxnclose' | ||||
warn during pretxncommit | ||||
|
r33859 | warn during txnclose | ||
|
r33858 | |||
$ hg commit -m 'commit 1' | ||||
|
r33859 | nothing changed | ||
[1] | ||||
|
r33858 | |||
$ cd .. | ||||
An I/O error during txnclose is handled | ||||
$ hg init ioerror-txnclose | ||||
$ cd ioerror-txnclose | ||||
$ echo 0 > foo | ||||
$ hg -q commit -A -m initial | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ echo 1 > foo | ||||
$ hg --config ui.ioerrors=txnclose commit -m 'error during txnclose' | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
$ hg commit -m 'commit 1' | ||||
nothing changed | ||||
[1] | ||||
$ cd .. | ||||
An I/O error writing "transaction abort" is handled | ||||
$ hg init ioerror-msgabort | ||||
$ cd ioerror-msgabort | ||||
$ echo 0 > foo | ||||
$ hg -q commit -A -m initial | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ echo 1 > foo | ||||
$ hg --config ui.ioerrors=msgabort --config hooks.pretxncommit=false commit -m 'error during abort message' | ||||
|
r33859 | warn during abort | ||
rollback completed | ||||
abort: pretxncommit hook exited with status 1 | ||||
|
r33858 | [255] | ||
$ hg commit -m 'commit 1' | ||||
|
r33859 | warn during pretxncommit | ||
warn during pretxnclose | ||||
warn during txnclose | ||||
|
r33858 | |||
$ cd .. | ||||
An I/O error during txnabort should still result in rollback | ||||
$ hg init ioerror-txnabort | ||||
$ cd ioerror-txnabort | ||||
$ echo 0 > foo | ||||
$ hg -q commit -A -m initial | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ echo 1 > foo | ||||
$ hg --config ui.ioerrors=txnabort --config hooks.pretxncommit=false commit -m 'error during abort' | ||||
transaction abort! | ||||
rollback completed | ||||
abort: pretxncommit hook exited with status 1 | ||||
[255] | ||||
$ hg commit -m 'commit 1' | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ cd .. | ||||
An I/O error writing "rollback completed" is handled | ||||
$ hg init ioerror-msgrollback | ||||
$ cd ioerror-msgrollback | ||||
$ echo 0 > foo | ||||
$ hg -q commit -A -m initial | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ echo 1 > foo | ||||
$ hg --config ui.ioerrors=msgrollback --config hooks.pretxncommit=false commit -m 'error during rollback message' | ||||
transaction abort! | ||||
warn during abort | ||||
abort: pretxncommit hook exited with status 1 | ||||
[255] | ||||
$ hg verify | ||||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
|
r39525 | checked 1 changesets with 1 changes to 1 files | ||
|
r33858 | |||
$ cd .. | ||||
Multiple I/O errors after transaction open are handled. | ||||
This is effectively what happens if a peer disconnects in the middle | ||||
of a transaction. | ||||
$ hg init ioerror-multiple | ||||
$ cd ioerror-multiple | ||||
$ echo 0 > foo | ||||
$ hg -q commit -A -m initial | ||||
warn during pretxncommit | ||||
warn during pretxnclose | ||||
warn during txnclose | ||||
$ echo 1 > foo | ||||
$ hg --config ui.ioerrors=pretxncommit,pretxnclose,txnclose,txnabort,msgabort,msgrollback commit -m 'multiple errors' | ||||
$ hg verify | ||||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
|
r39525 | checked 2 changesets with 2 changes to 1 files | ||
|
r33858 | |||
$ cd .. | ||||