comparison mercurial/merge.py @ 3007:962b9c7df641

merge: add remove to the action hash
author Matt Mackall <mpm@selenic.com>
date Tue, 22 Aug 2006 19:12:09 -0500
parents 87a0332ab58b
children db3f42261452 92a0c2200e41
comparison
equal deleted inserted replaced
3006:87a0332ab58b 3007:962b9c7df641
109 (overwrite, branchmerge, bool(partial), linear_path)) 109 (overwrite, branchmerge, bool(partial), linear_path))
110 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % 110 repo.ui.debug(_(" ancestor %s local %s remote %s\n") %
111 (short(man), short(m1n), short(m2n))) 111 (short(man), short(m1n), short(m2n)))
112 112
113 action = {} 113 action = {}
114 remove = []
115 forget = [] 114 forget = []
116 115
117 # update m1 from working dir 116 # update m1 from working dir
118 umap = dict.fromkeys(unknown) 117 umap = dict.fromkeys(unknown)
119 118
180 if not overwrite: 179 if not overwrite:
181 r = repo.ui.prompt( 180 r = repo.ui.prompt(
182 (_(" local changed %s which remote deleted\n") % f) + 181 (_(" local changed %s which remote deleted\n") % f) +
183 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) 182 _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
184 if r == _("d"): 183 if r == _("d"):
185 remove.append(f) 184 action[f] = (None, None, None)
186 else: 185 else:
187 repo.ui.debug(_("other deleted %s\n") % f) 186 repo.ui.debug(_("other deleted %s\n") % f)
188 remove.append(f) # other deleted it 187 action[f] = (None, None, None)
189 else: 188 else:
190 # file is created on branch or in working directory 189 # file is created on branch or in working directory
191 if overwrite and f not in umap: 190 if overwrite and f not in umap:
192 repo.ui.debug(_("remote deleted %s, clobbering\n") % f) 191 repo.ui.debug(_("remote deleted %s, clobbering\n") % f)
193 remove.append(f) 192 action[f] = (None, None, None)
194 elif not n[20:]: # same as parent 193 elif not n[20:]: # same as parent
195 if backwards: 194 if backwards:
196 repo.ui.debug(_("remote deleted %s\n") % f) 195 repo.ui.debug(_("remote deleted %s\n") % f)
197 remove.append(f) 196 action[f] = (None, None, None)
198 else: 197 else:
199 repo.ui.debug(_("local modified %s, keeping\n") % f) 198 repo.ui.debug(_("local modified %s, keeping\n") % f)
200 else: 199 else:
201 repo.ui.debug(_("working dir created %s, keeping\n") % f) 200 repo.ui.debug(_("working dir created %s, keeping\n") % f)
202 201
236 235
237 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2) 236 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2)
238 237
239 # update files 238 # update files
240 unresolved = [] 239 unresolved = []
241 updated = 0 240 updated, merged, removed = 0, 0, 0
242 merged = 0
243 files = action.keys() 241 files = action.keys()
244 files.sort() 242 files.sort()
245 for f in files: 243 for f in files:
246 flag, my, other = action[f] 244 flag, my, other = action[f]
247 if f[0] == "/": 245 if f[0] == "/":
248 continue 246 continue
249 if other: 247 if not my:
248 repo.ui.note(_("removing %s\n") % f)
249 util.audit_path(f)
250 try:
251 util.unlink(repo.wjoin(f))
252 except OSError, inst:
253 if inst.errno != errno.ENOENT:
254 repo.ui.warn(_("update failed to remove %s: %s!\n") %
255 (f, inst.strerror))
256 removed +=1
257 elif other:
250 repo.ui.status(_("merging %s\n") % f) 258 repo.ui.status(_("merging %s\n") % f)
251 if merge3(repo, f, my, other, xp1, xp2): 259 if merge3(repo, f, my, other, xp1, xp2):
252 unresolved.append(f) 260 unresolved.append(f)
261 util.set_exec(repo.wjoin(f), flag)
253 merged += 1 262 merged += 1
254 else: 263 else:
255 repo.ui.note(_("getting %s\n") % f) 264 repo.ui.note(_("getting %s\n") % f)
256 t = repo.file(f).read(my) 265 t = repo.file(f).read(my)
257 repo.wwrite(f, t) 266 repo.wwrite(f, t)
267 util.set_exec(repo.wjoin(f), flag)
258 updated += 1 268 updated += 1
259 util.set_exec(repo.wjoin(f), flag)
260
261 remove.sort()
262 for f in remove:
263 repo.ui.note(_("removing %s\n") % f)
264 util.audit_path(f)
265 try:
266 util.unlink(repo.wjoin(f))
267 except OSError, inst:
268 if inst.errno != errno.ENOENT:
269 repo.ui.warn(_("update failed to remove %s: %s!\n") %
270 (f, inst.strerror))
271 269
272 # update dirstate 270 # update dirstate
273 if not partial: 271 if not partial:
274 repo.dirstate.setparents(p1, p2) 272 repo.dirstate.setparents(p1, p2)
275 repo.dirstate.forget(forget) 273 repo.dirstate.forget(forget)
276 if branchmerge:
277 repo.dirstate.update(remove, 'r')
278 else:
279 repo.dirstate.forget(remove)
280
281 files = action.keys() 274 files = action.keys()
282 files.sort() 275 files.sort()
283 for f in files: 276 for f in files:
284 flag, my, other = action[f] 277 flag, my, other = action[f]
285 if not other: 278 if not my:
279 if branchmerge:
280 repo.dirstate.update([f], 'r')
281 else:
282 repo.dirstate.forget([f])
283 elif not other:
286 if branchmerge: 284 if branchmerge:
287 repo.dirstate.update([f], 'n', st_mtime=-1) 285 repo.dirstate.update([f], 'n', st_mtime=-1)
288 else: 286 else:
289 repo.dirstate.update([f], 'n') 287 repo.dirstate.update([f], 'n')
290 else: 288 else:
303 repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1) 301 repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1)
304 302
305 if show_stats: 303 if show_stats:
306 stats = ((updated, _("updated")), 304 stats = ((updated, _("updated")),
307 (merged - len(unresolved), _("merged")), 305 (merged - len(unresolved), _("merged")),
308 (len(remove), _("removed")), 306 (removed, _("removed")),
309 (len(unresolved), _("unresolved"))) 307 (len(unresolved), _("unresolved")))
310 note = ", ".join([_("%d files %s") % s for s in stats]) 308 note = ", ".join([_("%d files %s") % s for s in stats])
311 repo.ui.status("%s\n" % note) 309 repo.ui.status("%s\n" % note)
312 if not partial: 310 if not partial:
313 if branchmerge: 311 if branchmerge: