155 repo.ui.debug(_(" %s versions differ, resolve\n") % f) |
155 repo.ui.debug(_(" %s versions differ, resolve\n") % f) |
156 # merge executable bits |
156 # merge executable bits |
157 # "if we changed or they changed, change in merge" |
157 # "if we changed or they changed, change in merge" |
158 a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f) |
158 a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f) |
159 mode = ((a^b) | (a^c)) ^ a |
159 mode = ((a^b) | (a^c)) ^ a |
160 merge[f] = (m1.get(f, nullid), m2[f], mode) |
160 merge[f] = (mode, m1.get(f, nullid), m2[f]) |
161 s = 1 |
161 s = 1 |
162 # are we clobbering? |
162 # are we clobbering? |
163 # is remote's version newer? |
163 # is remote's version newer? |
164 # or are we going back in time? |
164 # or are we going back in time? |
165 elif overwrite or m2[f] != a or (p2 == pa and mw[f] == m1[f]): |
165 elif overwrite or m2[f] != a or (p2 == pa and mw[f] == m1[f]): |
166 repo.ui.debug(_(" remote %s is newer, get\n") % f) |
166 repo.ui.debug(_(" remote %s is newer, get\n") % f) |
167 get[f] = m2[f] |
167 get[f] = (m2.execf(f), m2[f]) |
168 s = 1 |
168 s = 1 |
169 elif f in umap or f in added: |
169 elif f in umap or f in added: |
170 # this unknown file is the same as the checkout |
170 # this unknown file is the same as the checkout |
171 # we need to reset the dirstate if the file was added |
171 # we need to reset the dirstate if the file was added |
172 get[f] = m2[f] |
172 get[f] = (m2.execf(f), m2[f]) |
173 |
173 |
174 if not s and mfw.execf(f) != mf2.execf(f): |
174 if not s and mfw.execf(f) != mf2.execf(f): |
175 if overwrite: |
175 if overwrite: |
176 repo.ui.debug(_(" updating permissions for %s\n") % f) |
176 repo.ui.debug(_(" updating permissions for %s\n") % f) |
177 util.set_exec(repo.wjoin(f), mf2.execf(f)) |
177 util.set_exec(repo.wjoin(f), mf2.execf(f)) |
219 if not overwrite and (linear_path or branchmerge): |
219 if not overwrite and (linear_path or branchmerge): |
220 r = repo.ui.prompt( |
220 r = repo.ui.prompt( |
221 (_("remote changed %s which local deleted\n") % f) + |
221 (_("remote changed %s which local deleted\n") % f) + |
222 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
222 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) |
223 if r == _("k"): |
223 if r == _("k"): |
224 get[f] = n |
224 get[f] = (m2.execf(f), n) |
225 elif f not in ma: |
225 elif f not in ma: |
226 repo.ui.debug(_("remote created %s\n") % f) |
226 repo.ui.debug(_("remote created %s\n") % f) |
227 get[f] = n |
227 get[f] = (m2.execf(f), n) |
228 else: |
228 else: |
229 if overwrite or p2 == pa: # going backwards? |
229 if overwrite or p2 == pa: # going backwards? |
230 repo.ui.debug(_("local deleted %s, recreating\n") % f) |
230 repo.ui.debug(_("local deleted %s, recreating\n") % f) |
231 get[f] = n |
231 get[f] = (m2.execf(f), n) |
232 else: |
232 else: |
233 repo.ui.debug(_("local deleted %s\n") % f) |
233 repo.ui.debug(_("local deleted %s\n") % f) |
234 |
234 |
235 del mw, m1, m2, ma |
235 del mw, m1, m2, ma |
236 |
236 |
237 if overwrite: |
237 if overwrite: |
238 for f in merge: |
238 for f in merge: |
239 get[f] = merge[f][1] |
239 get[f] = merge[f][:2] |
240 merge = {} |
240 merge = {} |
241 |
241 |
242 if linear_path or overwrite: |
242 if linear_path or overwrite: |
243 # we don't need to do any magic, just jump to the new rev |
243 # we don't need to do any magic, just jump to the new rev |
244 p1, p2 = p2, nullid |
244 p1, p2 = p2, nullid |
252 |
252 |
253 # get the files we don't need to change |
253 # get the files we don't need to change |
254 files = get.keys() |
254 files = get.keys() |
255 files.sort() |
255 files.sort() |
256 for f in files: |
256 for f in files: |
|
257 flag, node = get[f] |
257 if f[0] == "/": |
258 if f[0] == "/": |
258 continue |
259 continue |
259 repo.ui.note(_("getting %s\n") % f) |
260 repo.ui.note(_("getting %s\n") % f) |
260 t = repo.file(f).read(get[f]) |
261 t = repo.file(f).read(node) |
261 repo.wwrite(f, t) |
262 repo.wwrite(f, t) |
262 util.set_exec(repo.wjoin(f), mf2.execf(f)) |
263 util.set_exec(repo.wjoin(f), flag) |
263 if not partial: |
264 if not partial: |
264 if branchmerge: |
265 if branchmerge: |
265 repo.dirstate.update([f], 'n', st_mtime=-1) |
266 repo.dirstate.update([f], 'n', st_mtime=-1) |
266 else: |
267 else: |
267 repo.dirstate.update([f], 'n') |
268 repo.dirstate.update([f], 'n') |
270 unresolved = [] |
271 unresolved = [] |
271 files = merge.keys() |
272 files = merge.keys() |
272 files.sort() |
273 files.sort() |
273 for f in files: |
274 for f in files: |
274 repo.ui.status(_("merging %s\n") % f) |
275 repo.ui.status(_("merging %s\n") % f) |
275 my, other, flag = merge[f] |
276 flag, my, other = merge[f] |
276 ret = merge3(repo, f, my, other, xp1, xp2) |
277 ret = merge3(repo, f, my, other, xp1, xp2) |
277 if ret: |
278 if ret: |
278 unresolved.append(f) |
279 unresolved.append(f) |
279 util.set_exec(repo.wjoin(f), flag) |
280 util.set_exec(repo.wjoin(f), flag) |
280 if not partial: |
281 if not partial: |