mercurial/transaction.py
changeset 20087 cf3b8285af00
parent 20084 a3378a1b0a05
child 20524 28b8ff84db3f
equal deleted inserted replaced
20086:f3df2612f3c3 20087:cf3b8285af00
    10 #
    10 #
    11 # This software may be used and distributed according to the terms of the
    11 # This software may be used and distributed according to the terms of the
    12 # GNU General Public License version 2 or any later version.
    12 # GNU General Public License version 2 or any later version.
    13 
    13 
    14 from i18n import _
    14 from i18n import _
    15 import os, errno
    15 import errno
    16 import error, util
    16 import error
    17 
    17 
    18 def active(func):
    18 def active(func):
    19     def _active(self, *args, **kwds):
    19     def _active(self, *args, **kwds):
    20         if self.count == 0:
    20         if self.count == 0:
    21             raise error.Abort(_(
    21             raise error.Abort(_(
    37             try:
    37             try:
    38                 opener.unlink(f)
    38                 opener.unlink(f)
    39             except (IOError, OSError), inst:
    39             except (IOError, OSError), inst:
    40                 if inst.errno != errno.ENOENT:
    40                 if inst.errno != errno.ENOENT:
    41                     raise
    41                     raise
    42     util.unlink(journal)
    42     opener.unlink(journal)
    43 
    43 
    44 class transaction(object):
    44 class transaction(object):
    45     def __init__(self, report, opener, journal, after=None, createmode=None):
    45     def __init__(self, report, opener, journal, after=None, createmode=None):
    46         self.count = 1
    46         self.count = 1
    47         self.usages = 1
    47         self.usages = 1
    51         self.entries = []
    51         self.entries = []
    52         self.map = {}
    52         self.map = {}
    53         self.journal = journal
    53         self.journal = journal
    54         self._queue = []
    54         self._queue = []
    55 
    55 
    56         self.file = util.posixfile(self.journal, "w")
    56         self.file = opener.open(self.journal, "w")
    57         if createmode is not None:
    57         if createmode is not None:
    58             os.chmod(self.journal, createmode & 0666)
    58             opener.chmod(self.journal, createmode & 0666)
    59 
    59 
    60     def __del__(self):
    60     def __del__(self):
    61         if self.journal:
    61         if self.journal:
    62             self._abort()
    62             self._abort()
    63 
    63 
   131             return
   131             return
   132         self.file.close()
   132         self.file.close()
   133         self.entries = []
   133         self.entries = []
   134         if self.after:
   134         if self.after:
   135             self.after()
   135             self.after()
   136         if os.path.isfile(self.journal):
   136         if self.opener.isfile(self.journal):
   137             util.unlink(self.journal)
   137             self.opener.unlink(self.journal)
   138         self.journal = None
   138         self.journal = None
   139 
   139 
   140     @active
   140     @active
   141     def abort(self):
   141     def abort(self):
   142         '''abort the transaction (generally called on error, or when the
   142         '''abort the transaction (generally called on error, or when the
   150         self.file.close()
   150         self.file.close()
   151 
   151 
   152         try:
   152         try:
   153             if not self.entries:
   153             if not self.entries:
   154                 if self.journal:
   154                 if self.journal:
   155                     util.unlink(self.journal)
   155                     self.opener.unlink(self.journal)
   156                 return
   156                 return
   157 
   157 
   158             self.report(_("transaction abort!\n"))
   158             self.report(_("transaction abort!\n"))
   159 
   159 
   160             try:
   160             try:
   168 
   168 
   169 
   169 
   170 def rollback(opener, file, report):
   170 def rollback(opener, file, report):
   171     entries = []
   171     entries = []
   172 
   172 
   173     fp = util.posixfile(file)
   173     fp = opener.open(file)
   174     lines = fp.readlines()
   174     lines = fp.readlines()
   175     fp.close()
   175     fp.close()
   176     for l in lines:
   176     for l in lines:
   177         f, o = l.split('\0')
   177         f, o = l.split('\0')
   178         entries.append((f, int(o), None))
   178         entries.append((f, int(o), None))