Mercurial > hg
comparison mercurial/merge.py @ 2978: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 | 92a0c2200e41 db3f42261452 |
comparison
equal
deleted
inserted
replaced
2977:87a0332ab58b | 2978: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: |