mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 17:27:53 +03:00
be1b3a5e03
Once the transaction is closed, we now write transaction related data for possible future undo. For now, we only do it for full file "backup" because their were not handle at all in that case. In the future, we could move all the current logic to set undo up (that currently exists in localrepository) inside transaction itself, but it is not strictly requires to solve the current situation.
288 lines
8.4 KiB
Perl
288 lines
8.4 KiB
Perl
Init repo1:
|
|
|
|
$ hg init repo1
|
|
$ cd repo1
|
|
$ echo "some text" > a
|
|
$ hg add
|
|
adding a
|
|
$ hg ci -m first
|
|
$ cat .hg/store/fncache | sort
|
|
data/a.i
|
|
|
|
Testing a.i/b:
|
|
|
|
$ mkdir a.i
|
|
$ echo "some other text" > a.i/b
|
|
$ hg add
|
|
adding a.i/b (glob)
|
|
$ hg ci -m second
|
|
$ cat .hg/store/fncache | sort
|
|
data/a.i
|
|
data/a.i.hg/b.i
|
|
|
|
Testing a.i.hg/c:
|
|
|
|
$ mkdir a.i.hg
|
|
$ echo "yet another text" > a.i.hg/c
|
|
$ hg add
|
|
adding a.i.hg/c (glob)
|
|
$ hg ci -m third
|
|
$ cat .hg/store/fncache | sort
|
|
data/a.i
|
|
data/a.i.hg.hg/c.i
|
|
data/a.i.hg/b.i
|
|
|
|
Testing verify:
|
|
|
|
$ hg verify
|
|
checking changesets
|
|
checking manifests
|
|
crosschecking files in changesets and manifests
|
|
checking files
|
|
3 files, 3 changesets, 3 total revisions
|
|
|
|
$ rm .hg/store/fncache
|
|
|
|
$ hg verify
|
|
checking changesets
|
|
checking manifests
|
|
crosschecking files in changesets and manifests
|
|
checking files
|
|
data/a.i@0: missing revlog!
|
|
data/a.i.hg/c.i@2: missing revlog!
|
|
data/a.i/b.i@1: missing revlog!
|
|
3 files, 3 changesets, 3 total revisions
|
|
3 integrity errors encountered!
|
|
(first damaged changeset appears to be 0)
|
|
[1]
|
|
$ cd ..
|
|
|
|
Non store repo:
|
|
|
|
$ hg --config format.usestore=False init foo
|
|
$ cd foo
|
|
$ mkdir tst.d
|
|
$ echo foo > tst.d/foo
|
|
$ hg ci -Amfoo
|
|
adding tst.d/foo
|
|
$ find .hg | sort
|
|
.hg
|
|
.hg/00changelog.i
|
|
.hg/00manifest.i
|
|
.hg/cache
|
|
.hg/cache/branch2-served
|
|
.hg/cache/rbc-names-v1
|
|
.hg/cache/rbc-revs-v1
|
|
.hg/data
|
|
.hg/data/tst.d.hg
|
|
.hg/data/tst.d.hg/foo.i
|
|
.hg/dirstate
|
|
.hg/last-message.txt
|
|
.hg/phaseroots
|
|
.hg/requires
|
|
.hg/undo
|
|
.hg/undo.backupfiles
|
|
.hg/undo.bookmarks
|
|
.hg/undo.branch
|
|
.hg/undo.desc
|
|
.hg/undo.dirstate
|
|
.hg/undo.phaseroots
|
|
$ cd ..
|
|
|
|
Non fncache repo:
|
|
|
|
$ hg --config format.usefncache=False init bar
|
|
$ cd bar
|
|
$ mkdir tst.d
|
|
$ echo foo > tst.d/Foo
|
|
$ hg ci -Amfoo
|
|
adding tst.d/Foo
|
|
$ find .hg | sort
|
|
.hg
|
|
.hg/00changelog.i
|
|
.hg/cache
|
|
.hg/cache/branch2-served
|
|
.hg/cache/rbc-names-v1
|
|
.hg/cache/rbc-revs-v1
|
|
.hg/dirstate
|
|
.hg/last-message.txt
|
|
.hg/requires
|
|
.hg/store
|
|
.hg/store/00changelog.i
|
|
.hg/store/00manifest.i
|
|
.hg/store/data
|
|
.hg/store/data/tst.d.hg
|
|
.hg/store/data/tst.d.hg/_foo.i
|
|
.hg/store/phaseroots
|
|
.hg/store/undo
|
|
.hg/store/undo.backupfiles
|
|
.hg/store/undo.phaseroots
|
|
.hg/undo.bookmarks
|
|
.hg/undo.branch
|
|
.hg/undo.desc
|
|
.hg/undo.dirstate
|
|
$ cd ..
|
|
|
|
Encoding of reserved / long paths in the store
|
|
|
|
$ hg init r2
|
|
$ cd r2
|
|
$ cat <<EOF > .hg/hgrc
|
|
> [ui]
|
|
> portablefilenames = ignore
|
|
> EOF
|
|
|
|
$ hg import -q --bypass - <<EOF
|
|
> # HG changeset patch
|
|
> # User test
|
|
> # Date 0 0
|
|
> # Node ID 1c7a2f7cb77be1a0def34e4c7cabc562ad98fbd7
|
|
> # Parent 0000000000000000000000000000000000000000
|
|
> 1
|
|
>
|
|
> diff --git a/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-abcdefghjiklmnopqrstuvwxyz b/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-abcdefghjiklmnopqrstuvwxyz
|
|
> new file mode 100644
|
|
> --- /dev/null
|
|
> +++ b/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-abcdefghjiklmnopqrstuvwxyz
|
|
> @@ -0,0 +1,1 @@
|
|
> +foo
|
|
> diff --git a/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/TENTH/ELEVENTH/LOREMIPSUM.TXT b/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/TENTH/ELEVENTH/LOREMIPSUM.TXT
|
|
> new file mode 100644
|
|
> --- /dev/null
|
|
> +++ b/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/TENTH/ELEVENTH/LOREMIPSUM.TXT
|
|
> @@ -0,0 +1,1 @@
|
|
> +foo
|
|
> diff --git a/Project Planning/Resources/AnotherLongDirectoryName/Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt b/Project Planning/Resources/AnotherLongDirectoryName/Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt
|
|
> new file mode 100644
|
|
> --- /dev/null
|
|
> +++ b/Project Planning/Resources/AnotherLongDirectoryName/Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt
|
|
> @@ -0,0 +1,1 @@
|
|
> +foo
|
|
> diff --git a/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c b/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c
|
|
> new file mode 100644
|
|
> --- /dev/null
|
|
> +++ b/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c
|
|
> @@ -0,0 +1,1 @@
|
|
> +foo
|
|
> diff --git a/enterprise/openesbaddons/contrib-imola/corba-bc/netbeansplugin/wsdlExtension/src/main/java/META-INF/services/org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider b/enterprise/openesbaddons/contrib-imola/corba-bc/netbeansplugin/wsdlExtension/src/main/java/META-INF/services/org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider
|
|
> new file mode 100644
|
|
> --- /dev/null
|
|
> +++ b/enterprise/openesbaddons/contrib-imola/corba-bc/netbeansplugin/wsdlExtension/src/main/java/META-INF/services/org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider
|
|
> @@ -0,0 +1,1 @@
|
|
> +foo
|
|
> EOF
|
|
|
|
$ find .hg/store -name *.i | sort
|
|
.hg/store/00changelog.i
|
|
.hg/store/00manifest.i
|
|
.hg/store/data/bla.aux/pr~6e/_p_r_n/lpt/co~6d3/nu~6c/coma/foo._n_u_l/normal.c.i
|
|
.hg/store/dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxx168e07b38e65eff86ab579afaaa8e30bfbe0f35f.i
|
|
.hg/store/dh/au~78/second/x.prn/fourth/fi~3afth/sixth/seventh/eighth/nineth/tenth/loremia20419e358ddff1bf8751e38288aff1d7c32ec05.i
|
|
.hg/store/dh/enterpri/openesba/contrib-/corba-bc/netbeans/wsdlexte/src/main/java/org.net7018f27961fdf338a598a40c4683429e7ffb9743.i
|
|
.hg/store/dh/project_/resource/anotherl/followed/andanoth/andthenanextremelylongfilename0d8e1f4187c650e2f1fdca9fd90f786bc0976b6b.i
|
|
|
|
$ cd ..
|
|
|
|
Aborting lock does not prevent fncache writes
|
|
|
|
$ cat > exceptionext.py <<EOF
|
|
> import os
|
|
> from mercurial import commands, util
|
|
> from mercurial.extensions import wrapfunction
|
|
>
|
|
> def lockexception(orig, vfs, lockname, wait, releasefn, acquirefn, desc):
|
|
> def releasewrap():
|
|
> raise util.Abort("forced lock failure")
|
|
> return orig(vfs, lockname, wait, releasewrap, acquirefn, desc)
|
|
>
|
|
> def reposetup(ui, repo):
|
|
> wrapfunction(repo, '_lock', lockexception)
|
|
>
|
|
> cmdtable = {}
|
|
>
|
|
> EOF
|
|
$ extpath=`pwd`/exceptionext.py
|
|
$ hg init fncachetxn
|
|
$ cd fncachetxn
|
|
$ printf "[extensions]\nexceptionext=$extpath\n" >> .hg/hgrc
|
|
$ touch y
|
|
$ hg ci -qAm y
|
|
abort: forced lock failure
|
|
[255]
|
|
$ cat .hg/store/fncache
|
|
data/y.i
|
|
|
|
Aborting transaction prevents fncache change
|
|
|
|
$ cat > ../exceptionext.py <<EOF
|
|
> import os
|
|
> from mercurial import commands, util, localrepo
|
|
> from mercurial.extensions import wrapfunction
|
|
>
|
|
> def wrapper(orig, self, *args, **kwargs):
|
|
> tr = orig(self, *args, **kwargs)
|
|
> def fail(tr):
|
|
> raise util.Abort("forced transaction failure")
|
|
> # zzz prefix to ensure it sorted after store.write
|
|
> tr.addfinalize('zzz-forcefails', fail)
|
|
> return tr
|
|
>
|
|
> def uisetup(ui):
|
|
> wrapfunction(localrepo.localrepository, 'transaction', wrapper)
|
|
>
|
|
> cmdtable = {}
|
|
>
|
|
> EOF
|
|
$ rm -f "${extpath}c"
|
|
$ touch z
|
|
$ hg ci -qAm z
|
|
transaction abort!
|
|
rollback completed
|
|
abort: forced transaction failure
|
|
[255]
|
|
$ cat .hg/store/fncache
|
|
data/y.i
|
|
|
|
Aborted transactions can be recovered later
|
|
|
|
$ cat > ../exceptionext.py <<EOF
|
|
> import os
|
|
> from mercurial import commands, util, transaction, localrepo
|
|
> from mercurial.extensions import wrapfunction
|
|
>
|
|
> def trwrapper(orig, self, *args, **kwargs):
|
|
> tr = orig(self, *args, **kwargs)
|
|
> def fail(tr):
|
|
> raise util.Abort("forced transaction failure")
|
|
> # zzz prefix to ensure it sorted after store.write
|
|
> tr.addfinalize('zzz-forcefails', fail)
|
|
> return tr
|
|
>
|
|
> def abortwrapper(orig, self, *args, **kwargs):
|
|
> raise util.Abort("forced transaction failure")
|
|
>
|
|
> def uisetup(ui):
|
|
> wrapfunction(localrepo.localrepository, 'transaction', trwrapper)
|
|
> wrapfunction(transaction.transaction, '_abort', abortwrapper)
|
|
>
|
|
> cmdtable = {}
|
|
>
|
|
> EOF
|
|
$ rm -f "${extpath}c"
|
|
$ hg up -q 1
|
|
$ touch z
|
|
$ hg ci -qAm z 2>/dev/null
|
|
[255]
|
|
$ cat .hg/store/fncache | sort
|
|
data/y.i
|
|
data/z.i
|
|
$ hg recover
|
|
rolling back interrupted transaction
|
|
checking changesets
|
|
checking manifests
|
|
crosschecking files in changesets and manifests
|
|
checking files
|
|
1 files, 1 changesets, 1 total revisions
|
|
$ cat .hg/store/fncache
|
|
data/y.i
|