[cig-commits] commit: restore support for repositories under .hg

Mercurial hg at geodynamics.org
Mon Nov 24 11:27:03 PST 2008


changeset:   44:3a2665d193d0
user:        Robin Farine <robin.farine at terminus.org>
date:        Thu Jan 11 15:38:21 2007 +0100
files:       forest.py test-forest test-forest.out
description:
restore support for repositories under .hg

This change set adds the 'walkhg' configuration and command-line
option back. This option directs the relevant forest commands to
handle or to ignore repositories *directly* under a .hg directory,
e.g. mq patch repositories.


diff -r 60036a82c3c4 -r 3a2665d193d0 forest.py
--- a/forest.py	Wed Jan 10 11:10:12 2007 +0100
+++ b/forest.py	Thu Jan 11 15:38:21 2007 +0100
@@ -29,6 +29,19 @@ The 'fsnap' command generates or updates
 The 'fsnap' command generates or updates such a file based on a forest
 in the file system. Other commands use this information to populate a
 forest or to pull/push changes.
+
+
+Configuration
+
+This extension recognizes the following item in the forest
+configuration section:
+
+walkhg = (0|no|false|1|yes|true)
+
+  Whether repositories directly under a .hg directory should be
+  skipped (0|no|false) or not (1|yes|true). The default value is 0.
+  Some commands accept the --walkhg command-line option to override
+  the behavior selected by this item.
 """
 
 import ConfigParser
@@ -51,8 +64,18 @@ def cmd_options(ui, cmd, remove=None):
         res = [opt for opt in res if opt[0] not in remove]
     return res
 
-
-def enumerate_repos(ui, top):
+def walkhgenabled(ui, walkhg):
+    if walkhg == '':
+        walkhg = ui.config('forest', 'walkhg', 'false')
+    try:
+        res = { '0' : False, 'false' : False, 'no' : False,
+                '1' : True, 'true' : True, 'yes' : True }[walkhg.lower()]
+    except KeyError:
+        raise util.Abort(_("invalid value for 'walkhg': %s" % walkhg))
+    return res
+
+
+def enumerate_repos(ui, top, walkhg):
     """Generate a lexicographically sorted list of repository roots.
 
     Return a list of roots in filesystem representation.
@@ -75,6 +98,13 @@ def enumerate_repos(ui, top):
                     p = os.path.join(root, d)
                     if os.path.islink(p):
                         paths.append(p)
+    if walkhg:
+        for root in list(res):
+            hgroot = os.path.join(root, '.hg')
+            for e in os.listdir(hgroot):
+                path = os.path.join(hgroot, e)
+                if os.path.isdir(os.path.join(path, '.hg')):
+                    res.append(path)
     res.sort()
     return res
 
@@ -190,7 +220,7 @@ class ForestSnapshot(object):
             ui.write("\n")
 
 
