From 8ec6497d89bb1cc76c15e2f911a2ded3f8c5fbbc Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 7 Apr 2004 13:30:30 +0000 Subject: [PATCH] Add progress report to . Submitted by: Rami Ojares git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276288 13f79535-47bb-0310-9956-ffa450edef68 --- CONTRIBUTORS | 3 +- .../optional/ssh/AbstractSshMessage.java | 38 +++++++++++++ .../ant/taskdefs/optional/ssh/SSHBase.java | 15 ++++++ .../tools/ant/taskdefs/optional/ssh/Scp.java | 9 ++-- .../taskdefs/optional/ssh/ScpFromMessage.java | 33 ++++++++++-- .../taskdefs/optional/ssh/ScpToMessage.java | 54 ++++++++++++++++--- 6 files changed, 137 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 11e2612be..f5e88feb9 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -148,8 +148,9 @@ Peter Reilly Phillip Wells Pierre Delisle Pierre Dittgen -Raphael Pierquin R Handerson +Rami Ojares +Raphael Pierquin Richard Evans Rick Beton Robert Anderson diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/AbstractSshMessage.java b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/AbstractSshMessage.java index 809c480ff..2ad605c4d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/AbstractSshMessage.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/AbstractSshMessage.java @@ -32,6 +32,7 @@ import org.apache.tools.ant.BuildException; public abstract class AbstractSshMessage { private Session session; + private boolean verbose; private LogListener listener = new LogListener() { public void log(String message) { // do nothing; @@ -39,6 +40,14 @@ public abstract class AbstractSshMessage { }; public AbstractSshMessage(Session session) { + this(false, session); + } + + /** + * @since Ant 1.6.2 + */ + public AbstractSshMessage(boolean verbose, Session session) { + this.verbose = verbose; this.session = session; } @@ -114,4 +123,33 @@ public abstract class AbstractSshMessage { + " Average Rate: " + format.format(totalLength / duration) + " B/s"); } + + /** + * @since Ant 1.6.2 + */ + protected final boolean getVerbose() { + return verbose; + } + + /* + * Track progress every 10% if 100kb < filesize < 1mb. For larger + * files track progress for every percent transmitted. + */ + protected final int trackProgress(int filesize, int totalLength, + int percentTransmitted) { + + int percent = (int) Math.round(Math.floor((totalLength + / (double)filesize) + * 100)); + if (percent > percentTransmitted) { + if (filesize < 1048576 && (percent % 10 != 0)) { + // do not track between tenths + } else { + log("" + percent + "%"); + } + } + + return percent; + } + } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java index b3f21f7f9..918b5e2c7 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java @@ -40,6 +40,7 @@ public abstract class SSHBase extends Task implements LogListener { private String knownHosts; private int port = SSH_PORT; private boolean failOnError = true; + private boolean verbose; private SSHUserInfo userInfo; /** @@ -71,6 +72,20 @@ public abstract class SSHBase extends Task implements LogListener { return failOnError; } + /** + * @since Ant 1.6.2 + */ + public void setVerbose(boolean failure) { + verbose = failure; + } + + /** + * @since Ant 1.6.2 + */ + public boolean getVerbose() { + return verbose; + } + /** * Username known to remote host. * diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java index 191fe2561..a30fd3e05 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java @@ -140,7 +140,7 @@ public class Scp extends SSHBase { try { session = openSession(); ScpFromMessage message = - new ScpFromMessage(session, file, + new ScpFromMessage(getVerbose(), session, file, getProject().resolveFile(toPath), fromSshUri.endsWith("*")); log("Receiving file: " + file); @@ -169,7 +169,8 @@ public class Scp extends SSHBase { } if (!list.isEmpty()) { session = openSession(); - ScpToMessage message = new ScpToMessage(session, list, file); + ScpToMessage message = new ScpToMessage(getVerbose(), session, + list, file); message.setLogListener(this); message.execute(); } @@ -188,8 +189,8 @@ public class Scp extends SSHBase { try { session = openSession(); ScpToMessage message = - new ScpToMessage(session, getProject().resolveFile(fromPath), - file); + new ScpToMessage(getVerbose(), session, + getProject().resolveFile(fromPath), file); message.setLogListener(this); message.execute(); } finally { diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessage.java b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessage.java index a9a07d1e2..4b6b909b1 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessage.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessage.java @@ -38,14 +38,25 @@ public class ScpFromMessage extends AbstractSshMessage { private File localFile; private boolean isRecursive = false; + /** + * @since Ant 1.6.2 + */ + public ScpFromMessage(boolean verbose, + Session session, + String aRemoteFile, + File aLocalFile, + boolean recursive) { + super(verbose, session); + this.remoteFile = aRemoteFile; + this.localFile = aLocalFile; + this.isRecursive = recursive; + } + public ScpFromMessage(Session session, String aRemoteFile, File aLocalFile, boolean recursive) { - super(session); - this.remoteFile = aRemoteFile; - this.localFile = aLocalFile; - this.isRecursive = recursive; + this(false, session, aRemoteFile, aLocalFile, recursive); } public void execute() throws IOException, JSchException { @@ -153,6 +164,14 @@ public class ScpFromMessage extends AbstractSshMessage { int length; int totalLength = 0; long startTime = System.currentTimeMillis(); + + // only track progress for files larger than 100kb in verbose mode + boolean trackProgress = getVerbose() && filesize > 102400; + // since filesize keeps on decreasing we have to store the + // initial filesize + int initFilesize = filesize; + int percentTransmitted = 0; + try { while (true) { length = in.read(buf, 0, @@ -166,6 +185,12 @@ public class ScpFromMessage extends AbstractSshMessage { if (filesize == 0) { break; } + + if (trackProgress) { + percentTransmitted = trackProgress(initFilesize, + totalLength, + percentTransmitted); + } } } finally { long endTime = System.currentTimeMillis(); diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java index 2b2e52f02..ea33a3901 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java @@ -36,22 +36,50 @@ public class ScpToMessage extends AbstractSshMessage { private String remotePath; private List directoryList; - public ScpToMessage(Session session, + /** + * @since Ant 1.6.2 + */ + public ScpToMessage(boolean verbose, + Session session, File aLocalFile, String aRemotePath) { - super(session); + this(verbose, session, aRemotePath); this.localFile = aLocalFile; + } + + /** + * @since Ant 1.6.2 + */ + public ScpToMessage(boolean verbose, + Session session, + List aDirectoryList, + String aRemotePath) { + this(verbose, session, aRemotePath); + + this.directoryList = aDirectoryList; + } + + /** + * @since Ant 1.6.2 + */ + private ScpToMessage(boolean verbose, + Session session, + String aRemotePath) { + super(verbose, session); this.remotePath = aRemotePath; } + public ScpToMessage(Session session, + File aLocalFile, + String aRemotePath) { + this(false, session, aLocalFile, aRemotePath); + } + public ScpToMessage(Session session, List aDirectoryList, String aRemotePath) { - super(session); - - this.directoryList = aDirectoryList; - this.remotePath = aRemotePath; + this(false, session, aDirectoryList, aRemotePath); } public void execute() throws IOException, JSchException { @@ -150,6 +178,14 @@ public class ScpToMessage extends AbstractSshMessage { byte[] buf = new byte[BUFFER_SIZE]; long startTime = System.currentTimeMillis(); int totalLength = 0; + + // only track progress for files larger than 100kb in verbose mode + boolean trackProgress = getVerbose() && filesize > 102400; + // since filesize keeps on decreasing we have to store the + // initial filesize + int initFilesize = filesize; + int percentTransmitted = 0; + try { log("Sending: " + localFile.getName() + " : " + localFile.length()); while (true) { @@ -159,6 +195,12 @@ public class ScpToMessage extends AbstractSshMessage { } out.write(buf, 0, len); totalLength += len; + + if (trackProgress) { + percentTransmitted = trackProgress(initFilesize, + totalLength, + percentTransmitted); + } } out.flush(); sendAck(out);