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

r6283:5a45c82f default
r9115:b55d4471 default
Show More
test-git-export.out
197 lines | 4.0 KiB | text/plain | TextLexer
adding start
adding new
% new file
diff --git a/new b/new
new file mode 100644
--- /dev/null
+++ b/new
@@ -0,0 +1,1 @@
+new
% copy
diff --git a/new b/copy
copy from new
copy to copy
% rename
diff --git a/copy b/rename
rename from copy
rename to rename
% delete
diff --git a/rename b/rename
deleted file mode 100644
--- a/rename
+++ /dev/null
@@ -1,1 +0,0 @@
-new
adding src
% chmod 644
diff --git a/src b/src
old mode 100644
new mode 100755
% rename+mod+chmod
diff --git a/src b/dst
old mode 100755
new mode 100644
rename from src
rename to dst
--- a/src
+++ b/dst
@@ -3,3 +3,4 @@
3
4
5
+a
% nonexistent in tip+chmod
diff --git a/src b/src
old mode 100644
new mode 100755
% binary diff
diff --git a/binfile.bin b/binfile.bin
new file mode 100644
index 0000000000000000000000000000000000000000..37ba3d1c6f17137d9c5f5776fa040caf5fe73ff9
GIT binary patch
literal 593
zc$@)I0<QguP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00009a7bBm000XU
z000XU0RWnu7ytkO2XskIMF-Uh9TW;VpMjwv0005-Nkl<ZD9@FWPs=e;7{<>W$NUkd
zX$nnYLt$-$V!?uy+1V%`z&Eh=ah|duER<4|QWhju3gb^nF*8iYobxWG-qqXl=2~5M
z*IoDB)sG^CfNuoBmqLTVU^<;@nwHP!1wrWd`{(mHo6VNXWtyh{alzqmsH*yYzpvLT
zLdY<T=ks|woh-`&01!ej#(xbV1f|pI*=%;d-%F*E*X#ZH`4I%6SS+$EJDE&ct=8po
ziN#{?_j|kD%Cd|oiqds`xm@;oJ-^?NG3Gdqrs?5u*zI;{nogxsx~^|Fn^Y?Gdc6<;
zfMJ+iF1J`LMx&A2?dEwNW8ClebzPTbIh{@$hS6*`kH@1d%Lo7fA#}N1)oN7`gm$~V
z+wDx#)OFqMcE{s!JN0-xhG8ItAjVkJwEcb`3WWlJfU2r?;Pd%dmR+q@mSri5q9_W-
zaR2~ECX?B2w+zELozC0s*6Z~|QG^f{3I#<`?)Q7U-JZ|q5W;9Q8i_=pBuSzunx=U;
z9C)5jBoYw9^?EHyQl(M}1OlQcCX>lXB*ODN003Z&P17_@)3Pi=i0wb04<W?v-u}7K
zXmmQA+wDgE!qR9o8jr`%=ab_&uh(l?R=r;Tjiqon91I2-hIu?57~@*4h7h9uORK#=
fQItJW-{SoTm)8|5##k|m00000NkvXXu0mjf{mKw4
% import binary diff
applying b.diff
% rename binary file
diff --git a/binfile.bin b/renamed.bin
rename from binfile.bin
rename to renamed.bin
% diff across many revisions
diff --git a/dst2 b/dst3
rename from dst2
rename to dst3
% reversed
diff --git a/dst3 b/dst2
rename from dst3
rename to dst2
% file created before r1 and renamed before r2
diff --git a/foo b/bar
rename from foo
rename to bar
--- a/foo
+++ b/bar
@@ -1,2 +1,3 @@
a
b
+c
% reversed
diff --git a/bar b/foo
rename from bar
rename to foo
--- a/bar
+++ b/foo
@@ -1,3 +1,2 @@
a
b
-c
% file created in r1 and renamed before r2
diff --git a/foo b/bar
rename from foo
rename to bar
--- a/foo
+++ b/bar
@@ -1,1 +1,3 @@
a
+b
+c
% reversed
diff --git a/bar b/foo
rename from bar
rename to foo
--- a/bar
+++ b/foo
@@ -1,3 +1,1 @@
a
-b
-c
% file created after r1 and renamed before r2
diff --git a/bar b/bar
new file mode 100644
--- /dev/null
+++ b/bar
@@ -0,0 +1,3 @@
+a
+b
+c
% reversed
diff --git a/bar b/bar
deleted file mode 100644
--- a/bar
+++ /dev/null
@@ -1,3 +0,0 @@
-a
-b
-c
% comparing with the working dir
% there's a copy in the working dir...
diff --git a/created2 b/created3
rename from created2
rename to created3
% ...but there's another copy between the original rev and the wd
diff --git a/created b/created3
rename from created
rename to created3
% ...but the source of the copy was created after the original rev
diff --git a/created3 b/created3
new file mode 100644
--- /dev/null
+++ b/created3
@@ -0,0 +1,1 @@
+
% created in parent of wd; renamed in the wd
diff --git a/brand-new b/brand-new2
rename from brand-new
rename to brand-new2
% created between r1 and parent of wd; renamed in the wd
diff --git a/brand-new2 b/brand-new2
new file mode 100644
--- /dev/null
+++ b/brand-new2
@@ -0,0 +1,1 @@
+
% one file is copied to many destinations and removed
diff --git a/brand-new2 b/brand-new3
rename from brand-new2
rename to brand-new3
diff --git a/brand-new2 b/brand-new3-2
copy from brand-new2
copy to brand-new3-2
% reversed
diff --git a/brand-new3 b/brand-new2
rename from brand-new3
rename to brand-new2
diff --git a/brand-new3-2 b/brand-new3-2
deleted file mode 100644
--- a/brand-new3-2
+++ /dev/null
@@ -1,1 +0,0 @@
-
% there should be a trailing TAB if there are spaces in the file name
diff --git a/with spaces b/with spaces
new file mode 100644
--- /dev/null
+++ b/with spaces
@@ -0,0 +1,1 @@
+foo