Patchwork [5,of,8,V2] tests: add extension to emulate invoking internalpatch at the specific time

login
register
mail settings
Submitter Katsunori FUJIWARA
Date July 8, 2015, 8:08 a.m.
Message ID <12f303caa3d5beb009d4.1436342921@feefifofum>
Download mbox | patch
Permalink /patch/9920/
State Accepted
Commit a4a41525180c9236ff1fc4f7f766f4e30561131d
Headers show

Comments

Katsunori FUJIWARA - July 8, 2015, 8:08 a.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1436342469 -32400
#      Wed Jul 08 17:01:09 2015 +0900
# Node ID 12f303caa3d5beb009d47cae96285b8b6020aae3
# Parent  012495bec8b68fff0501811f7a3981b6afb919cb
tests: add extension to emulate invoking internalpatch at the specific time

This extension fakes "mtime" of patched files to emulate invoking
`patch.internalpatch()` at the specific time.

This is useful to reproduce timing critical issues fixed in subsequent
patches.

Patch

diff --git a/tests/fakepatchtime.py b/tests/fakepatchtime.py
new file mode 100644
--- /dev/null
+++ b/tests/fakepatchtime.py
@@ -0,0 +1,26 @@ 
+# extension to emulate invoking `patch.internalpatch()` at the time
+# specified by `[fakepatchtime] fakenow`
+
+from mercurial import extensions, patch as patchmod, util
+
+def internalpatch(orig, ui, repo, patchobj, strip,
+                  prefix='', files=None,
+                  eolmode='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('fakepatchtime', 'fakenow')
+    if fakenow:
+        # parsing `fakenow` in YYYYmmddHHMM format makes comparison between
+        # `fakenow` value and `touch -t YYYYmmddHHMM` argument easy
+        fakenow = util.parsedate(fakenow, ['%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)