Patchwork [3,of,4] transaction: avoid ambiguity of file stat at restoring from backup

login
register
mail settings
Submitter Katsunori FUJIWARA
Date June 12, 2016, 8:15 p.m.
Message ID <02167888292b1c6ce3f2.1465762520@feefifofum>
Download mbox | patch
Permalink /patch/15474/
State Accepted
Headers show

Comments

Katsunori FUJIWARA - June 12, 2016, 8:15 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1465762316 -32400
#      Mon Jun 13 05:11:56 2016 +0900
# Node ID 02167888292b1c6ce3f2993deff4612eaf0a7591
# Parent  e49ecef9ba4fa398e5597d7412b94d2f397698ee
transaction: avoid ambiguity of file stat at restoring from backup

In some cases below, copying from backup is used to restore original
contents of a file, which is backuped via addfilegenerator(). If
copying keeps ctime, mtime and size of a file, restoring is
overlooked, and old contents cached before restoring isn't invalidated
as expected.

  - failure of transaction (from '.hg/journal.backup.*')
  - rollback of previous transaction (from '.hg/undo.backup.*')

To avoid ambiguity of file stat at restoring, this patch invokes
util.copyfile() with checkambig=True.

This patch is a part of "Exact Cache Validation Plan":

    https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan

Patch

diff --git a/mercurial/transaction.py b/mercurial/transaction.py
--- a/mercurial/transaction.py
+++ b/mercurial/transaction.py
@@ -72,7 +72,7 @@  def _playback(journal, report, opener, v
                 filepath = vfs.join(f)
                 backuppath = vfs.join(b)
                 try:
-                    util.copyfile(backuppath, filepath)
+                    util.copyfile(backuppath, filepath, checkambig=True)
                     backupfiles.append(b)
                 except IOError:
                     report(_("failed to recover %s\n") % f)