public ProgramCommandLine makeProgramCommandLine()

in rake-runner-agent/src/jetbrains/buildServer/agent/rakerunner/RakeTasksBuildService.java [45:182]


  public ProgramCommandLine makeProgramCommandLine() throws RunBuildException {
    RVMPathsSettings.getInstanceEx().initialize(getBuildParameters().getEnvironmentVariables());
    RbEnvPathsSettings.getInstance().initialize(getBuildParameters().getEnvironmentVariables());

    final List<String> arguments = new ArrayList<String>();
    final BuildRunnerContext context = getRunnerContext();
    final ModifiableRunnerContext mc = new ModifiableRunnerContext(context);

    // runParams - all server-ui options
    // buildParams - system properties (system.*), environment vars (env.*)
    final Map<String, String> runParams = mc.getRunnerParameters();
    final Map<String, String> buildParams = mc.getBuildParameters();
    final EnvironmentPatchableMap env = mc.getEnvParameters();

    // apply options converter
    SupportedTestFramework.convertOptionsIfNecessary(runParams);

    final File buildFile = getBuildFile(runParams);

    final RakeRunnerUtils.RubyConfigMode interpreterConfigMode = RakeRunnerUtils.getRubyInterpreterConfigMode(runParams);
    final SharedParams shared = SharedParams.fromRunParameters(runParams);
    final boolean rubyEnvAlreadyConfigured = shared.isSetted(); // Do not inline!!!


    try {
      validateRunnerParams(interpreterConfigMode, runParams, shared);
      // configure params in terms of "shared params"
      configureRunnerParams(interpreterConfigMode, runParams, shared);

      shared.applyToParameters(runParams);

      // Sdk
      final RubySdk sdk = RubySDKUtil.createAndSetupSdk(runParams, context);


      if (!(interpreterConfigMode == RakeRunnerUtils.RubyConfigMode.DEFAULT && rubyEnvAlreadyConfigured)) {
        // 1. default, but build feature wasn't configured
        // 2. rvm or interpreter path

        // Inspect env, warn about any problems
        // (if defaults were set by smb else we cannot check them)
        RVMSupportUtil.inspectCurrentEnvironment(env, sdk, getBuild().getBuildLogger());

        if (SdkUtil.isRvmSdk(sdk)) {
          // Patch env for RVM
          RVMSupportUtil.patchEnvForRVMIfNecessary(sdk, env);

          if (sdk.isSystem()) {
            // Also Patch path for fake RVM
            RubySDKUtil.patchPathEnvForNonRvmOrSystemRvmSdk(sdk, mc);
          }
        } else {
          if (interpreterConfigMode == RakeRunnerUtils.RubyConfigMode.INTERPRETER_PATH) {
            // non-rvm sdk
            RubySDKUtil.patchPathEnvForNonRvmOrSystemRvmSdk(sdk, mc);
          }
        }
      }

      // loadpath patch for test runners
      addTestRunnerPatchFiles(sdk, mc);

      // attached frameworks info
      if (SupportedTestFramework.isAnyFrameworkActivated(runParams)) {
        env.put(RAKERUNNER_USED_FRAMEWORKS_KEY, SupportedTestFramework.getActivatedFrameworksConfig(runParams));
      }

      // track invoke/execute stages
      if (ConfigurationParamsUtil.isTraceStagesOptionEnabled(runParams)) {
        env.put(RAKE_TRACE_INVOKE_EXEC_STAGES_ENABLED_KEY, Boolean.TRUE.toString());
      }

      // Interpreter parameters
      final String additionalInterpreterParams = runParams.get(SERVER_UI_RUBY_INTERPRETER_ADDITIONAL_PARAMS);
      if (!TextUtil.isEmptyOrWhitespaced(additionalInterpreterParams)) {
        addCmdlineArguments(arguments, additionalInterpreterParams);
      }

      // Rake runner script
      final String rakeRunnerPath;
      final String customRakeRunnerScript = buildParams.get(CUSTOM_RAKERUNNER_SCRIPT);
      if (!StringUtil.isEmpty(customRakeRunnerScript)) {
        // use custom runner
        rakeRunnerPath = customRakeRunnerScript;
      } else {
        // default one
        rakeRunnerPath = RubyProjectSourcesUtil.getRakeRunnerPath();
      }
      arguments.add(rakeRunnerPath);

      // Rake gem version
      addGemVersionAttribute(arguments, RAKE_GEM_VERSION_PROPERTY, buildParams);

      // Rake options
      // Custom Rakefile if specified
      if (buildFile != null) {
        arguments.add(RAKE_CMDLINE_OPTIONS_RAKEFILE);
        arguments.add(buildFile.getAbsolutePath());
      }

      // Other arguments
      final String userDefinedArgs = runParams.get(SERVER_UI_RAKE_ADDITIONAL_CMD_PARAMS_PROPERTY);
      if (!TextUtil.isEmptyOrWhitespaced(userDefinedArgs)) {
        addCmdlineArguments(arguments, userDefinedArgs);
      }

      // Tasks names
      final String tasks_names = runParams.get(SERVER_UI_RAKE_TASKS_PROPERTY);
      if (!PropertiesUtil.isEmptyOrNull(tasks_names)) {
        addCmdlineArguments(arguments, tasks_names);
      }

      // rspec
      env.putAll(attachRSpecFormatterIfNeeded(runParams));

      // cucumber
      env.putAll(attachCucumberFormatterIfNeeded(runParams));

      // Bundle exec emulation:
      // (do not do it before RVM Env patch!!!!!!)
      BundlerUtil.enableBundleExecEmulationIfNeeded(sdk, mc);


      // Result:
      final HashMap<String, String> ret = new HashMap<String, String>();
      for (Map.Entry<String, String> entry : env.getPatched().entrySet()) {
        if (!StringUtil.isEmptyOrSpaces(entry.getValue())) {
          ret.put(entry.getKey(), entry.getValue());
        }
      }
      return new SimpleProgramCommandLine(ret,
        getWorkingDirectory().getAbsolutePath(),
        sdk.getRubyExecutable().getAbsolutePath(),
        arguments);
    } catch (MyBuildFailureException e) {
      throw new RunBuildException(e.getMessage(), e);
    }
  }