in rest-api/src/jetbrains/buildServer/server/rest/data/finder/impl/BuildFinder.java [247:347]
public BuildPromotion getBuildPromotion(@Nullable SBuildType buildType, @Nullable final String buildLocator) {
if (!TeamCityProperties.getBoolean(LEGACY_BUILDS_FILTERING_FORCED)) {
return getBuildPromotionInternal(buildType, buildLocator);
}
if (StringUtil.isEmpty(buildLocator)) {
throw new BadRequestException("Empty single build locator is not supported.");
}
Locator locator = null;
try {
locator = new Locator(buildLocator);
} catch (LocatorProcessException e) {
//unparsable locator - proceed to report a due error later with all the supported locators
}
if (locator == null || useByPromotionFiltering(locator)) {
return getBuildPromotionInternal(buildType, buildLocator);
}
if (locator.isSingleValue()) {
if (buildType == null) {
// no dimensions found and no build type, assume it's build id
@SuppressWarnings("ConstantConditions") SBuild build =
myServiceLocator.getSingletonService(BuildsManager.class).findBuildInstanceById(locator.getSingleValueAsLong()); //todo: report non-number more user-friendly
if (build == null) {
throw new NotFoundException("Cannot find build by id '" + locator.getSingleValue() + "'.");
}
return build.getBuildPromotion();
}
// no dimensions found and build type is specified, assume it's build number
@SuppressWarnings("ConstantConditions") SBuild build = myServiceLocator.getSingletonService(BuildsManager.class).findBuildInstanceByBuildNumber(buildType.getBuildTypeId(),
buildLocator);
if (build == null) {
throw new NotFoundException("No build can be found by number '" + buildLocator + "' in build configuration " + buildType + ".");
}
return build.getBuildPromotion();
}
String buildTypeLocator = locator.getSingleDimensionValue("buildType");
buildType = myBuildTypeFinder.deriveBuildTypeFromLocator(buildType, buildTypeLocator);
Long id = locator.getSingleDimensionValueAsLong(DIMENSION_ID);
if (id != null) {
SBuild build = myServiceLocator.getSingletonService(BuildsManager.class).findBuildInstanceById(id);
if (build == null) {
throw new NotFoundException("No build can be found by id '" + id + "'.");
}
if (buildType != null && !buildType.getBuildTypeId().equals(build.getBuildTypeId())) {
throw new NotFoundException("No build can be found by id '" + locator.getSingleDimensionValue(DIMENSION_ID) + "' in build type '" + buildType + "'.");
}
if (locator.getDimensionsCount() > 1) {
LOG.info("Build locator '" + buildLocator + "' has '" + DIMENSION_ID + "' dimension and others. Others are ignored.");
}
return build.getBuildPromotion();
}
String number = locator.getSingleDimensionValue("number");
if (number != null && buildType != null) {
SBuild build = myServiceLocator.getSingletonService(BuildsManager.class).findBuildInstanceByBuildNumber(buildType.getBuildTypeId(), number);
if (build == null) {
throw new NotFoundException("No build can be found by number '" + number + "' in build configuration " + buildType + ".");
}
if (locator.getDimensionsCount() > 1) {
LOG.info("Build locator '" + buildLocator + "' has 'number' dimension and others. Others are ignored.");
}
return build.getBuildPromotion();
}
Long promotionId = locator.getSingleDimensionValueAsLong(PROMOTION_ID);
if (promotionId == null){
promotionId = locator.getSingleDimensionValueAsLong("promotionId"); //support TeamCity 8.0 dimension
}
if (promotionId != null) {
BuildPromotion build = myBuildPromotionFinder.getBuildPromotion(promotionId);
if (buildType != null && !buildType.getBuildTypeId().equals(build.getBuildTypeId())) {
throw new NotFoundException("No build can be found by " + PROMOTION_ID + " '" + promotionId + "' in build type '" + buildType + "'.");
}
if (locator.getDimensionsCount() > 1) {
LOG.info("Build locator '" + buildLocator + "' has '" + PROMOTION_ID + "' dimension and others. Others are ignored.");
}
return build;
}
final BuildsFilter buildsFilter = getBuildsFilter(locator, buildType);
buildsFilter.setCount(1);
locator.checkLocatorFullyProcessed();
final List<SBuild> filteredBuilds = getBuilds(buildsFilter);
if (filteredBuilds.size() == 0){
throw new NotFoundException("No build found by filter: " + buildsFilter.toString() + ".");
}
if (filteredBuilds.size() == 1){
return filteredBuilds.get(0).getBuildPromotion();
}
//todo: check for unknown dimension names in all the returns
throw new BadRequestException("Build locator '" + buildLocator + "' is not supported (" + filteredBuilds.size() + " builds found)");
}