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

r8397:613ac285 default
r9115:b55d4471 default
Show More
test-glog
174 lines | 3.9 KiB | text/plain | TextLexer
#!/bin/sh
# @ (34) head
# |
# | o (33) head
# | |
# o | (32) expand
# |\ \
# | o \ (31) expand
# | |\ \
# | | o \ (30) expand
# | | |\ \
# | | | o | (29) regular commit
# | | | | |
# | | o | | (28) merge zero known
# | | |\ \ \
# o | | | | | (27) collapse
# |/ / / / /
# | | o---+ (26) merge one known; far right
# | | | | |
# +---o | | (25) merge one known; far left
# | | | | |
# | | o | | (24) merge one known; immediate right
# | | |\| |
# | | o | | (23) merge one known; immediate left
# | |/| | |
# +---o---+ (22) merge two known; one far left, one far right
# | | / /
# o | | | (21) expand
# |\ \ \ \
# | o---+-+ (20) merge two known; two far right
# | / / /
# o | | | (19) expand
# |\ \ \ \
# +---+---o (18) merge two known; two far left
# | | | |
# | o | | (17) expand
# | |\ \ \
# | | o---+ (16) merge two known; one immediate right, one near right
# | | |/ /
# o | | | (15) expand
# |\ \ \ \
# | o-----+ (14) merge two known; one immediate right, one far right
# | |/ / /
# o | | | (13) expand
# |\ \ \ \
# +---o | | (12) merge two known; one immediate right, one far left
# | | |/ /
# | o | | (11) expand
# | |\ \ \
# | | o---+ (10) merge two known; one immediate left, one near right
# | |/ / /
# o | | | (9) expand
# |\ \ \ \
# | o-----+ (8) merge two known; one immediate left, one far right
# |/ / / /
# o | | | (7) expand
# |\ \ \ \
# +---o | | (6) merge two known; one immediate left, one far left
# | |/ / /
# | o | | (5) expand
# | |\ \ \
# | | o | | (4) merge two known; one immediate left, one immediate right
# | |/|/ /
# | o / / (3) collapse
# |/ / /
# o / / (2) collapse
# |/ /
# o / (1) collapse
# |/
# o (0) root
"$TESTDIR/hghave" no-outer-repo || exit 80
set -e
commit()
{
rev=$1
msg=$2
shift 2
if [ "$#" -gt 0 ]; then
hg debugsetparents "$@"
fi
echo $rev > a
hg commit -Aqd "$rev 0" -m "($rev) $msg"
}
echo "[extensions]" >> $HGRCPATH
echo "graphlog=" >> $HGRCPATH
echo % init
hg init repo
cd repo
echo % empty repo
hg glog
echo % building tree
commit 0 "root"
commit 1 "collapse" 0
commit 2 "collapse" 1
commit 3 "collapse" 2
commit 4 "merge two known; one immediate left, one immediate right" 1 3
commit 5 "expand" 3 4
commit 6 "merge two known; one immediate left, one far left" 2 5
commit 7 "expand" 2 5
commit 8 "merge two known; one immediate left, one far right" 0 7
commit 9 "expand" 7 8
commit 10 "merge two known; one immediate left, one near right" 0 6
commit 11 "expand" 6 10
commit 12 "merge two known; one immediate right, one far left" 1 9
commit 13 "expand" 9 11
commit 14 "merge two known; one immediate right, one far right" 0 12
commit 15 "expand" 13 14
commit 16 "merge two known; one immediate right, one near right" 0 1
commit 17 "expand" 12 16
commit 18 "merge two known; two far left" 1 15
commit 19 "expand" 15 17
commit 20 "merge two known; two far right" 0 18
commit 21 "expand" 19 20
commit 22 "merge two known; one far left, one far right" 18 21
commit 23 "merge one known; immediate left" 1 22
commit 24 "merge one known; immediate right" 0 23
commit 25 "merge one known; far left" 21 24
commit 26 "merge one known; far right" 18 25
commit 27 "collapse" 21
commit 28 "merge zero known" 1 26
commit 29 "regular commit" 0
commit 30 "expand" 28 29
commit 31 "expand" 21 30
commit 32 "expand" 27 31
commit 33 "head" 18
commit 34 "head" 32
echo % glog -q
hg glog -q
echo % glog
hg glog
echo % file glog
hg glog a
echo % unused arguments
hg glog -q foo bar || echo failed
echo % from outer space
cd ..
hg glog -l1 repo
hg glog -l1 repo/a
hg glog -l1 repo/missing
echo % file log with revs != cset revs
hg init flog
cd flog
echo one >one
hg add one
hg commit -mone
echo two >two
hg add two
hg commit -mtwo
echo more >two
hg commit -mmore
hg glog two
echo % incoming and outgoing
cd ..
hg clone -U -r31 repo repo2
cd repo2
hg incoming -q --graph
cd ..
hg -R repo outgoing --graph repo2