comparison mercurial/patch.py @ 14390:ce77c275bec3

patch: merge backend setmode() into writelines() Copy handling will be easier to handle in a single method.
author Patrick Mezard <pmezard@gmail.com>
date Thu, 19 May 2011 22:44:01 +0200
parents 909ac6b9636b
children 1e64e1e12195
comparison
equal deleted inserted replaced
14389:909ac6b9636b 14390:ce77c275bec3
370 """Return target file lines, or its content as a single line 370 """Return target file lines, or its content as a single line
371 for symlinks. 371 for symlinks.
372 """ 372 """
373 raise NotImplementedError 373 raise NotImplementedError
374 374
375 def writelines(self, fname, lines, mode): 375 def setfile(self, fname, lines, mode):
376 """Write lines to target file. mode is a (islink, isexec) 376 """Write lines to target file. mode is a (islink, isexec)
377 tuple, or None if there is no mode information. 377 tuple, or None if there is no mode information. If lines is None,
378 the file must exists and its content is left unchanged.
378 """ 379 """
379 raise NotImplementedError 380 raise NotImplementedError
380 381
381 def unlink(self, fname): 382 def unlink(self, fname):
382 """Unlink target file.""" 383 """Unlink target file."""
395 directory. 396 directory.
396 """ 397 """
397 raise NotImplementedError 398 raise NotImplementedError
398 399
399 def exists(self, fname): 400 def exists(self, fname):
400 raise NotImplementedError
401
402 def setmode(self, fname, islink, isexec):
403 """Change target file mode."""
404 raise NotImplementedError 401 raise NotImplementedError
405 402
406 class fsbackend(abstractbackend): 403 class fsbackend(abstractbackend):
407 def __init__(self, ui, basedir): 404 def __init__(self, ui, basedir):
408 super(fsbackend, self).__init__(ui) 405 super(fsbackend, self).__init__(ui)
418 try: 415 try:
419 return list(fp) 416 return list(fp)
420 finally: 417 finally:
421 fp.close() 418 fp.close()
422 419
423 def writelines(self, fname, lines, mode): 420 def setfile(self, fname, lines, mode):
421 if lines is None:
422 if mode:
423 util.setflags(self._join(fname), mode[0], mode[1])
424 return
424 if not mode: 425 if not mode:
425 # Preserve mode information 426 # Preserve mode information
426 isexec, islink = False, False 427 isexec, islink = False, False
427 try: 428 try:
428 isexec = os.lstat(self._join(fname)).st_mode & 0100 != 0 429 isexec = os.lstat(self._join(fname)).st_mode & 0100 != 0
473 util.copyfile(abssrc, absdst) 474 util.copyfile(abssrc, absdst)
474 475
475 def exists(self, fname): 476 def exists(self, fname):
476 return os.path.lexists(self._join(fname)) 477 return os.path.lexists(self._join(fname))
477 478
478 def setmode(self, fname, islink, isexec):
479 util.setflags(self._join(fname), islink, isexec)
480
481 class workingbackend(fsbackend): 479 class workingbackend(fsbackend):
482 def __init__(self, ui, repo, similarity): 480 def __init__(self, ui, repo, similarity):
483 super(workingbackend, self).__init__(ui, repo.root) 481 super(workingbackend, self).__init__(ui, repo.root)
484 self.repo = repo 482 self.repo = repo
485 self.similarity = similarity 483 self.similarity = similarity
486 self.removed = set() 484 self.removed = set()
487 self.changed = set() 485 self.changed = set()
488 self.copied = [] 486 self.copied = []
489 487
490 def writelines(self, fname, lines, mode): 488 def setfile(self, fname, lines, mode):
491 super(workingbackend, self).writelines(fname, lines, mode) 489 super(workingbackend, self).setfile(fname, lines, mode)
492 self.changed.add(fname) 490 self.changed.add(fname)
493 491
494 def unlink(self, fname): 492 def unlink(self, fname):
495 super(workingbackend, self).unlink(fname) 493 super(workingbackend, self).unlink(fname)
496 self.removed.add(fname) 494 self.removed.add(fname)
498 496
499 def copy(self, src, dst): 497 def copy(self, src, dst):
500 super(workingbackend, self).copy(src, dst) 498 super(workingbackend, self).copy(src, dst)
501 self.copied.append((src, dst)) 499 self.copied.append((src, dst))
502 self.changed.add(dst) 500 self.changed.add(dst)
503
504 def setmode(self, fname, islink, isexec):
505 super(workingbackend, self).setmode(fname, islink, isexec)
506 self.changed.add(fname)
507 501
508 def close(self): 502 def close(self):
509 wctx = self.repo[None] 503 wctx = self.repo[None]
510 addremoved = set(self.changed) 504 addremoved = set(self.changed)
511 for src, dst in self.copied: 505 for src, dst in self.copied:
583 if l and l[-1] == '\n': 577 if l and l[-1] == '\n':
584 l = l[:-1] + eol 578 l = l[:-1] + eol
585 rawlines.append(l) 579 rawlines.append(l)
586 lines = rawlines 580 lines = rawlines
587 581
588 self.backend.writelines(fname, lines, mode) 582 self.backend.setfile(fname, lines, mode)
589 583
590 def printfile(self, warn): 584 def printfile(self, warn):
591 if self.fileprinted: 585 if self.fileprinted:
592 return 586 return
593 if warn or self.ui.verbose: 587 if warn or self.ui.verbose:
1250 backend.unlink(path) 1244 backend.unlink(path)
1251 continue 1245 continue
1252 if gp.op == 'RENAME': 1246 if gp.op == 'RENAME':
1253 backend.unlink(pstrip(gp.oldpath)) 1247 backend.unlink(pstrip(gp.oldpath))
1254 if gp.mode and not first_hunk: 1248 if gp.mode and not first_hunk:
1249 data = None
1255 if gp.op == 'ADD': 1250 if gp.op == 'ADD':
1256 # Added files without content have no hunk and must be created 1251 # Added files without content have no hunk and
1257 backend.writelines(path, [], gp.mode) 1252 # must be created
1258 else: 1253 data = []
1259 backend.setmode(path, gp.mode[0], gp.mode[1]) 1254 backend.setfile(path, data, gp.mode)
1260 if not first_hunk: 1255 if not first_hunk:
1261 continue 1256 continue
1262 try: 1257 try:
1263 mode = gp and gp.mode or None 1258 mode = gp and gp.mode or None
1264 current_file, missing = selectfile(backend, afile, bfile, 1259 current_file, missing = selectfile(backend, afile, bfile,