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

r7058:9e6d6568 default
r9115:b55d4471 default
Show More
test-convert-bzr-directories
93 lines | 2.0 KiB | text/plain | TextLexer
/ tests / test-convert-bzr-directories
#!/bin/sh
. "$TESTDIR/bzr-definitions"
echo % empty directory
mkdir test-empty
cd test-empty
bzr init -q source
cd source
echo content > a
bzr add -q a
bzr commit -q -m 'Initial add'
mkdir empty
bzr add -q empty
bzr commit -q -m 'Empty directory added'
echo content > empty/something
bzr add -q empty/something
bzr commit -q -m 'Added file into directory'
cd ..
hg convert source source-hg
manifest source-hg 1
manifest source-hg tip
cd ..
echo % directory renames
mkdir test-dir-rename
cd test-dir-rename
bzr init -q source
cd source
mkdir tpyo
echo content > tpyo/something
bzr add -q tpyo
bzr commit -q -m 'Added directory'
bzr mv tpyo typo
bzr commit -q -m 'Oops, typo'
cd ..
hg convert source source-hg
manifest source-hg 0
manifest source-hg tip
cd ..
echo % nested directory renames
mkdir test-nested-dir-rename
cd test-nested-dir-rename
bzr init -q source
cd source
mkdir -p firstlevel/secondlevel/thirdlevel
echo content > firstlevel/secondlevel/file
echo this_needs_to_be_there_too > firstlevel/secondlevel/thirdlevel/stuff
bzr add -q firstlevel
bzr commit -q -m 'Added nested directories'
bzr mv firstlevel/secondlevel secondlevel
bzr commit -q -m 'Moved secondlevel one level up'
cd ..
hg convert source source-hg
manifest source-hg tip
cd ..
echo % directory remove
mkdir test-dir-remove
cd test-dir-remove
bzr init -q source
cd source
mkdir src
echo content > src/sourcecode
bzr add -q src
bzr commit -q -m 'Added directory'
bzr rm -q src
bzr commit -q -m 'Removed directory'
cd ..
hg convert source source-hg
manifest source-hg 0
manifest source-hg tip
cd ..
echo % directory replace
mkdir test-dir-replace
cd test-dir-replace
bzr init -q source
cd source
mkdir first second
echo content > first/file
echo morecontent > first/dummy
echo othercontent > second/something
bzr add -q first second
bzr commit -q -m 'Initial layout'
bzr mv first/file second/file
bzr mv first third
bzr commit -q -m 'Some conflicting moves'
cd ..
hg convert source source-hg
manifest source-hg tip
cd ..