##// 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:

r6358:7cb9af02 default
r9115:b55d4471 default
Show More
test-remove
110 lines | 1.6 KiB | text/plain | TextLexer
mpm@selenic.com
Add a simple remove test
r936 #!/bin/sh
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346 remove() {
hg rm $@
hg st
Florent Guillaume
test-remove: make it pass on Mac OS X 10.5
r6356 # do not use ls -R, which recurses in .hg subdirs on Mac OS X 10.5
Florent Guillaume
test-remove: make tests really pass...
r6358 find . -name .hg -prune -o -type f -print | sort
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346 hg up -C
}
mpm@selenic.com
Add a simple remove test
r936 hg init a
cd a
echo a > foo
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346
echo % file not managed
remove foo
mpm@selenic.com
Add a simple remove test
r936 hg add foo
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346 hg commit -m1
# the table cases
echo % 00 state added, options none
echo b > bar
hg add bar
remove bar
echo % 01 state clean, options none
remove foo
echo % 02 state modified, options none
echo b >> foo
remove foo
echo % 03 state missing, options none
mpm@selenic.com
Add a simple remove test
r936 rm foo
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346 remove foo
echo % 10 state added, options -f
echo b > bar
hg add bar
remove -f bar
rm bar
echo % 11 state clean, options -f
remove -f foo
echo % 12 state modified, options -f
echo b >> foo
remove -f foo
echo % 13 state missing, options -f
Vadim Gelfer
make test-remove check some more cases.
r2180 rm foo
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346 remove -f foo
echo % 20 state added, options -A
echo b > bar
hg add bar
remove -A bar
mpm@selenic.com
Add a simple remove test
r936
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346 echo % 21 state clean, options -A
remove -A foo
echo % 22 state modified, options -A
echo b >> foo
remove -A foo
echo % 23 state missing, options -A
rm foo
remove -A foo
echo % 30 state added, options -Af
echo b > bar
hg add bar
remove -Af bar
rm bar
echo % 31 state clean, options -Af
remove -Af foo
echo % 32 state modified, options -Af
echo b >> foo
remove -Af foo
Vadim Gelfer
remove: rewrite to be ~400x faster, bit more friendly...
r2309
Dirkjan Ochtman
improved semantics for remove (issue438)...
r6346 echo % 33 state missing, options -Af
rm foo
remove -Af foo
# test some directory stuff
mkdir test
echo a > test/foo
echo b > test/bar
hg ci -Am2
echo % dir, options none
rm test/bar
remove test
echo % dir, options -f
rm test/bar
remove -f test
echo % dir, options -A
rm test/bar
remove -A test
echo % dir, options -Af
rm test/bar
remove -Af test