summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-04-10 16:48:52 -0700
committerShawn O. Pearce <sop@google.com>2009-04-10 19:01:04 -0700
commit68194f42b0b0e59f206b8e997c26f6a16b74fd4f (patch)
treec9a0a35ed66be9c0321e8ecf896d283bc0af763a
parentb1562faee09fe9eb84ea2d1eaf52bf841e2fe811 (diff)
downloadgit-repo-68194f42b0b0e59f206b8e997c26f6a16b74fd4f.tar.gz
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 <sop@google.com>
-rw-r--r--progress.py45
-rw-r--r--subcmds/sync.py9
2 files changed, 53 insertions, 1 deletions
diff --git a/progress.py b/progress.py
new file mode 100644
index 00000000..89d6c5ba
--- /dev/null
+++ b/progress.py
@@ -0,0 +1,45 @@
1#
2# Copyright (C) 2009 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16import sys
17
18class Progress(object):
19 def __init__(self, title, total):
20 self._title = title
21 self._total = total
22 self._done = 0
23 self._lastp = -1
24
25 def update(self, inc=1):
26 self._done += inc
27 p = (100 * self._done) / self._total
28
29 if self._lastp != p:
30 self._lastp = p
31 sys.stderr.write('\r%s: %3d%% (%d/%d) ' % (
32 self._title,
33 p,
34 self._done,
35 self._total))
36 sys.stderr.flush()
37
38 def end(self):
39 p = (100 * self._done) / self._total
40 sys.stderr.write('\r%s: %3d%% (%d/%d), done. \n' % (
41 self._title,
42 p,
43 self._done,
44 self._total))
45 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
23from command import Command, MirrorSafeCommand 23from command import Command, MirrorSafeCommand
24from error import RepoChangedException, GitError 24from error import RepoChangedException, GitError
25from project import R_HEADS 25from project import R_HEADS
26from progress import Progress
26 27
27class Sync(Command, MirrorSafeCommand): 28class Sync(Command, MirrorSafeCommand):
28 common = True 29 common = True
@@ -71,12 +72,16 @@ revision is temporarily needed.
71 72
72 def _Fetch(self, *projects): 73 def _Fetch(self, *projects):
73 fetched = set() 74 fetched = set()
75 pm = Progress('Fetching projects', len(projects))
74 for project in projects: 76 for project in projects:
77 pm.update()
78
75 if project.Sync_NetworkHalf(): 79 if project.Sync_NetworkHalf():
76 fetched.add(project.gitdir) 80 fetched.add(project.gitdir)
77 else: 81 else:
78 print >>sys.stderr, 'error: Cannot fetch %s' % project.name 82 print >>sys.stderr, 'error: Cannot fetch %s' % project.name
79 sys.exit(1) 83 sys.exit(1)
84 pm.end()
80 return fetched 85 return fetched
81 86
82 def Execute(self, opt, args): 87 def Execute(self, opt, args):
@@ -130,12 +135,14 @@ revision is temporarily needed.
130 missing.append(project) 135 missing.append(project)
131 self._Fetch(*missing) 136 self._Fetch(*missing)
132 137
138 pm = Progress('Syncing work tree', len(all))
133 for project in all: 139 for project in all:
140 pm.update()
134 if project.worktree: 141 if project.worktree:
135 if not project.Sync_LocalHalf( 142 if not project.Sync_LocalHalf(
136 detach_head=opt.detach_head): 143 detach_head=opt.detach_head):
137 sys.exit(1) 144 sys.exit(1)
138 145 pm.end()
139 146
140def _VerifyTag(project): 147def _VerifyTag(project):
141 gpg_dir = os.path.expanduser('~/.repoconfig/gnupg') 148 gpg_dir = os.path.expanduser('~/.repoconfig/gnupg')