diff options
Diffstat (limited to 'Lib/mailbox.py')
| -rw-r--r-- | Lib/mailbox.py | 28 | 
1 files changed, 16 insertions, 12 deletions
| diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 0270e25b00..39f24f9a72 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -23,9 +23,10 @@ try:  except ImportError:      fcntl = None -__all__ = [ 'Mailbox', 'Maildir', 'mbox', 'MH', 'Babyl', 'MMDF', -            'Message', 'MaildirMessage', 'mboxMessage', 'MHMessage', -            'BabylMessage', 'MMDFMessage'] +__all__ = ['Mailbox', 'Maildir', 'mbox', 'MH', 'Babyl', 'MMDF', +           'Message', 'MaildirMessage', 'mboxMessage', 'MHMessage', +           'BabylMessage', 'MMDFMessage', 'Error', 'NoSuchMailboxError', +           'NotEmptyError', 'ExternalClashError', 'FormatError']  linesep = os.linesep.encode('ascii') @@ -312,11 +313,12 @@ class Maildir(Mailbox):          # final position in order to prevent race conditions with changes          # from other programs          try: -            if hasattr(os, 'link'): +            try:                  os.link(tmp_file.name, dest) -                os.remove(tmp_file.name) -            else: +            except (AttributeError, PermissionError):                  os.rename(tmp_file.name, dest) +            else: +                os.remove(tmp_file.name)          except OSError as e:              os.remove(tmp_file.name)              if e.errno == errno.EEXIST: @@ -1199,13 +1201,14 @@ class MH(Mailbox):          for key in self.iterkeys():              if key - 1 != prev:                  changes.append((key, prev + 1)) -                if hasattr(os, 'link'): +                try:                      os.link(os.path.join(self._path, str(key)),                              os.path.join(self._path, str(prev + 1))) -                    os.unlink(os.path.join(self._path, str(key))) -                else: +                except (AttributeError, PermissionError):                      os.rename(os.path.join(self._path, str(key)),                                os.path.join(self._path, str(prev + 1))) +                else: +                    os.unlink(os.path.join(self._path, str(key)))              prev += 1          self._next_key = prev + 1          if len(changes) == 0: @@ -2075,13 +2078,14 @@ def _lock_file(f, dotlock=True):                  else:                      raise              try: -                if hasattr(os, 'link'): +                try:                      os.link(pre_lock.name, f.name + '.lock')                      dotlock_done = True -                    os.unlink(pre_lock.name) -                else: +                except (AttributeError, PermissionError):                      os.rename(pre_lock.name, f.name + '.lock')                      dotlock_done = True +                else: +                    os.unlink(pre_lock.name)              except FileExistsError:                  os.remove(pre_lock.name)                  raise ExternalClashError('dot lock unavailable: %s' % | 