-    def update(self, ui, repo, mq_fatal, tip=False):
+    def update(self, ui, repo, mq_fatal, walkhg='', tip=False):
         """Update a snapshot by scanning a forest.
 
         If the ForestSnapshot instance to update was initialized from
@@ -203,7 +233,7 @@ class ForestSnapshot(object):
         rootmap = {}
         self.trees = []
         pfxlen = len(repo.root + os.sep)
-        for rpath in enumerate_repos(ui, repo.root):
+        for rpath in enumerate_repos(ui, repo.root, walkhg):
             root = util.pconvert(rpath[pfxlen:])
             if root == '':
                 root = '.'
@@ -235,7 +265,7 @@ class ForestSnapshot(object):
             index += 1
 
 
-def clone(ui, source, dest, **opts):
+def clone(ui, source, dest, walkhg, **opts):
     """Clone a local forest."""
     dest = os.path.normpath(dest)
 
@@ -252,7 +282,7 @@ def clone(ui, source, dest, **opts):
 
     snapshot = ForestSnapshot()
     repo = hg.repository(ui, source)
-    snapshot.update(ui, repo, True)
+    snapshot.update(ui, repo, True, walkhgenabled(ui, walkhg))
     snapshot(ui, repo, doit, mq_check=False)
 
 
@@ -304,12 +334,12 @@ def push(ui, toprepo, snapfile, pathalia
     snapshot(ui, toprepo, doit, pathalias)
 
 
-def seed(ui, snapshot, pathalias='default', **opts):
+def seed(ui, snapshot, pathalias='default', root='', tip=False, **opts):
     """Populate a forest according to a snapshot file."""
 
     cfg = ConfigParser.RawConfigParser()
     cfg.read(snapshot)
-    pfx = opts['root']
+    pfx = root
     for section in tree_sections(cfg, bool(pfx)):
         root = cfg.get(section, 'root')
         ui.write("[%s]\n" % root)
@@ -329,7 +359,7 @@ def seed(ui, snapshot, pathalias='defaul
         # everything and then use 'update' if necessary
         opts['rev'] = []
         commands.clone(ui, source, dest, **opts)
-        if not opts['tip']:
+        if not tip:
             rev = cfg.get(section, 'revision')
             if rev and rev != 'tip' and rev != node.nullid:
                 repo = hg.repository(ui, dest)
@@ -337,15 +367,15 @@ def seed(ui, snapshot, pathalias='defaul
         ui.write("\n")
 
 
-def snapshot(ui, repo, snapfile=None, **opts):
+def snapshot(ui, repo, snapfile=None, tip=False, walkhg='', **opts):
     """Generate a new or updated forest snapshot and display it."""
 
     snapshot = ForestSnapshot(snapfile)
-    snapshot.update(ui, repo, True, **opts)
+    snapshot.update(ui, repo, True, walkhgenabled(ui, walkhg), tip)
     snapshot.write(ui)
 
 
-def status(ui, repo, *pats, **opts):
+def status(ui, repo, walkhg='', *pats, **opts):
     """Display the status of a forest of working directories."""
 
     def doit(repo, root, path, rev, mq_applied):
@@ -354,24 +384,26 @@ def status(ui, repo, *pats, **opts):
         commands.status(repo.ui, repo, *pats, **opts)
 
     snapshot = ForestSnapshot()
-    snapshot.update(ui, repo, False)
+    snapshot.update(ui, repo, False, walkhgenabled(ui, walkhg))
     snapshot(ui, repo, doit)
 
 
-def trees(ui, repo, **opts):
+def trees(ui, repo, convert=False, walkhg='', **opts):
     """List the roots of the repositories."""
 
-    if opts['convert']:
+    walkhg = walkhgenabled(ui, walkhg)
+    if convert:
         pfxlen = len(repo.root + os.sep)
-        l = [util.pconvert(p[pfxlen:]) for p in enumerate_repos(ui, repo.root)]
+        l = [util.pconvert(p[pfxlen:])
+             for p in enumerate_repos(ui, repo.root, walkhg)]
         l.remove('')
         l.insert(0, '.')
     else:
-        l = enumerate_repos(ui, repo.root)
+        l = enumerate_repos(ui, repo.root, walkhg)
     for t in l:
         ui.write(t + '\n')
 
-def update(ui, toprepo, snapfile=None, tip=False, **opts):
+def update(ui, toprepo, snapfile=None, tip=False, walkhg='', **opts):
     """Update working directories to tip or according to a snapshot file.
 
     When the tip option is specified, the working directory of the
