# HG changeset patch # User Matt Harbison # Date 1579620855 18000 # Node ID 06de4a673f487ec3f441a8cf758298482dcc4aa8 # Parent c791ed6a21542a49bf77b470c6a5222f73e1ded8 lfs: add a method to the local blobstore to convert OIDs to file paths This is less ugly than passing an open callback to the `httpsendfile` constuctor. Differential Revision: https://phab.mercurial-scm.org/D7961 diff -r c791ed6a2154 -r 06de4a673f48 hgext/lfs/blobstore.py --- a/hgext/lfs/blobstore.py Wed Jan 15 14:47:38 2020 -0800 +++ b/hgext/lfs/blobstore.py Tue Jan 21 10:34:15 2020 -0500 @@ -139,6 +139,17 @@ def open(self, oid): """Open a read-only file descriptor to the named blob, in either the usercache or the local store.""" + return open(self.path(oid), b'rb') + + def path(self, oid): + """Build the path for the given blob ``oid``. + + If the blob exists locally, the path may point to either the usercache + or the local store. If it doesn't, it will point to the local store. + This is meant for situations where existing code that isn't LFS aware + needs to open a blob. Generally, prefer the ``open`` method on this + class. + """ # The usercache is the most likely place to hold the file. Commit will # write to both it and the local store, as will anything that downloads # the blobs. However, things like clone without an update won't @@ -146,9 +157,9 @@ # the usercache is the only place it _could_ be. If not present, the # missing file msg here will indicate the local repo, not the usercache. if self.cachevfs.exists(oid): - return self.cachevfs(oid, b'rb') + return self.cachevfs.join(oid) - return self.vfs(oid, b'rb') + return self.vfs.join(oid) def download(self, oid, src, content_length): """Read the blob from the remote source in chunks, verify the content,