mercurial/changelog.py
changeset 51103 222b89224397
parent 51102 594f912818ab
child 51104 1c0f3994d733
--- a/mercurial/changelog.py	Fri Oct 20 12:13:33 2023 +0200
+++ b/mercurial/changelog.py	Thu Oct 26 03:29:46 2023 +0200
@@ -27,6 +27,7 @@
 from .revlogutils import (
     constants as revlog_constants,
     flagutil,
+    randomaccessfile,
 )
 
 _defaultextra = {b'branch': b'default'}
@@ -91,76 +92,6 @@
     return b'\n'.join([l.rstrip() for l in desc.splitlines()]).strip(b'\n')
 
 
-class appender:
-    """the changelog index must be updated last on disk, so we use this class
-    to delay writes to it"""
-
-    def __init__(self, vfs, name, mode, buf):
-        self.data = buf
-        fp = vfs(name, mode)
-        self.fp = fp
-        self.offset = fp.tell()
-        self.size = vfs.fstat(fp).st_size
-        self._end = self.size
-
-    def end(self):
-        return self._end
-
-    def tell(self):
-        return self.offset
-
-    def flush(self):
-        pass
-
-    @property
-    def closed(self):
-        return self.fp.closed
-
-    def close(self):
-        self.fp.close()
-
-    def seek(self, offset, whence=0):
-        '''virtual file offset spans real file and data'''
-        if whence == 0:
-            self.offset = offset
-        elif whence == 1:
-            self.offset += offset
-        elif whence == 2:
-            self.offset = self.end() + offset
-        if self.offset < self.size:
-            self.fp.seek(self.offset)
-
-    def read(self, count=-1):
-        '''only trick here is reads that span real file and data'''
-        ret = b""
-        if self.offset < self.size:
-            s = self.fp.read(count)
-            ret = s
-            self.offset += len(s)
-            if count > 0:
-                count -= len(s)
-        if count != 0:
-            doff = self.offset - self.size
-            self.data.insert(0, b"".join(self.data))
-            del self.data[1:]
-            s = self.data[0][doff : doff + count]
-            self.offset += len(s)
-            ret += s
-        return ret
-
-    def write(self, s):
-        self.data.append(bytes(s))
-        self.offset += len(s)
-        self._end += len(s)
-
-    def __enter__(self):
-        self.fp.__enter__()
-        return self
-
-    def __exit__(self, *args):
-        return self.fp.__exit__(*args)
-
-
 class _divertopener:
     def __init__(self, opener, target):
         self._opener = opener
@@ -187,7 +118,7 @@
         if name != self._target:
             return self._opener(name, mode, **kwargs)
         assert not kwargs
-        return appender(self._opener, name, mode, self._buf)
+        return randomaccessfile.appender(self._opener, name, mode, self._buf)
 
     def __getattr__(self, attr):
         return getattr(self._opener, attr)