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

r8753:af5f099d default
r9115:b55d4471 default
Show More
test-up-local-change.out
159 lines | 4.0 KiB | text/plain | TextLexer
/ tests / test-up-local-change.out
adding a
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
diff -r 33aaa84a386b a
--- a/a
+++ b/a
@@ -1,1 +1,1 @@
-a
+abc
adding b
M a
changeset: 0:33aaa84a386b
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 1
searching for copies back to rev 1
unmatched files in other:
b
resolving manifests
overwrite False partial False
ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
a: versions differ -> m
b: remote created -> g
preserving a for resolve of a
picked tool 'true' for a (binary False symlink False)
merging a
my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
getting b
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
changeset: 1:802f095af299
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 2
resolving manifests
overwrite False partial False
ancestor 802f095af299 local 802f095af299+ remote 33aaa84a386b
a: versions differ -> m
b: other deleted -> r
preserving a for resolve of a
removing b
picked tool 'true' for a (binary False symlink False)
merging a
my a@802f095af299+ other a@33aaa84a386b ancestor a@33aaa84a386b
premerge successful
0 files updated, 1 files merged, 1 files removed, 0 files unresolved
changeset: 0:33aaa84a386b
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 1
abort: there is nothing to merge - use "hg update" instead
failed
changeset: 0:33aaa84a386b
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 1
searching for copies back to rev 1
unmatched files in other:
b
resolving manifests
overwrite False partial False
ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
a: versions differ -> m
b: remote created -> g
preserving a for resolve of a
picked tool 'true' for a (binary False symlink False)
merging a
my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
getting b
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
changeset: 1:802f095af299
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 2
changeset: 1:802f095af299
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
files: a b
description:
2
changeset: 0:33aaa84a386b
user: test
date: Mon Jan 12 13:46:40 1970 +0000
files: a
description:
1
diff -r 802f095af299 a
--- a/a
+++ b/a
@@ -1,1 +1,1 @@
-a2
+abc
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
adding b
created new head
M a
changeset: 1:802f095af299
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 2
abort: crosses branches (use 'hg merge' or 'hg update -C' to discard changes)
failed
abort: outstanding uncommitted changes (use 'hg status' to list changes)
failed
searching for copies back to rev 1
resolving manifests
overwrite False partial False
ancestor 33aaa84a386b local 802f095af299+ remote 030602aee63d
a: versions differ -> m
b: versions differ -> m
preserving a for resolve of a
preserving b for resolve of b
picked tool 'true' for a (binary False symlink False)
merging a
my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
picked tool 'true' for b (binary False symlink False)
merging b
my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
0 files updated, 2 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
changeset: 1:802f095af299
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 2
changeset: 2:030602aee63d
tag: tip
parent: 0:33aaa84a386b
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: 3
diff -r 802f095af299 a
--- a/a
+++ b/a
@@ -1,1 +1,1 @@
-a2
+abc
adding a
pulling from ../a
requesting all 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