changeset 39440:ab20ee07b82d

narrow: add '--import-rules' flag to tracked command This patch adds a `--import-rules` flag to tracked command provided by narrow extension. Using the --import-rules flag, you can pass a filename from which narrowspecs should be read and added to main narrowspec. A lot of times, in automation or manually also, when you are working with big repo, specifying each path name on commandline using '--addinclude' and '--addexclude' is tedious and something which can scale. So we needed something where we can pass a file to extend the narrowspecs. Nice thing about this is that the automations which reads some file to change the sparse profile, can now read the same file for changing narrowspecs too. Tests are added for the new feature. Differential Revision: https://phab.mercurial-scm.org/D4125
author Pulkit Goyal <pulkit@yandex-team.ru>
date Mon, 06 Aug 2018 14:06:19 +0300
parents dc61a67c1fc0
children d0a8299e7256
files hgext/narrow/narrowcommands.py tests/test-narrow-trackedcmd.t
diffstat 2 files changed, 237 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/narrow/narrowcommands.py	Thu Aug 23 13:11:13 2018 -0700
+++ b/hgext/narrow/narrowcommands.py	Mon Aug 06 14:06:19 2018 +0300
@@ -14,6 +14,7 @@
     cmdutil,
     commands,
     discovery,
+    encoding,
     error,
     exchange,
     extensions,
