ConnectCommandRunner extends AbstractServerCommandRunner { @NotNull @Override public P4CommandRunner.QueryAnswer<AnnotateFileResult> getFileAnnotation( @NotNull ClientConfig config, @NotNull final AnnotateFileQuery query) { return new QueryAnswerImpl<>(connectionManager.withConnection(config, (client) -> { List<IFileSpec> specs; if (query.getLocalFile() != null) { specs = FileSpecBuildUtil.escapedForFilePathRev(query.getLocalFile(), query.getRev()); } else if (query.getRemoteFile() != null) { throw new IllegalStateException("Not implemented"); } else { throw new IllegalStateException("both local file and remote file are null"); } ClientServerRef ref = config.getClientServerRef(); IExtendedFileSpec headSpec = cmd.getFileDetails(client, specs); P4FileRevision headRevision = P4FileRevisionImpl.getHead(ref, headSpec); String content = loadContentAsString(config, client, headSpec); List<IFileAnnotation> annotations = cmd.getAnnotations(client, specs); List<IFileSpec> requiredHistory = FileAnnotationParser.getRequiredHistorySpecs(annotations); List<Pair<IFileSpec, IFileRevisionData>> history = cmd.getExactHistory((IOptionsServer) client.getServer(), requiredHistory); return new AnnotateFileResult(config, FileAnnotationParser.getFileAnnotation( ref, client.getServer().getUserName(), headSpec, query.getLocalFile(), annotations, history), headRevision, content); })); } ConnectCommandRunner(
            @NotNull Project project,
            @NotNull ConnectionManager connectionManager); @Override void disconnect(@NotNull P4ServerName config); @NotNull @Override P4CommandRunner.QueryAnswer<AnnotateFileResult> getFileAnnotation(
            @NotNull ClientConfig config,
            @NotNull final AnnotateFileQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<DescribeChangelistResult> describeChangelist(
            @NotNull OptionalClientServerConfig config,
            @NotNull DescribeChangelistQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<GetJobSpecResult> getJobSpec(
            @NotNull OptionalClientServerConfig config); @NotNull @Override P4CommandRunner.QueryAnswer<ListOpenedFilesChangesResult> listOpenedFilesChanges(@NotNull ClientConfig config,
            @NotNull ListOpenedFilesChangesQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<ListClientsForUserResult> getClientsForUser(
            @NotNull OptionalClientServerConfig config,
            @NotNull ListClientsForUserQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<ListSubmittedChangelistsResult> listSubmittedChangelists(
            @NotNull final ClientConfig config, @NotNull final ListSubmittedChangelistsQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<GetFileContentsResult> getFileContents(
            @NotNull ClientConfig config,
            @NotNull final GetFileContentsQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<ListFileHistoryResult> listFilesHistory(
            @NotNull ClientConfig config,
            @NotNull final ListFileHistoryQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<ListFilesDetailsResult> listFilesDetails(
            @NotNull ClientConfig config,
            @NotNull final ListFilesDetailsQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<ListJobsResult> listJobs(
            @NotNull OptionalClientServerConfig config,
            @NotNull final ListJobsQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<ListLabelsResult> listLabels(
            @NotNull OptionalClientServerConfig config,
            @NotNull final ListLabelsQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<ListUsersResult> listUsers(
            @NotNull OptionalClientServerConfig config,
            @NotNull final ListUsersQuery query); @NotNull @Override P4CommandRunner.QueryAnswer<SwarmConfigResult> getSwarmConfig(
            @NotNull OptionalClientServerConfig config,
            @NotNull final SwarmConfigQuery query);  }
@ExtendWith(TemporaryFolderExtension.class) @Test void getFileAnnotation(TemporaryFolder tmpDir) throws IOException { idea.useInlineThreading(null); MockConfigPart part = new MockConfigPart() .withServerName(server.getRshUrl()) .withUsername(server.getUser()) .withNoPassword() .withClientname("client1"); final ServerConfig serverConfig = ServerConfig.createFrom(part); final ClientConfig clientConfig = ClientConfig.createFrom(serverConfig, part); final File clientRoot = tmpDir.newFile("clientRoot"); final FilePath newFile = VcsUtil.getFilePath(touchFile(clientRoot, "a@b.txt")); final TestableP4RequestErrorHandler errorHandler = new TestableP4RequestErrorHandler(idea.getMockProject()); final P4ChangelistId defaultId = new P4ChangelistIdImpl(0, clientConfig.getClientServerRef()); assertNotNull(clientConfig.getClientname()); setupClient(clientConfig, tmpDir, clientRoot, errorHandler) .map((cm) -> new ConnectCommandRunner(idea.getMockProject(), cm)) .futureMap((runner, sink) -> runner.perform( clientConfig, new AddEditAction(newFile, null, defaultId, clientConfig.getCharSetName())) .mapActionAsync((res) -> runner.perform( clientConfig, new SubmitChangelistAction( new P4ChangelistIdImpl(0, clientConfig.getClientServerRef()), Collections.singletonList(newFile), null, "add file", null))) .mapActionAsync((res) -> runner.perform( clientConfig, new AddEditAction(newFile, null, defaultId, clientConfig.getCharSetName()))) .mapQueryAsync((res) -> runner.getFileAnnotation(clientConfig, new AnnotateFileQuery(newFile, 1))) .whenCompleted(sink::resolve) .whenServerError(sink::reject) ) .whenCompleted((r) -> { assertThat(r, instanceOf(AnnotateFileResult.class)); AnnotateFileResult res = (AnnotateFileResult) r; assertSame(clientConfig, res.getClientConfig()); assertEquals("x", res.getContent()); assertEquals(1, res.getHeadRevision().getRevision().getValue()); assertSize(1, res.getAnnotatedFile().getAnnotatedLines()); P4AnnotatedLine line = res.getAnnotatedFile().getAnnotatedLines().get(0); assertEquals(" assertEquals(" assertEquals(1, line.getRevNumber()); }) .whenFailed(Assertions::fail); }