diff hgext/lfs/wrapper.py @ 37564:31a4ea773369

lfs: infer the blob store URL from an explicit push dest or default-push Unlike pull, the blobs are uploaded within the exchange.push() window, so simply wrap it and swap in a properly configured remote store. The '_subtoppath' field shouldn't be available during this window, but give the passed path priority for clarity. At one point I hit an AttributeError in one of the convert tests when trying to save the original remote blobstore when the swap was run unconditionally. I wrapped it in a util.safehasattr(), but then today I wasn't able to reproduce it. But now the whole thing is tucked under the requirement guard because without the requirement, there are no blobs in the repo, even if the extension is loaded.
author Matt Harbison <matt_harbison@yahoo.com>
date Sun, 08 Apr 2018 14:22:12 -0400
parents 092eff6833a7
children 7269b87f817c
line wrap: on
line diff
--- a/hgext/lfs/wrapper.py	Sun Apr 08 01:23:39 2018 -0400
+++ b/hgext/lfs/wrapper.py	Sun Apr 08 14:22:12 2018 -0400
@@ -289,7 +289,8 @@
     return uploadblobsfromrevs(pushop.repo, pushop.outgoing.missing)
 
 def push(orig, repo, remote, *args, **kwargs):
-    """bail on push if the extension isn't enabled on remote when needed"""
+    """bail on push if the extension isn't enabled on remote when needed, and
+    update the remote store based on the destination path."""
     if 'lfs' in repo.requirements:
         # If the remote peer is for a local repo, the requirement tests in the
         # base class method enforce lfs support.  Otherwise, some revisions in
@@ -300,7 +301,18 @@
             m = _("required features are not supported in the destination: %s")
             raise error.Abort(m % 'lfs',
                               hint=_('enable the lfs extension on the server'))
-    return orig(repo, remote, *args, **kwargs)
+
+        # Repositories where this extension is disabled won't have the field.
+        # But if there's a requirement, then the extension must be loaded AND
+        # there may be blobs to push.
+        remotestore = repo.svfs.lfsremoteblobstore
+        try:
+            repo.svfs.lfsremoteblobstore = blobstore.remote(repo, remote.url())
+            return orig(repo, remote, *args, **kwargs)
+        finally:
+            repo.svfs.lfsremoteblobstore = remotestore
+    else:
+        return orig(repo, remote, *args, **kwargs)
 
 def writenewbundle(orig, ui, repo, source, filename, bundletype, outgoing,
                    *args, **kwargs):