Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Aniszczyk2011-02-01 14:40:57 +0000
committerCode Review2011-02-01 14:40:57 +0000
commitcc5295c4b4b023843bedeefdff9f7cc016595b77 (patch)
treef6c78b24da933d34504b86d17ee404f1da841234
parentc1de63262eebe7e3a2d085db830b98d7dff3bd24 (diff)
parent168114fd39a0829a5ce9a63bab248cf73c0c7e1e (diff)
downloadjgit-cc5295c4b4b023843bedeefdff9f7cc016595b77.tar.gz
jgit-cc5295c4b4b023843bedeefdff9f7cc016595b77.tar.xz
jgit-cc5295c4b4b023843bedeefdff9f7cc016595b77.zip
Merge "Show resolving deltas progress to push clients"
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryPackParser.java5
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java59
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java14
3 files changed, 56 insertions, 22 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryPackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryPackParser.java
index b13df8108c..d8df339d5e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryPackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryPackParser.java
@@ -168,13 +168,14 @@ public class ObjectDirectoryPackParser extends PackParser {
}
@Override
- public PackLock parse(ProgressMonitor progress) throws IOException {
+ public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
+ throws IOException {
tmpPack = File.createTempFile("incoming_", ".pack", db.getDirectory());
tmpIdx = new File(db.getDirectory(), baseName(tmpPack) + ".idx");
try {
out = new RandomAccessFile(tmpPack, "rw");
- super.parse(progress);
+ super.parse(receiving, resolving);
out.seek(packEnd);
out.write(packHash);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
index 9d75328af4..bae01f17d2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
@@ -406,10 +406,33 @@ public abstract class PackParser {
* @throws IOException
* the stream is malformed, or contains corrupt objects.
*/
- public PackLock parse(ProgressMonitor progress) throws IOException {
- if (progress == null)
- progress = NullProgressMonitor.INSTANCE;
- progress.start(2 /* tasks */);
+ public final PackLock parse(ProgressMonitor progress) throws IOException {
+ return parse(progress, progress);
+ }
+
+ /**
+ * Parse the pack stream.
+ *
+ * @param receiving
+ * receives progress feedback during the initial receiving
+ * objects phase. If null, {@link NullProgressMonitor} will be
+ * used.
+ * @param resolving
+ * receives progress feedback during the resolving objects phase.
+ * @return the pack lock, if one was requested by setting
+ * {@link #setLockMessage(String)}.
+ * @throws IOException
+ * the stream is malformed, or contains corrupt objects.
+ */
+ public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving)
+ throws IOException {
+ if (receiving == null)
+ receiving = NullProgressMonitor.INSTANCE;
+ if (resolving == null)
+ resolving = NullProgressMonitor.INSTANCE;
+
+ if (receiving == resolving)
+ receiving.start(2 /* tasks */);
try {
readPackHeader();
@@ -418,21 +441,25 @@ public abstract class PackParser {
baseByPos = new LongMap<UnresolvedDelta>();
deferredCheckBlobs = new ArrayList<PackedObjectInfo>();
- progress.beginTask(JGitText.get().receivingObjects,
+ receiving.beginTask(JGitText.get().receivingObjects,
(int) objectCount);
- for (int done = 0; done < objectCount; done++) {
- indexOneObject();
- progress.update(1);
- if (progress.isCancelled())
- throw new IOException(JGitText.get().downloadCancelled);
+ try {
+ for (int done = 0; done < objectCount; done++) {
+ indexOneObject();
+ receiving.update(1);
+ if (receiving.isCancelled())
+ throw new IOException(JGitText.get().downloadCancelled);
+ }
+ readPackFooter();
+ endInput();
+ } finally {
+ receiving.endTask();
}
- readPackFooter();
- endInput();
+
if (!deferredCheckBlobs.isEmpty())
doDeferredCheckBlobs();
- progress.endTask();
if (deltaCount > 0) {
- resolveDeltas(progress);
+ resolveDeltas(resolving);
if (entryCount < objectCount) {
if (!isAllowThin()) {
throw new IOException(MessageFormat.format(JGitText
@@ -440,7 +467,7 @@ public abstract class PackParser {
(objectCount - entryCount)));
}
- resolveDeltasWithExternalBases(progress);
+ resolveDeltasWithExternalBases(resolving);
if (entryCount < objectCount) {
throw new IOException(MessageFormat.format(JGitText
@@ -467,8 +494,6 @@ public abstract class PackParser {
inflater = null;
objectDatabase.close();
}
-
- progress.endTask();
}
return null; // By default there is no locking.
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
index 8c50604f13..59037c3bd7 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
@@ -77,6 +77,7 @@ import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectIdSubclassMap;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository;
@@ -162,6 +163,8 @@ public class ReceivePack {
private Writer msgs;
+ private SideBandOutputStream msgOut;
+
private PackParser parser;
/** The refs we advertised as existing at the start of the connection. */
@@ -758,9 +761,9 @@ public class ReceivePack {
OutputStream out = rawOut;
rawOut = new SideBandOutputStream(CH_DATA, MAX_BUF, out);
+ msgOut = new SideBandOutputStream(CH_PROGRESS, MAX_BUF, out);
pckOut = new PacketLineOut(rawOut);
- msgs = new OutputStreamWriter(new SideBandOutputStream(CH_PROGRESS,
- MAX_BUF, out), Constants.CHARSET);
+ msgs = new OutputStreamWriter(msgOut, Constants.CHARSET);
}
}
@@ -780,6 +783,11 @@ public class ReceivePack {
if (timeoutIn != null)
timeoutIn.setTimeout(10 * timeout * 1000);
+ ProgressMonitor receiving = NullProgressMonitor.INSTANCE;
+ ProgressMonitor resolving = NullProgressMonitor.INSTANCE;
+ if (sideBand)
+ resolving = new SideBandProgressMonitor(msgOut);
+
ObjectInserter ins = db.newObjectInserter();
try {
String lockMsg = "jgit receive-pack";
@@ -792,7 +800,7 @@ public class ReceivePack {
parser.setNeedBaseObjectIds(checkReferencedIsReachable);
parser.setObjectChecking(isCheckReceivedObjects());
parser.setLockMessage(lockMsg);
- packLock = parser.parse(NullProgressMonitor.INSTANCE);
+ packLock = parser.parse(receiving, resolving);
ins.flush();
} finally {
ins.release();

Back to the top