in deploy-runner-agent/src/main/java/jetbrains/buildServer/deployer/agent/ssh/scp/ScpProcessAdapter.java [51:128]
public BuildFinishedStatus runProcess() {
String escapedRemotePath;
Session session = null;
JSch.setLogger(new JSchBuildLogger(myLogger));
try {
escapedRemotePath = mySessionProvider.getRemotePath();
session = mySessionProvider.getSession();
if (isInterrupted()) return BuildFinishedStatus.FINISHED_FAILED;
myLogger.message("Starting upload via SCP to " + mySessionProvider.getSessionString());
final List<ArtifactsCollection> relativeDestinations = new LinkedList<>();
final List<ArtifactsCollection> absDestinations = new LinkedList<>();
boolean isRemoteBaseAbsolute = escapedRemotePath.startsWith("/");
String escapedRemotePathFromDrive = escapedRemotePath;
List<String> filePath = Stream.of(escapedRemotePath.replace('\\', '/').split("\\/"))
.filter(it -> !it.isEmpty()).collect(Collectors.toList());
String escapedRemoteBase = isRemoteBaseAbsolute ? "/" : ".";
if (filePath.size() > 0 && filePath.get(0).matches("\\w\\:")) {
// cases to of specific windows drive, like C:
escapedRemoteBase = "/" + filePath.get(0);
isRemoteBaseAbsolute = true;
if (filePath.size() > 1) {
List<String> remotePathNoDrive = filePath.subList(1, filePath.size());
escapedRemotePathFromDrive = String.join("/", remotePathNoDrive);
} else
escapedRemotePathFromDrive = ".";
}
for (ArtifactsCollection artifactsCollection : myArtifacts) {
if (artifactsCollection.getTargetPath().startsWith("/")) {
absDestinations.add(new ArtifactsCollection(
artifactsCollection.getSourcePath(),
artifactsCollection.getTargetPath(),
new HashMap<>(artifactsCollection.getFilePathMap())
));
} else {
final Map<File, String> newPathMap = new HashMap<>();
for (Map.Entry<File, String> fileTargetEntry : artifactsCollection.getFilePathMap().entrySet()) {
final String oldTarget = fileTargetEntry.getValue();
newPathMap.put(fileTargetEntry.getKey(), escapedRemotePathFromDrive + "/" + oldTarget);
}
final ArtifactsCollection newCollection = new ArtifactsCollection(artifactsCollection.getSourcePath(), artifactsCollection.getTargetPath(), newPathMap);
if (isRemoteBaseAbsolute) {
absDestinations.add(newCollection);
} else {
relativeDestinations.add(newCollection);
}
}
}
upload(session, ".", relativeDestinations);
upload(session, escapedRemoteBase, absDestinations);
return BuildFinishedStatus.FINISHED_SUCCESS;
} catch (JSchException e) {
logBuildProblem(myLogger, e.getMessage());
LOG.warnAndDebugDetails("Error executing SCP command", e);
return BuildFinishedStatus.FINISHED_FAILED;
} catch (IOException e) {
logBuildProblem(myLogger, e.getMessage());
LOG.warnAndDebugDetails("Error executing SCP command", e);
return BuildFinishedStatus.FINISHED_FAILED;
} finally {
if (session != null) {
session.disconnect();
}
JSch.setLogger(null);
}
}