# HG changeset patch # User Will Lentz # Date 1454697240 28800 # Fri Feb 05 10:34:00 2016 -0800 # Node ID 076fda162fa3c5c0b23ac0efc74c2a45f396fb80 # Parent 9b0c76d4b8a904f159c80c6fbe33c02406873a1b add ability to set sparse config during clone diff --git a/sparse.py b/sparse.py --- a/sparse.py +++ b/sparse.py @@ -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 @@ _setupcommit(ui) def extsetup(ui): + _setupclone(ui) _setuplog(ui) _setupadd(ui) _setupdirstate(ui) @@ -211,6 +212,40 @@ 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, diff --git a/tests/test-sparse-clone.t b/tests/test-sparse-clone.t new file mode 100644 --- /dev/null +++ b/tests/test-sparse-clone.t @@ -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 + > [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 < [include] + > *.html + > EOF + $ cat > backend.sparse < [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 ..