diff options
author | Stefan Bodewig <bodewig@apache.org> | 2015-12-14 06:33:26 +0100 |
---|---|---|
committer | Stefan Bodewig <bodewig@apache.org> | 2015-12-14 06:33:26 +0100 |
commit | 881a0ff79e095227ce00c7deefc8054f60fefa2f (patch) | |
tree | 20443b0230fba4743cc6ce446ed4698d65675694 /src/main/org/apache/tools/ant/taskdefs/optional/ssh | |
parent | 9de4ec709caa882bbeceacf4f6868646869ccbf1 (diff) | |
download | ant-881a0ff79e095227ce00c7deefc8054f60fefa2f.tar.gz |
preserveLastModified for scp uploads
Contributed by J. Hoffmann
Diffstat (limited to 'src/main/org/apache/tools/ant/taskdefs/optional/ssh')
-rw-r--r-- | src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java | 9 | ||||
-rw-r--r-- | src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java | 72 |
2 files changed, 69 insertions, 12 deletions
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 1cf1e2ca3..dd37a2b34 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 @@ -124,8 +124,8 @@ public class Scp extends SSHBase { } /** - * Sets flag to determine if file timestamp from - * remote system is to be preserved during copy. + * Sets flag to determine if file timestamp + * is to be preserved during copy. * @since Ant 1.8.0 */ public void setPreservelastmodified(final boolean yesOrNo) { @@ -340,7 +340,7 @@ public class Scp extends SSHBase { ScpToMessage message = null; if (!isSftp) { message = new ScpToMessage(getVerbose(), session, - list, file); + list, file, preserveLastModified); } else { message = new ScpToMessageBySftp(getVerbose(), session, list, file); @@ -372,7 +372,8 @@ public class Scp extends SSHBase { if (!isSftp) { message = new ScpToMessage(getVerbose(), session, - getProject().resolveFile(fromPath), file); + getProject().resolveFile(fromPath), file, + preserveLastModified); } else { message = new ScpToMessageBySftp(getVerbose(), session, 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 5ba6b5596..a042c4ad5 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 @@ -44,6 +44,7 @@ public class ScpToMessage extends AbstractSshMessage { private String remotePath; private List directoryList; private Integer fileMode, dirMode; + private boolean preserveLastModified; /** * Constructor for ScpToMessage @@ -69,15 +70,17 @@ public class ScpToMessage extends AbstractSshMessage { * @param session the scp session to use * @param aLocalFile the local file * @param aRemotePath the remote path - * @since Ant 1.6.2 + * @param preserveLastModified whether to preserve the last modified timestamps + * @since Ant 1.9.7 */ public ScpToMessage(final boolean verbose, final Session session, final File aLocalFile, - final String aRemotePath) { + final String aRemotePath, + final boolean preserveLastModified) { this(verbose, session, aRemotePath); - this.localFile = aLocalFile; + this.preserveLastModified = preserveLastModified; } /** @@ -86,15 +89,47 @@ public class ScpToMessage extends AbstractSshMessage { * @param session the scp session to use * @param aDirectoryList a list of directories * @param aRemotePath the remote path - * @since Ant 1.6.2 + * @param preserveLastModified whether to preserve the last modified timestamps + * @since Ant 1.9.7 */ public ScpToMessage(final boolean verbose, final Session session, final List aDirectoryList, - final String aRemotePath) { + final String aRemotePath, + final boolean preserveLastModified) { this(verbose, session, aRemotePath); - this.directoryList = aDirectoryList; + this.preserveLastModified = preserveLastModified; + } + + /** + * Constructor for a local file to remote. + * @param verbose if true do verbose logging + * @param session the scp session to use + * @param aLocalFile the local file + * @param aRemotePath the remote path + * @since Ant 1.6.2 + */ + public ScpToMessage(final boolean verbose, + final Session session, + final File aLocalFile, + final String aRemotePath) { + this(verbose, session, aLocalFile, aRemotePath, false); + } + + /** + * Constructor for a local directories to remote. + * @param verbose if true do verbose logging + * @param session the scp session to use + * @param aDirectoryList a list of directories + * @param aRemotePath the remote path + * @since Ant 1.6.2 + */ + public ScpToMessage(final boolean verbose, + final Session session, + final List aDirectoryList, + final String aRemotePath) { + this(verbose, session, aDirectoryList, aRemotePath, false); } /** @@ -152,7 +187,7 @@ public class ScpToMessage extends AbstractSshMessage { } private void doSingleTransfer() throws IOException, JSchException { - final String cmd = "scp -t " + remotePath; + final String cmd = "scp -t " + (getPreserveLastModified() ? "-p " : "") + remotePath; final Channel channel = openExecChannel(cmd); try { @@ -171,7 +206,10 @@ public class ScpToMessage extends AbstractSshMessage { } private void doMultipleTransfer() throws IOException, JSchException { - final Channel channel = openExecChannel("scp -r -d -t " + remotePath); + final Channel channel = + openExecChannel("scp -r -d -t " + + (getPreserveLastModified() ? "-p " : "") + + remotePath); try { final OutputStream out = channel.getOutputStream(); final InputStream in = channel.getInputStream(); @@ -226,6 +264,16 @@ public class ScpToMessage extends AbstractSshMessage { final OutputStream out) throws IOException { // send "C0644 filesize filename", where filename should not include '/' final long filesize = localFile.length(); + + if (getPreserveLastModified()) { + String command = "T" + (localFile.lastModified() / 1000) + " 0"; + command += " " + (localFile.lastModified() / 1000) + " 0\n"; + out.write(command.getBytes()); + out.flush(); + + waitForAck(in); + } + String command = "C0"; command += Integer.toOctalString(getFileMode()); command += " " + filesize + " "; @@ -328,4 +376,12 @@ public class ScpToMessage extends AbstractSshMessage { return dirMode != null ? dirMode.intValue() : DEFAULT_DIR_MODE; } + /** + * Whether to preserve the last modified time. + * @since Ant 1.9.7 + */ + public boolean getPreserveLastModified() { + return preserveLastModified; + } + } |