##// END OF EJS Templates
symlinks: minimal support for symlinks in merge/update...
Matt Mackall -
r4007:20da40cc default
parent child Browse files
Show More
@@ -508,7 +508,10 b' class localrepository(repo.repository):'
508 508 def wwrite(self, filename, data, flags):
509 509 data = self._filter("decode", filename, data)
510 510 if "l" in flags:
511 try:
511 512 os.unlink(self.wjoin(filename))
513 except OSError:
514 pass
512 515 os.symlink(data, self.wjoin(filename))
513 516 else:
514 517 try:
@@ -220,12 +220,17 b' def manifestmerge(repo, p1, p2, pa, over'
220 220 copy = {}
221 221
222 222 def fmerge(f, f2=None, fa=None):
223 """merge executable flags"""
223 """merge flags"""
224 224 if not f2:
225 225 f2 = f
226 226 fa = f
227 227 a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
228 return ((a^b) | (a^c)) ^ a
228 if ((a^b) | (a^c)) ^ a:
229 return 'x'
230 a, b, c = ma.linkf(fa), m1.linkf(f), m2.linkf(f2)
231 if ((a^b) | (a^c)) ^ a:
232 return 'l'
233 return ''
229 234
230 235 def act(msg, m, f, *args):
231 236 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
@@ -250,21 +255,21 b' def manifestmerge(repo, p1, p2, pa, over'
250 255 # is remote's version newer?
251 256 # or are we going back in time and clean?
252 257 elif overwrite or m2[f] != a or (backwards and not n[20:]):
253 act("remote is newer", "g", f, m2.execf(f))
258 act("remote is newer", "g", f, m2.flags(f))
254 259 # local is newer, not overwrite, check mode bits
255 elif fmerge(f) != m1.execf(f):
256 act("update permissions", "e", f, m2.execf(f))
260 elif fmerge(f) != m1.flags(f):
261 act("update permissions", "e", f, m2.flags(f))
257 262 # contents same, check mode bits
258 elif m1.execf(f) != m2.execf(f):
259 if overwrite or fmerge(f) != m1.execf(f):
260 act("update permissions", "e", f, m2.execf(f))
263 elif m1.flags(f) != m2.flags(f):
264 if overwrite or fmerge(f) != m1.flags(f):
265 act("update permissions", "e", f, m2.flags(f))
261 266 elif f in copied:
262 267 continue
263 268 elif f in copy:
264 269 f2 = copy[f]
265 270 if f2 not in m2: # directory rename
266 271 act("remote renamed directory to " + f2, "d",
267 f, None, f2, m1.execf(f))
272 f, None, f2, m1.flags(f))
268 273 elif f2 in m1: # case 2 A,B/B/B
269 274 act("local copied to " + f2, "m",
270 275 f, f2, f, fmerge(f, f2, f2), False)
@@ -295,7 +300,7 b' def manifestmerge(repo, p1, p2, pa, over'
295 300 f2 = copy[f]
296 301 if f2 not in m1: # directory rename
297 302 act("local renamed directory to " + f2, "d",
298 None, f, f2, m2.execf(f))
303 None, f, f2, m2.flags(f))
299 304 elif f2 in m2: # rename case 1, A/A,B/A
300 305 act("remote copied to " + f, "m",
301 306 f2, f, f, fmerge(f2, f, f2), False)
@@ -304,14 +309,14 b' def manifestmerge(repo, p1, p2, pa, over'
304 309 f2, f, f, fmerge(f2, f, f2), True)
305 310 elif f in ma:
306 311 if overwrite or backwards:
307 act("recreating", "g", f, m2.execf(f))
312 act("recreating", "g", f, m2.flags(f))
308 313 elif n != ma[f]:
309 314 if repo.ui.prompt(
310 315 (_("remote changed %s which local deleted\n") % f) +
311 316 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
312 act("prompt recreating", "g", f, m2.execf(f))
317 act("prompt recreating", "g", f, m2.flags(f))
313 318 else:
314 act("remote created", "g", f, m2.execf(f))
319 act("remote created", "g", f, m2.flags(f))
315 320
316 321 return action
317 322
@@ -335,7 +340,7 b' def applyupdates(repo, action, wctx, mct'
335 340 (f, inst.strerror))
336 341 removed += 1
337 342 elif m == "m": # merge
338 f2, fd, flag, move = a[2:]
343 f2, fd, flags, move = a[2:]
339 344 r = filemerge(repo, f, f2, wctx, mctx)
340 345 if r > 0:
341 346 unresolved += 1
@@ -346,32 +351,32 b' def applyupdates(repo, action, wctx, mct'
346 351 merged += 1
347 352 if f != fd:
348 353 repo.ui.debug(_("copying %s to %s\n") % (f, fd))
349 repo.wwrite(fd, repo.wread(f), flag and 'x' or '')
354 repo.wwrite(fd, repo.wread(f), flags)
350 355 if move:
351 356 repo.ui.debug(_("removing %s\n") % f)
352 357 os.unlink(repo.wjoin(f))
353 util.set_exec(repo.wjoin(fd), flag)
358 util.set_exec(repo.wjoin(fd), "x" in flags)
354 359 elif m == "g": # get
355 flag = a[2]
360 flags = a[2]
356 361 repo.ui.note(_("getting %s\n") % f)
357 362 t = mctx.filectx(f).data()
358 repo.wwrite(f, t, flag and 'x' or '')
363 repo.wwrite(f, t, flags)
359 364 updated += 1
360 365 elif m == "d": # directory rename
361 f2, fd, flag = a[2:]
366 f2, fd, flags = a[2:]
362 367 if f:
363 368 repo.ui.note(_("moving %s to %s\n") % (f, fd))
364 369 t = wctx.filectx(f).data()
365 repo.wwrite(fd, t, flag and 'x' or '')
370 repo.wwrite(fd, t, flags)
366 371 util.unlink(repo.wjoin(f))
367 372 if f2:
368 373 repo.ui.note(_("getting %s to %s\n") % (f2, fd))
369 374 t = mctx.filectx(f2).data()
370 repo.wwrite(fd, t, flag and 'x' or '')
375 repo.wwrite(fd, t, flags)
371 376 updated += 1
372 377 elif m == "e": # exec
373 flag = a[2]
374 util.set_exec(repo.wjoin(f), flag)
378 flags = a[2]
379 util.set_exec(repo.wjoin(f), flags)
375 380
376 381 return updated, merged, removed, unresolved
377 382
General Comments 0
You need to be logged in to leave comments. Login now