--- a/mercurial/transaction.py Thu Feb 06 20:43:34 2025 -0500
+++ b/mercurial/transaction.py Fri Feb 07 16:40:49 2025 +0100
@@ -16,7 +16,21 @@
import errno
import os
+from typing import (
+ Callable,
+ Collection,
+ List,
+ Optional,
+ Tuple,
+ Union,
+)
+
from .i18n import _
+from .interfaces.types import (
+ CallbackCategoryT,
+ HgPathT,
+ VfsKeyT,
+)
from . import (
encoding,
error,
@@ -31,6 +45,8 @@
GEN_GROUP_PRE_FINALIZE = b'prefinalize'
GEN_GROUP_POST_FINALIZE = b'postfinalize'
+JournalEntryT = Tuple[HgPathT, int]
+
def active(func):
def _active(self, *args, **kwds):
@@ -336,11 +352,11 @@
self._abort()
@property
- def finalized(self):
+ def finalized(self) -> bool:
return self._finalizecallback is None
@active
- def startgroup(self):
+ def startgroup(self) -> None:
"""delay registration of file entry
This is used by strip to delay vision of strip offset. The transaction
@@ -348,7 +364,7 @@
self._queue.append([])
@active
- def endgroup(self):
+ def endgroup(self) -> None:
"""apply delayed registration of file entry.
This is used by strip to delay vision of strip offset. The transaction
@@ -358,7 +374,7 @@
self._addentry(f, o)
@active
- def add(self, file, offset):
+ def add(self, file: HgPathT, offset: int) -> None:
"""record the state of an append-only file before update"""
if (
file in self._newfiles
@@ -391,7 +407,13 @@
self._file.flush()
@active
- def addbackup(self, file, hardlink=True, location=b'', for_offset=False):
+ def addbackup(
+ self,
+ file: HgPathT,
+ hardlink: bool = True,
+ location: VfsKeyT = b'',
+ for_offset: Union[bool, int] = False,
+ ) -> None:
"""Adds a backup of the file to the transaction
Calling addbackup() creates a hardlink backup of the specified file
@@ -445,7 +467,7 @@
self._backupsfile.flush()
@active
- def registertmp(self, tmpfile, location=b''):
+ def registertmp(self, tmpfile: HgPathT, location: VfsKeyT = b'') -> None:
"""register a temporary transaction file
Such files will be deleted when the transaction exits (on both
@@ -457,13 +479,13 @@
@active
def addfilegenerator(
self,
- genid,
- filenames,
- genfunc,
- order=0,
- location=b'',
- post_finalize=False,
- ):
+ genid: bytes,
+ filenames: Collection[HgPathT],
+ genfunc: Callable,
+ order: int = 0,
+ location: VfsKeyT = b'',
+ post_finalize: bool = False,
+ ) -> None:
"""add a function to generates some files at transaction commit
The `genfunc` argument is a function capable of generating proper
@@ -495,7 +517,7 @@
self._filegenerators[genid] = entry
@active
- def removefilegenerator(self, genid):
+ def removefilegenerator(self, genid: bytes) -> None:
"""reverse of addfilegenerator, remove a file generator function"""
if genid in self._filegenerators:
del self._filegenerators[genid]
@@ -545,13 +567,13 @@
return any
@active
- def findoffset(self, file):
+ def findoffset(self, file: HgPathT) -> Optional[int]:
if file in self._newfiles:
return 0
return self._offsetmap.get(file)
@active
- def readjournal(self):
+ def readjournal(self) -> List[JournalEntryT]:
self._file.seek(0)
entries = []
for l in self._file.readlines():
@@ -560,7 +582,7 @@
return entries
@active
- def replace(self, file, offset):
+ def replace(self, file: HgPathT, offset: int) -> None:
"""
replace can only replace already committed entries
that are not pending in the queue
@@ -582,13 +604,13 @@
self._file.flush()
@active
- def nest(self, name=b'<unnamed>'):
+ def nest(self, name: bytes = b'<unnamed>') -> transaction:
self._count += 1
self._usages += 1
self._names.append(name)
return self
- def release(self):
+ def release(self) -> None:
if self._count > 0:
self._usages -= 1
if self._names:
@@ -597,10 +619,14 @@
if self._count > 0 and self._usages == 0:
self._abort()
- def running(self):
+ def running(self) -> bool:
return self._count > 0
- def addpending(self, category, callback):
+ def addpending(
+ self,
+ category: CallbackCategoryT,
+ callback: Callable[[transaction], None],
+ ) -> None:
"""add a callback to be called when the transaction is pending
The transaction will be given as callback's first argument.
@@ -611,7 +637,7 @@
self._pendingcallback[category] = callback
@active
- def writepending(self):
+ def writepending(self) -> bool:
"""write pending file to temporary version
This is used to allow hooks to view a transaction before commit"""
@@ -624,12 +650,16 @@
return self._anypending
@active
- def hasfinalize(self, category):
+ def hasfinalize(self, category: CallbackCategoryT) -> bool:
"""check is a callback already exist for a category"""
return category in self._finalizecallback
@active
- def addfinalize(self, category, callback):
+ def addfinalize(
+ self,
+ category: CallbackCategoryT,
+ callback: Callable[[transaction], None],
+ ) -> None:
"""add a callback to be called when the transaction is closed
The transaction will be given as callback's first argument.
@@ -640,7 +670,11 @@
self._finalizecallback[category] = callback
@active
- def addpostclose(self, category, callback):
+ def addpostclose(
+ self,
+ category: CallbackCategoryT,
+ callback: Callable[[transaction], None],
+ ) -> None:
"""add or replace a callback to be called after the transaction closed
The transaction will be given as callback's first argument.
@@ -651,12 +685,19 @@
self._postclosecallback[category] = callback
@active
- def getpostclose(self, category):
+ def getpostclose(
+ self,
+ category: CallbackCategoryT,
+ ) -> Optional[Callable[[transaction], None]]:
"""return a postclose callback added before, or None"""
return self._postclosecallback.get(category, None)
@active
- def addabort(self, category, callback):
+ def addabort(
+ self,
+ category: CallbackCategoryT,
+ callback: Callable[[transaction], None],
+ ) -> None:
"""add a callback to be called when the transaction is aborted.
The transaction will be given as the first argument to the callback.
@@ -667,7 +708,11 @@
self._abortcallback[category] = callback
@active
- def addvalidator(self, category, callback):
+ def addvalidator(
+ self,
+ category: CallbackCategoryT,
+ callback: Callable[[transaction], None],
+ ) -> None:
"""adds a callback to be called when validating the transaction.
The transaction will be given as the first argument to the callback.
@@ -676,7 +721,7 @@
self._validatecallback[category] = callback
@active
- def close(self):
+ def close(self) -> None:
'''commit the transaction'''
if self._count == 1:
for category in sorted(self._validatecallback):
@@ -758,14 +803,14 @@
self._postclosecallback = None
@active
- def abort(self):
+ def abort(self) -> None:
"""abort the transaction (generally called on error, or when the
transaction is not explicitly committed before going out of
scope)"""
self._abort()
@active
- def add_journal(self, vfs_id, path):
+ def add_journal(self, vfs_id: VfsKeyT, path: HgPathT) -> None:
self._journal_files.append((vfs_id, path))
def _writeundo(self):