changeset 35186:e0a1b9ee93cd

lfs: add a repo requirement for this extension once an lfs file is committed Largefiles does the same thing (also delayed until the first largefile commit), to prevent access to the repo without the extension. In the case of this extension, not having the extension loaded while accessing an lfs file results in cryptic errors about "missing processor for flag '0x2000'". If enabled locally but not remotely, the cryptic error message is about no common changegroup version. (It wants '03', which is currently experimental.) The largefiles extension looks for any tracked file that starts with '.hglf/'. Unfortunately, that doesn't work here. I didn't see any way to get the files that were just committed, without doing a full status. But since there's no secondary check on adding an lfs file once the extension is loaded and a threshold set, the best practice is to only enable this locally on a repo that needs it. That should minimize the unnecessary overhead for repos without an lfs file.
author Matt Harbison <matt_harbison@yahoo.com>
date Wed, 15 Nov 2017 23:43:15 -0500
parents 6864c405f023
children 671aba341d90
files hgext/lfs/__init__.py tests/test-lfs.t
diffstat 2 files changed, 23 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/lfs/__init__.py	Thu Nov 30 22:32:13 2017 +0900
+++ b/hgext/lfs/__init__.py	Wed Nov 15 23:43:15 2017 -0500
@@ -37,6 +37,7 @@
     exchange,
     extensions,
     filelog,
+    localrepo,
     registrar,
     revlog,
     scmutil,
@@ -84,6 +85,13 @@
 
 templatekeyword = registrar.templatekeyword()
 
+def featuresetup(ui, supported):
+    # don't die on seeing a repo with the lfs requirement
+    supported |= {'lfs'}
+
+def uisetup(ui):
+    localrepo.localrepository.featuresetupfuncs.add(featuresetup)
+
 def reposetup(ui, repo):
     # Nothing to do with a remote repo
     if not repo.local():
@@ -98,6 +106,17 @@
     # Push hook
     repo.prepushoutgoinghooks.add('lfs', wrapper.prepush)
 
+    if 'lfs' not in repo.requirements:
+        def checkrequireslfs(ui, repo, **kwargs):
+            if 'lfs' not in repo.requirements:
+                ctx = repo[kwargs['node']]
+                # TODO: is there a way to just walk the files in the commit?
+                if any(ctx[f].islfs() for f in ctx.files()):
+                    repo.requirements.add('lfs')
+                    repo._writerequirements()
+
+        ui.setconfig('hooks', 'commit.lfs', checkrequireslfs, 'lfs')
+
 def wrapfilelog(filelog):
     wrapfunction = extensions.wrapfunction
 
--- a/tests/test-lfs.t	Thu Nov 30 22:32:13 2017 +0900
+++ b/tests/test-lfs.t	Wed Nov 15 23:43:15 2017 -0500
@@ -20,7 +20,11 @@
 
 # Commit large file
   $ echo $LONG > largefile
+  $ grep lfs .hg/requires
+  [1]
   $ hg commit --traceback -Aqm "add large file"
+  $ grep lfs .hg/requires
+  lfs
 
 # Ensure metadata is stored
   $ hg debugdata largefile 0