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

r8945:7b3d837c default
r9115:b55d4471 default
Show More
test-status-color
100 lines | 2.5 KiB | text/plain | TextLexer
#!/bin/sh
echo "[extensions]" >> $HGRCPATH
echo "color=" >> $HGRCPATH
hg init repo1
cd repo1
mkdir a b a/1 b/1 b/2
touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2
echo "hg status in repo root:"
hg status --color=always
echo "hg status . in repo root:"
hg status --color=always .
for dir in a b a/1 b/1 b/2; do
echo "hg status in $dir:"
hg status --color=always --cwd "$dir"
echo "hg status . in $dir:"
hg status --color=always --cwd "$dir" .
echo "hg status .. in $dir:"
hg status --color=always --cwd "$dir" ..
done
cd ..
hg init repo2
cd repo2
touch modified removed deleted ignored
echo "^ignored$" > .hgignore
hg ci -A -m 'initial checkin' -d "1000000 0"
touch modified added unknown ignored
hg add added
hg remove removed
rm deleted
echo "hg status:"
hg status --color=always
echo "hg status modified added removed deleted unknown never-existed ignored:"
hg status --color=always modified added removed deleted unknown never-existed ignored
hg copy modified copied
echo "hg status -C:"
hg status --color=always -C
echo "hg status -A:"
hg status --color=always -A
echo "^ignoreddir$" > .hgignore
mkdir ignoreddir
touch ignoreddir/file
echo "hg status ignoreddir/file:"
hg status --color=always ignoreddir/file
echo "hg status -i ignoreddir/file:"
hg status --color=always -i ignoreddir/file
cd ..
# check 'status -q' and some combinations
hg init repo3
cd repo3
touch modified removed deleted ignored
echo "^ignored$" > .hgignore
hg commit -A -m 'initial checkin'
touch added unknown ignored
hg add added
echo "test" >> modified
hg remove removed
rm deleted
hg copy modified copied
echo "% test unknown color"
hg --config color.status.modified=periwinkle status --color=always
# Run status with 2 different flags.
# Check if result is the same or different.
# If result is not as expected, raise error
assert() {
hg status --color=always $1 > ../a
hg status --color=always $2 > ../b
out=`diff ../a ../b`
if [ $? -ne 0 ]; then
out=1
else
out=0
fi
if [ $3 -eq 0 ]; then
df="same"
else
df="different"
fi
if [ $out -ne $3 ]; then
echo "Error on $1 and $2, should be $df."
fi
}
# assert flag1 flag2 [0-same | 1-different]
assert "-q" "-mard" 0
assert "-A" "-marduicC" 0
assert "-qA" "-mardcC" 0
assert "-qAui" "-A" 0
assert "-qAu" "-marducC" 0
assert "-qAi" "-mardicC" 0
assert "-qu" "-u" 0
assert "-q" "-u" 1
assert "-m" "-a" 1
assert "-r" "-d" 1