Display progress while checking connectivity on push

Verifying 100 new objects are fully connected to the existing DAG
is usually very cheap. Checking the entire Linux kernel history is
fully connected when pushing it to a new repository can take 30-60
seconds. Display a progress counter during this time so the client
knows the server is still working.

Change-Id: Iababe3ee1d35cb82f2bef2f12da7a2ecd03282b0
This commit is contained in:
Shawn Pearce 2014-03-12 17:13:10 -07:00 committed by Shawn Pearce
parent 088e80315b
commit 4c3e7931ed
1 changed files with 10 additions and 0 deletions

View File

@ -1036,6 +1036,12 @@ private boolean needCheckConnectivity() {
private void checkConnectivity() throws IOException {
ObjectIdSubclassMap<ObjectId> baseObjects = null;
ObjectIdSubclassMap<ObjectId> providedObjects = null;
ProgressMonitor checking = NullProgressMonitor.INSTANCE;
if (sideBand) {
SideBandProgressMonitor m = new SideBandProgressMonitor(msgOut);
m.setDelayStart(750, TimeUnit.MILLISECONDS);
checking = m;
}
if (checkReferencedIsReachable) {
baseObjects = parser.getBaseObjectIds();
@ -1071,8 +1077,10 @@ private void checkConnectivity() throws IOException {
}
}
checking.beginTask(JGitText.get().countingObjects, ProgressMonitor.UNKNOWN);
RevCommit c;
while ((c = ow.next()) != null) {
checking.update(1);
if (providedObjects != null //
&& !c.has(RevFlag.UNINTERESTING) //
&& !providedObjects.contains(c))
@ -1081,6 +1089,7 @@ private void checkConnectivity() throws IOException {
RevObject o;
while ((o = ow.nextObject()) != null) {
checking.update(1);
if (o.has(RevFlag.UNINTERESTING))
continue;
@ -1094,6 +1103,7 @@ private void checkConnectivity() throws IOException {
if (o instanceof RevBlob && !db.hasObject(o))
throw new MissingObjectException(o, Constants.TYPE_BLOB);
}
checking.endTask();
if (baseObjects != null) {
for (ObjectId id : baseObjects) {