List<TimedVcsCommit> (final @NotNull VirtualFile root, @NotNull VcsLogFilterCollection filterCollection, int maxCount) { List<String> filterParameters = new ArrayList<>(); // branch filter and user filter may be used several times without delimiter VcsLogBranchFilter branchFilter = filterCollection.get(VcsLogFilterCollection.BRANCH_FILTER); if (branchFilter != null) { HgRepository repository = getHgRepoManager(myProject).getRepositoryForRoot(root); if (repository == null) { LOG.error("Repository not found for root " + root); return Collections.emptyList(); } Collection<String> branchNames = repository.getBranches().keySet(); Collection<String> bookmarkNames = HgUtil.getNamesWithoutHashes(repository.getBookmarks()); Collection<String> predefinedNames = Collections.singletonList(TIP_REFERENCE); boolean atLeastOneBranchExists = false; for (String branchName : ContainerUtil.concat(branchNames, bookmarkNames, predefinedNames)) { if (branchFilter.matches(branchName)) { filterParameters.add(HgHistoryUtil.prepareParameter("branch", branchName)); atLeastOneBranchExists = true; } } if (branchFilter.matches(HEAD_REFERENCE)) { filterParameters.add(HgHistoryUtil.prepareParameter("branch", ".")); filterParameters.add("-r"); filterParameters.add("::."); //all ancestors for current revision; atLeastOneBranchExists = true; } if (!atLeastOneBranchExists) { // no such branches => filter matches nothing return Collections.emptyList(); } } VcsLogUserFilter userFilter = filterCollection.get(VcsLogFilterCollection.USER_FILTER); if (userFilter != null) { filterParameters.add("-r"); String authorFilter = StringUtil.join(ContainerUtil.map(ContainerUtil.map(userFilter.getUsers(root), VcsUserUtil::toExactString), UserNameRegex.EXTENDED_INSTANCE), "|"); filterParameters.add("user('re:" + authorFilter + "')"); } VcsLogDateFilter dateFilter = filterCollection.get(VcsLogFilterCollection.DATE_FILTER); if (dateFilter != null) { StringBuilder args = new StringBuilder(); final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); filterParameters.add("-d"); if (dateFilter.getAfter() != null) { if (dateFilter.getBefore() != null) { args.append(dateFormatter.format(dateFilter.getAfter())).append(" to ").append(dateFormatter.format(dateFilter.getBefore())); } else { args.append('>').append(dateFormatter.format(dateFilter.getAfter())); } } else if (dateFilter.getBefore() != null) { args.append('<').append(dateFormatter.format(dateFilter.getBefore())); } filterParameters.add(args.toString()); } VcsLogTextFilter textFilter = filterCollection.get(VcsLogFilterCollection.TEXT_FILTER); if (textFilter != null) { String text = textFilter.getText(); if (textFilter.isRegex()) { filterParameters.add("-r"); filterParameters.add("grep(r'" + text + "')"); } else if (textFilter.matchesCase()) { filterParameters.add("-r"); filterParameters.add("grep(r'" + StringUtil.escapeChars(text, UserNameRegex.EXTENDED_REGEX_CHARS) + "')"); } else { filterParameters.add(HgHistoryUtil.prepareParameter("keyword", text)); } } VcsLogStructureFilter structureFilter = filterCollection.get(VcsLogFilterCollection.STRUCTURE_FILTER); if (structureFilter != null) { for (FilePath file : structureFilter.getFiles()) { filterParameters.add(file.getPath()); } } return HgHistoryUtil.readHashes(myProject, root, EmptyConsumer.getInstance(), maxCount, filterParameters); }