changeset 47335:1844a2e3401c

revlog: simplify the try nesting in the `_writing` context Lets use a single try, with conditional cleanup. This make is easier to add a file handle dedicated to sidedata. Differential Revision: https://phab.mercurial-scm.org/D10775
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 26 May 2021 21:35:51 +0200
parents 53ab13d6a5db
children 27e9ed1217c5
files mercurial/revlog.py
diffstat 1 files changed, 29 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlog.py	Thu May 20 21:54:21 2021 +0200
+++ b/mercurial/revlog.py	Wed May 26 21:35:51 2021 +0200
@@ -2232,41 +2232,43 @@
         if self._writinghandles is not None:
             yield
         else:
-            r = len(self)
-            dsize = 0
-            if r:
-                dsize = self.end(r - 1)
-            dfh = None
-            if not self._inline:
-                try:
-                    dfh = self._datafp(b"r+")
-                    if self._docket is None:
-                        dfh.seek(0, os.SEEK_END)
-                    else:
-                        dfh.seek(self._docket.data_end, os.SEEK_SET)
-                except IOError as inst:
-                    if inst.errno != errno.ENOENT:
-                        raise
-                    dfh = self._datafp(b"w+")
-                transaction.add(self._datafile, dsize)
+            ifh = dfh = None
             try:
+                r = len(self)
+                # opening the data file.
+                dsize = 0
+                if r:
+                    dsize = self.end(r - 1)
+                dfh = None
+                if not self._inline:
+                    try:
+                        dfh = self._datafp(b"r+")
+                        if self._docket is None:
+                            dfh.seek(0, os.SEEK_END)
+                        else:
+                            dfh.seek(self._docket.data_end, os.SEEK_SET)
+                    except IOError as inst:
+                        if inst.errno != errno.ENOENT:
+                            raise
+                        dfh = self._datafp(b"w+")
+                    transaction.add(self._datafile, dsize)
+
+                # opening the index file.
                 isize = r * self.index.entry_size
                 ifh = self.__index_write_fp()
                 if self._inline:
                     transaction.add(self._indexfile, dsize + isize)
                 else:
                     transaction.add(self._indexfile, isize)
-                try:
-                    self._writinghandles = (ifh, dfh)
-                    try:
-                        yield
-                        if self._docket is not None:
-                            self._write_docket(transaction)
-                    finally:
-                        self._writinghandles = None
-                finally:
+                # exposing all file handle for writing.
+                self._writinghandles = (ifh, dfh)
+                yield
+                if self._docket is not None:
+                    self._write_docket(transaction)
+            finally:
+                self._writinghandles = None
+                if ifh is not None:
                     ifh.close()
-            finally:
                 if dfh is not None:
                     dfh.close()