From 89e717d9481c0c69292a39f85599f5df8277b004 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Sat, 18 Apr 2009 15:04:41 -0700 Subject: Improve checkout performance for the common unmodified case Most projects will have their branch heads matching in all branches, so switching between them should be just a matter of updating the work tree's HEAD symref. This can be done in pure Python, saving quite a bit of time over forking 'git checkout'. Signed-off-by: Shawn O. Pearce --- subcmds/checkout.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'subcmds/checkout.py') diff --git a/subcmds/checkout.py b/subcmds/checkout.py index 07644c95..4198acd1 100644 --- a/subcmds/checkout.py +++ b/subcmds/checkout.py @@ -15,6 +15,7 @@ import sys from command import Command +from progress import Progress class Checkout(Command): common = True @@ -35,13 +36,23 @@ The command is equivalent to: if not args: self.Usage() - retValue = 0; - - branch = args[0] - for project in self.GetProjects(args[1:]): - if not project.CheckoutBranch(branch): - retValue = 1; - print >>sys.stderr, "error: checking out branch '%s' in %s failed" % (branch, project.name) - - if (retValue != 0): - sys.exit(retValue); + nb = args[0] + err = [] + all = self.GetProjects(args[1:]) + + pm = Progress('Checkout %s' % nb, len(all)) + for project in all: + pm.update() + if not project.CheckoutBranch(nb): + err.append(project) + pm.end() + + if err: + if len(err) == len(all): + print >>sys.stderr, 'error: no project has branch %s' % nb + else: + for p in err: + print >>sys.stderr,\ + "error: %s/: cannot checkout %s" \ + % (p.relpath, nb) + sys.exit(1) -- cgit v1.2.3-54-g00ecf