@@ 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,
@@ 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 ..