##// END OF EJS Templates
inotify: server: new data structure to keep track of changes....
inotify: server: new data structure to keep track of changes. == Rationale for the new structure == Current structure was a dictionary tree. One directory was tracked as a dictionary: - keys: file/subdir name - values: - for a file, the status (a/r/m/...) - for a subdir, the directory representing the subdir It allowed efficient lookups, no matter of the type of the terminal leaf: for part in path.split('/'): tree = tree[part] However, there is no way to represent a directory and a file with the same name because keys are conflicting in the dictionary. Concrete example: Initial state: root dir |- foo (file) |- bar (file) # data state is: {'foo': 'n', 'bar': 'n'} Remove foo: root dir |- bar (file) # Data becomes {'foo': 'r'} until next commit. Add foo, as a directory, and foo/barbar file: root dir |- bar (file) |-> foo (dir) |- barbar (file) # New state should be represented as: {'foo': {'barbar': 'a'}, 'bar': 'n'} however, the key "foo" is already used and represents the old file. The dirstate: D foo A foo/barbar cannot be represented, hence the need for a new structure. == The new structure == 'directory' class. Represents one directory level. * Notable attributes: Two dictionaries: - 'files' Maps filename -> status for the current dir. - 'dirs' Maps subdir's name -> directory object representing the subdir * methods - walk(), formerly server.walk - lookup(), old server.lookup - dir(), old server.dir This new class allows embedding all the tree walks/lookups in its own class, instead of having everything mixed together in server. Incidently, since files and directories are not stored in the same dictionaries, we are solving the previous key conflict problem. The small drawback is that lookup operation is a bit more complex: for a path a/b/c/d/e we have to check twice the leaf, if e is a directory or a file.

File last commit:

r3862:46abbed0 default
r9115:b55d4471 default
Show More
test-encoding
61 lines | 1.4 KiB | text/plain | TextLexer
Matt Mackall
Add a charset encoding test case
r3777 #!/bin/sh
hg init t
cd t
# we need a repo with some legacy latin-1 changesets
Matt Mackall
test-encoding: copy a bundle from TESTDIR rather than constructing one
r3780 hg unbundle $TESTDIR/legacy-encoding.hg
Matt Mackall
Add a charset encoding test case
r3777 hg co
Thomas Arendsen Hein
Use python instead of shell printf with \x sequences for test-encoding....
r3789 python << EOF
f = file('latin-1', 'w'); f.write("latin-1 e' encoded: \xe9"); f.close()
f = file('utf-8', 'w'); f.write("utf-8 e' encoded: \xc3\xa9"); f.close()
f = file('latin-1-tag', 'w'); f.write("\xe9"); f.close()
EOF
Matt Mackall
Make quoting in test-encoding simpler
r3783
Matt Mackall
Add a charset encoding test case
r3777 echo % should fail with encoding error
echo "plain old ascii" > a
hg st
Thomas Arendsen Hein
Fixes test-encoding for python2.3 and minor cleanups:...
r3839 HGENCODING=ascii hg ci -l latin-1 -d "1000000 0"
Matt Mackall
Add a charset encoding test case
r3777
echo % these should work
echo "latin-1" > a
Thomas Arendsen Hein
Fixes test-encoding for python2.3 and minor cleanups:...
r3839 HGENCODING=latin-1 hg ci -l latin-1 -d "1000000 0"
Matt Mackall
Add a charset encoding test case
r3777 echo "utf-8" > a
Thomas Arendsen Hein
Fixes test-encoding for python2.3 and minor cleanups:...
r3839 HGENCODING=utf-8 hg ci -l utf-8 -d "1000000 0"
Matt Mackall
Add a charset encoding test case
r3777
Thomas Arendsen Hein
Fixes test-encoding for python2.3 and minor cleanups:...
r3839 HGENCODING=latin-1 hg tag -d "1000000 0" `cat latin-1-tag`
Alexis S. L. Carvalho
Use UTF-8 in .hg/branch
r3862 HGENCODING=latin-1 hg branch `cat latin-1-tag`
Thomas Arendsen Hein
Fixes test-encoding for python2.3 and minor cleanups:...
r3839 HGENCODING=latin-1 hg ci -d "1000000 0" -m 'latin1 branch'
Alexis S. L. Carvalho
log: convert branch names to the local encoding
r3827 rm .hg/branch
Matt Mackall
Add a charset encoding test case
r3777
Matt Mackall
Make quoting in test-encoding simpler
r3783 echo % ascii
Matt Mackall
Add a charset encoding test case
r3777 hg --encoding ascii log
Matt Mackall
Make quoting in test-encoding simpler
r3783 echo % latin-1
Matt Mackall
Add a charset encoding test case
r3777 hg --encoding latin-1 log
Matt Mackall
Make quoting in test-encoding simpler
r3783 echo % utf-8
Matt Mackall
Add a charset encoding test case
r3777 hg --encoding utf-8 log
Matt Mackall
Make quoting in test-encoding simpler
r3783 echo % ascii
Matt Mackall
Add a charset encoding test case
r3777 HGENCODING=ascii hg tags
Matt Mackall
Make quoting in test-encoding simpler
r3783 echo % latin-1
Matt Mackall
Add a charset encoding test case
r3777 HGENCODING=latin-1 hg tags
Matt Mackall
Make quoting in test-encoding simpler
r3783 echo % utf-8
Matt Mackall
Add a charset encoding test case
r3777 HGENCODING=utf-8 hg tags
Alexis S. L. Carvalho
log: convert branch names to the local encoding
r3827 echo % ascii
HGENCODING=ascii hg branches
echo % latin-1
HGENCODING=latin-1 hg branches
echo % utf-8
HGENCODING=utf-8 hg branches
Alexis S. L. Carvalho
Allow the user to specify the fallback encoding for the changelog...
r3835
echo '[ui]' >> .hg/hgrc
Thomas Arendsen Hein
Fixes test-encoding for python2.3 and minor cleanups:...
r3839 echo 'fallbackencoding = koi8-r' >> .hg/hgrc
Alexis S. L. Carvalho
Allow the user to specify the fallback encoding for the changelog...
r3835 echo % utf-8
HGENCODING=utf-8 hg log
Matt Mackall
make transcoding more robust...
r3843
Matt Mackall
Make test-encoding return 0
r3845 HGENCODING=dolphin hg log
Alexis S. L. Carvalho
Use UTF-8 in .hg/branch
r3862 HGENCODING=ascii hg branch `cat latin-1-tag`
cp latin-1-tag .hg/branch
HGENCODING=latin-1 hg ci -d "1000000 0" -m 'should fail'
Matt Mackall
Make test-encoding return 0
r3845 exit 0