##// END OF EJS Templates
posix: always seek to EOF when opening a file in append mode...
posix: always seek to EOF when opening a file in append mode Python 3 already does this, so skip it there. Consider the program: #include <stdio.h> int main() { FILE *f = fopen("narf", "w"); fprintf(f, "narf\n"); fclose(f); f = fopen("narf", "a"); printf("%ld\n", ftell(f)); fprintf(f, "troz\n"); printf("%ld\n", ftell(f)); return 0; } on macOS, FreeBSD, and Linux with glibc, this program prints 5 10 but on musl libc (Alpine Linux and probably others) this prints 0 10 By my reading of https://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html this is technically correct, specifically: > Opening a file with append mode (a as the first character in the > mode argument) shall cause all subsequent writes to the file to be > forced to the then current end-of-file, regardless of intervening > calls to fseek(). in other words, the file position doesn't really matter in append-mode files, and we can't depend on it being at all meaningful unless we perform a seek() before tell() after open(..., 'a'). Experimentally after a .write() we can do a .tell() and it'll always be reasonable, but I'm unclear from reading the specification if that's a smart thing to rely on. This matches what we do on Windows and what Python 3 does for free, so let's just be consistent. Thanks to Yuya for the idea.

File last commit:

r42569:0546ead3 stable
r43163:97ada9b8 5.0.2 stable
Show More
test-manifest.t
278 lines | 7.7 KiB | text/troff | Tads3Lexer
Source bundle was generated with the following script:
# hg init
# echo a > a
# ln -s a l
# hg ci -Ama -d'0 0'
# mkdir b
# echo a > b/a
# chmod +x b/a
# hg ci -Amb -d'1 0'
$ hg init
$ hg unbundle "$TESTDIR/bundles/test-manifest.hg"
adding changesets
adding manifests
adding file changes
added 2 changesets with 3 changes to 3 files
new changesets b73562a03cfe:5bdc995175ba (2 drafts)
(run 'hg update' to get a working copy)
The next call is expected to return nothing:
$ hg manifest
$ hg co
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg manifest
a
b/a
l
$ hg files -vr .
2 a
2 x b/a
1 l l
$ hg files -r . -X b
a
l
$ hg files -T '{path} {size} {flags}\n'
a 2
b/a 2 x
l 1 l
$ hg files -T '{path} {node|shortest}\n' -r.
a 5bdc
b/a 5bdc
l 5bdc
$ hg manifest -v
644 a
755 * b/a
644 @ l
$ hg manifest -T '{path} {rev}\n'
a 1
b/a 1
l 1
$ hg manifest --debug
b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 644 a
b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 755 * b/a
047b75c6d7a3ef6a2243bd0e99f94f6ea6683597 644 @ l
$ hg manifest -r 0
a
l
$ hg manifest -r 1
a
b/a
l
$ hg manifest -r tip
a
b/a
l
$ hg manifest tip
a
b/a
l
$ hg manifest --all
a
b/a
l
The next two calls are expected to abort:
$ hg manifest -r 2
abort: unknown revision '2'!
[255]
$ hg manifest -r tip tip
abort: please specify just one revision
[255]
Testing the manifest full text cache utility
--------------------------------------------
Reminder of the manifest log content
$ hg log --debug | grep 'manifest:'
manifest: 1:1e01206b1d2f72bd55f2a33fa8ccad74144825b7
manifest: 0:fce2a30dedad1eef4da95ca1dc0004157aa527cf
Showing the content of the caches after the above operations
$ hg debugmanifestfulltextcache
cache contains 1 manifest entries, in order of most to least recent:
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
total cache data size 157 bytes, on-disk 157 bytes
(Clearing the cache in case of any content)
$ hg debugmanifestfulltextcache --clear
Adding a new persistent entry in the cache
$ hg debugmanifestfulltextcache --add 1e01206b1d2f72bd55f2a33fa8ccad74144825b7
$ hg debugmanifestfulltextcache
cache contains 1 manifest entries, in order of most to least recent:
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
total cache data size 157 bytes, on-disk 157 bytes
Check we don't duplicated entry (added from the debug command)
$ hg debugmanifestfulltextcache --add 1e01206b1d2f72bd55f2a33fa8ccad74144825b7
$ hg debugmanifestfulltextcache
cache contains 1 manifest entries, in order of most to least recent:
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
total cache data size 157 bytes, on-disk 157 bytes
Adding a second entry
$ hg debugmanifestfulltextcache --add fce2a30dedad1eef4da95ca1dc0004157aa527cf
$ hg debugmanifestfulltextcache
cache contains 2 manifest entries, in order of most to least recent:
id: fce2a30dedad1eef4da95ca1dc0004157aa527cf, size 87 bytes
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
total cache data size 268 bytes, on-disk 268 bytes
Accessing the initial entry again, refresh their order
$ hg debugmanifestfulltextcache --add 1e01206b1d2f72bd55f2a33fa8ccad74144825b7
$ hg debugmanifestfulltextcache
cache contains 2 manifest entries, in order of most to least recent:
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
id: fce2a30dedad1eef4da95ca1dc0004157aa527cf, size 87 bytes
total cache data size 268 bytes, on-disk 268 bytes
Check cache clearing
$ hg debugmanifestfulltextcache --clear
$ hg debugmanifestfulltextcache
cache empty
Check adding multiple entry in one go:
$ hg debugmanifestfulltextcache --add fce2a30dedad1eef4da95ca1dc0004157aa527cf --add 1e01206b1d2f72bd55f2a33fa8ccad74144825b7
$ hg debugmanifestfulltextcache
cache contains 2 manifest entries, in order of most to least recent:
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
id: fce2a30dedad1eef4da95ca1dc0004157aa527cf, size 87 bytes
total cache data size 268 bytes, on-disk 268 bytes
$ hg debugmanifestfulltextcache --clear
Test caching behavior on actual operation
-----------------------------------------
Make sure we start empty
$ hg debugmanifestfulltextcache
cache empty
Commit should have the new node cached:
$ echo a >> b/a
$ hg commit -m 'foo'
$ hg debugmanifestfulltextcache
cache contains 2 manifest entries, in order of most to least recent:
id: 26b8653b67af8c1a0a0317c4ee8dac50a41fdb65, size 133 bytes
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
total cache data size 314 bytes, on-disk 314 bytes
$ hg log -r 'ancestors(., 1)' --debug | grep 'manifest:'
manifest: 1:1e01206b1d2f72bd55f2a33fa8ccad74144825b7
manifest: 2:26b8653b67af8c1a0a0317c4ee8dac50a41fdb65
hg update should warm the cache too
(force dirstate check to avoid flackiness in manifest order)
$ hg debugrebuilddirstate
$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg debugmanifestfulltextcache
cache contains 3 manifest entries, in order of most to least recent:
id: fce2a30dedad1eef4da95ca1dc0004157aa527cf, size 87 bytes
id: 26b8653b67af8c1a0a0317c4ee8dac50a41fdb65, size 133 bytes
id: 1e01206b1d2f72bd55f2a33fa8ccad74144825b7, size 133 bytes
total cache data size 425 bytes, on-disk 425 bytes
$ hg log -r '0' --debug | grep 'manifest:'
manifest: 0:fce2a30dedad1eef4da95ca1dc0004157aa527cf
Test file removal (especially with pure). The tests are crafted such that there
will be contiguous spans of existing entries to ensure that is handled properly.
(In this case, a.txt, aa.txt and c.txt, cc.txt, and ccc.txt)
$ cat > $TESTTMP/manifest.py <<EOF
> from mercurial import (
> extensions,
> manifest,
> )
> def extsetup(ui):
> manifest.FASTDELTA_TEXTDIFF_THRESHOLD = 0
> EOF
$ cat >> $HGRCPATH <<EOF
> [extensions]
> manifest = $TESTTMP/manifest.py
> EOF
Pure removes should actually remove all dropped entries
$ hg init repo
$ cd repo
$ echo a > a.txt
$ echo aa > aa.txt
$ echo b > b.txt
$ echo c > c.txt
$ echo c > cc.txt
$ echo c > ccc.txt
$ echo b > d.txt
$ echo c > e.txt
$ hg ci -Aqm 'a-e'
$ hg rm b.txt d.txt
$ hg ci -m 'remove b and d'
$ hg debugdata -m 1
a.txt\x00b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 (esc)
aa.txt\x00a4bdc161c8fbb523c9a60409603f8710ff49a571 (esc)
c.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
cc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
ccc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
e.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
$ hg up -qC .
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
checked 2 changesets with 8 changes to 8 files
$ hg rollback -q --config ui.rollback=True
$ hg rm b.txt d.txt
$ echo bb > bb.txt
A mix of adds and removes should remove all dropped entries.
$ hg ci -Aqm 'remove b and d; add bb'
$ hg debugdata -m 1
a.txt\x00b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 (esc)
aa.txt\x00a4bdc161c8fbb523c9a60409603f8710ff49a571 (esc)
bb.txt\x0004c6faf8a9fdd848a5304dfc1704749a374dff44 (esc)
c.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
cc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
ccc.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
e.txt\x00149da44f2a4e14f488b7bd4157945a9837408c00 (esc)
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
checked 2 changesets with 9 changes to 9 files