GitCommandResult (@NotNull GitLineHandler handler, @NotNull GitVersion version, @NotNull OutputCollector outputCollector) { getGitTraceEnvironmentVariables(version).forEach(handler::addCustomEnvironmentVariable); boolean canSuppressOptionalLocks = Registry.is("git.use.no.optional.locks") && GitVersionSpecialty.ENV_GIT_OPTIONAL_LOCKS_ALLOWED.existsIn(version); if (canSuppressOptionalLocks) { handler.addCustomEnvironmentVariable("GIT_OPTIONAL_LOCKS", "0"); } GitCommandResultListener resultListener = new GitCommandResultListener(outputCollector); handler.addLineListener(resultListener); try (AccessToken ignored = lock(handler, canSuppressOptionalLocks)) { writeOutputToConsole(handler); handler.runInCurrentThread(); } catch (IOException e) { return GitCommandResult.error(GitBundle.message("git.error.cant.process.output", e.getLocalizedMessage())); } String rootName = getPresentableRootName(handler); return new GitCommandResult(resultListener.myStartFailed, resultListener.myExitCode, outputCollector.myErrorOutput, outputCollector.myOutput, rootName); }