comparison mercurial/merge.py @ 3248:751840e739a1

merge: reduce manifest copying
author Matt Mackall <mpm@selenic.com>
date Wed, 04 Oct 2006 14:33:22 -0500
parents 7a0d70b69d74
children f05c182430a0
comparison
equal deleted inserted replaced
3247:7a0d70b69d74 3248:751840e739a1
162 for mf in match[of]: 162 for mf in match[of]:
163 checkpair(c, mf, m1) 163 checkpair(c, mf, m1)
164 164
165 return copy 165 return copy
166 166
167 def filtermanifest(man, partial): 167 def manifestmerge(ui, m1, m2, ma, overwrite, backwards, partial):
168 if partial:
169 for k in man.keys():
170 if not partial(k): del man[k]
171
172 def manifestmerge(ui, m1, m2, ma, overwrite, backwards):
173 """ 168 """
174 Merge manifest m1 with m2 using ancestor ma and generate merge action list 169 Merge manifest m1 with m2 using ancestor ma and generate merge action list
175 """ 170 """
176 171
177 def fmerge(f): 172 def fmerge(f):
185 ui.debug(" %s: %s -> %s\n" % (f, msg, m)) 180 ui.debug(" %s: %s -> %s\n" % (f, msg, m))
186 action.append((f, m) + args) 181 action.append((f, m) + args)
187 182
188 # Compare manifests 183 # Compare manifests
189 for f, n in m1.iteritems(): 184 for f, n in m1.iteritems():
185 if partial and not partial(f):
186 continue
190 if f in m2: 187 if f in m2:
191 # are files different? 188 # are files different?
192 if n != m2[f]: 189 if n != m2[f]:
193 a = ma.get(f, nullid) 190 a = ma.get(f, nullid)
194 # are both different from the ancestor? 191 # are both different from the ancestor?
204 act("update permissions", f, "e", m2.execf(f)) 201 act("update permissions", f, "e", m2.execf(f))
205 # contents same, check mode bits 202 # contents same, check mode bits
206 elif m1.execf(f) != m2.execf(f): 203 elif m1.execf(f) != m2.execf(f):
207 if overwrite or fmerge(f) != m1.execf(f): 204 if overwrite or fmerge(f) != m1.execf(f):
208 act("update permissions", f, "e", m2.execf(f)) 205 act("update permissions", f, "e", m2.execf(f))
209 del m2[f]
210 elif f in ma: 206 elif f in ma:
211 if n != ma[f] and not overwrite: 207 if n != ma[f] and not overwrite:
212 if ui.prompt( 208 if ui.prompt(
213 (_(" local changed %s which remote deleted\n") % f) + 209 (_(" local changed %s which remote deleted\n") % f) +
214 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"): 210 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
219 # file is created on branch or in working directory 215 # file is created on branch or in working directory
220 if (overwrite and n[20:] != "u") or (backwards and not n[20:]): 216 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
221 act("remote deleted", f, "r") 217 act("remote deleted", f, "r")
222 218
223 for f, n in m2.iteritems(): 219 for f, n in m2.iteritems():
220 if partial and not partial(f):
221 continue
222 if f in m1:
223 continue
224 if f in ma: 224 if f in ma:
225 if overwrite or backwards: 225 if overwrite or backwards:
226 act("recreating", f, "g", m2.execf(f), n) 226 act("recreating", f, "g", m2.execf(f), n)
227 elif n != ma[f]: 227 elif n != ma[f]:
228 if ui.prompt( 228 if ui.prompt(
335 335
336 if branchmerge and not forcemerge: 336 if branchmerge and not forcemerge:
337 if wc.modified() or wc.added() or wc.removed(): 337 if wc.modified() or wc.added() or wc.removed():
338 raise util.Abort(_("outstanding uncommitted changes")) 338 raise util.Abort(_("outstanding uncommitted changes"))
339 339
340 m1 = wc.manifest().copy() 340 m1 = wc.manifest()
341 m2 = p2.manifest().copy() 341 m2 = p2.manifest()
342 ma = pa.manifest() 342 ma = pa.manifest()
343 343
344 # resolve the manifest to determine which files 344 # resolve the manifest to determine which files
345 # we care about merging 345 # we care about merging
346 repo.ui.note(_("resolving manifests\n")) 346 repo.ui.note(_("resolving manifests\n"))
349 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa)) 349 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa))
350 350
351 action = [] 351 action = []
352 copy = {} 352 copy = {}
353 353
354 filtermanifest(m1, partial)
355 filtermanifest(m2, partial)
356
357 if not force: 354 if not force:
358 checkunknown(repo, m2, wc) 355 checkunknown(repo, m2, wc)
359 if not branchmerge: 356 if not branchmerge:
360 action += forgetremoved(m2, wc) 357 action += forgetremoved(m2, wc)
361 if not (backwards or overwrite): 358 if not (backwards or overwrite):
362 copy = findcopies(repo, m1, m2, pa.rev()) 359 copy = findcopies(repo, m1, m2, pa.rev())
363 360
364 action += manifestmerge(repo.ui, m1, m2, ma, overwrite, backwards) 361 action += manifestmerge(repo.ui, m1, m2, ma, overwrite, backwards, partial)
365 del m1, m2, ma
366 362
367 ### apply phase 363 ### apply phase
368 364
369 if not branchmerge: 365 if not branchmerge:
370 # we don't need to do any magic, just jump to the new rev 366 # we don't need to do any magic, just jump to the new rev