# HG changeset patch
# User Matt Harbison <matt_harbi...@yahoo.com>
# Date 1523155211 14400
#      Sat Apr 07 22:40:11 2018 -0400
# Node ID f4381233ecb960307d39459ea961a0af03df442b
# Parent  69ead78af94459ca41e529d0ebfb24bd1d11c32c
lfs: add the ability to disable the usercache

While the usercache is important for real world uses, I've been tripped up more
than a couple of times by it in tests- thinking a file was being downloaded, but
it was simply linked from the local cache.  The syntax for setting it is the
same as for setting a null remote endpoint, and like that endpoint, is left
undocumented.

This may or may not be a useful feature in the real world (I'd expect any sane
filesystem to support hardlinks at this point).

diff --git a/hgext/lfs/blobstore.py b/hgext/lfs/blobstore.py
--- a/hgext/lfs/blobstore.py
+++ b/hgext/lfs/blobstore.py
@@ -59,6 +59,22 @@ class lfsvfs(vfsmod.vfs):
 
         yield ('', [], oids)
 
+class nullvfs(lfsvfs):
+    def __init__(self):
+        pass
+
+    def exists(self, oid):
+        return False
+
+    def read(self, oid):
+        raise IOError('%s: No such file or directory' % self.join(oid))
+
+    def walk(self, path=None, onerror=None):
+        return ('', [], [])
+
+    def write(self, oid, data):
+        pass
+
 class filewithprogress(object):
     """a file-like object that supports __len__ and read.
 
@@ -97,8 +113,14 @@ class local(object):
     def __init__(self, repo):
         fullpath = repo.svfs.join('lfs/objects')
         self.vfs = lfsvfs(fullpath)
-        usercache = lfutil._usercachedir(repo.ui, 'lfs')
-        self.cachevfs = lfsvfs(usercache)
+        usercache = util.url(lfutil._usercachedir(repo.ui, 'lfs'))
+        if usercache.scheme in (None, 'file'):
+            self.cachevfs = lfsvfs(usercache.localpath())
+        elif usercache.scheme == 'null':
+            self.cachevfs = nullvfs()
+        else:
+            raise error.Abort(_('unknown lfs cache scheme: %s')
+                              % usercache.scheme)
         self.ui = repo.ui
 
     def open(self, oid):
@@ -129,11 +151,7 @@ class local(object):
             if realoid != oid:
                 raise error.Abort(_('corrupt remote lfs object: %s') % oid)
 
-        # XXX: should we verify the content of the cache, and hardlink back to
-        # the local store on success, but truncate, write and link on failure?
-        if not self.cachevfs.exists(oid):
-            self.ui.note(_('lfs: adding %s to the usercache\n') % oid)
-            lfutil.link(self.vfs.join(oid), self.cachevfs.join(oid))
+        self._linktousercache(oid)
 
     def write(self, oid, data):
         """Write blob to local blobstore.
@@ -144,9 +162,13 @@ class local(object):
         with self.vfs(oid, 'wb', atomictemp=True) as fp:
             fp.write(data)
 
+        self._linktousercache(oid)
+
+    def _linktousercache(self, oid):
         # XXX: should we verify the content of the cache, and hardlink back to
         # the local store on success, but truncate, write and link on failure?
-        if not self.cachevfs.exists(oid):
+        if (not self.cachevfs.exists(oid)
+            and not isinstance(self.cachevfs, nullvfs)):
             self.ui.note(_('lfs: adding %s to the usercache\n') % oid)
             lfutil.link(self.vfs.join(oid), self.cachevfs.join(oid))
 
diff --git a/tests/test-lfs-serve.t b/tests/test-lfs-serve.t
--- a/tests/test-lfs-serve.t
+++ b/tests/test-lfs-serve.t
@@ -35,6 +35,7 @@ masked by the Internal Server Error mess
   $ cat >> $HGRCPATH <<EOF
   > [lfs]
   > url=file:$TESTTMP/dummy-remote/
+  > usercache = null://
   > threshold=10
   > [web]
   > allow_push=*
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to