From 68194f42b0b0e59f206b8e997c26f6a16b74fd4f Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 10 Apr 2009 16:48:52 -0700 Subject: Add a project progress meter to 'repo sync' This way users can see how much is left during fetch. Its especially useful when most syncs are no-ops but there are hundreds of repositories to poll. Signed-off-by: Shawn O. Pearce --- progress.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ subcmds/sync.py | 9 ++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 progress.py diff --git a/progress.py b/progress.py new file mode 100644 index 00000000..89d6c5ba --- /dev/null +++ b/progress.py @@ -0,0 +1,45 @@ +# +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +class Progress(object): + def __init__(self, title, total): + self._title = title + self._total = total + self._done = 0 + self._lastp = -1 + + def update(self, inc=1): + self._done += inc + p = (100 * self._done) / self._total + + if self._lastp != p: + self._lastp = p + sys.stderr.write('\r%s: %3d%% (%d/%d) ' % ( + self._title, + p, + self._done, + self._total)) + sys.stderr.flush() + + def end(self): + p = (100 * self._done) / self._total + sys.stderr.write('\r%s: %3d%% (%d/%d), done. \n' % ( + self._title, + p, + self._done, + self._total)) + sys.stderr.flush() diff --git a/subcmds/sync.py b/subcmds/sync.py index 21e0899a..79ffcf51 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py @@ -23,6 +23,7 @@ from git_command import GIT from command import Command, MirrorSafeCommand from error import RepoChangedException, GitError from project import R_HEADS +from progress import Progress class Sync(Command, MirrorSafeCommand): common = True @@ -71,12 +72,16 @@ revision is temporarily needed. def _Fetch(self, *projects): fetched = set() + pm = Progress('Fetching projects', len(projects)) for project in projects: + pm.update() + if project.Sync_NetworkHalf(): fetched.add(project.gitdir) else: print >>sys.stderr, 'error: Cannot fetch %s' % project.name sys.exit(1) + pm.end() return fetched def Execute(self, opt, args): @@ -130,12 +135,14 @@ revision is temporarily needed. missing.append(project) self._Fetch(*missing) + pm = Progress('Syncing work tree', len(all)) for project in all: + pm.update() if project.worktree: if not project.Sync_LocalHalf( detach_head=opt.detach_head): sys.exit(1) - + pm.end() def _VerifyTag(project): gpg_dir = os.path.expanduser('~/.repoconfig/gnupg') -- cgit v1.2.3-54-g00ecf