comparison hgext/convert/common.py @ 51687:1eab9e40c0c8

convert: fix various leaked file descriptors Some of these only leaked if an exception occurred between the open and close, but a lot of these leaked unconditionally. A type hint is added to `parsesplicemap` because otherwise this change caused pytype to change the return type from this to `Dict[nothing, nothing]`.
author Matt Harbison <matt_harbison@yahoo.com>
date Thu, 11 Jul 2024 21:54:02 -0400
parents 39033e7a6e0a
children f4733654f144
comparison
equal deleted inserted replaced
51686:39033e7a6e0a 51687:1eab9e40c0c8
573 return 573 return
574 try: 574 try:
575 fp = open(self.path, b'rb') 575 fp = open(self.path, b'rb')
576 except FileNotFoundError: 576 except FileNotFoundError:
577 return 577 return
578 for i, line in enumerate(fp): 578
579 line = line.splitlines()[0].rstrip() 579 try:
580 if not line: 580 for i, line in enumerate(fp):
581 # Ignore blank lines 581 line = line.splitlines()[0].rstrip()
582 continue 582 if not line:
583 try: 583 # Ignore blank lines
584 key, value = line.rsplit(b' ', 1) 584 continue
585 except ValueError: 585 try:
586 raise error.Abort( 586 key, value = line.rsplit(b' ', 1)
587 _(b'syntax error in %s(%d): key/value pair expected') 587 except ValueError:
588 % (self.path, i + 1) 588 raise error.Abort(
589 ) 589 _(b'syntax error in %s(%d): key/value pair expected')
590 if key not in self: 590 % (self.path, i + 1)
591 self.order.append(key) 591 )
592 super(mapfile, self).__setitem__(key, value) 592 if key not in self:
593 fp.close() 593 self.order.append(key)
594 super(mapfile, self).__setitem__(key, value)
595 finally:
596 fp.close()
594 597
595 def __setitem__(self, key, value) -> None: 598 def __setitem__(self, key, value) -> None:
596 if self.fp is None: 599 if self.fp is None:
597 try: 600 try:
598 self.fp = open(self.path, b'ab') 601 self.fp = open(self.path, b'ab')