From: "David Kågedal" <davidk@lysator.liu.se>
To: catalin.marinas@gmail.com
Cc: git@vger.kernel.org
Subject: [StGit RFC] Make "stg branch -l" faster by getting all git config information in one call
Date: Thu, 13 Dec 2007 14:38:36 +0100 [thread overview]
Message-ID: <20071213133653.13925.89254.stgit@krank> (raw)
This isn't a real patch yet, but it is good enough for my usage.
I have a fair amount of branches, and I noticed that "stg branch -l"
takes ridiculously long to finish. The problem is that it creates
stack objects for all branches, and indiviudally extract information
about them one after one. With 20 branches, it took almost 2 seconds
to run. Compare that with the 0.01 seconds it takes to run "git
branch".
I made a patch that uses "git config --get-regexp" to get the
description and stgit.stackformatversion options for all branches at
once, and ignore the "protected" flag that I don't use. With this
change, I'm almost down to half a second, which almost makes it
usable.
There are still a bunch of redundant invokations of git, but python
startup times are hard to get around.
Maybe someone can help me find a quicker replacement for the
get_protected call?
---
stgit/commands/branch.py | 39 ++++++++++++++++++++++++++++++---------
1 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/stgit/commands/branch.py b/stgit/commands/branch.py
index 50684bb..f4b0c33 100644
--- a/stgit/commands/branch.py
+++ b/stgit/commands/branch.py
@@ -72,21 +72,21 @@ options = [make_option('-c', '--create',
def __is_current_branch(branch_name):
return crt_series.get_name() == branch_name
-def __print_branch(branch_name, length):
+def __print_branch(branch_name, description, version, length):
initialized = ' '
current = ' '
protected = ' '
- branch = stack.Series(branch_name)
+ #branch = stack.Series(branch_name)
- if branch.is_initialised():
+ if version != None:
initialized = 's'
if __is_current_branch(branch_name):
current = '>'
- if branch.get_protected():
- protected = 'p'
+ #if branch.get_protected():
+ # protected = 'p'
out.stdout(current + ' ' + initialized + protected + '\t'
- + branch_name.ljust(length) + ' | ' + branch.get_description())
+ + branch_name.ljust(length) + ' | ' + (description or ''))
def __delete_branch(doomed_name, force = False):
doomed = stack.Series(doomed_name)
@@ -100,6 +100,23 @@ def __delete_branch(doomed_name, force = False):
doomed.delete(force)
out.done()
+class FormatException(StgException):
+ pass
+
+def __get_all_branch_config(key):
+ key = re.escape(key)
+ lines = git.GRun('config', '--get-regexp',
+ r'branch\..*\.'+key).returns([0,1]).output_lines()
+ val_re = re.compile(r'branch\.(.*)\.%s (.*)' % key)
+ result = {}
+ for line in lines:
+ m = val_re.match(line)
+ if not m:
+ raise FormatException("unknown output from git config")
+ branch, data = m.groups()
+ result[branch] = data
+ return result
+
def func(parser, options, args):
if options.create:
@@ -198,11 +215,15 @@ def func(parser, options, args):
branches = git.get_heads()
branches.sort()
+ descriptions = __get_all_branch_config('description')
+ versions = __get_all_branch_config('stgit.stackformatversion')
+
if branches:
out.info('Available branches:')
- max_len = max([len(i) for i in branches])
- for i in branches:
- __print_branch(i, max_len)
+ max_len = max(len(i) for i in branches)
+ for branch in branches:
+ __print_branch(branch, descriptions.get(branch),
+ versions.get(branch), max_len)
else:
out.info('No branches')
return
next reply other threads:[~2007-12-13 13:38 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-13 13:38 David Kågedal [this message]
2007-12-13 13:42 ` git config --get-regexp exit status David Kågedal
2007-12-13 18:06 ` Junio C Hamano
2007-12-13 14:04 ` [StGit RFC] Make "stg branch -l" faster by getting all git config information in one call Catalin Marinas
2007-12-13 14:15 ` David Kågedal
2007-12-13 14:31 ` David Kågedal
2007-12-13 15:38 ` Catalin Marinas
2007-12-13 16:08 ` David Kågedal
2007-12-13 16:08 ` Karl Hasselström
2007-12-13 16:04 ` Karl Hasselström
2007-12-13 16:10 ` Catalin Marinas
2007-12-13 16:39 ` David Kågedal
2007-12-13 17:04 ` Karl Hasselström
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071213133653.13925.89254.stgit@krank \
--to=davidk@lysator.liu.se \
--cc=catalin.marinas@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).