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

r8496:a21605de default
r9115:b55d4471 default
Show More
test-import.out
294 lines | 7.0 KiB | text/plain | TextLexer
adding a
adding d1/d2/a
% import exported patch
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../tip.patch
% message should be same
summary: second change
% committer should be same
user: someone
% import exported patch with external patcher
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../tip.patch
line2
% import of plain diff should fail without message
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../tip.patch
abort: empty commit message
% import of plain diff should be ok with message
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../tip.patch
% import of plain diff with specific date and user
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../tip.patch
changeset: 1:ca68f19f3a40
tag: tip
user: user@nowhere.net
date: Thu Jan 01 00:00:01 1970 +0000
files: a
description:
patch
diff -r 80971e65b431 -r ca68f19f3a40 a
--- a/a Thu Jan 01 00:00:00 1970 +0000
+++ b/a Thu Jan 01 00:00:01 1970 +0000
@@ -1,1 +1,2 @@
line 1
+line 2
% import of plain diff should be ok with --no-commit
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../tip.patch
diff -r 80971e65b431 a
--- a/a
+++ b/a
@@ -1,1 +1,2 @@
line 1
+line 2
% hg -R repo import
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying tip.patch
% import from stdin
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying patch from stdin
% override commit message
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying patch from stdin
summary: override
% plain diff in email, subject, message body
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../msg.patch
user: email patcher
summary: email patch
% plain diff in email, no subject, message body
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying patch from stdin
% plain diff in email, subject, no message body
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying patch from stdin
% plain diff in email, no subject, no message body, should fail
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying patch from stdin
abort: empty commit message
% hg export in email, should use patch header
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying patch from stdin
summary: second change
% plain diff in email, [PATCH] subject, message body with subject
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying patch from stdin
email patch
next line
---
% import patch1 patch2; rollback
parent: 0
applying ../patch1
applying ../patch2
rolling back last transaction
parent: 1
% hg import in a subdirectory
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying ../../../tip.patch
% message should be 'subdir change'
summary: subdir change
% committer should be 'someoneelse'
user: someoneelse
% should be empty
% test fuzziness
adding a
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
created new head
applying tip.patch
patching file a
Hunk #1 succeeded at 1 with fuzz 2 (offset -2 lines).
a
adding a
adding b1
adding c1
adding d
diff --git a/a b/a
--- a/a
+++ b/a
@@ -0,0 +1,1 @@
+a
diff --git a/b1 b/b2
rename from b1
rename to b2
--- a/b1
+++ b/b2
@@ -0,0 +1,1 @@
+b
diff --git a/c1 b/c1
--- a/c1
+++ b/c1
@@ -0,0 +1,1 @@
+c
diff --git a/c1 b/c2
copy from c1
copy to c2
--- a/c1
+++ b/c2
@@ -0,0 +1,1 @@
+c
diff --git a/d b/d
--- a/d
+++ b/d
@@ -1,1 +0,0 @@
-d
4 files updated, 0 files merged, 2 files removed, 0 files unresolved
applying empty.diff
% a file
a
% b1 file
% b2 file
b
% c1 file
c
% c2 file
c
% d file
% test trailing binary removal
adding a
adding b
R a
R b
diff --git a/a b/a
diff --git a/b b/b
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
applying remove.diff
% test update+rename with common name (issue 927)
adding a
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
applying copy.diff
% view a
a
% view a2
a
% test -p0
adding a
applying patch from stdin
bb
% test paths outside repo root
applying patch from stdin
abort: ../outside/foo not under root
% test import with similarity (issue295)
adding a
applying ../rename.diff
patching file a
patching file b
removing a
adding b
recording removal of a as rename to b (88% similar)
A b
a
R a
undeleting a
forgetting b
applying ../rename.diff
patching file a
patching file b
removing a
adding b
A b
R a
% add empty file from the end of patch (issue 1495)
adding a
applying a.patch