comparison mercurial/merge.py @ 8814:ab668c92a036

subrepo: add update/merge logic
author Matt Mackall <mpm@selenic.com>
date Mon, 15 Jun 2009 02:45:38 -0500
parents af5f099d932b
children 3f56055ff1d7
comparison
equal deleted inserted replaced
8813:db3c1ab0e632 8814:ab668c92a036
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2, incorporated herein by reference. 6 # GNU General Public License version 2, incorporated herein by reference.
7 7
8 from node import nullid, nullrev, hex, bin 8 from node import nullid, nullrev, hex, bin
9 from i18n import _ 9 from i18n import _
10 import util, filemerge, copies 10 import util, filemerge, copies, subrepo
11 import errno, os, shutil 11 import errno, os, shutil
12 12
13 class mergestate(object): 13 class mergestate(object):
14 '''track 3-way merge state of individual files''' 14 '''track 3-way merge state of individual files'''
15 def __init__(self, repo): 15 def __init__(self, repo):
239 updated, merged, removed, unresolved = 0, 0, 0, 0 239 updated, merged, removed, unresolved = 0, 0, 0, 0
240 ms = mergestate(repo) 240 ms = mergestate(repo)
241 ms.reset(wctx.parents()[0].node()) 241 ms.reset(wctx.parents()[0].node())
242 moves = [] 242 moves = []
243 action.sort(key=actionkey) 243 action.sort(key=actionkey)
244 substate = wctx.substate # prime
244 245
245 # prescan for merges 246 # prescan for merges
246 for a in action: 247 for a in action:
247 f, m = a[:2] 248 f, m = a[:2]
248 if m == 'm': # merge 249 if m == 'm': # merge
249 f2, fd, flags, move = a[2:] 250 f2, fd, flags, move = a[2:]
251 if f == '.hgsubstate': # merged internally
252 continue
250 repo.ui.debug(_("preserving %s for resolve of %s\n") % (f, fd)) 253 repo.ui.debug(_("preserving %s for resolve of %s\n") % (f, fd))
251 fcl = wctx[f] 254 fcl = wctx[f]
252 fco = mctx[f2] 255 fco = mctx[f2]
253 fca = fcl.ancestor(fco) or repo.filectx(f, fileid=nullrev) 256 fca = fcl.ancestor(fco) or repo.filectx(f, fileid=nullrev)
254 ms.add(fcl, fco, fca, fd, flags) 257 ms.add(fcl, fco, fca, fd, flags)
268 if f and f[0] == "/": 271 if f and f[0] == "/":
269 continue 272 continue
270 if m == "r": # remove 273 if m == "r": # remove
271 repo.ui.note(_("removing %s\n") % f) 274 repo.ui.note(_("removing %s\n") % f)
272 audit_path(f) 275 audit_path(f)
276 if f == '.hgsubstate': # subrepo states need updating
277 subrepo.submerge(repo, wctx, mctx, wctx)
273 try: 278 try:
274 util.unlink(repo.wjoin(f)) 279 util.unlink(repo.wjoin(f))
275 except OSError, inst: 280 except OSError, inst:
276 if inst.errno != errno.ENOENT: 281 if inst.errno != errno.ENOENT:
277 repo.ui.warn(_("update failed to remove %s: %s!\n") % 282 repo.ui.warn(_("update failed to remove %s: %s!\n") %
278 (f, inst.strerror)) 283 (f, inst.strerror))
279 removed += 1 284 removed += 1
280 elif m == "m": # merge 285 elif m == "m": # merge
286 if f == '.hgsubstate': # subrepo states need updating
287 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx))
288 continue
281 f2, fd, flags, move = a[2:] 289 f2, fd, flags, move = a[2:]
282 r = ms.resolve(fd, wctx, mctx) 290 r = ms.resolve(fd, wctx, mctx)
283 if r > 0: 291 if r > 0:
284 unresolved += 1 292 unresolved += 1
285 else: 293 else:
295 flags = a[2] 303 flags = a[2]
296 repo.ui.note(_("getting %s\n") % f) 304 repo.ui.note(_("getting %s\n") % f)
297 t = mctx.filectx(f).data() 305 t = mctx.filectx(f).data()
298 repo.wwrite(f, t, flags) 306 repo.wwrite(f, t, flags)
299 updated += 1 307 updated += 1
308 if f == '.hgsubstate': # subrepo states need updating
309 subrepo.submerge(repo, wctx, mctx, wctx)
300 elif m == "d": # directory rename 310 elif m == "d": # directory rename
301 f2, fd, flags = a[2:] 311 f2, fd, flags = a[2:]
302 if f: 312 if f:
303 repo.ui.note(_("moving %s to %s\n") % (f, fd)) 313 repo.ui.note(_("moving %s to %s\n") % (f, fd))
304 t = wctx.filectx(f).data() 314 t = wctx.filectx(f).data()