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

r7957:88a2687f default
r9115:b55d4471 default
Show More
test-convert-mtn-rename-directory.out
23 lines | 833 B | text/plain | TextLexer
/ tests / test-convert-mtn-rename-directory.out
% tedious monotone keys configuration
% create monotone repository
mtn: adding dir1 to workspace manifest
mtn: adding dir1/subdir1 to workspace manifest
mtn: adding dir1/subdir1/file1 to workspace manifest
mtn: beginning commit on branch 'com.selenic.test'
mtn: committed revision 5ed13ff5582d8d1e319f079b694a37d2b45edfc8
% rename directory
mtn: skipping dir1, already accounted for in workspace
mtn: renaming dir1/subdir1 to dir1/subdir2 in workspace manifest
mtn: beginning commit on branch 'com.selenic.test'
mtn: committed revision 985204142a822b22ee86b509d61f3c5ab6857d2b
% convert
assuming destination repo.mtn-hg
initializing destination repo.mtn-hg repository
scanning source...
sorting...
converting...
1 initialize
0 rename
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% manifest
dir1/subdir2/file1