diff --git a/hgext/lfs/__init__.py b/hgext/lfs/__init__.py --- a/hgext/lfs/__init__.py +++ b/hgext/lfs/__init__.py @@ -87,7 +87,9 @@ Configs:: # git-lfs endpoint # - file:///tmp/path # local filesystem, usually for testing - # if unset, lfs will prompt setting this when it must use this value. + # if unset, lfs will assume the repository at ``paths.default`` also handles + # blob storage for http(s) URLs. Otherwise, lfs will prompt to set this + # when it must use this value. # (default: unset) url = https://example.com/repo.git/info/lfs diff --git a/hgext/lfs/blobstore.py b/hgext/lfs/blobstore.py --- a/hgext/lfs/blobstore.py +++ b/hgext/lfs/blobstore.py @@ -532,8 +532,29 @@ def _verify(oid, content): hint=_('run hg verify')) def remote(repo): - """remotestore factory. return a store in _storemap depending on config""" + """remotestore factory. return a store in _storemap depending on config + + If ``lfs.url`` is specified, use that remote endpoint. Otherwise, try to + infer the endpoint, based on the remote repository using the same path + adjustments as git. As an extension, 'http' is supported as well so that + ``hg serve`` works out of the box. + + https://github.com/git-lfs/git-lfs/blob/master/docs/api/server-discovery.md + """ url = util.url(repo.ui.config('lfs', 'url') or '') + if url.scheme is None: + # TODO: investigate 'paths.remote:lfsurl' style path customization, + # and fall back to inferring from 'paths.remote' if unspecified. + defaulturl = util.url(repo.ui.config('paths', 'default') or b'') + + # TODO: support local paths as well. + # TODO: consider the ssh -> https transformation that git applies + if defaulturl.scheme in (b'http', b'https'): + defaulturl.path = defaulturl.path or b'' + b'.git/info/lfs' + + url = util.url(bytes(defaulturl)) + repo.ui.note(_('lfs: assuming remote store: %s\n') % url) + scheme = url.scheme if scheme not in _storemap: raise error.Abort(_('lfs: unknown url scheme: %s') % scheme) diff --git a/hgext/lfs/wrapper.py b/hgext/lfs/wrapper.py --- a/hgext/lfs/wrapper.py +++ b/hgext/lfs/wrapper.py @@ -257,7 +257,9 @@ def _prefetchfiles(repo, ctx, files): pointers.append(p) if pointers: - repo.svfs.lfsremoteblobstore.readbatch(pointers, localstore) + # Recalculating the repo store here allows 'paths.default' that is set + # on the repo by a clone command to be used for the update. + blobstore.remote(repo).readbatch(pointers, localstore) def _canskipupload(repo): # if remotestore is a null store, upload is a no-op and can be skipped 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 @@ -34,7 +34,6 @@ for flag '0x2000'!" if the extension is masked by the Internal Server Error message). $ cat >> $HGRCPATH < [lfs] - > url=file:$TESTTMP/dummy-remote/ > usercache = null:// > threshold=10 > [web] diff --git a/tests/test-lfs-test-server.t b/tests/test-lfs-test-server.t --- a/tests/test-lfs-test-server.t +++ b/tests/test-lfs-test-server.t @@ -157,6 +157,7 @@ Clear the cache to force a download resolving manifests branchmerge: False, force: False, partial: False ancestor: 000000000000, local: 000000000000+, remote: 99a7098854a3 + http auth: user foo, password *** Status: 200 Content-Length: 311 (git-server !) Content-Length: 352 (hg-server !) @@ -328,6 +329,7 @@ Clear the cache to force a download resolving manifests branchmerge: False, force: False, partial: False ancestor: 99a7098854a3, local: 99a7098854a3+, remote: dfca2c9e2ef2 + http auth: user foo, password *** Status: 200 Content-Length: 608 (git-server !) Content-Length: 670 (hg-server !) @@ -417,6 +419,7 @@ TODO: give the proper error indication f resolving manifests branchmerge: False, force: True, partial: False ancestor: dfca2c9e2ef2+, local: dfca2c9e2ef2+, remote: dfca2c9e2ef2 + http auth: user foo, password *** Status: 200 Content-Length: 311 (git-server !) Content-Length: 183 (hg-server !) @@ -516,6 +519,7 @@ Archive will prefetch blobs in a group $ rm -rf .hg/store/lfs `hg config lfs.usercache` $ hg archive --debug -r 1 ../archive http auth: user foo, password *** + http auth: user foo, password *** Status: 200 Content-Length: 905 (git-server !) Content-Length: 988 (hg-server !) @@ -611,6 +615,7 @@ Cat will prefetch blobs in a group $ rm -rf .hg/store/lfs `hg config lfs.usercache` $ hg cat --debug -r 1 a b c http auth: user foo, password *** + http auth: user foo, password *** Status: 200 Content-Length: 608 (git-server !) Content-Length: 670 (hg-server !) @@ -685,6 +690,7 @@ Revert will prefetch blobs in a group reverting b reverting c reverting d + http auth: user foo, password *** Status: 200 Content-Length: 905 (git-server !) Content-Length: 988 (hg-server !) @@ -781,6 +787,7 @@ Check error message when the remote miss resolving manifests branchmerge: False, force: True, partial: False ancestor: 62fdbaf221c6+, local: 62fdbaf221c6+, remote: ef0564edf47e + http auth: user foo, password *** Status: 200 Content-Length: 308 (git-server !) Content-Length: 186 (hg-server !) @@ -892,6 +899,7 @@ Check error message when object does not resolving manifests branchmerge: False, force: False, partial: False ancestor: 000000000000, local: 000000000000+, remote: d2a338f184a8 + http auth: user foo, password *** Status: 200 Content-Length: 308 (git-server !) Content-Length: 186 (hg-server !)