Mercurial > hg
view tests/bruterebase.py @ 51930:bc9ed92d4753
util: make `mmapread()` work on Windows again
522b4d729e89 started referencing `mmap.MAP_PRIVATE`, but that's not available on
Windows, so `hg version` worked, but `make local` did not. That commit also
started calling the constructor with the fine-grained `flags` and `prot` args,
but those aren't available on Windows either[1] (though the backing C code
doesn't seem conditionalized to disallow usage of them).
I assume the change away from from the `access` arg was to provide the same
options, plus `MAP_POPULATE`. Looking at the source code[2], they're not quite
the same- `ACCESS_READ` is equivalent to `flags = MAP_SHARED` and `prot = PROT_READ`.
`MAP_PRIVATE` is only used with `ACCESS_COPY`, which allows read and write.
Therefore, we can't quite get the same baseline flags on Windows, but this was
the status quo ante and `MAP_POPULATE` is a Linux thing, so presumably it works.
I realize that typically the OS differences are abstracted into the platform
modules, but I'm leaving it here so that it is obvious what the differences are
between the platforms.
[1] https://docs.python.org/3/library/mmap.html#mmap.mmap
[2] https://github.com/python/cpython/blob/5e0abb47886bc665eefdcc19fde985f803e49d4c/Modules/mmapmodule.c#L1539
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Tue, 01 Oct 2024 15:00:39 -0400 |
parents | 56f98406831b |
children |
line wrap: on
line source
# bruterebase.py - brute force rebase testing # # Copyright 2017 Facebook, Inc. # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from mercurial import ( error, registrar, revsetlang, ) from hgext import rebase cmdtable = {} command = registrar.command(cmdtable) @command(b'debugbruterebase') def debugbruterebase(ui, repo, source, dest): """for every non-empty subset of source, run rebase -r subset -d dest Print one line summary for each subset. Assume obsstore is enabled. """ srevs = list(repo.revs(source)) with repo.wlock(), repo.lock(): repolen = len(repo) cl = repo.changelog def getdesc(rev): result = cl.changelogrevision(rev).description if rev >= repolen: result += b"'" return result for i in range(1, 2 ** len(srevs)): subset = [rev for j, rev in enumerate(srevs) if i & (1 << j) != 0] spec = revsetlang.formatspec(b'%ld', subset) tr = repo.transaction(b'rebase') tr._report = lambda x: 0 # hide "transaction abort" with ui.silent(): try: rebase.rebase(ui, repo, dest=dest, rev=[spec]) except error.Abort as ex: summary = b'ABORT: %s' % ex.message except Exception as ex: summary = b'CRASH: %s' % ex else: # short summary about new nodes cl = repo.changelog descs = [] for rev in range(repolen, len(repo)): desc = b'%s:' % getdesc(rev) for prev in cl.parentrevs(rev): if prev > -1: desc += getdesc(prev) descs.append(desc) descs.sort() summary = b' '.join(descs) repo.vfs.tryunlink(b'rebasestate') subsetdesc = b''.join(getdesc(rev) for rev in subset) ui.write(b'%s: %s\n' % (subsetdesc.rjust(len(srevs)), summary)) tr.abort()