076fda162fa3 — Will Lentz 5 years ago
add ability to set sparse config during clone
2 files changed, 110 insertions(+), 1 deletions(-)

M sparse.py
A => tests/test-sparse-clone.t
M sparse.py +36 -1
@@ 9,7 9,7 @@ 
 """
 
 from mercurial import util, cmdutil, extensions, context, dirstate, commands
-from mercurial import localrepo, error
+from mercurial import localrepo, error, hg
 from mercurial import match as matchmod
 from mercurial import merge as mergemod
 from mercurial.node import nullid

          
@@ 25,6 25,7 @@ def uisetup(ui):
     _setupcommit(ui)
 
 def extsetup(ui):
+    _setupclone(ui)
     _setuplog(ui)
     _setupadd(ui)
     _setupdirstate(ui)

          
@@ 211,6 212,40 @@ def _setuplog(ui):
         return revs
     extensions.wrapfunction(cmdutil, '_logrevs', _logrevs)
 
+def _clonesparsecmd(orig, ui, repo, *args, **opts):
+    include_pat = opts.get('include')
+    exclude_pat = opts.get('exclude')
+    enableprofile_pat = opts.get('enable_profile')
+    include = exclude = enableprofile = False
+    if include_pat:
+        pat = include_pat
+        include = True
+    if exclude_pat:
+        pat = exclude_pat
+        exclude = True
+    if enableprofile_pat:
+        pat = enableprofile_pat
+        enableprofile = True
+    if sum([include, exclude, enableprofile]) > 1:
+        raise util.Abort(_("too many flags specified."))
+    if include or exclude or enableprofile:
+        def clone_sparse(orig, self, node, overwrite):
+            _config(self.ui, self.unfiltered(), pat, include=include,
+                    exclude=exclude, enableprofile=enableprofile)
+            return orig(self, node, overwrite)
+        extensions.wrapfunction(hg, 'updaterepo', clone_sparse)
+    orig(ui, repo, *args, **opts)
+
+def _setupclone(ui):
+    entry = commands.table['^clone']
+    entry[1].append(('', 'enable-profile', [],
+                    'enable a sparse profile'))
+    entry[1].append(('', 'include', [],
+                    'include sparse pattern'))
+    entry[1].append(('', 'exclude', [],
+                    'exclude sparse pattern'))
+    extensions.wrapcommand(commands.table, 'clone', _clonesparsecmd)
+
 def _setupadd(ui):
     entry = commands.table['^add']
     entry[1].append(('s', 'sparse', None,

          
A => tests/test-sparse-clone.t +74 -0
@@ 0,0 1,74 @@ 
+test sparse
+
+  $ extpath=$(dirname $TESTDIR)
+  $ cp $extpath/sparse.py $TESTTMP # use $TESTTMP substitution in message
+  $ cat >> $HGRCPATH << EOF
+  > [ui]
+  > ssh = python "$RUNTESTDIR/dummyssh"
+  > username = nobody <no.reply@fb.com>
+  > [extensions]
+  > sparse=$TESTTMP/sparse.py
+  > purge=
+  > strip=
+  > rebase=
+  > EOF
+
+  $ hg init myrepo
+  $ cd myrepo
+  $ echo a > index.html
+  $ echo x > data.py
+  $ echo z > readme.txt
+  $ cat > webpage.sparse <<EOF
+  > [include]
+  > *.html
+  > EOF
+  $ cat > backend.sparse <<EOF
+  > [include]
+  > *.py
+  > EOF
+  $ hg ci -Aqm 'initial'
+  $ cd ..
+
+Verify local clone with a sparse profile works
+
+  $ hg clone --enable-profile webpage.sparse myrepo clone1
+  updating to branch default
+  warning: sparse profile 'webpage.sparse' not found in rev 000000000000 - ignoring it
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd clone1
+  $ ls
+  index.html
+  $ cd ..
+
+Verify local clone with include works
+
+  $ hg clone --include *.sparse myrepo clone2
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd clone2
+  $ ls
+  backend.sparse
+  webpage.sparse
+  $ cd ..
+
+Verify local clone with exclude works
+
+  $ hg clone --exclude data.py myrepo clone3
+  updating to branch default
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd clone3
+  $ ls
+  backend.sparse
+  index.html
+  readme.txt
+  webpage.sparse
+  $ cd ..
+
+Verify sparse clone profile over ssh works
+
+  $ hg clone -q --enable-profile webpage.sparse ssh://user@dummy/myrepo clone4
+  warning: sparse profile 'webpage.sparse' not found in rev 000000000000 - ignoring it
+  $ cd clone4
+  $ ls
+  index.html
+  $ cd ..