From f57bae636f4f68594bf1ee9365e2b55980139315 Mon Sep 17 00:00:00 2001 From: Cletus D'Souza Date: Fri, 27 Mar 2015 12:14:05 -0400 Subject: [PATCH] [FIXED JENKINS-13765] Resolving this issue as a workaround, since the si proejctco command ingnores the --retoreTimestamp option --- .../java/hudson/scm/IntegrityCMMember.java | 9 ++++++++- .../java/hudson/scm/IntegrityCheckoutTask.java | 18 +++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/hudson/scm/IntegrityCMMember.java b/src/main/java/hudson/scm/IntegrityCMMember.java index 3df6322..bc7e650 100644 --- a/src/main/java/hudson/scm/IntegrityCMMember.java +++ b/src/main/java/hudson/scm/IntegrityCMMember.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.sql.Timestamp; import java.util.logging.Logger; import org.apache.commons.codec.digest.DigestUtils; @@ -105,7 +106,7 @@ public static final String getDifferencesLink(String configPath, String memberID * @return true if the operation succeeded or false if failed * @throws APIException */ - public static final boolean checkout(APISession api, String configPath, String memberID, String memberRev, + public static final boolean checkout(APISession api, String configPath, String memberID, String memberRev, Timestamp memberTimestamp, File targetFile, boolean restoreTimestamp, String lineTerminator) throws APIException { // Make sure the directory is created @@ -132,6 +133,12 @@ public static final boolean checkout(APISession api, String configPath, String m // Return true if we were successful if( res.getExitCode() == 0 ) { + // Per JENKINS-13765 - providing a workaround due to API bug + // Update the timestamp for the file, if appropriate + if( restoreTimestamp ) + { + targetFile.setLastModified(memberTimestamp.getTime()); + } return true; } // Otherwise return false... diff --git a/src/main/java/hudson/scm/IntegrityCheckoutTask.java b/src/main/java/hudson/scm/IntegrityCheckoutTask.java index 6ba5503..276c2f7 100644 --- a/src/main/java/hudson/scm/IntegrityCheckoutTask.java +++ b/src/main/java/hudson/scm/IntegrityCheckoutTask.java @@ -7,6 +7,7 @@ import java.io.File; import java.io.IOException; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; @@ -198,11 +199,12 @@ private final class CheckOutTask implements Callable private final String memberID; private final String memberName; private final String memberRev; + private final Timestamp memberTimestamp; private final File targetFile; private final boolean calculateChecksum; - public CheckOutTask(ThreadLocalAPISession apiSession, ThreadLocalOpenFileHandler openFileHandler, - String memberName, String configPath, String memberID, String memberRev, File targetFile, boolean calculateChecksum) + public CheckOutTask(ThreadLocalAPISession apiSession, ThreadLocalOpenFileHandler openFileHandler, String memberName, String configPath, + String memberID, String memberRev, Timestamp memberTimestamp, File targetFile, boolean calculateChecksum) { this.apiSession = apiSession; this.openFileHandler = openFileHandler; @@ -210,6 +212,7 @@ public CheckOutTask(ThreadLocalAPISession apiSession, ThreadLocalOpenFileHandler this.memberID = memberID; this.memberName = memberName; this.memberRev = memberRev; + this.memberTimestamp = memberTimestamp; this.targetFile = targetFile; this.calculateChecksum = calculateChecksum; } @@ -230,7 +233,7 @@ public Void call() throws Exception LOGGER.fine("Checkout on API thread: " + api.toString()); try { - IntegrityCMMember.checkout(api, configPath, memberID, memberRev, targetFile, restoreTimestamp, lineTerminator); + IntegrityCMMember.checkout(api, configPath, memberID, memberRev, memberTimestamp, targetFile, restoreTimestamp, lineTerminator); } catch( APIException aex ) { @@ -295,33 +298,34 @@ public Boolean invoke(File workspaceFile, VirtualChannel channel) throws IOExcep String memberName = memberInfo.get(CM_PROJECT.NAME).toString(); String memberID = memberInfo.get(CM_PROJECT.MEMBER_ID).toString(); String memberRev = memberInfo.get(CM_PROJECT.REVISION).toString(); + Timestamp memberTimestamp = (Timestamp)memberInfo.get(CM_PROJECT.TIMESTAMP); String configPath = memberInfo.get(CM_PROJECT.CONFIG_PATH).toString(); String checksum = (null == memberInfo.get(CM_PROJECT.CHECKSUM) ? "" : memberInfo.get(CM_PROJECT.CHECKSUM).toString()); if( cleanCopy && deltaFlag != 3 ) { LOGGER.fine("Attempting to checkout file: " + targetFile.getAbsolutePath() + " at revision " + memberRev); - coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, targetFile, fetchChangedWorkspaceFiles))); + coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, memberTimestamp, targetFile, fetchChangedWorkspaceFiles))); } else if( deltaFlag == 0 && fetchChangedWorkspaceFiles && checksum.length() > 0 ) { if( ! checksum.equals(IntegrityCMMember.getMD5Checksum(targetFile)) ) { LOGGER.fine("Attempting to restore changed workspace file: " + targetFile.getAbsolutePath() + " to revision " + memberRev); - coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, targetFile, false))); + coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, memberTimestamp, targetFile, false))); fetchCount++; } } else if( deltaFlag == 1 ) { LOGGER.fine("Attempting to get new file: " + targetFile.getAbsolutePath() + " at revision " + memberRev); - coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, targetFile, fetchChangedWorkspaceFiles))); + coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, memberTimestamp, targetFile, fetchChangedWorkspaceFiles))); addCount++; } else if( deltaFlag == 2 ) { LOGGER.fine("Attempting to update file: " + targetFile.getAbsolutePath() + " to revision " + memberRev); - coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, targetFile, fetchChangedWorkspaceFiles))); + coThreads.add(executor.submit(new CheckOutTask(generateAPISession, openFileHandler, memberName, configPath, memberID, memberRev, memberTimestamp, targetFile, fetchChangedWorkspaceFiles))); updateCount++; } else if( deltaFlag == 3 )