diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 8e47e059f..3dbdec986 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -252,6 +252,7 @@ Matthew Hawthorne
Matthew Inger
Matthew Kuperus Heun
Matthew Watson
+Matthew Yanos
Matthias Bhend
Michael Bayne
Michael Clarke
diff --git a/WHATSNEW b/WHATSNEW
index 25a0464f1..3a74f9fa0 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -27,6 +27,10 @@ Fixed bugs:
Other changes:
--------------
+ * now supports compression via the optional compressed attribute.
+ Bugzilla Report 47552
+
+
Changes from Ant 1.9.6 TO Ant 1.9.7
===================================
diff --git a/contributors.xml b/contributors.xml
index 2bfa1b071..318aae3cd 100644
--- a/contributors.xml
+++ b/contributors.xml
@@ -1037,6 +1037,10 @@
Matthew
Watson
+
+ Matthew
+ Yanos
+
Michael
Bayne
diff --git a/manual/Tasks/scp.html b/manual/Tasks/scp.html
index 909084ef6..47a3cee8c 100644
--- a/manual/Tasks/scp.html
+++ b/manual/Tasks/scp.html
@@ -217,6 +217,12 @@ for more information. This task has been tested with jsch-0.1.2 and later.
since Ant 1.9.7
No, defaults to 3 |
+
+ compressed |
+ Whether to enable compression during transfer.
+ since Ant 1.9.8 |
+ No, defaults to false |
+
Parameters specified as nested elements
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 9365e8cd2..c0236e1f6 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
@@ -40,6 +40,7 @@ public abstract class AbstractSshMessage {
private final Session session;
private final boolean verbose;
+ private final boolean compressed;
private LogListener listener = new LogListener() {
public void log(final String message) {
// do nothing;
@@ -61,7 +62,19 @@ public abstract class AbstractSshMessage {
* @since Ant 1.6.2
*/
public AbstractSshMessage(final boolean verbose, final Session session) {
+ this(verbose, false, session);
+ }
+
+ /**
+ * Constructor for AbstractSshMessage
+ * @param verbose if true do verbose logging
+ * @param compression if true use compression
+ * @param session the ssh session to use
+ * @since Ant 1.9.8
+ */
+ public AbstractSshMessage(boolean verbose, boolean compressed, Session session) {
this.verbose = verbose;
+ this.compressed = compressed;
this.session = session;
}
@@ -191,6 +204,15 @@ public abstract class AbstractSshMessage {
return verbose;
}
+ /**
+ * Is the compressed attribute set.
+ * @return true if the compressed attribute is set
+ * @since Ant 1.9.8
+ */
+ protected final boolean getCompressed() {
+ return compressed;
+ }
+
/**
* Track progress every 10% if 100kb < filesize < 1mb. For larger
* files track progress for every percent transmitted.
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 dd37a2b34..d2a09bc68 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
@@ -54,6 +54,7 @@ public class Scp extends SSHBase {
private String fromUri;
private String toUri;
private boolean preserveLastModified = false;
+ private boolean compressed = false;
private List rcs = null;
private boolean isFromRemote, isToRemote;
private boolean isSftp = false;
@@ -111,6 +112,15 @@ public class Scp extends SSHBase {
this.isFromRemote = true;
}
+ /**
+ * Sets flag to determine if compression should
+ * be used for the copy.
+ * @since Ant 1.9.8
+ */
+ public void setCompressed(boolean compressed) {
+ this.compressed = compressed;
+ }
+
/**
* Similar to {@link #setTodir setTodir} but explicitly states
* that the directory is a local. This is the only way to specify
@@ -295,7 +305,8 @@ public class Scp extends SSHBase {
new ScpFromMessage(getVerbose(), session, file,
getProject().resolveFile(toPath),
fromSshUri.endsWith("*"),
- preserveLastModified);
+ preserveLastModified,
+ compressed);
} else {
message =
new ScpFromMessageBySftp(getVerbose(), session, file,
@@ -339,7 +350,7 @@ public class Scp extends SSHBase {
session = openSession();
ScpToMessage message = null;
if (!isSftp) {
- message = new ScpToMessage(getVerbose(), session,
+ message = new ScpToMessage(getVerbose(), compressed, session,
list, file, preserveLastModified);
} else {
message = new ScpToMessageBySftp(getVerbose(), session,
@@ -371,7 +382,7 @@ public class Scp extends SSHBase {
ScpToMessage message = null;
if (!isSftp) {
message =
- new ScpToMessage(getVerbose(), session,
+ new ScpToMessage(getVerbose(), compressed, session,
getProject().resolveFile(fromPath), file,
preserveLastModified);
} else {
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 b6d47379b..b6b9b01b7 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
@@ -115,7 +115,29 @@ public class ScpFromMessage extends AbstractSshMessage {
final File aLocalFile,
final boolean recursive,
final boolean preserveLastModified) {
- super(verbose, session);
+ this(verbose, session, aRemoteFile, aLocalFile, recursive, preserveLastModified, false);
+ }
+
+ /**
+ * Constructor for ScpFromMessage.
+ * @param verbose if true log extra information
+ * @param session the Scp session to use
+ * @param aRemoteFile the remote file name
+ * @param aLocalFile the local file
+ * @param recursive if true use recursion (-r option to scp)
+ * @param preserveLastModified whether to preserve file
+ * @param compressed if true use compression (-C option to scp)
+ * modification times
+ * @since Ant 1.9.8
+ */
+ public ScpFromMessage(boolean verbose,
+ Session session,
+ String aRemoteFile,
+ File aLocalFile,
+ boolean recursive,
+ boolean preserveLastModified,
+ boolean compressed) {
+ super(verbose, compressed, session);
this.remoteFile = aRemoteFile;
this.localFile = aLocalFile;
this.isRecursive = recursive;
@@ -132,6 +154,9 @@ public class ScpFromMessage extends AbstractSshMessage {
if (isRecursive) {
command += "-r ";
}
+ if (getCompressed()) {
+ command += "-C ";
+ }
command += remoteFile;
final Channel channel = openExecChannel(command);
try {
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 a042c4ad5..7b0a0f29f 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
@@ -61,7 +61,18 @@ public class ScpToMessage extends AbstractSshMessage {
* @since Ant 1.7
*/
public ScpToMessage(final boolean verbose, final Session session) {
- super(verbose, session);
+ this(verbose, false, session);
+ }
+
+ /**
+ * Constructor for ScpToMessage
+ * @param verbose if true do verbose logging
+ * @param compressed if true use compression
+ * @param session the ssh session to use
+ * @since Ant 1.9.8
+ */
+ public ScpToMessage(final boolean verbose, boolean compressed, final Session session) {
+ super(verbose, compressed, session);
}
/**
@@ -78,7 +89,26 @@ public class ScpToMessage extends AbstractSshMessage {
final File aLocalFile,
final String aRemotePath,
final boolean preserveLastModified) {
- this(verbose, session, aRemotePath);
+ this(verbose, false, session, aLocalFile, aRemotePath, preserveLastModified);
+ }
+
+ /**
+ * Constructor for a local file to remote.
+ * @param verbose if true do verbose logging
+ * @param compressed if true use compression
+ * @param session the scp session to use
+ * @param aLocalFile the local file
+ * @param aRemotePath the remote path
+ * @param preserveLastModified whether to preserve the last modified timestamps
+ * @since Ant 1.9.8
+ */
+ public ScpToMessage(final boolean verbose,
+ final boolean compressed,
+ final Session session,
+ final File aLocalFile,
+ final String aRemotePath,
+ final boolean preserveLastModified) {
+ this(verbose, compressed, session, aRemotePath);
this.localFile = aLocalFile;
this.preserveLastModified = preserveLastModified;
}
@@ -97,7 +127,26 @@ public class ScpToMessage extends AbstractSshMessage {
final List aDirectoryList,
final String aRemotePath,
final boolean preserveLastModified) {
- this(verbose, session, aRemotePath);
+ this(verbose, false, session, aDirectoryList, aRemotePath, preserveLastModified);
+ }
+
+ /**
+ * Constructor for a local directories to remote.
+ * @param verbose if true do verbose logging
+ * @param compressed whether to use compression
+ * @param session the scp session to use
+ * @param aDirectoryList a list of directories
+ * @param aRemotePath the remote path
+ * @param preserveLastModified whether to preserve the last modified timestamps
+ * @since Ant 1.9.8
+ */
+ public ScpToMessage(final boolean verbose,
+ final boolean compressed,
+ final Session session,
+ final List aDirectoryList,
+ final String aRemotePath,
+ final boolean preserveLastModified) {
+ this(verbose, compressed, session, aRemotePath);
this.directoryList = aDirectoryList;
this.preserveLastModified = preserveLastModified;
}
@@ -142,7 +191,22 @@ public class ScpToMessage extends AbstractSshMessage {
private ScpToMessage(final boolean verbose,
final Session session,
final String aRemotePath) {
- super(verbose, session);
+ this(verbose, false, session, aRemotePath);
+ }
+
+ /**
+ * Constructor for ScpToMessage.
+ * @param verbose if true do verbose logging
+ * @param compressed if true use compression
+ * @param session the scp session to use
+ * @param aRemotePath the remote path
+ * @since Ant 1.9.8
+ */
+ private ScpToMessage(final boolean verbose,
+ final boolean compressed,
+ final Session session,
+ final String aRemotePath) {
+ super(verbose, compressed, session);
this.remotePath = aRemotePath;
}
@@ -187,7 +251,15 @@ public class ScpToMessage extends AbstractSshMessage {
}
private void doSingleTransfer() throws IOException, JSchException {
- final String cmd = "scp -t " + (getPreserveLastModified() ? "-p " : "") + remotePath;
+ StringBuilder sb = new StringBuilder("scp -t ");
+ if (getPreserveLastModified()) {
+ sb.append("-p ");
+ }
+ if (getCompressed()) {
+ sb.append("-C ");
+ }
+ sb.append(remotePath);
+ final String cmd = sb.toString();
final Channel channel = openExecChannel(cmd);
try {
@@ -206,10 +278,15 @@ public class ScpToMessage extends AbstractSshMessage {
}
private void doMultipleTransfer() throws IOException, JSchException {
- final Channel channel =
- openExecChannel("scp -r -d -t "
- + (getPreserveLastModified() ? "-p " : "")
- + remotePath);
+ StringBuilder sb = new StringBuilder("scp -r -d -t ");
+ if (getPreserveLastModified()) {
+ sb.append("-p ");
+ }
+ if (getCompressed()) {
+ sb.append("-C ");
+ }
+ sb.append(remotePath);
+ final Channel channel = openExecChannel(sb.toString());
try {
final OutputStream out = channel.getOutputStream();
final InputStream in = channel.getInputStream();