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

r9093:0b2b269b default
r9115:b55d4471 default
Show More
test-fetch.out
209 lines | 7.4 KiB | text/plain | TextLexer
% test fetch with default branches only
adding a
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
adding b
1:97d72e5f12c7
% should pull one change
pulling from ../a
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1:97d72e5f12c7
adding c
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
% should merge c into a
pulling from ../a
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
updating to 2:97d72e5f12c7
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
merging with 1:5e056962225c
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 3:cd3a41621cf0 merges remote changes with local
a
b
c
% fetch over http, no auth
pulling from http://localhost:20059/
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
updating to 2:97d72e5f12c7
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
merging with 1:5e056962225c
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 3:... merges remote changes with local
Automated merge with http://localhost:20059/
% fetch over http with auth (should be hidden in desc)
pulling from http://user:***@localhost:20059/
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
updating to 2:97d72e5f12c7
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
merging with 1:5e056962225c
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 3:... merges remote changes with local
Automated merge with http://localhost:20059/
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
adding f
adding g
% should merge f into g
pulling from ../f
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
merging with 3:cc6a3744834d
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 4:55aa4f32ec59 merges remote changes with local
% should abort, because i is modified
abort: working directory is missing some files
% test fetch with named branches
adding a
marked working directory as branch a
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
marked working directory as branch b
adding b
created new head
% pull in change on foreign branch
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
pulling from n1
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
% parent should be 2 (no automatic update)
2
% pull in changes on both foreign and local branches
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
pulling from n1
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 2 files
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% parent should be 4 (fast forward)
4
% pull changes on foreign (2 new heads) and local (1 new head) branches
% with a local change
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
created new head
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
adding c
pulling from n1
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 2 files (+2 heads)
updating to 5:708c6cce3d26
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
merging with 3:d83427717b1f
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
new changeset 7:48f1a33f52af merges remote changes with local
% parent should be 7 (new merge changeset)
7
% pull in changes on foreign (merge of local branch) and local (2 new
% heads) with a local change
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
created new head
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
created new head
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
pulling from n1
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 2 changes to 1 files (+2 heads)
not merging with 1 other new branch heads (use "hg heads ." and "hg merge" to merge them)
% parent should be 3 (fetch did not merge anything)
3
% pull in change on different branch than dirstate
adding a
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
marked working directory as branch topic
abort: working dir not at branch tip (use "hg update" to check out branch tip)
% parent should be 0 (fetch did not update or merge anything)
0
% test fetch with inactive branches
adding a
marked working directory as branch second
adding b
marked working directory as branch default
adding c
updating working directory
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
% fetch should succeed
pulling from ../ib1
searching for changes
no changes found
% test issue1726
adding a
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
pulling from ../i1726r1
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
updating to 2:7837755a2789
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
merging with 1:d1f0c6c48ebd
merging a
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
new changeset 3 merges remote changes with local
3