Patchwork branches: avoid unnecessary changectx.branch() calls

login
register
mail settings
Submitter Brodie Rao
Date Nov. 14, 2013, 10:50 p.m.
Message ID <5ad83b0804e366b79d1b.1384469409@kapp.local>
Download mbox | patch
Permalink /patch/2948/
State Superseded
Headers show

Comments

Brodie Rao - Nov. 14, 2013, 10:50 p.m.
# HG changeset patch
# User Brodie Rao <brodie@sf.io>
# Date 1384467366 18000
#      Thu Nov 14 17:16:06 2013 -0500
# Node ID 5ad83b0804e366b79d1bde8b897b1dbbc1dd2d7a
# Parent  c38c3fdc8b9317ba09e03ab09364c3800da7c50c
branches: avoid unnecessary changectx.branch() calls

This requires reading from the changelog, which can be costly over NFS.

Note that this does not totally remove reading from the changelog; we
still do that when calling changectx.closesbranch(). That call will be
removed in a later patch.
Brodie Rao - Nov. 16, 2013, 2:21 a.m.
On Thu, Nov 14, 2013 at 5:50 PM, Brodie Rao <brodie@sf.io> wrote:
> # HG changeset patch
> # User Brodie Rao <brodie@sf.io>
> # Date 1384467366 18000
> #      Thu Nov 14 17:16:06 2013 -0500
> # Node ID 5ad83b0804e366b79d1bde8b897b1dbbc1dd2d7a
> # Parent  c38c3fdc8b9317ba09e03ab09364c3800da7c50c
> branches: avoid unnecessary changectx.branch() calls
>
> This requires reading from the changelog, which can be costly over NFS.
>
> Note that this does not totally remove reading from the changelog; we
> still do that when calling changectx.closesbranch(). That call will be
> removed in a later patch.

Please ignore this patch. I'm sending a longer series that contains an
updated version of it.

> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -1008,7 +1008,7 @@ def branches(ui, repo, active=False, clo
>
>      hexfunc = ui.debugflag and hex or short
>
> -    activebranches = set([repo[n].branch() for n in repo.heads()])
> +    allheads = set(repo.heads())
>      branches = []
>      for tag, heads in repo.branchmap().iteritems():
>          for h in reversed(heads):
> @@ -1019,12 +1019,12 @@ def branches(ui, repo, active=False, clo
>                  break
>          else:
>              tip = repo[heads[-1]]
> -        isactive = tag in activebranches and isopen
> -        branches.append((tip, isactive, isopen))
> -    branches.sort(key=lambda i: (i[1], i[0].rev(), i[0].branch(), i[2]),
> +        isactive = isopen and bool(set(heads) & allheads)
> +        branches.append((tag, tip, isactive, isopen))
> +    branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
>                    reverse=True)
>
> -    for ctx, isactive, isopen in branches:
> +    for tag, ctx, isactive, isopen in branches:
>          if (not active) or isactive:
>              if isactive:
>                  label = 'branches.active'
> @@ -1037,16 +1037,16 @@ def branches(ui, repo, active=False, clo
>              else:
>                  label = 'branches.inactive'
>                  notice = _(' (inactive)')
> -            if ctx.branch() == repo.dirstate.branch():
> +            if tag == repo.dirstate.branch():
>                  label = 'branches.current'
> -            rev = str(ctx.rev()).rjust(31 - encoding.colwidth(ctx.branch()))
> +            rev = str(ctx.rev()).rjust(31 - encoding.colwidth(tag))
>              rev = ui.label('%s:%s' % (rev, hexfunc(ctx.node())),
>                             'log.changeset changeset.%s' % ctx.phasestr())
> -            tag = ui.label(ctx.branch(), label)
> +            labeledtag = ui.label(tag, label)
>              if ui.quiet:
> -                ui.write("%s\n" % tag)
> +                ui.write("%s\n" % labeledtag)
>              else:
> -                ui.write("%s %s%s\n" % (tag, rev, notice))
> +                ui.write("%s %s%s\n" % (labeledtag, rev, notice))
>
>  @command('bundle',
>      [('f', 'force', None, _('run even when the destination is unrelated')),

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -1008,7 +1008,7 @@  def branches(ui, repo, active=False, clo
 
     hexfunc = ui.debugflag and hex or short
 
-    activebranches = set([repo[n].branch() for n in repo.heads()])
+    allheads = set(repo.heads())
     branches = []
     for tag, heads in repo.branchmap().iteritems():
         for h in reversed(heads):
@@ -1019,12 +1019,12 @@  def branches(ui, repo, active=False, clo
                 break
         else:
             tip = repo[heads[-1]]
-        isactive = tag in activebranches and isopen
-        branches.append((tip, isactive, isopen))
-    branches.sort(key=lambda i: (i[1], i[0].rev(), i[0].branch(), i[2]),
+        isactive = isopen and bool(set(heads) & allheads)
+        branches.append((tag, tip, isactive, isopen))
+    branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
                   reverse=True)
 
-    for ctx, isactive, isopen in branches:
+    for tag, ctx, isactive, isopen in branches:
         if (not active) or isactive:
             if isactive:
                 label = 'branches.active'
@@ -1037,16 +1037,16 @@  def branches(ui, repo, active=False, clo
             else:
                 label = 'branches.inactive'
                 notice = _(' (inactive)')
-            if ctx.branch() == repo.dirstate.branch():
+            if tag == repo.dirstate.branch():
                 label = 'branches.current'
-            rev = str(ctx.rev()).rjust(31 - encoding.colwidth(ctx.branch()))
+            rev = str(ctx.rev()).rjust(31 - encoding.colwidth(tag))
             rev = ui.label('%s:%s' % (rev, hexfunc(ctx.node())),
                            'log.changeset changeset.%s' % ctx.phasestr())
-            tag = ui.label(ctx.branch(), label)
+            labeledtag = ui.label(tag, label)
             if ui.quiet:
-                ui.write("%s\n" % tag)
+                ui.write("%s\n" % labeledtag)
             else:
-                ui.write("%s %s%s\n" % (tag, rev, notice))
+                ui.write("%s %s%s\n" % (labeledtag, rev, notice))
 
 @command('bundle',
     [('f', 'force', None, _('run even when the destination is unrelated')),