144 if n != m2[f]: |
144 if n != m2[f]: |
145 a = ma.get(f, nullid) |
145 a = ma.get(f, nullid) |
146 # are both different from the ancestor? |
146 # are both different from the ancestor? |
147 if not overwrite and n != a and m2[f] != a: |
147 if not overwrite and n != a and m2[f] != a: |
148 repo.ui.debug(_(" %s versions differ, resolve\n") % f) |
148 repo.ui.debug(_(" %s versions differ, resolve\n") % f) |
149 action.append((f, fmerge(f, m1, m2, ma), n[:20], m2[f])) |
149 action.append((f, "m", fmerge(f, m1, m2, ma), n[:20], m2[f])) |
150 queued = 1 |
150 queued = 1 |
151 # are we clobbering? |
151 # are we clobbering? |
152 # is remote's version newer? |
152 # is remote's version newer? |
153 # or are we going back in time and clean? |
153 # or are we going back in time and clean? |
154 elif overwrite or m2[f] != a or (backwards and not n[20:]): |
154 elif overwrite or m2[f] != a or (backwards and not n[20:]): |
155 repo.ui.debug(_(" remote %s is newer, get\n") % f) |
155 repo.ui.debug(_(" remote %s is newer, get\n") % f) |
156 action.append((f, m2.execf(f), m2[f], None)) |
156 action.append((f, "g", m2.execf(f), m2[f])) |
157 queued = 1 |
157 queued = 1 |
158 elif n[20:] in ("u","a"): |
158 elif n[20:] in ("u","a"): |
159 # this unknown file is the same as the checkout |
159 # this unknown file is the same as the checkout |
160 # we need to reset the dirstate if the file was added |
160 # we need to reset the dirstate if the file was added |
161 action.append((f, m2.execf(f), m2[f], None)) |
161 action.append((f, "g", m2.execf(f), m2[f])) |
162 |
162 |
163 # do we still need to look at mode bits? |
163 # do we still need to look at mode bits? |
164 if not queued and m1.execf(f) != m2.execf(f): |
164 if not queued and m1.execf(f) != m2.execf(f): |
165 if overwrite: |
165 if overwrite: |
166 repo.ui.debug(_(" updating permissions for %s\n") % f) |
166 repo.ui.debug(_(" updating permissions for %s\n") % f) |
177 if not overwrite: |
177 if not overwrite: |
178 r = repo.ui.prompt( |
178 r = repo.ui.prompt( |
179 (_(" local changed %s which remote deleted\n") % f) + |
179 (_(" local changed %s which remote deleted\n") % f) + |
180 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
180 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
181 if r == _("d"): |
181 if r == _("d"): |
182 action.append((f, None, None, None)) |
182 action.append((f, "r")) |
183 else: |
183 else: |
184 repo.ui.debug(_("other deleted %s\n") % f) |
184 repo.ui.debug(_("other deleted %s\n") % f) |
185 action.append((f, None, None, None)) |
185 action.append((f, "r")) |
186 else: |
186 else: |
187 # file is created on branch or in working directory |
187 # file is created on branch or in working directory |
188 if overwrite and n[20:] != "u": |
188 if overwrite and n[20:] != "u": |
189 repo.ui.debug(_("remote deleted %s, clobbering\n") % f) |
189 repo.ui.debug(_("remote deleted %s, clobbering\n") % f) |
190 action.append((f, None, None, None)) |
190 action.append((f, "r")) |
191 elif not n[20:]: # same as parent |
191 elif not n[20:]: # same as parent |
192 if backwards: |
192 if backwards: |
193 repo.ui.debug(_("remote deleted %s\n") % f) |
193 repo.ui.debug(_("remote deleted %s\n") % f) |
194 action.append((f, None, None, None)) |
194 action.append((f, "r")) |
195 else: |
195 else: |
196 repo.ui.debug(_("local modified %s, keeping\n") % f) |
196 repo.ui.debug(_("local modified %s, keeping\n") % f) |
197 else: |
197 else: |
198 repo.ui.debug(_("working dir created %s, keeping\n") % f) |
198 repo.ui.debug(_("working dir created %s, keeping\n") % f) |
199 |
199 |
205 if not overwrite: |
205 if not overwrite: |
206 r = repo.ui.prompt( |
206 r = repo.ui.prompt( |
207 (_("remote changed %s which local deleted\n") % f) + |
207 (_("remote changed %s which local deleted\n") % f) + |
208 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
208 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
209 if r == _("k"): |
209 if r == _("k"): |
210 action.append((f, m2.execf(f), n, None)) |
210 action.append((f, "g", m2.execf(f), n)) |
211 elif f not in ma: |
211 elif f not in ma: |
212 repo.ui.debug(_("remote created %s\n") % f) |
212 repo.ui.debug(_("remote created %s\n") % f) |
213 action.append((f, m2.execf(f), n, None)) |
213 action.append((f, "g", m2.execf(f), n)) |
214 else: |
214 else: |
215 if overwrite or backwards: |
215 if overwrite or backwards: |
216 repo.ui.debug(_("local deleted %s, recreating\n") % f) |
216 repo.ui.debug(_("local deleted %s, recreating\n") % f) |
217 action.append((f, m2.execf(f), n, None)) |
217 action.append((f, "g", m2.execf(f), n)) |
218 else: |
218 else: |
219 repo.ui.debug(_("local deleted %s\n") % f) |
219 repo.ui.debug(_("local deleted %s\n") % f) |
220 |
220 |
221 del m1, m2, ma |
221 del m1, m2, ma |
222 |
222 |
235 |
235 |
236 # update files |
236 # update files |
237 updated, merged, removed, unresolved = 0, 0, 0, 0 |
237 updated, merged, removed, unresolved = 0, 0, 0, 0 |
238 action.sort() |
238 action.sort() |
239 for a in action: |
239 for a in action: |
240 f, flag, my, other = a |
240 f, m = a[:2] |
241 if f[0] == "/": |
241 if f[0] == "/": |
242 continue |
242 continue |
243 if not my: |
243 if m == "r": # remove |
244 repo.ui.note(_("removing %s\n") % f) |
244 repo.ui.note(_("removing %s\n") % f) |
245 util.audit_path(f) |
245 util.audit_path(f) |
246 try: |
246 try: |
247 util.unlink(repo.wjoin(f)) |
247 util.unlink(repo.wjoin(f)) |
248 except OSError, inst: |
248 except OSError, inst: |
249 if inst.errno != errno.ENOENT: |
249 if inst.errno != errno.ENOENT: |
250 repo.ui.warn(_("update failed to remove %s: %s!\n") % |
250 repo.ui.warn(_("update failed to remove %s: %s!\n") % |
251 (f, inst.strerror)) |
251 (f, inst.strerror)) |
252 removed +=1 |
252 removed +=1 |
253 elif other: |
253 elif m == "m": # merge |
|
254 flag, my, other = a[2:] |
254 repo.ui.status(_("merging %s\n") % f) |
255 repo.ui.status(_("merging %s\n") % f) |
255 if merge3(repo, f, my, other, xp1, xp2): |
256 if merge3(repo, f, my, other, xp1, xp2): |
256 unresolved += 1 |
257 unresolved += 1 |
257 util.set_exec(repo.wjoin(f), flag) |
258 util.set_exec(repo.wjoin(f), flag) |
258 merged += 1 |
259 merged += 1 |
259 else: |
260 elif m == "g": # get |
|
261 flag, node = a[2:] |
260 repo.ui.note(_("getting %s\n") % f) |
262 repo.ui.note(_("getting %s\n") % f) |
261 t = repo.file(f).read(my) |
263 t = repo.file(f).read(node) |
262 repo.wwrite(f, t) |
264 repo.wwrite(f, t) |
263 util.set_exec(repo.wjoin(f), flag) |
265 util.set_exec(repo.wjoin(f), flag) |
264 updated += 1 |
266 updated += 1 |
265 |
267 |
266 # update dirstate |
268 # update dirstate |
267 if not partial: |
269 if not partial: |
268 repo.dirstate.setparents(p1, p2) |
270 repo.dirstate.setparents(p1, p2) |
269 repo.dirstate.forget(forget) |
271 repo.dirstate.forget(forget) |
270 for a in action: |
272 for a in action: |
271 f, flag, my, other = a |
273 f, m = a[:2] |
272 if not my: |
274 if m == "r": # remove |
273 if branchmerge: |
275 if branchmerge: |
274 repo.dirstate.update([f], 'r') |
276 repo.dirstate.update([f], 'r') |
275 else: |
277 else: |
276 repo.dirstate.forget([f]) |
278 repo.dirstate.forget([f]) |
277 elif not other: |
279 elif m == "g": # get |
278 if branchmerge: |
280 if branchmerge: |
279 repo.dirstate.update([f], 'n', st_mtime=-1) |
281 repo.dirstate.update([f], 'n', st_mtime=-1) |
280 else: |
282 else: |
281 repo.dirstate.update([f], 'n') |
283 repo.dirstate.update([f], 'n') |
282 else: |
284 elif m == "m": # merge |
|
285 flag, my, other = a[2:] |
283 if branchmerge: |
286 if branchmerge: |
284 # We've done a branch merge, mark this file as merged |
287 # We've done a branch merge, mark this file as merged |
285 # so that we properly record the merger later |
288 # so that we properly record the merger later |
286 repo.dirstate.update([f], 'm') |
289 repo.dirstate.update([f], 'm') |
287 else: |
290 else: |