By matching only whole lines we should be able to improve the progress scaper so we avoid ugly output like we had been seeing: EGIT.contrib/jgit clone git://repo.or.cz/libgit2.git LIBGIT2 Initialized empty Git repository in /home/me/SW/LIBGIT2/.git Counting objects: 547 Compressing objects: 100% (192/192) ts: 100% (192/192) Compressing objects: 100% (192/192) ng objects: 100% (192/192) Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- Robin Rosenberg <robin.rosenberg@xxxxxxxxxx> wrote: > Would it be hard to get the progress look better? Maybe this does the trick. Its hard to reproduce so its hard to come up with the condition that was giving us the problem before. I suspect its because we were getting line fragments on the sideband channel, but I'm not sure that was really the case. .../jgit/transport/SideBandInputStream.java | 37 +++++++++++++++++-- 1 files changed, 33 insertions(+), 4 deletions(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/SideBandInputStream.java b/org.spearce.jgit/src/org/spearce/jgit/transport/SideBandInputStream.java index 3ec9bff..f0ba3d3 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/SideBandInputStream.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/SideBandInputStream.java @@ -73,10 +73,10 @@ private static final int CH_ERROR = 3; private static Pattern P_UNBOUNDED = Pattern.compile( - ".*?([\\w ]+): (\\d+)(, done)?.*", Pattern.DOTALL); + "^([\\w ]+): (\\d+)( |, done)?.*", Pattern.DOTALL); private static Pattern P_BOUNDED = Pattern.compile( - ".*?([\\w ]+):.*\\((\\d+)/(\\d+)\\).*", Pattern.DOTALL); + "^([\\w ]+):.*\\((\\d+)/(\\d+)\\).*", Pattern.DOTALL); private final PacketLineIn pckIn; @@ -84,6 +84,8 @@ private final ProgressMonitor monitor; + private String progressBuffer = ""; + private String currentTask; private int lastCnt; @@ -160,7 +162,31 @@ private void needDataPacket() throws IOException { } } - private void progress(final String msg) { + private void progress(String pkt) { + pkt = progressBuffer + pkt; + for (;;) { + final int lf = pkt.indexOf('\n'); + final int cr = pkt.indexOf('\r'); + final int s; + if (0 <= lf && 0 <= cr) + s = Math.min(lf, cr); + else if (0 <= lf) + s = lf; + else if (0 <= cr) + s = cr; + else + break; + + final String msg = pkt.substring(0, s); + if (doProgressLine(msg)) + pkt = pkt.substring(s + 1); + else + break; + } + progressBuffer = pkt; + } + + private boolean doProgressLine(final String msg) { Matcher matcher; matcher = P_BOUNDED.matcher(msg); @@ -175,7 +201,7 @@ private void progress(final String msg) { final int cnt = Integer.parseInt(matcher.group(2)); monitor.update(cnt - lastCnt); lastCnt = cnt; - return; + return true; } matcher = P_UNBOUNDED.matcher(msg); @@ -189,7 +215,10 @@ private void progress(final String msg) { final int cnt = Integer.parseInt(matcher.group(2)); monitor.update(cnt - lastCnt); lastCnt = cnt; + return true; } + + return false; } private String readString(final int len) throws IOException { -- 1.6.1.59.g6f6746 -- Shawn. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html