From: Wouter Admiraal Date: Fri, 25 Sep 2020 11:43:24 +0000 (+0200) Subject: SONAR-13900 Display BBS repo search results even if project is unknown X-Git-Tag: 8.5.0.37579~34 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1055024bf5bbfd50b26e4be8dc5a1fc52990dfed;p=sonarqube.git SONAR-13900 Display BBS repo search results even if project is unknown --- diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx index 9d9ce31adf4..a8cca95a4ca 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx @@ -36,7 +36,7 @@ export interface BitbucketProjectAccordionProps { onClick?: () => void; onSelectRepository: (repo: BitbucketRepository) => void; open: boolean; - project: BitbucketProject; + project?: BitbucketProject; repositories: BitbucketRepository[]; selectedRepository?: BitbucketRepository; showingAllRepositories: boolean; @@ -54,6 +54,8 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi const repositoryCount = repositories.length; + const title = project?.name ?? translate('search_results'); + return ( {project.name}}> + title={

{title}

}> {open && ( -
- {repositoryCount === 0 && ( - - - {translate('onboarding.create_project.update_your_token')} - - ) - }} - /> - - )} + <> +
+ {repositoryCount === 0 && ( + + + {translate('onboarding.create_project.update_your_token')} + + ) + }} + /> + + )} - {repositories.map(repo => - repo.sqProjectKey ? ( -
- -
-
- - {repo.name} - + {repositories.map(repo => + repo.sqProjectKey ? ( +
+ +
+
+ + {repo.name} + +
+ {translate('onboarding.create_project.repository_imported')}
- {translate('onboarding.create_project.repository_imported')}
-
- ) : ( - props.onSelectRepository(repo)} - value={String(repo.id)}> - - {repo.name} - - - ) - )} + ) : ( + props.onSelectRepository(repo)} + value={String(repo.id)}> + + {repo.name} + + + ) + )} +
{!showingAllRepositories && repositoryCount > 0 && ( @@ -137,7 +140,7 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi )} )} -
+ )} ); diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx index 64fbcaa5930..41b4601d918 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx @@ -34,6 +34,7 @@ import { } from '../../../types/alm-integration'; import { AlmSettingsInstance } from '../../../types/alm-settings'; import BitbucketCreateProjectRenderer from './BitbucketProjectCreateRenderer'; +import { DEFAULT_BBS_PAGE_SIZE } from './constants'; interface Props extends Pick { canAdmin: boolean; @@ -146,11 +147,31 @@ export default class BitbucketProjectCreate extends React.PureComponent { return getBitbucketServerRepositories(bitbucketSetting.key, p.name).then( - ({ isLastPage, repositories }) => ({ - isLastPage, - repositories, - projectKey: p.key - }) + ({ isLastPage, repositories }) => { + // Because the WS uses the project name rather than its key to find + // repositories, we can match more repositories than we expect. For + // example, p.name = "A1" would find repositories for projects "A1", + // "A10", "A11", etc. This is a limitation of BBS. To make sure we + // don't display incorrect information, filter on the project key. + const filteredRepositories = repositories.filter(r => r.projectKey === p.key); + + // And because of the above, the "isLastPage" cannot be relied upon + // either. This one is impossible to get 100% for now. We can only + // make some assumptions: by default, the page size for BBS is 25 + // (this is not part of the payload, so we don't know the actual + // number; but changing this implies changing some advanced config, + // so it's not likely). If the filtered repos is larger than this + // number AND isLastPage is false, we'll keep it at false. + // Otherwise, we assume it's true. + const realIsLastPage = + isLastPage || filteredRepositories.length < DEFAULT_BBS_PAGE_SIZE; + + return { + repositories: filteredRepositories, + isLastPage: realIsLastPage, + projectKey: p.key + }; + } ); }) ).then(results => { diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx index 6acd8d44104..c8f6f122e3a 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx @@ -44,17 +44,32 @@ export default function BitbucketSearchResults(props: BitbucketSearchResultsProp selectedRepository } = props; + if (searchResults.length === 0 && !searching) { + return ( + + {translate('onboarding.create_project.no_bbs_repos.filter')} + + ); + } + const filteredProjects = uniq( searchResults.map(r => projects.find(p => p.key === r.projectKey)).filter(isDefined) ); - return filteredProjects.length === 0 && !searching ? ( - - {translate('onboarding.create_project.no_bbs_repos.filter')} - - ) : ( + return (
+ {filteredProjects.length === 0 && searchResults.length > 0 && ( + + )} + {filteredProjects.map(project => { const repositories = searchResults.filter(r => r.projectKey === project.key); diff --git a/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectAccordion-test.tsx b/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectAccordion-test.tsx index 7f89c5cce6e..81fdd2319b5 100644 --- a/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectAccordion-test.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectAccordion-test.tsx @@ -39,6 +39,7 @@ it('should render correctly', () => { 'selected repo' ); expect(shallowRender({ showingAllRepositories: false })).toMatchSnapshot('not showing all repos'); + expect(shallowRender({ project: undefined })).toMatchSnapshot('no project info'); }); it('should correctly handle selecting repos', () => { diff --git a/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketSearchResults-test.tsx b/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketSearchResults-test.tsx index 1d7c2893a08..3db815e30a4 100644 --- a/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketSearchResults-test.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketSearchResults-test.tsx @@ -32,6 +32,9 @@ it('should render correctly', () => { shallowRender({ searching: true, projects: undefined, searchResults: undefined }) ).toMatchSnapshot('searching'); expect(shallowRender({ searchResults: undefined })).toMatchSnapshot('no results'); + expect( + shallowRender({ searchResults: [mockBitbucketRepository({ projectKey: 'unknown' })] }) + ).toMatchSnapshot('unknown project in search results'); }); function shallowRender(props: Partial = {}) { diff --git a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/BitbucketProjectAccordion-test.tsx.snap b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/BitbucketProjectAccordion-test.tsx.snap index 03b1ab6bdf0..e995e7e8379 100644 --- a/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/BitbucketProjectAccordion-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/BitbucketProjectAccordion-test.tsx.snap @@ -3,7 +3,6 @@ exports[`should render correctly: closed 1`] = ` `; +exports[`should render correctly: no project info 1`] = ` + + search_results + + } +> +
+ + + Repo + + +
+ +
+
+ + + Bar + + +
+ + onboarding.create_project.repository_imported + +
+
+
+
+`; + exports[`should render correctly: no repos 1`] = `
- - onboarding.create_project.only_showing_X_first_repos.2 -
+ + onboarding.create_project.only_showing_X_first_repos.2 +
`; exports[`should render correctly: selected repo 1`] = ` `; + +exports[`should render correctly: unknown project in search results 1`] = ` +
+ + + +
+`; diff --git a/server/sonar-web/src/main/js/apps/create/project/constants.ts b/server/sonar-web/src/main/js/apps/create/project/constants.ts index 967aee5d9b7..f01d1d67e34 100644 --- a/server/sonar-web/src/main/js/apps/create/project/constants.ts +++ b/server/sonar-web/src/main/js/apps/create/project/constants.ts @@ -19,3 +19,5 @@ */ export const PROJECT_NAME_MAX_LEN = 255; + +export const DEFAULT_BBS_PAGE_SIZE = 25; diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index 06b37f78f40..79705e09376 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -168,6 +168,7 @@ review=Review rule=Rule rules=Rules save=Save +search_results=Search results search_verb=Search see_all=See all select_verb=Select