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

r8936:1de6e7e1 default
r9115:b55d4471 default
Show More
test-hgwebdir.out
330 lines | 8.6 KiB | text/plain | TextLexer
/ tests / test-hgwebdir.out
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 adding a
adding b
Benoit Allard
hgweb: recurse down collections only if ** in [paths]...
r7523 adding d
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 adding c
% should give a 404 - file does not exist
404 Not Found
Dirkjan Ochtman
hgweb: better error messages
r6368 error: bork@8580ff50825a: not found in manifest
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 % should succeed
200 Script output follows
/a/
/b/
200 Script output follows
a
200 Script output follows
b
% should give a 404 - repo is not published
404 Not Found
error: repository c not found
Dirkjan Ochtman
Add tests for hgwebdir repository names with slashes in them.
r5578 % should succeed, slashy names
200 Script output follows
/b/
Patrick Mezard
hgweb: extend [paths] syntax to match repositories recursively (issue852)...
r7450 /coll/a/
Dirkjan Ochtman
hgweb: mq repos should be in non-recursive collections, too
r7525 /coll/a/.hg/patches/
Patrick Mezard
hgweb: extend [paths] syntax to match repositories recursively (issue852)...
r7450 /coll/b/
/coll/c/
Benoit Allard
hgweb: recurse down collections only if ** in [paths]...
r7523 /rcoll/a/
/rcoll/a/.hg/patches/
/rcoll/b/
/rcoll/b/d/
/rcoll/c/
Dirkjan Ochtman
Add tests for hgwebdir repository names with slashes in them.
r5578 /t/a/
200 Script output follows
Dirkjan Ochtman
tests: add tests for styled hgwebdir pages
r8217 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<link rel="icon" href="/static/hgicon.png" type="image/png" />
<meta name="robots" content="index, nofollow" />
<link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
<title>Mercurial repositories index</title>
</head>
<body>
<div class="container">
<div class="menu">
Dirkjan Ochtman
change wiki/bts URLs to point to new hostname
r8936 <a href="http://mercurial.selenic.com/">
Dirkjan Ochtman
tests: add tests for styled hgwebdir pages
r8217 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
</div>
<div class="main">
<h2>Mercurial Repositories</h2>
<table class="bigtable">
<tr>
<th><a href="?sort=-name">Name</a></th>
<th><a href="?sort=description">Description</a></th>
<th><a href="?sort=contact">Contact</a></th>
<th><a href="?sort=lastchange">Last change</a></th>
<th>&nbsp;</th>
</tr>
Martin Geisler
paper: break long lines in map file
r8372
<tr class="parity0">
<td><a href="/b/?style=paper">b</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/coll/a/?style=paper">coll/a</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/coll/b/?style=paper">coll/b</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/coll/c/?style=paper">coll/c</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity1">
<td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
<tr class="parity0">
<td><a href="/t/a/?style=paper">t/a</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
Dirkjan Ochtman
tests: add tests for styled hgwebdir pages
r8217
</table>
</div>
</div>
</body>
</html>
200 Script output follows
Dirkjan Ochtman
Add tests for hgwebdir repository names with slashes in them.
r5578
/t/a/
200 Script output follows
/t/a/
200 Script output follows
Dirkjan Ochtman
tests: add tests for styled hgwebdir pages
r8217 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<link rel="icon" href="/static/hgicon.png" type="image/png" />
<meta name="robots" content="index, nofollow" />
<link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
<title>Mercurial repositories index</title>
</head>
<body>
<div class="container">
<div class="menu">
Dirkjan Ochtman
change wiki/bts URLs to point to new hostname
r8936 <a href="http://mercurial.selenic.com/">
Dirkjan Ochtman
tests: add tests for styled hgwebdir pages
r8217 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
</div>
<div class="main">
<h2>Mercurial Repositories</h2>
<table class="bigtable">
<tr>
<th><a href="?sort=-name">Name</a></th>
<th><a href="?sort=description">Description</a></th>
<th><a href="?sort=contact">Contact</a></th>
<th><a href="?sort=lastchange">Last change</a></th>
<th>&nbsp;</th>
</tr>
Martin Geisler
paper: break long lines in map file
r8372
<tr class="parity0">
<td><a href="/t/a/?style=paper">a</a></td>
<td>unknown</td>
<td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
<td class="age">seconds ago</td>
<td class="indexlinks"></td>
</tr>
Dirkjan Ochtman
tests: add tests for styled hgwebdir pages
r8217
</table>
</div>
</div>
</body>
</html>
200 Script output follows
Dirkjan Ochtman
Add tests for hgwebdir repository names with slashes in them.
r5578 <?xml version="1.0" encoding="ascii"?>
<feed xmlns="http://127.0.0.1/2005/Atom">
<!-- Changelog -->
<id>http://127.0.0.1/t/a/</id>
<link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
<link rel="alternate" href="http://127.0.0.1/t/a/"/>
<title>t/a Changelog</title>
<updated>1970-01-01T00:00:01+00:00</updated>
<entry>
<title>a</title>
Matt Mackall
atom: fix URLs used in entry GUIDs
r7849 <id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
Dirkjan Ochtman
Add tests for hgwebdir repository names with slashes in them.
r5578 <link href="http://127.0.0.1/t/a/rev/8580ff50825a50c8f716709acdf8de0deddcd6ab"/>
<author>
<name>test</name>
<email>&#116;&#101;&#115;&#116;</email>
</author>
<updated>1970-01-01T00:00:01+00:00</updated>
<published>1970-01-01T00:00:01+00:00</published>
<content type="xhtml">
<div xmlns="http://127.0.0.1/1999/xhtml">
<pre xml:space="preserve">a</pre>
</div>
</content>
</entry>
</feed>
200 Script output follows
<?xml version="1.0" encoding="ascii"?>
<feed xmlns="http://127.0.0.1/2005/Atom">
<!-- Changelog -->
<id>http://127.0.0.1/t/a/</id>
<link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
<link rel="alternate" href="http://127.0.0.1/t/a/"/>
<title>t/a Changelog</title>
<updated>1970-01-01T00:00:01+00:00</updated>
<entry>
<title>a</title>
Matt Mackall
atom: fix URLs used in entry GUIDs
r7849 <id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
Dirkjan Ochtman
Add tests for hgwebdir repository names with slashes in them.
r5578 <link href="http://127.0.0.1/t/a/rev/8580ff50825a50c8f716709acdf8de0deddcd6ab"/>
<author>
<name>test</name>
<email>&#116;&#101;&#115;&#116;</email>
</author>
<updated>1970-01-01T00:00:01+00:00</updated>
<published>1970-01-01T00:00:01+00:00</published>
<content type="xhtml">
<div xmlns="http://127.0.0.1/1999/xhtml">
<pre xml:space="preserve">a</pre>
</div>
</content>
</entry>
</feed>
200 Script output follows
a
Patrick Mezard
hgweb: extend [paths] syntax to match repositories recursively (issue852)...
r7450 200 Script output follows
/coll/a/
Dirkjan Ochtman
hgweb: mq repos should be in non-recursive collections, too
r7525 /coll/a/.hg/patches/
Patrick Mezard
hgweb: extend [paths] syntax to match repositories recursively (issue852)...
r7450 /coll/b/
/coll/c/
200 Script output follows
a
Benoit Allard
hgweb: recurse down collections only if ** in [paths]...
r7523 200 Script output follows
/rcoll/a/
/rcoll/a/.hg/patches/
/rcoll/b/
/rcoll/b/d/
/rcoll/c/
200 Script output follows
d
% collections: should succeed
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 200 Script output follows
/a/
Dirkjan Ochtman
hgweb: mq repos should be in non-recursive collections, too
r7525 /a/.hg/patches/
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 /b/
/c/
200 Script output follows
a
200 Script output follows
b
200 Script output follows
c
Dirkjan Ochtman
hgwebdir: split out makeindex function, facilitate test failure diagnosis
r5601 % paths errors 1
% paths errors 2
% collections errors