Mercurial > hg
view tests/test-hg-parseurl.py @ 49568:da48f170d203
rust-status: query fs traversal metadata lazily
Currently, any time the status algorithm needs to read a directory from the
filesystem (because the stat-only optimization is not available), it also
stats each directory entry eagerly.
Stat'ing the entries is only needed in a few cases (like when checking
the mtime of a directory for caching): this patch creates a wrapper struct
`DirEntry` that only stats the directory entry it represents when needed.
Excerpt of an `strace` before this change on Mozilla Central:
```
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
newfstatat(3, "", {st_mode=S_IFDIR|0755, st_size=3540, ...}, AT_EMPTY_PATH) = 0
getdents64(3, 0x55dc970bd440 /* 139 entries */, 32768) = 5072
statx(3, ".hg", AT_STATX_SYNC_AS_STAT|AT_SYMLINK_NOFOLLOW, STATX_ALL, {stx_mask=STATX_ALL|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=772, ...}) = 0
[... 135 other successful `statx` calls]
getdents64(3, 0x55dc970bd440 /* 0 entries */, 32768) = 0
close(3) = 0
```
After this change:
```
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
newfstatat(3, "", {st_mode=S_IFDIR|0755, st_size=3540, ...}, AT_EMPTY_PATH) = 0
getdents64(3, 0x561567c10190 /* 139 entries */, 32768) = 5072
getdents64(3, 0x561567c10190 /* 0 entries */, 32768) = 0
close(3) = 0
```
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Wed, 19 Oct 2022 12:38:06 +0200 |
parents | 6000f5b25c9b |
children | 493034cc3265 |
line wrap: on
line source
import unittest from mercurial.utils import urlutil class ParseRequestTests(unittest.TestCase): def testparse(self): self.assertEqual( urlutil.parseurl(b'http://example.com/no/anchor'), (b'http://example.com/no/anchor', (None, [])), ) self.assertEqual( urlutil.parseurl(b'http://example.com/an/anchor#foo'), (b'http://example.com/an/anchor', (b'foo', [])), ) self.assertEqual( urlutil.parseurl( b'http://example.com/no/anchor/branches', [b'foo'] ), (b'http://example.com/no/anchor/branches', (None, [b'foo'])), ) self.assertEqual( urlutil.parseurl( b'http://example.com/an/anchor/branches#bar', [b'foo'] ), (b'http://example.com/an/anchor/branches', (b'bar', [b'foo'])), ) self.assertEqual( urlutil.parseurl( b'http://example.com/an/anchor/branches-None#foo', None ), (b'http://example.com/an/anchor/branches-None', (b'foo', [])), ) self.assertEqual( urlutil.parseurl(b'http://example.com/'), (b'http://example.com/', (None, [])), ) self.assertEqual( urlutil.parseurl(b'http://example.com'), (b'http://example.com/', (None, [])), ) self.assertEqual( urlutil.parseurl(b'http://example.com#foo'), (b'http://example.com/', (b'foo', [])), ) if __name__ == '__main__': import silenttestrunner silenttestrunner.main(__name__)