[PATCH STABLE] revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori
foozy at lares.dti.ne.jp
Fri Apr 24 09:39:49 CDT 2015
Please ignore this. I'll soon post revised one, which examines also
file size to avoid silently breaking test condition.
At Fri, 24 Apr 2015 23:20:43 +0900,
FUJIWARA Katsunori wrote:
>
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1429884991 -32400
> # Fri Apr 24 23:16:31 2015 +0900
> # Branch stable
> # Node ID b483fc5e67961924de9ccda7cd7133a24845050a
> # Parent ca1ad8ef38be225caec42564502aafe43cae173d
> revert: apply normallookup on reverted file if size isn't changed (issue4583)
>
> Before this patch, reverting a file to the revision other than the
> parent doesn't update dirstate. This seems to expect that timestamp
> and/or size will be changed by reverting.
>
> But if (1) dirstate of file "f" is filled with timestamp before
> reverting and (2) size and timestamp of file "f" isn't changed at
> reverting, file "f" is recognized as CLEAN unexpectedly.
>
> This patch applies "dirstate.normallookup()" on reverted file, if size
> isn't changed.
>
> Making "localrepository.wwrite()" return length of written data is
> needed to avoid additional (and redundant) "lstat(2)" on the reverted
> file. "filectx.size()" can't be used to know it, because data may be
> decoded at being written out.
>
> BTW, interactive reverting may cause similar problem, too. But this
> patch doesn't focus on fixing it, because (1) interactive (maybe slow)
> reverting changes one (or both) of size/timestamp of reverted files in
> many usecases, and (2) changes to fix it seems not suitable for stable
> branch.
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -3066,7 +3066,7 @@ def _performrevert(repo, parents, ctx, a
> node = ctx.node()
> def checkout(f):
> fc = ctx[f]
> - repo.wwrite(f, fc.data(), fc.flags())
> + return repo.wwrite(f, fc.data(), fc.flags())
>
> audit_path = pathutil.pathauditor(repo.root)
> for f in actions['forget'][0]:
> @@ -3114,9 +3114,13 @@ def _performrevert(repo, parents, ctx, a
> del fp
> else:
> for f in actions['revert'][0]:
> - checkout(f)
> + wsize = checkout(f)
> if normal:
> normal(f)
> + elif wsize == repo.dirstate._map[f][2]:
> + # changes may be overlooked without normallookup,
> + # if size isn't changed at reverting
> + repo.dirstate.normallookup(f)
>
> for f in actions['add'][0]:
> checkout(f)
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -917,6 +917,10 @@ class localrepository(object):
> return self._filter(self._encodefilterpats, filename, data)
>
> def wwrite(self, filename, data, flags):
> + """write ``data`` into ``filename`` in the working directory
> +
> + This returns length of written (maybe decoded) data.
> + """
> data = self._filter(self._decodefilterpats, filename, data)
> if 'l' in flags:
> self.wvfs.symlink(data, filename)
> @@ -924,6 +928,7 @@ class localrepository(object):
> self.wvfs.write(filename, data)
> if 'x' in flags:
> self.wvfs.setflags(filename, False, True)
> + return len(data)
>
> def wwritedata(self, filename, data):
> return self._filter(self._decodefilterpats, filename, data)
> diff --git a/tests/test-merge-tools.t b/tests/test-merge-tools.t
> --- a/tests/test-merge-tools.t
> +++ b/tests/test-merge-tools.t
> @@ -608,7 +608,12 @@ update is a merge ...
> true.executable=cat
> # hg update -C 1
> $ hg update -q 0
> + $ touch -t 200001010000 f
> + $ hg status f
> $ hg revert -q -r 1 .
> + $ touch -t 200001010000 f
> + $ hg status f
> + M f
> $ hg update -r 2
> merging f
> revision 1
> @@ -634,7 +639,12 @@ update should also have --tool
> true.executable=cat
> # hg update -C 1
> $ hg update -q 0
> + $ touch -t 200001010000 f
> + $ hg status f
> $ hg revert -q -r 1 .
> + $ touch -t 200001010000 f
> + $ hg status f
> + M f
> $ hg update -r 2 --tool false
> merging f
> merging f failed!
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
----------------------------------------------------------------------
[FUJIWARA Katsunori] foozy at lares.dti.ne.jp
More information about the Mercurial-devel
mailing list