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

r7249:671b3e1e default
r9115:b55d4471 default
Show More
test-init.out
75 lines | 1.7 KiB | text/plain | TextLexer
Thomas Arendsen Hein
Added tests for local and remote init....
r2599 # creating 'local'
Alexis S. L. Carvalho
small fixes for the parent patch...
r4166 store created
00changelog.i created
revlogv1
store
Adrian Buehlmann
introduce fncache repository layout...
r7229 fncache
Thomas Arendsen Hein
Added tests for local and remote init....
r2599 adding foo
Adrian Buehlmann
test-init: add test with format.usefncache=false
r7249 # creating repo with format.usestore=false
Alexis S. L. Carvalho
small fixes for the parent patch...
r4166 revlogv1
Adrian Buehlmann
test-init: add test with format.usefncache=false
r7249 # creating repo with format.usefncache=false
store created
00changelog.i created
revlogv1
store
Benoit Boissinot
clone: simplifying dest repo creation...
r3037 #test failure
abort: repository local already exists!
Thomas Arendsen Hein
Added tests for local and remote init....
r2599 # init+push to remote2
Alexis S. L. Carvalho
incoming/outgoing: print the name of the other repo
r4162 comparing with local
Thomas Arendsen Hein
Added tests for local and remote init....
r2599 changeset: 0:c4e059d443be
tag: tip
user: test
date: Mon Jan 12 13:46:40 1970 +0000
summary: init
pushing to ssh://user@dummy/remote2
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
# clone to remote1
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
Benoit Boissinot
clone: simplifying dest repo creation...
r3037 # init to existing repo
Benoit Boissinot
sshrepo: don't try to validate when creating the repo...
r3084 abort: repository remote1 already exists!
abort: could not create remote repo!
Benoit Boissinot
clone: simplifying dest repo creation...
r3037 # clone to existing repo
Benoit Boissinot
sshrepo: don't try to validate when creating the repo...
r3084 abort: repository remote1 already exists!
abort: could not create remote repo!
Thomas Arendsen Hein
Added tests for local and remote init....
r2599 # output of dummyssh
Alexis S. L. Carvalho
test-init: avoid a shell script
r4297 Got arguments 1:user@dummy 2:hg init remote2
Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio
Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio
Got arguments 1:user@dummy 2:hg init remote1
Got arguments 1:user@dummy 2:hg -R remote1 serve --stdio
Got arguments 1:user@dummy 2:hg init remote1
Got arguments 1:user@dummy 2:hg init remote1
Thomas Arendsen Hein
Added tests for local and remote init....
r2599 # comparing repositories
0:c4e059d443be
0:c4e059d443be
0:c4e059d443be
# check names for repositories (clashes with URL schemes, special chars)
# hg init "bundle"
ok
# hg init "file"
ok
# hg init "hg"
ok
# hg init "http"
ok
# hg init "https"
ok
# hg init "old-http"
ok
# hg init "ssh"
ok
# hg init "static-http"
ok
# hg init " "
ok
# hg init "with space"
ok