tests/fakepatchtime.py
author Raphaël Gomès <rgomes@octobus.net>
Mon, 06 May 2024 13:02:52 +0200
branchstable
changeset 51616 9dbbaecfc950
parent 48875 6000f5b25c9b
permissions -rw-r--r--
dirstate-v2: add check of parent/child nodes being related when writing This stems from a corruption seen in a private repository. We're not sure of the source of the corruption, and it's very possible that we're seeing compounded effects of multiple writes on a corrupted dirstate. Adding this check is not expensive in itself and large writes of the dirstate are not common. This change does not catch this problem at the root node, the next one will.

# extension to emulate invoking 'patch.internalpatch()' at the time
# specified by '[fakepatchtime] fakenow'


from mercurial import (
    extensions,
    patch as patchmod,
    registrar,
)
from mercurial.utils import dateutil

configtable = {}
configitem = registrar.configitem(configtable)

configitem(
    b'fakepatchtime',
    b'fakenow',
    default=None,
)


def internalpatch(
    orig,
    ui,
    repo,
    patchobj,
    strip,
    prefix=b'',
    files=None,
    eolmode=b'strict',
    similarity=0,
):
    if files is None:
        files = set()
    r = orig(
        ui,
        repo,
        patchobj,
        strip,
        prefix=prefix,
        files=files,
        eolmode=eolmode,
        similarity=similarity,
    )

    fakenow = ui.config(b'fakepatchtime', b'fakenow')
    if fakenow:
        # parsing 'fakenow' in YYYYmmddHHMM format makes comparison between
        # 'fakenow' value and 'touch -t YYYYmmddHHMM' argument easy
        fakenow = dateutil.parsedate(fakenow, [b'%Y%m%d%H%M'])[0]
        for f in files:
            repo.wvfs.utime(f, (fakenow, fakenow))

    return r


def extsetup(ui):
    extensions.wrapfunction(patchmod, 'internalpatch', internalpatch)