changeset 2399:70275407a31e

obshashrange: avoid crash when 'cache/' directory is missing If the directory is missing, we create it.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 17 May 2017 18:40:48 +0200
parents 612c17c8ab69
children 9a53ed7e5540
files hgext3rd/evolve/obsdiscovery.py
diffstat 1 files changed, 18 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/hgext3rd/evolve/obsdiscovery.py	Wed May 17 17:16:59 2017 +0200
+++ b/hgext3rd/evolve/obsdiscovery.py	Wed May 17 18:40:48 2017 +0200
@@ -425,6 +425,7 @@
 
     def __init__(self, repo):
         super(_obshashcache, self).__init__()
+        self._vfs = repo.vfs
         self._path = repo.vfs.join('cache/evoext_obshashrange_v1.sqlite')
         self._new = set()
         self._valid = True
@@ -524,6 +525,15 @@
             self._ondiskcachekey = self.emptykey
         assert self._cachekey is not None
 
+    def _db(self):
+        try:
+            util.makedirs(self._vfs.dirname(self._path))
+        except OSError:
+            return None
+        con = sqlite3.connect(self._path)
+        con.text_factory = str
+        return con
+
     @util.propertycache
     def _con(self):
         if not self._valid:
@@ -531,8 +541,9 @@
         repo = self._repo()
         if repo is None:
             return None
-        con = sqlite3.connect(self._path)
-        con.text_factory = str
+        con = self._db()
+        if con is None:
+            return None
         cur = con.execute(_queryexist)
         if cur.fetchone() is None:
             self._valid = False
@@ -566,8 +577,11 @@
             if '_con' in vars(self):
                 del self._con
 
-            con = sqlite3.connect(self._path)
-            con.text_factory = str
+            con = self._db()
+            if con is None:
+                repo.ui.log('evoext-cache', 'unable to write obshashrange cache'
+                            ' - cannot create database')
+                return
             with con:
                 for req in _sqliteschema:
                     con.execute(req)