hgext/lfs/blobstore.py
changeset 35362 79968f91ad0c
parent 35280 8e72f9152c4d
child 35396 c8edeb03ca94
--- a/hgext/lfs/blobstore.py	Thu Dec 07 22:36:31 2017 -0500
+++ b/hgext/lfs/blobstore.py	Thu Dec 07 23:44:06 2017 -0500
@@ -15,6 +15,7 @@
 
 from mercurial import (
     error,
+    pathutil,
     url as urlmod,
     util,
     vfs as vfsmod,
@@ -32,6 +33,28 @@
             raise error.ProgrammingError('unexpected lfs path: %s' % path)
         return super(lfsvfs, self).join(path[0:2], path[2:])
 
+    def walk(self, path=None, onerror=None):
+        """Yield (dirpath, '', oids) tuple for blobs under path
+
+        Oids only exist in the root of this vfs, so dirpath is always ''.
+        """
+        root = os.path.normpath(self.base)
+        # when dirpath == root, dirpath[prefixlen:] becomes empty
+        # because len(dirpath) < prefixlen.
+        prefixlen = len(pathutil.normasprefix(root))
+        oids = []
+
+        for dirpath, dirs, files in os.walk(self.reljoin(self.base, path or ''),
+                                            onerror=onerror):
+            dirpath = dirpath[prefixlen:]
+
+            # Silently skip unexpected files and directories
+            if len(dirpath) == 2:
+                oids.extend([dirpath + f for f in files
+                             if _lfsre.match(dirpath + f)])
+
+        yield ('', '', oids)
+
 class filewithprogress(object):
     """a file-like object that supports __len__ and read.