@@ -382,12 +414,11 @@ def update(ui, toprepo, snapfile=None, t
 
     The tip option or the snapshot file are exclusive.
     """
-
     if snapfile is not None and tip or snapfile is None and not tip:
         raise util.Abort(_("need either --tip or SNAPSHOT-FILE"))
     if tip:
         snapshot = ForestSnapshot()
-        snapshot.update(ui, toprepo, False, True)
+        snapshot.update(ui, toprepo, False, walkhgenabled(ui, walkhg), True)
     else:
         snapshot = ForestSnapshot(snapfile)
 
@@ -402,10 +433,13 @@ def update(ui, toprepo, snapfile=None, t
 
 def uisetup(ui):
     global cmdtable
+    walkhgopt = ('', 'walkhg', '',
+                 _("whether to walk (1|yes|true) repositories under '.hg' or "
+                   "not (0|no|false)"))
     cmdtable = {
         "fclone" :
             (clone,
-             cmd_options(ui, 'clone', remove=('r',)),
+             [walkhgopt] + cmd_options(ui, 'clone', remove=('r',)),
              _('hg fclone [OPTIONS] SOURCE DESTINATION')),
         "fpull" :
             (pull,
@@ -417,30 +451,33 @@ def uisetup(ui):
              _('hg fpush [OPTIONS] SNAPSHOT-FILE PATH-ALIAS')),
         "fseed" :
             (seed,
-             [('t', 'tip', None,
-               _("use tip instead of revisions stored in the snapshot file")),
-              ('', 'root', '',
-               _("create root as well as children under <root>"))]
+             [('', 'root', '',
+               _("create root as well as children under <root>")),
+              ('t', 'tip', False,
+               _("use tip instead of revisions stored in the snapshot file"))]
              + cmd_options(ui, 'clone', remove=('r',)),
              _('hg fseed [OPTIONS] SNAPSHOT-FILE [PATH-ALIAS]')),
         "fsnap" :
             (snapshot,
-             [('t', 'tip', None,
-               _("record tip instead of actual child revisions"))],
+             [('t', 'tip', False,
+               _("record tip instead of actual child revisions")),
+              walkhgopt],
              _('hg fsnap [OPTIONS] [SNAPSHOT-FILE]')),
         "fstatus" :
             (status,
-             cmd_options(ui, 'status'),
+             [walkhgopt] + cmd_options(ui, 'status'),
              _('hg fstatus [OPTIONS]')),
         "ftrees" :
             (trees,
-             [('c', 'convert', None,
-               _("convert paths to mercurial representation"))],
+             [('c', 'convert', False,
+               _("convert paths to mercurial representation")),
+              walkhgopt],
              _('hg ftrees [OPTIONS]')),
         "fupdate" :
             (update,
              [('', 'tip', False,
-               _("update working directories to a specified revision"))]
+               _("update working directories to a specified revision")),
+              walkhgopt]
              + cmd_options(ui, 'update', remove=('d',)),
-             _('hg fupdate (--tip | SNAPSHOT-FILE)'))
+             _('hg fupdate [OPTIONS] (--tip | SNAPSHOT-FILE)'))
         }
diff -r 60036a82c3c4 -r 3a2665d193d0 test-forest
--- a/test-forest	Wed Jan 10 11:10:12 2007 +0100
+++ b/test-forest	Thu Jan 11 15:38:21 2007 +0100
@@ -131,3 +131,15 @@ hg fpull --cwd topcopy -u ../top-snap de
 
 echo "# fpush + mq"
 hg fpush --cwd topcopy ../top-snap default | sed "s@$HGTMP at HGTMP@g"
+
+echo "# walk **/.hg"
+hg init walkhg
+hg init walkhg/.hg/h
+hg init walkhg/a
+hg init walkhg/a/.hg/h
+hg ftrees --cwd walkhg --convert
+hg ftrees -R walkhg --convert --walkhg=1
+echo "[forest]" >> walkhg/.hg/hgrc
+echo "walkhg = Yes" >> walkhg/.hg/hgrc
+hg ftrees -R walkhg --convert
+hg ftrees --cwd walkhg --convert --walkhg=FALSE
diff -r 60036a82c3c4 -r 3a2665d193d0 test-forest.out
--- a/test-forest.out	Wed Jan 10 11:10:12 2007 +0100
+++ b/test-forest.out	Thu Jan 11 15:38:21 2007 +0100
@@ -416,3 +416,16 @@ searching for changes
 searching for changes
 no changes found
 
+# walk **/.hg
+.
+a
+.
+.hg/h
+a
+a/.hg/h
+.
+.hg/h
+a
+a/.hg/h
+.
+a



More information about the CIG-COMMITS mailing list