in rest-api/src/jetbrains/buildServer/server/rest/data/finder/impl/VcsRootInstanceFinder.java [346:435]
public ItemHolder<VcsRootInstance> getPrefilteredItems(@NotNull Locator locator) {
setLocatorDefaults(locator);
Boolean versionedSettingsUsagesOnly = locator.getSingleDimensionValueAsBoolean(HAS_VERSIONED_SETTINGS_ONLY); // should check it not in Filter as it considers current scope
final String build = locator.getSingleDimensionValue(BUILD);
if (build != null) {
Stream<VcsRootInstance> vcsRootInstancesByBuilds = getVcsRootInstancesByBuilds(build);
if (BooleanUtils.isTrue(versionedSettingsUsagesOnly)) {
vcsRootInstancesByBuilds = vcsRootInstancesByBuilds.filter(vcsRootInstance -> vcsRootInstance.equals(myVersionedSettingsManager.getVersionedSettingsVcsRootInstance(vcsRootInstance.getParent().getProject())));
} else if (BooleanUtils.isFalse(versionedSettingsUsagesOnly)) {
vcsRootInstancesByBuilds = vcsRootInstancesByBuilds.filter(vcsRootInstance -> !vcsRootInstance.equals(myVersionedSettingsManager.getVersionedSettingsVcsRootInstance(vcsRootInstance.getParent().getProject())));
}
return ItemHolder.of(vcsRootInstancesByBuilds);
}
final String vcsRootLocator = locator.getSingleDimensionValue(VCS_ROOT_DIMENSION);
if (vcsRootLocator != null) {
final List<SVcsRoot> vcsRoots = myVcsRootFinder.getItemsNotEmpty(vcsRootLocator).getEntries();
final Set<VcsRootInstance> result = new TreeSet<>(VCS_ROOT_INSTANCE_COMPARATOR);
final String buildTypesLocator = locator.getSingleDimensionValue(BUILD_TYPE);
Predicate<SBuildType> filter;
Set<SProject> projects;
if (buildTypesLocator != null) {
if (versionedSettingsUsagesOnly == null || !versionedSettingsUsagesOnly) { //is used below in the same condition
ItemFilter<BuildTypeOrTemplate> buildTypeFilter = myBuildTypeFinder.getFilter(buildTypesLocator);
filter = sBuildType -> buildTypeFilter.isIncluded(new BuildTypeOrTemplate(sBuildType));
} else {
filter = (a) -> true;
}
if (versionedSettingsUsagesOnly == null || versionedSettingsUsagesOnly) { //is used below in the same condition
projects = myBuildTypeFinder.getItemsNotEmpty(buildTypesLocator).getEntries().stream().map(BuildTypeOrTemplate::getProject).collect(Collectors.toSet());
} else {
projects = null;
}
} else {
filter = (a) -> true;
projects = null;
}
filterOutUnrelatedWithoutParameterResolution(locator, vcsRoots);
for (SVcsRoot vcsRoot : vcsRoots) {
if (!canViewSettingsFor(vcsRoot)) {
continue;
}
if (versionedSettingsUsagesOnly == null || !versionedSettingsUsagesOnly) {
vcsRoot.getUsagesInConfigurations().stream()
.filter(filter)
.map(buildType -> buildType.getVcsRootInstanceForParent(vcsRoot))
.forEach(result::add);
}
if (versionedSettingsUsagesOnly == null || versionedSettingsUsagesOnly) {
Set<SProject> projectsBySettingsRoot = myVersionedSettingsManager.getProjectsBySettingsRoot(vcsRoot);
result.addAll(getSettingsRootInstances(projects == null ? projectsBySettingsRoot : CollectionsUtil.intersect(projectsBySettingsRoot, projects)));
}
}
return ItemHolder.of(result);
}
final String buildTypesLocator = locator.getSingleDimensionValue(BUILD_TYPE);
if (buildTypesLocator != null) {
return ItemHolder.of(getInstances(buildTypesLocator, versionedSettingsUsagesOnly));
}
final String projectLocator = locator.getSingleDimensionValue(AFFECTED_PROJECT); //todo: support multiple here for "from all not archived projects" case
if (projectLocator != null) {
return ItemHolder.of(getVcsRootInstancesUnderProject(myProjectFinder.getItem(projectLocator), versionedSettingsUsagesOnly));
}
//todo: (TeamCity) open API is there a better way to do this?
//if reworked, can use checkPermission(Permission.VIEW_BUILD_CONFIGURATION_SETTINGS, item);
// when implemented, can also add to jetbrains.buildServer.usageStatistics.impl.providers.StaticServerUsageStatisticsProvider.publishNumberOfVcsRoots()
final Set<VcsRootInstance> result = new TreeSet<>(VCS_ROOT_INSTANCE_COMPARATOR);
if (versionedSettingsUsagesOnly == null || !versionedSettingsUsagesOnly) {
for (SBuildType buildType : myProjectManager.getAllBuildTypes()) {
if (myPermissionChecker.isPermissionGranted(Permission.VIEW_BUILD_CONFIGURATION_SETTINGS, buildType.getProjectId())) {
result.addAll(buildType.getVcsRootInstances());
}
}
}
if (versionedSettingsUsagesOnly == null || versionedSettingsUsagesOnly) {
result.addAll(getSettingsRootInstances(myProjectManager.getProjects()));
}
return ItemHolder.of(result);
}