D4766: fastcheckout: arguments to make checkout narrow

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Wed Sep 26 21:45:20 UTC 2018


indygreg created this revision.
Herald added subscribers: mercurial-devel, mjpieters.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This is similar to what the narrow extension does. The main
  difference is we don't have an explicit --narrow argument to opt
  into narrow: we assume that --include or --exclude translate to
  a narrow store and working directory.
  
  The added test demonstrates that extra files are being transferred
  and the clone isn't yet narrow. That's because exchangev2 doesn't
  yet support narrow.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D4766

AFFECTED FILES
  hgext/fastcheckout.py
  tests/test-fastcheckout.t

CHANGE DETAILS

diff --git a/tests/test-fastcheckout.t b/tests/test-fastcheckout.t
--- a/tests/test-fastcheckout.t
+++ b/tests/test-fastcheckout.t
@@ -118,6 +118,59 @@
   $ cat dest0/dir1/py3.py
   0
 
+Bad value to --include results in error
+
+  $ hg fastcheckout --include glob:* http://localhost:$HGPORT 6a9937924 badinclude
+  abort: invalid prefix on narrow pattern: glob:*
+  (narrow patterns must begin with one of the following: path:, rootfilesin:)
+  [255]
+
+  $ hg fastcheckout --include glob:* http://localhost:$HGPORT 6a9937924 dest0
+  abort: invalid prefix on narrow pattern: glob:*
+  (narrow patterns must begin with one of the following: path:, rootfilesin:)
+  [255]
+
+Bad value to --exclude results in error
+
+  $ hg fastcheckout --exclude glob:* http://localhost:$HGPORT 6a9937924 badexclude
+  abort: invalid prefix on narrow pattern: glob:*
+  (narrow patterns must begin with one of the following: path:, rootfilesin:)
+  [255]
+
+  $ hg fastcheckout --exclude glob:* http://localhost:$HGPORT 6a9937924 dest0
+  abort: invalid prefix on narrow pattern: glob:*
+  (narrow patterns must begin with one of the following: path:, rootfilesin:)
+  [255]
+
+Narrow file clone works
+
+  $ hg fastcheckout --include path:dir0 http://localhost:$HGPORT 15c769176a narrow-dest0
+  fetching data from http://localhost:$HGPORT
+  new changesets 6a9937924083:15c769176aab
+  updating to 15c769176aab
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+#if reporevlogstore
+  $ find narrow-dest0/.hg/store -type f | sort
+  narrow-dest0/.hg/store/00changelog.i
+  narrow-dest0/.hg/store/00manifest.i
+  narrow-dest0/.hg/store/data/dir0/child0/c.c.i
+  narrow-dest0/.hg/store/data/dir0/child0/py0.py.i
+  narrow-dest0/.hg/store/data/dir0/child1/py1.py.i
+  narrow-dest0/.hg/store/data/dir0/child1/py2.py.i
+  narrow-dest0/.hg/store/data/dir0/file0.txt.i
+  narrow-dest0/.hg/store/data/dir1/file1.txt.i
+  narrow-dest0/.hg/store/data/dir1/file2.txt.i
+  narrow-dest0/.hg/store/data/dir1/py3.py.i
+  narrow-dest0/.hg/store/data/foo.i
+  narrow-dest0/.hg/store/fncache
+  narrow-dest0/.hg/store/narrowspec
+  narrow-dest0/.hg/store/phaseroots
+  narrow-dest0/.hg/store/undo
+  narrow-dest0/.hg/store/undo.backupfiles
+  narrow-dest0/.hg/store/undo.phaseroots
+#endif
+
 Should not have any server-side errors
 
   $ cat error.log
diff --git a/hgext/fastcheckout.py b/hgext/fastcheckout.py
--- a/hgext/fastcheckout.py
+++ b/hgext/fastcheckout.py
@@ -26,9 +26,12 @@
     error,
     exchange,
     hg,
+    localrepo,
     merge as mergemod,
+    narrowspec,
     pycompat,
     registrar,
+    repository,
     scmutil,
     util,
     vfs as vfsmod,
@@ -47,6 +50,8 @@
     'fastcheckout',
     [
         ('C', 'clean', False, _('discard uncommitted changes (no backup)')),
+        ('', 'include', [], _('pattern of files to include in checkout')),
+        ('', 'exclude', [], _('pattern of files to not include in checkout')),
         ('', 'purge', False,
          _('purge the working directory of untracked files'),
         ),
@@ -75,6 +80,14 @@
     purge the working directory of both untracked and ignored files, similar
     to running :hg:`purge --all`.
 
+    ``include`` and ``exclude`` define patterns of paths to include and
+    exclude in the working directory, respectively. A path is included in
+    the working directory if it matches a pattern in ``include`` but not
+    ``exclude``. Only ``path`` and ``rootfilesin`` patterns are supported.
+    If the pattern doesn't contain a ``:`` / prefix, it is assumed to be a
+    ``path`` pattern. If ``include`` is not provided, it defaults to all
+    paths.
+
     The source repository must support modern versions of the Mercurial
     wire protocol.
     """
@@ -94,15 +107,20 @@
 
     destvfs = vfsmod.vfs(dest, expandpath=True)
 
+    includepats = narrowspec.parsepatterns(opts['include'])
+    excludepats = narrowspec.parsepatterns(opts['exclude'])
+
     overrides = {
         ('experimental', 'httppeer.advertise-v2'): True,
     }
 
     with ui.configoverride(overrides):
         return dofastcheckout(ui, source, rev, destvfs,
                               purge=opts.get('purge', False),
                               purgeall=opts.get('purgeall', False),
-                              clean=opts.get('clean', False))
+                              clean=opts.get('clean', False),
+                              includepats=includepats,
+                              excludepats=excludepats)
 
 def getpeer(ui, source):
     peer = hg.peer(ui, {}, source)
@@ -114,7 +132,11 @@
     return peer
 
 def dofastcheckout(ui, source, rev, destvfs, purge=False, purgeall=False,
-                   clean=False):
+                   clean=False, includepats=None, excludepats=None):
+
+    # Empty sets need to be None to force a full clone/checkout.
+    if not includepats and not excludepats:
+        includepats, excludepats = None, None
 
     createdrepo = False
     peer = None
@@ -124,7 +146,8 @@
         peer = getpeer(ui, source)
         ui.write(_('fetching data from %s\n') % peer.url())
         hg.clone(ui, {}, peer, destvfs.base, pull=True,
-                 update=False, revs=[rev])
+                 update=False, revs=[rev],
+                 storeincludepats=includepats, storeexcludepats=excludepats)
 
         createdrepo = True
 
@@ -145,7 +168,8 @@
         with peer.commandexecutor() as e:
             pullrev = e.callcommand('lookup', {'key': rev}).result()
 
-        exchange.pull(repo, peer, heads=[pullrev])
+        exchange.pull(repo, peer, heads=[pullrev],
+                      includepats=includepats, excludepats=excludepats)
 
     if not createdrepo and (purge or purgeall):
         ui.write(_('purging working directory\n'))
@@ -164,3 +188,9 @@
                                clean=clean, updatecheck='none')
 
         return ret
+
+def featuresetup(ui, features):
+    features.add(repository.NARROW_REQUIREMENT)
+
+def extsetup(ui):
+    localrepo.featuresetupfuncs.add(featuresetup)



To: indygreg, #hg-reviewers
Cc: mjpieters, mercurial-devel


More information about the Mercurial-devel mailing list