comparison hgext/evolve.py @ 219:cfdab01ca8a0

evolve-amend: properly handle amending file renames and additions.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Wed, 02 May 2012 14:08:21 +0200
parents 69a37d56c7fb
children 5a17c0d41a00
comparison
equal deleted inserted replaced
218:ace5608350b6 219:cfdab01ca8a0
15 from mercurial import error 15 from mercurial import error
16 from mercurial import extensions 16 from mercurial import extensions
17 from mercurial import commands 17 from mercurial import commands
18 from mercurial import bookmarks 18 from mercurial import bookmarks
19 from mercurial import phases 19 from mercurial import phases
20 from mercurial import commands
20 from mercurial import context 21 from mercurial import context
21 from mercurial import commands 22 from mercurial import copies
22 from mercurial import util 23 from mercurial import util
23 from mercurial.i18n import _ 24 from mercurial.i18n import _
24 from mercurial.commands import walkopts, commitopts, commitopts2, logopts 25 from mercurial.commands import walkopts, commitopts, commitopts2, logopts
25 from mercurial import hg 26 from mercurial import hg
26 27
67 # commit a new version of the old changeset, including the update 68 # commit a new version of the old changeset, including the update
68 # collect all files which might be affected 69 # collect all files which might be affected
69 files = set(old.files()) 70 files = set(old.files())
70 for u in updates: 71 for u in updates:
71 files.update(u.files()) 72 files.update(u.files())
73
74 # Recompute copies (avoid recording a -> b -> a)
75 copied = copies.pathcopies(base, head)
76
77
72 # prune files which were reverted by the updates 78 # prune files which were reverted by the updates
73 def samefile(f): 79 def samefile(f):
74 if f in head.manifest(): 80 if f in head.manifest():
75 a = head.filectx(f) 81 a = head.filectx(f)
76 if f in base.manifest(): 82 if f in base.manifest():
77 b = base.filectx(f) 83 b = base.filectx(f)
78 return (a.data() == b.data() 84 return (a.data() == b.data()
79 and a.flags() == b.flags() 85 and a.flags() == b.flags())
80 and a.renamed() == b.renamed())
81 else: 86 else:
82 return False 87 return False
83 else: 88 else:
84 return f not in base.manifest() 89 return f not in base.manifest()
85 files = [f for f in files if not samefile(f)] 90 files = [f for f in files if not samefile(f)]
86 # commit version of these files as defined by head 91 # commit version of these files as defined by head
87 headmf = head.manifest() 92 headmf = head.manifest()
88 def filectxfn(repo, ctx, path): 93 def filectxfn(repo, ctx, path):
89 if path in headmf: 94 if path in headmf:
90 return head.filectx(path) 95 fctx = head[path]
96 flags = fctx.flags()
97 mctx = context.memfilectx(fctx.path(), fctx.data(),
98 islink='l' in flags,
99 isexec='x' in flags,
100 copied=copied.get(path))
101 return mctx
91 raise IOError() 102 raise IOError()
92 if commitopts.get('message') and commitopts.get('logfile'): 103 if commitopts.get('message') and commitopts.get('logfile'):
93 raise util.Abort(_('options --message and --logfile are mutually' 104 raise util.Abort(_('options --message and --logfile are mutually'
94 ' exclusive')) 105 ' exclusive'))
95 if commitopts.get('logfile'): 106 if commitopts.get('logfile'):