Submitter | Matt Harbison |
---|---|
Date | April 9, 2018, 4:26 a.m. |
Message ID | <3d5a3d9692c0e9f3424a.1523248003@Envy> |
Download | mbox | patch |
Permalink | /patch/30582/ |
State | Accepted |
Headers | show |
Comments
On Mon, 09 Apr 2018 00:26:43 -0400, Matt Harbison wrote: > # HG changeset patch > # User Matt Harbison <matt_harbison@yahoo.com> > # Date 1523154140 14400 > # Sat Apr 07 22:22:20 2018 -0400 > # Node ID 3d5a3d9692c0e9f3424a3eac148bef674580885f > # Parent f4381233ecb960307d39459ea961a0af03df442b > lfs: infer the blob store URL from paths.default > 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. > + if defaulturl.scheme and defaulturl.scheme != b'file': > + if defaulturl.scheme in (b'http', b'https', b'ssh'): > + defaulturl.path = defaulturl.path or b'' + b'.git/info/lfs' > + if defaulturl.scheme == b'ssh': > + defaulturl.scheme = b'https' Maybe we shouldn't rewrite ssh to https because there's no clue that the SSH path matches the HTTP path. Also, eventually we might add an SSH-based LFS protocol.
> On Apr 9, 2018, at 9:26 AM, Yuya Nishihara <yuya@tcha.org> wrote: > >> On Mon, 09 Apr 2018 00:26:43 -0400, Matt Harbison wrote: >> # HG changeset patch >> # User Matt Harbison <matt_harbison@yahoo.com> >> # Date 1523154140 14400 >> # Sat Apr 07 22:22:20 2018 -0400 >> # Node ID 3d5a3d9692c0e9f3424a3eac148bef674580885f >> # Parent f4381233ecb960307d39459ea961a0af03df442b >> lfs: infer the blob store URL from paths.default > >> 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. >> + if defaulturl.scheme and defaulturl.scheme != b'file': >> + if defaulturl.scheme in (b'http', b'https', b'ssh'): >> + defaulturl.path = defaulturl.path or b'' + b'.git/info/lfs' >> + if defaulturl.scheme == b'ssh': >> + defaulturl.scheme = b'https' > > Maybe we shouldn't rewrite ssh to https because there's no clue that the SSH > path matches the HTTP path. Also, eventually we might add an SSH-based LFS > protocol. That seems to be what the git spec in the function doc here is doing. But I don’t have a problem dropping it, because it’s hard to describe in documentation, and it does seem to be assuming a lot.
On Mon, 9 Apr 2018 10:53:43 -0400, Matt Harbison wrote: > > > On Apr 9, 2018, at 9:26 AM, Yuya Nishihara <yuya@tcha.org> wrote: > > > >> On Mon, 09 Apr 2018 00:26:43 -0400, Matt Harbison wrote: > >> # HG changeset patch > >> # User Matt Harbison <matt_harbison@yahoo.com> > >> # Date 1523154140 14400 > >> # Sat Apr 07 22:22:20 2018 -0400 > >> # Node ID 3d5a3d9692c0e9f3424a3eac148bef674580885f > >> # Parent f4381233ecb960307d39459ea961a0af03df442b > >> lfs: infer the blob store URL from paths.default > > > >> 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. > >> + if defaulturl.scheme and defaulturl.scheme != b'file': > >> + if defaulturl.scheme in (b'http', b'https', b'ssh'): > >> + defaulturl.path = defaulturl.path or b'' + b'.git/info/lfs' > >> + if defaulturl.scheme == b'ssh': > >> + defaulturl.scheme = b'https' > > > > Maybe we shouldn't rewrite ssh to https because there's no clue that the SSH > > path matches the HTTP path. Also, eventually we might add an SSH-based LFS > > protocol. > > That seems to be what the git spec in the function doc here is doing. But I don’t have a problem dropping it, because it’s hard to describe in documentation, and it does seem to be assuming a lot. Ugh. Can you add a TODO comment for that? I think it's better to not follow the git way here since we're making new SSH protocol which will look more like HTTP.
Patch
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,10 @@ 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) and ssh URLs. Https is substituted for ssh, but + # the URL is otherwise unchanged. If ``paths.default`` points to a file or + # is unset, 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 @@ -527,8 +527,31 @@ 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. + if defaulturl.scheme and defaulturl.scheme != b'file': + if defaulturl.scheme in (b'http', b'https', b'ssh'): + defaulturl.path = defaulturl.path or b'' + b'.git/info/lfs' + if defaulturl.scheme == b'ssh': + defaulturl.scheme = b'https' + + 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 <<EOF > [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 !)