@@ -326,6 +327,7 @@
     [('', 'addinclude', [], _('new paths to include')),
      ('', 'removeinclude', [], _('old paths to no longer include')),
      ('', 'addexclude', [], _('new paths to exclude')),
+     ('', 'import-rules', '', _('import narrowspecs from a file')),
      ('', 'removeexclude', [], _('old paths to no longer exclude')),
      ('', 'clear', False, _('whether to replace the existing narrowspec')),
      ('', 'force-delete-local-changes', False,
@@ -369,6 +371,23 @@
         ui.warn(_('The --clear option is not yet supported.\n'))
         return 1
 
+    # import rules from a file
+    newrules = opts.get('import_rules')
+    if newrules:
+        try:
+            filepath = os.path.join(pycompat.getcwd(), newrules)
+            fdata = util.readfile(filepath)
+        except IOError as inst:
+            raise error.Abort(_("cannot read narrowspecs from '%s': %s") %
+                              (filepath, encoding.strtolocal(inst.strerror)))
+        includepats, excludepats, profiles = sparse.parseconfig(ui, fdata,
+                                                                'narrow')
+        if profiles:
+            raise error.Abort(_("including other spec files using '%include' "
+                                "is not supported in narrowspec"))
+        opts['addinclude'].extend(includepats)
+        opts['addexclude'].extend(excludepats)
+
     if narrowspec.needsexpansion(opts['addinclude'] + opts['addexclude']):
         raise error.Abort('Expansion not yet supported on widen/narrow')
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-narrow-trackedcmd.t	Mon Aug 06 14:06:19 2018 +0300
@@ -0,0 +1,218 @@
+#testcases flat tree
+  $ . "$TESTDIR/narrow-library.sh"
+
+#if tree
+  $ cat << EOF >> $HGRCPATH
+  > [experimental]
+  > treemanifest = 1
+  > EOF
+#endif
+
+  $ hg init master
+  $ cd master
+  $ cat >> .hg/hgrc <<EOF
+  > [narrow]
+  > serveellipses=True
+  > EOF
+
+  $ mkdir inside
+  $ echo 'inside' > inside/f
+  $ hg add inside/f
+  $ hg commit -m 'add inside'
+
+  $ mkdir widest
+  $ echo 'widest' > widest/f
+  $ hg add widest/f
+  $ hg commit -m 'add widest'
+
+  $ mkdir outside
+  $ echo 'outside' > outside/f
+  $ hg add outside/f
+  $ hg commit -m 'add outside'
+
+  $ cd ..
+
+narrow clone the inside file
+
+  $ hg clone --narrow ssh://user@dummy/master narrow --include inside
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 1 changes to 1 files
+  new changesets *:* (glob)
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd narrow
+  $ hg tracked
+  I path:inside
+  $ ls
+  inside
+  $ cat inside/f
+  inside
+  $ cd ..
+
+add more upstream files which we will include in a wider narrow spec
+
+  $ cd master
+
+  $ mkdir wider
+  $ echo 'wider' > wider/f
+  $ hg add wider/f
+  $ echo 'widest v2' > widest/f
+  $ hg commit -m 'add wider, update widest'
+
+  $ echo 'widest v3' > widest/f
+  $ hg commit -m 'update widest v3'
+
+  $ echo 'inside v2' > inside/f
+  $ hg commit -m 'update inside'
+
+  $ mkdir outside2
+  $ echo 'outside2' > outside2/f
+  $ hg add outside2/f
+  $ hg commit -m 'add outside2'
+
+  $ echo 'widest v4' > widest/f
+  $ hg commit -m 'update widest v4'
+
+  $ hg log -T "{if(ellipsis, '...')}{rev}: {desc}\n"
+  7: update widest v4
+  6: add outside2
+  5: update inside
+  4: update widest v3
+  3: add wider, update widest
+  2: add outside
+  1: add widest
+  0: add inside
+
+  $ cd ..
+
+Testing the --import-rules flag of `hg tracked` command
+
+  $ cd narrow
+  $ hg tracked --import-rules
+  hg tracked: option --import-rules requires argument
+  hg tracked [OPTIONS]... [REMOTE]
+  
+  show or change the current narrowspec
+  
+  options ([+] can be repeated):
+  
+      --addinclude VALUE [+]       new paths to include
+      --removeinclude VALUE [+]    old paths to no longer include
+      --addexclude VALUE [+]       new paths to exclude
+      --import-rules VALUE         import narrowspecs from a file
+      --removeexclude VALUE [+]    old paths to no longer exclude
+      --clear                      whether to replace the existing narrowspec
+      --force-delete-local-changes forces deletion of local changes when
+                                   narrowing
+   -e --ssh CMD                    specify ssh command to use
+      --remotecmd CMD              specify hg command to run on the remote side
+      --insecure                   do not verify server certificate (ignoring
+                                   web.cacerts config)
+  
+  (use 'hg tracked -h' to show more help)
+  [255]
+  $ hg tracked --import-rules doesnotexist
+  abort: cannot read narrowspecs from '$TESTTMP/narrow/doesnotexist': $ENOENT$
+  [255]
+
+  $ cat > specs <<EOF
+  > %include foo
+  > [include]
+  > path:widest/
+  > [exclude]
+  > path:inside/
+  > EOF
+
+  $ hg tracked --import-rules specs
+  abort: including other spec files using '%include' is not supported in narrowspec
+  [255]
+
+  $ cat > specs <<EOF
+  > [include]
+  > outisde
+  > [exclude]
+  > inside
+  > EOF
+
+  $ hg tracked --import-rules specs
+  comparing with ssh://user@dummy/master
+  searching for changes
+  looking for local changes to affected paths
+  deleting data/inside/f.i
+  deleting meta/inside/00manifest.i (tree !)
+  no changes found
+  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-widen.hg (glob)
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 0 changes to 0 files
+  new changesets *:* (glob)
+  $ hg tracked
+  I path:outisde
+  X path:inside
+
+Testing the --import-rules flag with --addinclude and --addexclude
+
+  $ cat > specs <<EOF
+  > [include]
+  > widest
+  > EOF
+
+  $ hg tracked --import-rules specs --addinclude 'wider/'
+  comparing with ssh://user@dummy/master
+  searching for changes
+  no changes found
+  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-widen.hg (glob)
+  adding changesets
+  adding manifests
+  adding file changes
+  added 3 changesets with 1 changes to 1 files
+  new changesets *:* (glob)
+  $ hg tracked
+  I path:outisde
+  I path:wider
+  I path:widest
+  X path:inside
+
+  $ cat > specs <<EOF
+  > [exclude]
+  > outside2
+  > EOF
+
+  $ hg tracked --import-rules specs --addexclude 'widest'
+  comparing with ssh://user@dummy/master
+  searching for changes
+  looking for local changes to affected paths
+  deleting data/widest/f.i
+  deleting meta/widest/00manifest.i (tree !)
+  $ hg tracked
+  I path:outisde
+  I path:wider
+  X path:inside
+  X path:outside2
+  X path:widest
+
+  $ hg tracked --import-rules specs --clear
+  The --clear option is not yet supported.
+  [1]
+
+Testing with passing a out of wdir file
+
+  $ cat > ../nspecs <<EOF
+  > [include]
+  > widest
+  > EOF
+
+  $ hg tracked --import-rules ../nspecs
+  comparing with ssh://user@dummy/master
+  searching for changes
+  no changes found
+  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-widen.hg (glob)
+  adding changesets
+  adding manifests
+  adding file changes
+  added 3 changesets with 0 changes to 0 files
+  new changesets *:* (glob)