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

r8142:912bfef1 default
r9115:b55d4471 default
Show More
test-notify
100 lines | 2.2 KiB | text/plain | TextLexer
Matt Mackall
add test for the notify extension
r3740 #!/bin/sh
cat <<EOF >> $HGRCPATH
[extensions]
notify=
[hooks]
incoming.notify = python:hgext.notify.hook
[notify]
sources = pull
Thomas Arendsen Hein
Fix test-notify for systems without or with a different version of diffstat....
r3747 diffstat = False
Matt Mackall
add test for the notify extension
r3740
[usersubs]
foo@bar = *
Alexis S. L. Carvalho
notify: don't try to fix addresses if notify.domain is not set
r4094
[reposubs]
* = baz
Matt Mackall
add test for the notify extension
r3740 EOF
Benoit Boissinot
fix hg help <ext> for extension that do not define any command...
r4009 hg help notify
Matt Mackall
add test for the notify extension
r3740 hg init a
echo a > a/a
echo % commit
hg --traceback --cwd a commit -Ama -d '0 0'
echo % clone
hg --traceback clone a b
echo a >> a/a
echo % commit
hg --traceback --cwd a commit -Amb -d '1 0'
Florent Guillaume
test-notify: make it pass on Mac OS X 10.5
r6359 # on Mac OS X 10.5 the tmp path is very long so would get stripped in the subject line
cat <<EOF >> $HGRCPATH
[notify]
maxsubject = 200
EOF
# the python call below wraps continuation lines, which appear on Mac OS X 10.5 because
# of the very long subject line
Alexis S. L. Carvalho
notify: don't try to fix addresses if notify.domain is not set
r4094 echo '% pull (minimal config)'
Florent Guillaume
test-notify: make it pass on Mac OS X 10.5
r6359 hg --traceback --cwd b pull ../a 2>&1 |
python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' |
sed -e 's/\(Message-Id:\).*/\1/' \
Thomas Arendsen Hein
Fix sed expression in test-notify to be more portable.
r4157 -e 's/changeset \([0-9a-f]* *\)in .*test-notif/changeset \1in test-notif/' \
Mathieu Clabaut
Add sending date to notify message....
r4479 -e 's/^details: .*test-notify/details: test-notify/' \
-e 's/^Date:.*/Date:/'
Alexis S. L. Carvalho
notify: don't try to fix addresses if notify.domain is not set
r4094
cat <<EOF >> $HGRCPATH
[notify]
config = $HGTMP/.notify.conf
domain = test.com
strip = 3
Christian Ebert
notify: fix neglect of custom headers set via template...
r7658 template = Subject: {desc|firstline|strip}\nFrom: {author}\nX-Test: foo\n\nchangeset {node|short} in {webroot}\ndescription:\n\t{desc|tabindent|strip}
Alexis S. L. Carvalho
notify: don't try to fix addresses if notify.domain is not set
r4094
[web]
baseurl = http://test/
EOF
Patrick Mezard
ui: make readsections() abort when configuration cannot be read.
r4517 echo % fail for config file is missing
hg --cwd b rollback
Matt Mackall
ui: fold readsections into readconfig...
r8142 hg --cwd b pull ../a 2>&1 | grep 'error.*\.notify\.conf' > /dev/null && echo pull failed
Patrick Mezard
ui: make readsections() abort when configuration cannot be read.
r4517
touch "$HGTMP/.notify.conf"
Matt Mackall
add test for the notify extension
r3740 echo % pull
Alexis S. L. Carvalho
notify: don't try to fix addresses if notify.domain is not set
r4094 hg --cwd b rollback
Matt Mackall
add test for the notify extension
r3740 hg --traceback --cwd b pull ../a 2>&1 | sed -e 's/\(Message-Id:\).*/\1/' \
Mathieu Clabaut
Add sending date to notify message....
r4479 -e 's/changeset \([0-9a-f]*\) in .*/changeset \1/' \
-e 's/^Date:.*/Date:/'
Alexis S. L. Carvalho
notify: don't try to fix addresses if notify.domain is not set
r4094
Dirkjan Ochtman
tests: add some testing for patch.diffstat()
r7105 cat << EOF >> $HGRCPATH
[hooks]
incoming.notify = python:hgext.notify.hook
[notify]
sources = pull
diffstat = True
EOF
echo % pull
hg --cwd b rollback
hg --traceback --cwd b pull ../a 2>&1 | sed -e 's/\(Message-Id:\).*/\1/' \
-e 's/changeset \([0-9a-f]*\) in .*/changeset \1/' \
Thomas Arendsen Hein
Use dummy diffstat in tests and remove older diffstat workaround....
r7172 -e 's/^Date:.*/Date:/'
Patrick Mezard
diffstat: don't fail on merges...
r7664
echo % test merge
cd a
hg up -C 0
echo a >> a
hg ci -Am adda2 -d '2 0'
hg merge
hg ci -m merge -d '3 0'
cd ..
hg --traceback --cwd b pull ../a 2>&1 | sed -e 's/\(Message-Id:\).*/\1/' \
-e 's/changeset \([0-9a-f]*\) in .*/changeset \1/' \
-e 's/^Date:.*/Date:/'