public BuildFinishedStatus runProcess()

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);
    }
  }