diff --git a/hgext/narrow/narrowcommands.py b/hgext/narrow/narrowcommands.py --- a/hgext/narrow/narrowcommands.py +++ b/hgext/narrow/narrowcommands.py @@ -7,6 +7,7 @@ from __future__ import absolute_import import itertools +import os from mercurial.i18n import _ from mercurial import ( @@ -25,6 +26,7 @@ from mercurial import ( repair, repository, repoview, + sparse, util, ) @@ -43,6 +45,8 @@ def setup(): _("create a narrow clone of select files"))) entry[1].append(('', 'depth', '', _("limit the history fetched by distance from heads"))) + entry[1].append(('', 'narrowspec', '', + _("read narrowspecs from file"))) # TODO(durin42): unify sparse/narrow --include/--exclude logic a bit if 'sparse' not in extensions.enabled(): entry[1].append(('', 'include', [], @@ -73,6 +77,27 @@ def clonenarrowcmd(orig, ui, repo, *args opts = pycompat.byteskwargs(opts) wrappedextraprepare = util.nullcontextmanager() opts_narrow = opts['narrow'] + narrowspecfile = opts['narrowspec'] + + if narrowspecfile: + filepath = os.path.join(pycompat.getcwd(), narrowspecfile) + ui.status(_("reading narrowspec from '%s'\n") % filepath) + try: + fp = open(filepath, 'rb') + except IOError: + raise error.Abort(_("file '%s' not found") % filepath) + + includes, excludes, profiles = sparse.parseconfig(ui, fp.read(), + 'narrow') + if profiles: + raise error.Abort(_("cannot specify other files using '%include' in" + " narrowspec")) + + # narrowspec is passed so we should assume that user wants narrow clone + opts_narrow = True + opts['include'].extend(includes) + opts['exclude'].extend(excludes) + if opts_narrow: def pullbundle2extraprepare_widen(orig, pullop, kwargs): # Create narrow spec patterns from clone flags diff --git a/tests/test-narrow-clone-no-ellipsis.t b/tests/test-narrow-clone-no-ellipsis.t --- a/tests/test-narrow-clone-no-ellipsis.t +++ b/tests/test-narrow-clone-no-ellipsis.t @@ -123,3 +123,39 @@ narrow clone everything but a directory dir/src/f9 $ cd .. + +Testing the --narrowspec flag to clone + + $ cat >> narrowspecs < %include foo + > [include] + > path:dir/tests/ + > file:dir/src/f12 + > EOF + + $ hg clone ssh://user@dummy/master specfile --narrowspec narrowspecs + reading narrowspec from '$TESTTMP/narrowspecs' + abort: cannot specify other files using '%include' in narrowspec + [255] + + $ cat > narrowspecs < [include] + > path:dir/tests/ + > file:dir/src/f12 + > EOF + + $ hg clone ssh://user@dummy/master specfile --narrowspec narrowspecs + reading narrowspec from '$TESTTMP/narrowspecs' + requesting all changes + adding changesets + adding manifests + adding file changes + added 40 changesets with 20 changes to 20 files + new changesets 681085829a73:26ce255d5b5d + updating to branch default + 20 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd specfile + $ hg tracked + I path:dir/tests + I path:file:dir/src/f12 + $ cd .. diff --git a/tests/test-narrow-clone.t b/tests/test-narrow-clone.t --- a/tests/test-narrow-clone.t +++ b/tests/test-narrow-clone.t @@ -218,3 +218,39 @@ simple clone dir/tests/t9 $ cd .. + +Testing the --narrowspec flag to clone + + $ cat >> narrowspecs < %include foo + > [include] + > path:dir/tests/ + > dir/src/f12 + > EOF + + $ hg clone ssh://user@dummy/master specfile --narrowspec narrowspecs + reading narrowspec from '$TESTTMP/narrowspecs' + abort: cannot specify other files using '%include' in narrowspec + [255] + + $ cat > narrowspecs < [include] + > path:dir/tests/ + > file:dir/src/f12 + > EOF + + $ hg clone ssh://user@dummy/master specfile --narrowspec narrowspecs + reading narrowspec from '$TESTTMP/narrowspecs' + requesting all changes + adding changesets + adding manifests + adding file changes + added 21 changesets with 20 changes to 20 files + new changesets f93383bb3e99:26ce255d5b5d + updating to branch default + 20 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd specfile + $ hg tracked + I path:dir/tests + I path:file:dir/src/f12 + $ cd ..