comparison mercurial/patch.py @ 14609:f53dc0787424

patch: extend filtestore to store an optional copy source This will help wrapping filestores in memctx.
author Patrick Mezard <pmezard@gmail.com>
date Tue, 14 Jun 2011 23:24:34 +0200
parents d0c2cc11e611
children adbf5e7df96d
comparison
equal deleted inserted replaced
14608:4aef71839337 14609:f53dc0787424
489 def __init__(self): 489 def __init__(self):
490 self.opener = None 490 self.opener = None
491 self.files = {} 491 self.files = {}
492 self.created = 0 492 self.created = 0
493 493
494 def setfile(self, fname, data, mode): 494 def setfile(self, fname, data, mode, copied=None):
495 if self.opener is None: 495 if self.opener is None:
496 root = tempfile.mkdtemp(prefix='hg-patch-') 496 root = tempfile.mkdtemp(prefix='hg-patch-')
497 self.opener = scmutil.opener(root) 497 self.opener = scmutil.opener(root)
498 # Avoid filename issues with these simple names 498 # Avoid filename issues with these simple names
499 fn = str(self.created) 499 fn = str(self.created)
500 self.opener.write(fn, data) 500 self.opener.write(fn, data)
501 self.created += 1 501 self.created += 1
502 self.files[fname] = (fn, mode) 502 self.files[fname] = (fn, mode, copied)
503 503
504 def getfile(self, fname): 504 def getfile(self, fname):
505 if fname not in self.files: 505 if fname not in self.files:
506 raise IOError() 506 raise IOError()
507 fn, mode = self.files[fname] 507 fn, mode, copied = self.files[fname]
508 return self.opener.read(fn), mode 508 return self.opener.read(fn), mode, copied
509 509
510 def close(self): 510 def close(self):
511 if self.opener: 511 if self.opener:
512 shutil.rmtree(self.opener.base) 512 shutil.rmtree(self.opener.base)
513 513
533 try: 533 try:
534 if self.copysource is None: 534 if self.copysource is None:
535 data, mode = backend.getfile(self.fname) 535 data, mode = backend.getfile(self.fname)
536 self.exists = True 536 self.exists = True
537 else: 537 else:
538 data, mode = store.getfile(self.copysource) 538 data, mode = store.getfile(self.copysource)[:2]
539 self.exists = backend.exists(self.fname) 539 self.exists = backend.exists(self.fname)
540 self.missing = False 540 self.missing = False
541 if data: 541 if data:
542 self.lines = data.splitlines(True) 542 self.lines = data.splitlines(True)
543 if self.mode is None: 543 if self.mode is None:
1246 if gp.op == 'DELETE': 1246 if gp.op == 'DELETE':
1247 backend.unlink(gp.path) 1247 backend.unlink(gp.path)
1248 continue 1248 continue
1249 data, mode = None, None 1249 data, mode = None, None
1250 if gp.op in ('RENAME', 'COPY'): 1250 if gp.op in ('RENAME', 'COPY'):
1251 data, mode = store.getfile(gp.oldpath) 1251 data, mode = store.getfile(gp.oldpath)[:2]
1252 if gp.mode: 1252 if gp.mode:
1253 mode = gp.mode 1253 mode = gp.mode
1254 if gp.op == 'ADD': 1254 if gp.op == 'ADD':
1255 # Added files without content have no hunk and 1255 # Added files without content have no hunk and
1256 # must be created 1256 # must be created