diff tests/pullext.py @ 40327:55836a34f41b

exchangev2: recognize narrow patterns when pulling pulloperation instances were recently taught to record file include and exclude patterns to facilitate narrow file transfer. Teaching the exchangev2 code to transfer a subset of files is as simple as constructing a narrow matcher from these patterns and filtering all seen file paths through it. Keep in mind that this change only influences file data: we're still fetching all changeset and manifest data. So, there's still a ton of "partial clone" to implement in exchangev2. On a personal note, I derive gratification that this feature requires very few lines of new code to implement. To test this, we implemented a minimal extension which allows us to specify --include/--exclude to clone. While the narrow extension provides these arguments, I explicitly wanted to test this functionality without the narrow extension enabled, as that extension monkeypatches various things and I want to isolate the behavior of core Mercurial. Differential Revision: https://phab.mercurial-scm.org/D5132
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 26 Sep 2018 14:38:43 -0700
parents
children 229d23cdb203
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/pullext.py	Wed Sep 26 14:38:43 2018 -0700
@@ -0,0 +1,38 @@
+# pullext.py - Simple extension to test pulling
+#
+# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+from mercurial.i18n import _
+from mercurial import (
+    commands,
+    extensions,
+    localrepo,
+    repository,
+)
+
+def clonecommand(orig, ui, repo, *args, **kwargs):
+    if kwargs.get(r'include') or kwargs.get(r'exclude'):
+        kwargs[r'narrow'] = True
+
+    return orig(ui, repo, *args, **kwargs)
+
+def featuresetup(ui, features):
+    features.add(repository.NARROW_REQUIREMENT)
+
+def extsetup(ui):
+    entry = extensions.wrapcommand(commands.table, 'clone', clonecommand)
+
+    hasinclude = any(x[1] == 'include' for x in entry[1])
+
+    if not hasinclude:
+        entry[1].append(('', 'include', [],
+                         _('pattern of file/directory to clone')))
+        entry[1].append(('', 'exclude', [],
+                         _('pattern of file/directory to not clone')))
+
+    localrepo.featuresetupfuncs.add(featuresetup)