public long countByTypeAndCreationDate(DbSession dbSession, BranchType branchType, long sinceDate) { return mapper(dbSession).countByTypeAndCreationDate(branchType.name(), sinceDate); }
private void checkComponentType(DbSession dbSession, ComponentDto project) { Optional<BranchDto> branch = dbClient.branchDao().selectByUuid(dbSession, project.uuid()); if (project.isPrivate()) { throw generateInvalidProjectExcpetion(); } if (branch.isPresent() && !branch.get().getBranchType().equals(LONG)) { throw generateInvalidProjectExcpetion(); } if (!project.qualifier().equals(PROJECT) && !project.qualifier().equals(APP)) { throw generateInvalidProjectExcpetion(); } }
private static ComponentDto createButDoNotInsertBranch(ComponentDto project) { BranchType randomBranchType = BranchType.values()[new Random().nextInt(BranchType.values().length)]; BranchDto branchDto = newBranchDto(project.projectUuid(), randomBranchType); return ComponentTesting.newProjectBranch(project, branchDto); }
@Override public void load(Metadata metadata) { String projectUuid = analysisMetadataHolder.getProject().getUuid(); String branchName = StringUtils.trimToNull(metadata.getBranchName()); Branch branch; if (branchName == null) { branch = getMainBranch(projectUuid); } else { BranchType branchType = BranchType.valueOf(metadata.getBranchType().name()); String mergeBranchName = StringUtils.trimToNull(metadata.getMergeBranchName()); branch = getMergeBranch(projectUuid, branchName, branchType, mergeBranchName); } analysisMetadataHolder.setBranch(branch); }
private static ProjectBranches.Branch.Builder toBranchBuilder(BranchDto branch, Optional<BranchDto> mergeBranch) { ProjectBranches.Branch.Builder builder = ProjectBranches.Branch.newBuilder(); String branchKey = branch.getKey(); ofNullable(branchKey).ifPresent(builder::setName); builder.setIsMain(branch.isMain()); builder.setType(Common.BranchType.valueOf(branch.getBranchType().name())); if (branch.getBranchType() == SHORT) { if (mergeBranch.isPresent()) { String mergeBranchKey = mergeBranch.get().getKey(); builder.setMergeBranch(mergeBranchKey); } else { builder.setIsOrphan(true); } } return builder; }
@Override public void handle(Request request, Response response) throws Exception { String projectKey = request.mandatoryParam(PARAM_PROJECT); try (DbSession dbSession = dbClient.openSession(false)) { ComponentDto project = componentFinder.getByKey(dbSession, projectKey); checkPermission(project); checkArgument(ALLOWED_QUALIFIERS.contains(project.qualifier()), "Invalid project"); Collection<BranchDto> branches = dbClient.branchDao().selectByComponent(dbSession, project).stream() .filter(b -> b.getBranchType() == SHORT || b.getBranchType() == LONG) .collect(toList()); List<String> branchUuids = branches.stream().map(BranchDto::getUuid).collect(toList()); Map<String, BranchDto> mergeBranchesByUuid = dbClient.branchDao() .selectByUuids(dbSession, branches.stream().map(BranchDto::getMergeBranchUuid).filter(Objects::nonNull).collect(toList())) .stream().collect(uniqueIndex(BranchDto::getUuid)); Map<String, LiveMeasureDto> qualityGateMeasuresByComponentUuids = dbClient.liveMeasureDao() .selectByComponentUuidsAndMetricKeys(dbSession, branchUuids, singletonList(ALERT_STATUS_KEY)).stream() .collect(uniqueIndex(LiveMeasureDto::getComponentUuid)); Map<String, BranchStatistics> branchStatisticsByBranchUuid = issueIndex.searchBranchStatistics(project.uuid(), branches.stream() .filter(b -> b.getBranchType().equals(SHORT)) .map(BranchDto::getUuid).collect(toList())).stream() .collect(uniqueIndex(BranchStatistics::getBranchUuid, Function.identity())); Map<String, String> analysisDateByBranchUuid = dbClient.snapshotDao() .selectLastAnalysesByRootComponentUuids(dbSession, branchUuids).stream() .collect(uniqueIndex(SnapshotDto::getComponentUuid, s -> formatDateTime(s.getCreatedAt()))); ProjectBranches.ListWsResponse.Builder protobufResponse = ProjectBranches.ListWsResponse.newBuilder(); branches.forEach(b -> addBranch(protobufResponse, b, mergeBranchesByUuid, qualityGateMeasuresByComponentUuids.get(b.getUuid()), branchStatisticsByBranchUuid.get(b.getUuid()), analysisDateByBranchUuid.get(b.getUuid()))); WsUtils.writeProtobuf(protobufResponse.build(), request, response); } }
@CheckForNull private BranchImpl createBranch() { org.sonar.ce.task.projectanalysis.analysis.Branch analysisBranch = analysisMetadataHolder.getBranch(); if (!analysisBranch.isLegacyFeature()) { String branchKey = analysisBranch.getType() == PULL_REQUEST ? analysisBranch.getPullRequestKey() : analysisBranch.getName(); return new BranchImpl(analysisBranch.isMain(), branchKey, Branch.Type.valueOf(analysisBranch.getType().name())); } return null; }
private void checkComponentType(DbSession dbSession, ComponentDto project) { Optional<BranchDto> branch = dbClient.branchDao().selectByUuid(dbSession, project.uuid()); if (project.isPrivate()) { throw generateInvalidProjectExcpetion(); } if (branch.isPresent() && !branch.get().getBranchType().equals(LONG)) { throw generateInvalidProjectExcpetion(); } if (!project.qualifier().equals(PROJECT) && !project.qualifier().equals(APP)) { throw generateInvalidProjectExcpetion(); } }
private WebhookPayload buildWebHookPayload(DbSession dbSession, QGChangeEvent event, @Nullable EvaluatedQualityGate evaluatedQualityGate) { ComponentDto project = event.getProject(); BranchDto branch = event.getBranch(); SnapshotDto analysis = event.getAnalysis(); Map<String, String> analysisProperties = dbClient.analysisPropertiesDao().selectBySnapshotUuid(dbSession, analysis.getUuid()) .stream() .collect(Collectors.toMap(AnalysisPropertyDto::getKey, AnalysisPropertyDto::getValue)); String projectUuid = StringUtils.defaultString(project.getMainBranchProjectUuid(), project.projectUuid()); ProjectAnalysis projectAnalysis = new ProjectAnalysis( new Project(projectUuid, project.getKey(), project.name()), null, new Analysis(analysis.getUuid(), analysis.getCreatedAt()), new Branch(branch.isMain(), branch.getKey(), Type.valueOf(branch.getBranchType().name())), evaluatedQualityGate, null, analysisProperties); return webhookPayloadFactory.create(projectAnalysis); }
@Override public void handle(Request request, Response response) throws Exception { String projectKey = request.mandatoryParam(PARAM_PROJECT); try (DbSession dbSession = dbClient.openSession(false)) { ComponentDto project = componentFinder.getByKey(dbSession, projectKey); checkPermission(project); checkArgument(project.isEnabled() && PROJECT.equals(project.qualifier()), "Invalid project key"); Collection<BranchDto> branches = dbClient.branchDao().selectByComponent(dbSession, project).stream() .filter(b -> b.getBranchType() == SHORT || b.getBranchType() == LONG) .collect(MoreCollectors.toList()); List<String> branchUuids = branches.stream().map(BranchDto::getUuid).collect(toList()); Map<String, BranchDto> mergeBranchesByUuid = dbClient.branchDao() .selectByUuids(dbSession, branches.stream().map(BranchDto::getMergeBranchUuid).filter(Objects::nonNull).collect(toList())) .stream().collect(uniqueIndex(BranchDto::getUuid)); Map<String, LiveMeasureDto> qualityGateMeasuresByComponentUuids = dbClient.liveMeasureDao() .selectByComponentUuidsAndMetricKeys(dbSession, branchUuids, singletonList(ALERT_STATUS_KEY)).stream() .collect(uniqueIndex(LiveMeasureDto::getComponentUuid)); Map<String, BranchStatistics> branchStatisticsByBranchUuid = issueIndex.searchBranchStatistics(project.uuid(), branches.stream() .filter(b -> b.getBranchType().equals(SHORT)) .map(BranchDto::getUuid).collect(toList())).stream() .collect(uniqueIndex(BranchStatistics::getBranchUuid, Function.identity())); Map<String, String> analysisDateByBranchUuid = dbClient.snapshotDao() .selectLastAnalysesByRootComponentUuids(dbSession, branchUuids).stream() .collect(uniqueIndex(SnapshotDto::getComponentUuid, s -> formatDateTime(s.getCreatedAt()))); ProjectBranches.ListWsResponse.Builder protobufResponse = ProjectBranches.ListWsResponse.newBuilder(); branches.forEach(b -> addBranch(protobufResponse, b, mergeBranchesByUuid, qualityGateMeasuresByComponentUuids.get(b.getUuid()), branchStatisticsByBranchUuid.get(b.getUuid()), analysisDateByBranchUuid.get(b.getUuid()))); WsUtils.writeProtobuf(protobufResponse.build(), request, response); } }
@Test public void long_living_branch_in_queue_analysis() { logInAsSystemAdministrator(); String branch = "ny_branch"; CeQueueDto queue1 = insertQueue("T1", null, IN_PROGRESS); insertCharacteristic(queue1, BRANCH_KEY, branch); insertCharacteristic(queue1, BRANCH_TYPE_KEY, LONG.name()); CeQueueDto queue2 = insertQueue("T2", null, PENDING); insertCharacteristic(queue2, BRANCH_KEY, branch); insertCharacteristic(queue2, BRANCH_TYPE_KEY, LONG.name()); ActivityResponse response = ws.newRequest() .setParam("status", "FAILED,IN_PROGRESS,PENDING") .executeProtobuf(ActivityResponse.class); assertThat(response.getTasksList()) .extracting(Task::getId, Ce.Task::getBranch, Ce.Task::getBranchType, Ce.Task::getStatus) .containsExactlyInAnyOrder( tuple("T1", branch, Common.BranchType.LONG, Ce.TaskStatus.IN_PROGRESS), tuple("T2", branch, Common.BranchType.LONG, Ce.TaskStatus.PENDING)); }
@Test public void long_living_branch_in_queue_analysis() { UserDto user = db.users().insertUser(); userSession.logIn(user).setRoot(); String branch = "my_branch"; CeQueueDto queueDto = createAndPersistQueueTask(null, user); insertCharacteristic(queueDto, BRANCH_KEY, branch); insertCharacteristic(queueDto, BRANCH_TYPE_KEY, LONG.name()); Ce.TaskResponse taskResponse = ws.newRequest() .setParam("id", SOME_TASK_UUID) .executeProtobuf(Ce.TaskResponse.class); assertThat(taskResponse.getTask()) .extracting(Ce.Task::getId, Ce.Task::getBranch, Ce.Task::getBranchType, Ce.Task::hasComponentKey) .containsExactlyInAnyOrder(SOME_TASK_UUID, branch, Common.BranchType.LONG, false); }
@Test public void long_living_branch_in_queue_analysis() { ComponentDto project = db.components().insertMainBranch(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(LONG)); CeQueueDto queue1 = insertQueue("T1", project, IN_PROGRESS); insertCharacteristic(queue1, BRANCH_KEY, longLivingBranch.getBranch()); insertCharacteristic(queue1, BRANCH_TYPE_KEY, LONG.name()); CeQueueDto queue2 = insertQueue("T2", project, PENDING); insertCharacteristic(queue2, BRANCH_KEY, longLivingBranch.getBranch()); insertCharacteristic(queue2, BRANCH_TYPE_KEY, LONG.name()); Ce.ComponentResponse response = ws.newRequest() .setParam(PARAM_COMPONENT, longLivingBranch.getKey()) .executeProtobuf(Ce.ComponentResponse.class); assertThat(response.getQueueList()) .extracting(Ce.Task::getId, Ce.Task::getBranch, Ce.Task::getBranchType, Ce.Task::getStatus, Ce.Task::getComponentKey, Ce.Task::getWarningCount, Ce.Task::getWarningsList) .containsOnly( tuple("T1", longLivingBranch.getBranch(), Common.BranchType.LONG, Ce.TaskStatus.IN_PROGRESS, project.getKey(), 0, emptyList()), tuple("T2", longLivingBranch.getBranch(), Common.BranchType.LONG, Ce.TaskStatus.PENDING, project.getKey(), 0, emptyList())); }
@Test public void return_many_tasks_from_same_project() { ComponentDto project = db.components().insertMainBranch(); userSession.addProjectPermission(UserRole.USER, project); insertQueue("Main", project, IN_PROGRESS); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(LONG).setKey("long-branch")); CeQueueDto longLivingBranchQueue = insertQueue("Long", project, IN_PROGRESS); insertCharacteristic(longLivingBranchQueue, BRANCH_KEY, longLivingBranch.getBranch()); insertCharacteristic(longLivingBranchQueue, BRANCH_TYPE_KEY, LONG.name()); ComponentDto shortLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(SHORT).setKey("short-branch")); CeQueueDto shortLivingBranchQueue = insertQueue("Short", project, PENDING); insertCharacteristic(shortLivingBranchQueue, BRANCH_KEY, shortLivingBranch.getBranch()); insertCharacteristic(shortLivingBranchQueue, BRANCH_TYPE_KEY, SHORT.name()); Ce.ComponentResponse response = ws.newRequest() .setParam(PARAM_COMPONENT, longLivingBranch.getKey()) .executeProtobuf(Ce.ComponentResponse.class); assertThat(response.getQueueList()) .extracting(Ce.Task::getId, Ce.Task::getComponentKey, Ce.Task::getBranch, Ce.Task::getBranchType, Ce.Task::getWarningCount, Ce.Task::getWarningsList) .containsOnly( tuple("Main", project.getKey(), "", Common.BranchType.UNKNOWN_BRANCH_TYPE, 0, emptyList()), tuple("Long", longLivingBranch.getKey(), longLivingBranch.getBranch(), Common.BranchType.LONG, 0, emptyList()), tuple("Short", shortLivingBranch.getKey(), shortLivingBranch.getBranch(), Common.BranchType.SHORT, 0, emptyList())); }
@Test public void long_living_branch_in_activity() { ComponentDto project = db.components().insertMainBranch(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(LONG)); SnapshotDto analysis = db.components().insertSnapshot(longLivingBranch); CeActivityDto activity = insertActivity("T1", project, SUCCESS, analysis); insertCharacteristic(activity, BRANCH_KEY, longLivingBranch.getBranch()); insertCharacteristic(activity, BRANCH_TYPE_KEY, LONG.name()); Ce.ComponentResponse response = ws.newRequest() .setParam(PARAM_COMPONENT, project.getKey()) .executeProtobuf(Ce.ComponentResponse.class); assertThat(response.getCurrent()) .extracting(Ce.Task::getId, Ce.Task::getBranch, Ce.Task::getBranchType, Ce.Task::getStatus, Ce.Task::getComponentKey, Ce.Task::getWarningCount, Ce.Task::getWarningsList) .containsOnly( "T1", longLivingBranch.getBranch(), Common.BranchType.LONG, Ce.TaskStatus.SUCCESS, project.getKey(), 0, emptyList()); }
@Test public void long_living_branch_in_past_activity() { logInAsRoot(); ComponentDto project = db.components().insertMainBranch(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(LONG)); db.components().insertSnapshot(longLivingBranch); CeActivityDto activity = createAndPersistArchivedTask(project); insertCharacteristic(activity, BRANCH_KEY, longLivingBranch.getBranch()); insertCharacteristic(activity, BRANCH_TYPE_KEY, LONG.name()); Ce.TaskResponse taskResponse = ws.newRequest() .setParam("id", SOME_TASK_UUID) .executeProtobuf(Ce.TaskResponse.class); assertThat(taskResponse.getTask()) .extracting(Ce.Task::getId, Ce.Task::getBranch, Ce.Task::getBranchType, Ce.Task::getComponentKey) .containsExactlyInAnyOrder(SOME_TASK_UUID, longLivingBranch.getBranch(), Common.BranchType.LONG, longLivingBranch.getKey()); }
@Test public void long_living_branch_in_past_activity() { logInAsSystemAdministrator(); ComponentDto project = db.components().insertMainBranch(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(LONG)); SnapshotDto analysis = db.components().insertSnapshot(longLivingBranch); CeActivityDto activity = insertActivity("T1", project, SUCCESS, analysis); insertCharacteristic(activity, BRANCH_KEY, longLivingBranch.getBranch()); insertCharacteristic(activity, BRANCH_TYPE_KEY, LONG.name()); ActivityResponse response = ws.newRequest().executeProtobuf(ActivityResponse.class); assertThat(response.getTasksList()) .extracting(Task::getId, Ce.Task::getBranch, Ce.Task::getBranchType, Ce.Task::getStatus, Ce.Task::getComponentKey) .containsExactlyInAnyOrder( tuple("T1", longLivingBranch.getBranch(), Common.BranchType.LONG, Ce.TaskStatus.SUCCESS, longLivingBranch.getKey())); }
@CheckForNull private BranchImpl createBranch() { org.sonar.server.computation.task.projectanalysis.analysis.Branch analysisBranch = analysisMetadataHolder.getBranch(); if (!analysisBranch.isLegacyFeature()) { String branchKey = analysisBranch.getType() == PULL_REQUEST ? analysisBranch.getPullRequestKey() : analysisBranch.getName(); return new BranchImpl(analysisBranch.isMain(), branchKey, Branch.Type.valueOf(analysisBranch.getType().name())); } return null; }
private static ProjectBranches.Branch.Builder toBranchBuilder(BranchDto branch, Optional<BranchDto> mergeBranch) { ProjectBranches.Branch.Builder builder = ProjectBranches.Branch.newBuilder(); String branchKey = branch.getKey(); setNullable(branchKey, builder::setName); builder.setIsMain(branch.isMain()); builder.setType(Common.BranchType.valueOf(branch.getBranchType().name())); if (branch.getBranchType() == SHORT) { if (mergeBranch.isPresent()) { String mergeBranchKey = mergeBranch.get().getKey(); builder.setMergeBranch(mergeBranchKey); } else { builder.setIsOrphan(true); } } return builder; }
private WebhookPayload buildWebHookPayload(DbSession dbSession, QGChangeEvent event, @Nullable EvaluatedQualityGate evaluatedQualityGate) { ComponentDto project = event.getProject(); BranchDto branch = event.getBranch(); SnapshotDto analysis = event.getAnalysis(); Map<String, String> analysisProperties = dbClient.analysisPropertiesDao().selectBySnapshotUuid(dbSession, analysis.getUuid()) .stream() .collect(Collectors.toMap(AnalysisPropertyDto::getKey, AnalysisPropertyDto::getValue)); String projectUuid = StringUtils.defaultString(project.getMainBranchProjectUuid(), project.projectUuid()); ProjectAnalysis projectAnalysis = new ProjectAnalysis( new Project(projectUuid, project.getKey(), project.name()), null, new Analysis(analysis.getUuid(), analysis.getCreatedAt()), new Branch(branch.isMain(), branch.getKey(), Type.valueOf(branch.getBranchType().name())), evaluatedQualityGate, null, analysisProperties); return webhookPayloadFactory.create(projectAnalysis); }