[PATCH] hg tip for subrepos: -S/--subrepos for hg tip to recurse on subrepositories

Erik Zielke ez at aragost.com
Thu Sep 30 07:16:35 CDT 2010


# HG changeset patch
# User Erik Zielke <ez at aragost.com>
# Date 1285578511 -7200
# Node ID 5ed5dadf9654ea946a0aa4155c57ff668c307178
# Parent  234e9a63173db6eb117b952cccbc4ccc9fc297ab
hg tip for subrepos: -S/--subrepos for hg tip to recurse on subrepositories

Option for tip to recurse on subrepositories.

Shows
  subrepo:  name of subrepo
before a sub repository changeset

And added {subrepo} as a keyword which can be used in

diff -r 234e9a63173d -r 5ed5dadf9654 contrib/bash_completion
--- a/contrib/bash_completion	Thu Sep 30 12:46:46 2010 +0200
+++ b/contrib/bash_completion	Mon Sep 27 11:08:31 2010 +0200
@@ -54,6 +54,13 @@
 
 shopt -s extglob
 
+_hg_emails()
+{
+    if [ -r ~/.patchbomb-$1 ]; then
+       cat ~/.patchbomb-$1
+    fi
+}
+
 _hg_cmd()
 {
     HGPLAIN=1 "$hg" "$@" 2>/dev/null
diff -r 234e9a63173d -r 5ed5dadf9654 mercurial/cmdutil.py
--- a/mercurial/cmdutil.py	Thu Sep 30 12:46:46 2010 +0200
+++ b/mercurial/cmdutil.py	Mon Sep 27 11:08:31 2010 +0200
@@ -5,12 +5,12 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
+from i18n import _
 from node import hex, nullid, nullrev, short
-from i18n import _
+import match as matchmod
 import os, sys, errno, re, glob, tempfile
+import similar, revset, subrepo
 import util, templater, patch, error, encoding, templatekw
-import match as matchmod
-import similar, revset, subrepo
 
 revrangesep = ':'
 
@@ -93,7 +93,7 @@
             else:
                 message = open(logfile).read()
         except IOError, inst:
-            raise util.Abort(_("can't read commit message '%s': %s") %
+            raise util.Abort(_("can't read commit message '%s': %s") % 
                              (logfile, inst.strerror))
     return message
 
@@ -156,7 +156,7 @@
                 start, end = spec.split(revrangesep, 1)
                 start = revfix(repo, start, 0)
                 end = revfix(repo, end, len(repo) - 1)
-                step = start > end and -1 or 1
+                step = start > end and - 1 or 1
                 for rev in xrange(start, end + step, step):
                     if rev in seen:
                         continue
@@ -224,7 +224,7 @@
             i += 1
         return ''.join(newname)
     except KeyError, inst:
-        raise util.Abort(_("invalid format spec '%%%s' in output filename") %
+        raise util.Abort(_("invalid format spec '%%%s' in output filename") % 
                          inst.args[0])
 
 def make_file(repo, pat, node=None,
@@ -314,7 +314,7 @@
                 added + unknown, removed + deleted, similarity):
             if repo.ui.verbose or not m.exact(old) or not m.exact(new):
                 repo.ui.status(_('recording removal of %s as rename to %s '
-                                 '(%d%% similar)\n') %
+                                 '(%d%% similar)\n') % 
                                (m.rel(old), m.rel(new), score * 100))
             copies[new] = old
 
@@ -416,7 +416,7 @@
         # check for collisions
         prevsrc = targets.get(abstarget)
         if prevsrc is not None:
-            ui.warn(_('%s: not overwriting - %s collides with %s\n') %
+            ui.warn(_('%s: not overwriting - %s collides with %s\n') % 
                     (reltarget, repo.pathto(abssrc, cwd),
                      repo.pathto(prevsrc, cwd)))
             return
@@ -425,17 +425,17 @@
         exists = os.path.lexists(target)
         if not after and exists or after and state in 'mn':
             if not opts['force']:
-                ui.warn(_('%s: not overwriting - file exists\n') %
+                ui.warn(_('%s: not overwriting - file exists\n') % 
                         reltarget)
                 return
 
         if after:
             if not exists:
                 if rename:
-                    ui.warn(_('%s: not recording move - %s does not exist\n') %
+                    ui.warn(_('%s: not recording move - %s does not exist\n') % 
                             (relsrc, reltarget))
                 else:
-                    ui.warn(_('%s: not recording copy - %s does not exist\n') %
+                    ui.warn(_('%s: not recording copy - %s does not exist\n') % 
                             (relsrc, reltarget))
                 return
         elif not dryrun:
@@ -450,7 +450,7 @@
                 if inst.errno == errno.ENOENT:
                     ui.warn(_('%s: deleted in working copy\n') % relsrc)
                 else:
-                    ui.warn(_('%s: cannot copy - %s\n') %
+                    ui.warn(_('%s: cannot copy - %s\n') % 
                             (relsrc, inst.strerror))
                     return True # report a failure
 
@@ -736,7 +736,7 @@
 class changeset_printer(object):
     '''show changeset information when templating not requested.'''
 
-    def __init__(self, ui, repo, patch, diffopts, buffered):
+    def __init__(self, ui, repo, patch, diffopts, buffered, subpath=None):
         self.ui = ui
         self.repo = repo
         self.buffered = buffered
@@ -746,6 +746,7 @@
         self.hunk = {}
         self.lastheader = None
         self.footer = None
+        self.subpath = subpath
 
     def flush(self, rev):
         if rev in self.header:
@@ -790,6 +791,9 @@
         parents = [(p, hexfunc(log.node(p)))
                    for p in self._meaningful_parentrevs(log, rev)]
 
+        if self.subpath:
+            self.ui.write(_("subrepo:     %s\n") % self.subpath)
+
         self.ui.write(_("changeset:   %d:%s\n") % (rev, hexfunc(changenode)),
                       label='log.changeset')
 
@@ -808,7 +812,7 @@
 
         if self.ui.debugflag:
             mnode = ctx.manifestnode()
-            self.ui.write(_("manifest:    %d:%s\n") %
+            self.ui.write(_("manifest:    %d:%s\n") % 
                           (self.repo.manifest.rev(mnode), hex(mnode)),
                           label='ui.debug log.manifest')
         self.ui.write(_("user:        %s\n") % ctx.user(),
@@ -847,7 +851,7 @@
                               label='ui.note log.description')
                 self.ui.write("\n\n")
             else:
-                self.ui.write(_("summary:     %s\n") %
+                self.ui.write(_("summary:     %s\n") % 
                               description.splitlines()[0],
                               label='log.summary')
         self.ui.write("\n")
@@ -891,8 +895,10 @@
 class changeset_templater(changeset_printer):
     '''format changeset information.'''
 
-    def __init__(self, ui, repo, patch, diffopts, mapfile, buffered):
-        changeset_printer.__init__(self, ui, repo, patch, diffopts, buffered)
+    def __init__(self, ui, repo, patch, diffopts,
+                 mapfile, buffered, subpath=None):
+        changeset_printer.__init__(self, ui, repo, patch,
+                                   diffopts, buffered, subpath)
         formatnode = ui.debugflag and (lambda x: x) or (lambda x: x[:12])
         defaulttempl = {
             'parent': '{rev}:{node|formatnode} ',
@@ -902,6 +908,7 @@
             }
         # filecopy is preserved for compatibility reasons
         defaulttempl['filecopy'] = defaulttempl['file_copy']
+        self.subpath = subpath
         self.t = templater.templater(mapfile, {'formatnode': formatnode},
                                      cache=defaulttempl)
         self.cache = {}
@@ -945,6 +952,7 @@
         props['repo'] = self.repo
         props['revcache'] = {'copies': copies}
         props['cache'] = self.cache
+        props['subrepopath'] = self.subpath
 
         # find correct templates for current mode
 
@@ -976,7 +984,8 @@
 
             # write changeset metadata, then patch if requested
             key = types['changeset']
-            self.ui.write(templater.stringify(self.t(key, **props)))
+            out = templater.stringify(self.t(key, **props))
+            self.ui.write(out)
             self.showpatch(ctx.node(), matchfn)
 
             if types['footer']:
@@ -990,7 +999,7 @@
         except SyntaxError, inst:
             raise util.Abort('%s: %s' % (self.t.mapfile, inst.args[0]))
 
-def show_changeset(ui, repo, opts, buffered=False):
+def show_changeset(ui, repo, opts, buffered=False, subpath=None):
     """show one changeset using template or regular display.
 
     Display format will be the first non-empty hit of:
@@ -1022,7 +1031,7 @@
             style = util.expandpath(ui.config('ui', 'style', ''))
 
     if not (tmpl or style):
-        return changeset_printer(ui, repo, patch, opts, buffered)
+        return changeset_printer(ui, repo, patch, opts, buffered, subpath)
 
     mapfile = None
     if style and not tmpl:
@@ -1034,7 +1043,7 @@
                 mapfile = mapname
 
     try:
-        t = changeset_templater(ui, repo, patch, opts, mapfile, buffered)
+        t = changeset_templater(ui, repo, patch, opts, mapfile, buffered, subpath)
     except SyntaxError, inst:
         raise util.Abort(inst.args[0])
     if tmpl:
@@ -1056,7 +1065,7 @@
     for ctx in walkchangerevs(repo, m, {'rev': None}, prep):
         rev = ctx.rev()
         if rev in results:
-            ui.status(_("Found revision %s from %s\n") %
+            ui.status(_("Found revision %s from %s\n") % 
                       (rev, util.datestr(results[rev])))
             return str(rev)
 
diff -r 234e9a63173d -r 5ed5dadf9654 mercurial/commands.py
--- a/mercurial/commands.py	Thu Sep 30 12:46:46 2010 +0200
+++ b/mercurial/commands.py	Mon Sep 27 11:08:31 2010 +0200
@@ -3719,6 +3719,8 @@
     displayer.show(repo[len(repo) - 1])
     displayer.close()
 
+    hg.tip(ui, repo, **opts)
+
 def unbundle(ui, repo, fname1, *fnames, **opts):
     """apply one or more changegroup files
 
@@ -4417,7 +4419,7 @@
         (tip,
          [('p', 'patch', None, _('show patch')),
           ('g', 'git', None, _('use git extended diff format')),
-         ] + templateopts,
+         ] + templateopts + subrepoopts ,
          _('[-p] [-g]')),
     "unbundle":
         (unbundle,
diff -r 234e9a63173d -r 5ed5dadf9654 mercurial/hg.py
--- a/mercurial/hg.py	Thu Sep 30 12:46:46 2010 +0200
+++ b/mercurial/hg.py	Mon Sep 27 11:08:31 2010 +0200
@@ -522,6 +522,13 @@
     recurse()
     return 0 # exit code is zero since we found outgoing changes
 
+def tip(ui, repo, **opts):
+    if opts.get('subrepos'):
+        ctx = repo[None]
+        for subpath in sorted(ctx.substate):
+            sub = ctx.sub(subpath)
+            sub.tip(ui, **opts)
+
 def revert(repo, node, choose):
     """revert changes to revision in node without updating dirstate"""
     return mergemod.update(repo, node, False, True, choose)[3] > 0
diff -r 234e9a63173d -r 5ed5dadf9654 mercurial/subrepo.py
--- a/mercurial/subrepo.py	Thu Sep 30 12:46:46 2010 +0200
+++ b/mercurial/subrepo.py	Mon Sep 27 11:08:31 2010 +0200
@@ -282,6 +282,9 @@
         """return file flags"""
         return ''
 
+    def tip(self, ui, source, **opts):
+        raise NotImplementedError
+
     def archive(self, archiver, prefix):
         for name in self.files():
             flags = self.fileflags(name)
@@ -324,6 +327,14 @@
         return cmdutil.add(ui, self._repo, match, dryrun, True,
                            os.path.join(prefix, self._path))
 
+    def tip(self, ui, **opts):
+        repo = self._repo
+        path = relpath(self)
+        displayer = cmdutil.show_changeset(ui, repo, opts, subpath=path)
+        displayer.show(repo[len(repo) - 1])
+        displayer.close()
+        hg.tip(ui, repo, **opts)
+
     def status(self, rev2, **opts):
         try:
             rev1 = self._state[1]
diff -r 234e9a63173d -r 5ed5dadf9654 mercurial/templatekw.py
--- a/mercurial/templatekw.py	Thu Sep 30 12:46:46 2010 +0200
+++ b/mercurial/templatekw.py	Mon Sep 27 11:08:31 2010 +0200
@@ -236,6 +236,9 @@
 def showrev(repo, ctx, templ, **args):
     return ctx.rev()
 
+def showsubrepo(**args):
+    return args['subrepopath']
+
 def showtags(**args):
     return showlist('tag', args['ctx'].tags(), **args)
 
@@ -267,5 +270,6 @@
     'node': shownode,
     'rev': showrev,
     'tags': showtags,
+    'subrepo': showsubrepo,
 }
 
diff -r 234e9a63173d -r 5ed5dadf9654 tests/test-debugcomplete.t
--- a/tests/test-debugcomplete.t	Thu Sep 30 12:46:46 2010 +0200
+++ b/tests/test-debugcomplete.t	Mon Sep 27 11:08:31 2010 +0200
@@ -243,7 +243,7 @@
   showconfig: untrusted
   tag: force, local, rev, remove, edit, message, date, user
   tags: 
-  tip: patch, git, style, template
+  tip: patch, git, style, template, subrepos
   unbundle: update
   verify: 
   version: 
diff -r 234e9a63173d -r 5ed5dadf9654 tests/test-subrepo-recursion.t
--- a/tests/test-subrepo-recursion.t	Thu Sep 30 12:46:46 2010 +0200
+++ b/tests/test-subrepo-recursion.t	Mon Sep 27 11:08:31 2010 +0200
@@ -341,6 +341,37 @@
   abort: cannot combine --bundle and --subrepos
   [255]
 
+Test recursive tip
+  $ hg tip -S
+  changeset:   2:1326fa26d0c0
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2-3-2
+  
+  subrepo:     foo
+  changeset:   3:65903cebad86
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2-3-2
+  
+  subrepo:     foo/bar
+  changeset:   2:31ecbdafd357
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     2-3-2
+  
+Test recursive tip using template
+  $ hg tip -S --template '{subrepo}\n{rev}:{node|short} {desc}\n'
+  
+  2:1326fa26d0c0 2-3-2
+  foo
+  3:65903cebad86 2-3-2
+  foo/bar
+  2:31ecbdafd357 2-3-2
+
 Test missing subrepo:
 
   $ rm -r foo


More information about the Mercurial-devel mailing list