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

r8043:b777dd8f default
r9115:b55d4471 default
Show More
test-purge.out
78 lines | 1.6 KiB | text/plain | TextLexer
Emanuele Aina
Add a test for the purge extension
r4145 % init
% setup
% delete an empty directory
empty_dir
Removing directory empty_dir
directory
r1
% delete an untracked directory
untracked_dir/untracked_file1
untracked_dir/untracked_file2
Removing file untracked_dir/untracked_file1
Removing file untracked_dir/untracked_file2
Removing directory untracked_dir
directory
r1
% delete an untracked file
untracked_file
Patrick Mezard
purge: remove read-only files under Windows (issue583)...
r8043 untracked_file_readonly
Emanuele Aina
Add a test for the purge extension
r4145 Removing file untracked_file
Patrick Mezard
purge: remove read-only files under Windows (issue583)...
r8043 Removing file untracked_file_readonly
Emanuele Aina
Add a test for the purge extension
r4145 directory
r1
% delete an untracked file in a tracked directory
directory/untracked_file
Removing file directory/untracked_file
directory
r1
% delete nested directories
untracked_directory/nested_directory
Removing directory untracked_directory/nested_directory
Removing directory untracked_directory
directory
r1
Alexis S. L. Carvalho
purge.py: fix invocation of statwalk
r4155 % delete nested directories from a subdir
untracked_directory/nested_directory
Removing directory untracked_directory/nested_directory
Removing directory untracked_directory
directory
r1
% delete only part of the tree
untracked_directory/nested_directory
Removing directory untracked_directory/nested_directory
Removing directory untracked_directory
directory
r1
directory/untracked_file
Emanuele Aina
purge: don't delete ignored files if --all is not specified
r4691 % skip ignored files if --all not specified
directory
ignored
r1
Emanuele Aina
Add a test for the purge extension
r4145 ignored
Removing file ignored
directory
r1
Emanuele Aina
purge: abort with missing files avoiding problems with name-mangling fs...
r4310 % abort with missing files until we support name mangling filesystems
untracked_file
Matt Mackall
purge: cleanup...
r6757 ! r1
? untracked_file
untracked_file
Emanuele Aina
purge: abort with missing files avoiding problems with name-mangling fs...
r4310 Removing file untracked_file
Matt Mackall
purge: cleanup...
r6757 ! r1
Alexis S. L. Carvalho
purge: simplify safety net for case mangling filesystems...
r5517 % tracked file in ignored directory (issue621)
untracked_file
Removing file untracked_file
Emanuele Aina
purge: add --include and --exclude options
r4463 % skip excluded files
directory
excluded_file
r1
% skip files in excluded dirs
directory
excluded_dir
r1
file
% skip excluded empty dirs
directory
excluded_dir
r1
% skip patterns