Преглед на файлове

SONAR-14933 Show all tutorials if no project binding

tags/9.0.0.45539
Wouter Admiraal преди 3 години
родител
ревизия
c0cdcd5ab6
променени са 100 файла, в които са добавени 1190 реда и са изтрити 846 реда
  1. 0
    1
      server/sonar-web/public/images/sonarcloud/analysis/Waiting-for-analysis.svg
  2. 0
    1
      server/sonar-web/public/images/sonarcloud/analysis/galaxy.svg
  3. 0
    1
      server/sonar-web/public/images/sonarcloud/analysis/helmet.svg
  4. 0
    1
      server/sonar-web/public/images/sonarcloud/analysis/manual.svg
  5. 0
    1
      server/sonar-web/public/images/sonarcloud/analysis/rocket.svg
  6. 0
    17
      server/sonar-web/public/images/sonarcloud/as-a-service.svg
  7. 0
    3
      server/sonar-web/public/images/sonarcloud/azure.svg
  8. 0
    1
      server/sonar-web/public/images/sonarcloud/bitbucket-big.svg
  9. 0
    12
      server/sonar-web/public/images/sonarcloud/bitbucket-unbound.svg
  10. 0
    10
      server/sonar-web/public/images/sonarcloud/bitbucket-white.svg
  11. 0
    10
      server/sonar-web/public/images/sonarcloud/bitbucket.svg
  12. Двоични данни
      server/sonar-web/public/images/sonarcloud/branch-01.png
  13. Двоични данни
      server/sonar-web/public/images/sonarcloud/branch-01@2x.png
  14. Двоични данни
      server/sonar-web/public/images/sonarcloud/branch-02.png
  15. Двоични данни
      server/sonar-web/public/images/sonarcloud/branch-02@2x.png
  16. Двоични данни
      server/sonar-web/public/images/sonarcloud/branch-03.png
  17. Двоични данни
      server/sonar-web/public/images/sonarcloud/branch-03@2x.png
  18. 0
    45
      server/sonar-web/public/images/sonarcloud/branch-analysis.svg
  19. 0
    3
      server/sonar-web/public/images/sonarcloud/check.svg
  20. 0
    1
      server/sonar-web/public/images/sonarcloud/chevron-left.svg
  21. 0
    1
      server/sonar-web/public/images/sonarcloud/chevron-right.svg
  22. 0
    1
      server/sonar-web/public/images/sonarcloud/collab.svg
  23. Двоични данни
      server/sonar-web/public/images/sonarcloud/gears.png
  24. Двоични данни
      server/sonar-web/public/images/sonarcloud/gears@2x.png
  25. 0
    1
      server/sonar-web/public/images/sonarcloud/github-big.svg
  26. 0
    7
      server/sonar-web/public/images/sonarcloud/github-unbound.svg
  27. 0
    3
      server/sonar-web/public/images/sonarcloud/github-white.svg
  28. 0
    3
      server/sonar-web/public/images/sonarcloud/github.svg
  29. 0
    1
      server/sonar-web/public/images/sonarcloud/home-background-grey-bottom.svg
  30. Двоични данни
      server/sonar-web/public/images/sonarcloud/home-branch.png
  31. Двоични данни
      server/sonar-web/public/images/sonarcloud/home-branch@2x.png
  32. Двоични данни
      server/sonar-web/public/images/sonarcloud/home-easy-to-use.png
  33. Двоични данни
      server/sonar-web/public/images/sonarcloud/home-easy-to-use@2x.png
  34. 0
    3
      server/sonar-web/public/images/sonarcloud/home-grey-background.svg
  35. Двоични данни
      server/sonar-web/public/images/sonarcloud/home-header-people.png
  36. 0
    7
      server/sonar-web/public/images/sonarcloud/home-header.svg
  37. Двоични данни
      server/sonar-web/public/images/sonarcloud/home-open-transparent.png
  38. Двоични данни
      server/sonar-web/public/images/sonarcloud/home-open-transparent@2x.png
  39. 0
    108
      server/sonar-web/public/images/sonarcloud/ide.svg
  40. 0
    12
      server/sonar-web/public/images/sonarcloud/locs.svg
  41. 0
    3
      server/sonar-web/public/images/sonarcloud/open-source.svg
  42. 0
    1
      server/sonar-web/public/images/sonarcloud/pricing-header.svg
  43. 0
    3
      server/sonar-web/public/images/sonarcloud/pull-request.svg
  44. 0
    1
      server/sonar-web/public/images/sonarcloud/rules.svg
  45. 0
    4
      server/sonar-web/public/images/sonarcloud/scale.svg
  46. Двоични данни
      server/sonar-web/public/images/sonarcloud/sl-notif.png
  47. Двоични данни
      server/sonar-web/public/images/sonarcloud/sl-notif@2x.png
  48. 0
    3
      server/sonar-web/public/images/sonarcloud/sonarcloud-logo-text-only.svg
  49. 0
    15
      server/sonar-web/public/images/sonarcloud/sonarlint-integration.svg
  50. 0
    4
      server/sonar-web/public/images/sonarcloud/sonarlint-logo.svg
  51. 0
    1
      server/sonar-web/public/images/sonarcloud/sq-background.svg
  52. Двоични данни
      server/sonar-web/public/images/sonarcloud/sq-homepage.png
  53. Двоични данни
      server/sonar-web/public/images/sonarcloud/sq-homepage@2x.png
  54. 0
    9
      server/sonar-web/public/images/sonarcloud/stop.svg
  55. 0
    1
      server/sonar-web/public/images/sonarcloud/vsts-big.svg
  56. 0
    1
      server/sonar-web/public/images/sonarcloud/windows.svg
  57. 16
    0
      server/sonar-web/public/images/tutorials/manual.svg
  58. 4
    10
      server/sonar-web/src/main/js/components/tutorials/TutorialSelection.tsx
  59. 63
    63
      server/sonar-web/src/main/js/components/tutorials/TutorialSelectionRenderer.tsx
  60. 0
    12
      server/sonar-web/src/main/js/components/tutorials/__tests__/TutorialSelection-test.tsx
  61. 0
    1
      server/sonar-web/src/main/js/components/tutorials/__tests__/__snapshots__/TutorialSelection-test.tsx.snap
  62. 115
    53
      server/sonar-web/src/main/js/components/tutorials/__tests__/__snapshots__/TutorialSelectionRenderer-test.tsx.snap
  63. 27
    1
      server/sonar-web/src/main/js/components/tutorials/__tests__/utils-test.ts
  64. 1
    20
      server/sonar-web/src/main/js/components/tutorials/azure-pipelines/AzurePipelinesTutorial.tsx
  65. 0
    12
      server/sonar-web/src/main/js/components/tutorials/azure-pipelines/__tests__/AzurePipelinesTutorial-test.tsx
  66. 0
    58
      server/sonar-web/src/main/js/components/tutorials/azure-pipelines/__tests__/__snapshots__/AzurePipelinesTutorial-test.tsx.snap
  67. 1
    1
      server/sonar-web/src/main/js/components/tutorials/bitbucket-pipelines/BitbucketPipelinesTutorial.tsx
  68. 18
    13
      server/sonar-web/src/main/js/components/tutorials/bitbucket-pipelines/RepositoryVariables.tsx
  69. 2
    2
      server/sonar-web/src/main/js/components/tutorials/bitbucket-pipelines/__tests__/__snapshots__/RepositoryVariables-test.tsx.snap
  70. 1
    1
      server/sonar-web/src/main/js/components/tutorials/github-action/GitHubActionTutorial.tsx
  71. 14
    11
      server/sonar-web/src/main/js/components/tutorials/github-action/SecretStep.tsx
  72. 2
    2
      server/sonar-web/src/main/js/components/tutorials/github-action/__tests__/SecretStep-test.tsx
  73. 3
    1
      server/sonar-web/src/main/js/components/tutorials/github-action/__tests__/__snapshots__/SecretStep-test.tsx.snap
  74. 1
    14
      server/sonar-web/src/main/js/components/tutorials/gitlabci/GitLabCITutorial.tsx
  75. 0
    8
      server/sonar-web/src/main/js/components/tutorials/gitlabci/__tests__/GitLabCITutorial-test.tsx
  76. 0
    8
      server/sonar-web/src/main/js/components/tutorials/gitlabci/__tests__/__snapshots__/GitLabCITutorial-test.tsx.snap
  77. 76
    64
      server/sonar-web/src/main/js/components/tutorials/jenkins/JenkinsTutorial.tsx
  78. 36
    34
      server/sonar-web/src/main/js/components/tutorials/jenkins/MultiBranchPipelineStep.tsx
  79. 3
    2
      server/sonar-web/src/main/js/components/tutorials/jenkins/PreRequisitesStep.tsx
  80. 74
    0
      server/sonar-web/src/main/js/components/tutorials/jenkins/SelectAlmStep.tsx
  81. 7
    5
      server/sonar-web/src/main/js/components/tutorials/jenkins/WebhookStep.tsx
  82. 20
    20
      server/sonar-web/src/main/js/components/tutorials/jenkins/WebhookStepBitbucket.tsx
  83. 6
    3
      server/sonar-web/src/main/js/components/tutorials/jenkins/WebhookStepGithub.tsx
  84. 59
    34
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/JenkinsTutorial-test.tsx
  85. 25
    1
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/MultiBranchPipelineStep-test.tsx
  86. 1
    0
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/PreRequisitesStep-test.tsx
  87. 62
    0
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/SelectAlmStep-test.tsx
  88. 3
    2
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/WebhookStep-test.tsx
  89. 18
    9
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/WebhookStepBitbucket-test.tsx
  90. 22
    6
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/JenkinsTutorial-test.tsx.snap
  91. 330
    1
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/MultiBranchPipelineStep-test.tsx.snap
  92. 1
    1
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/PreRequisitesStep-test.tsx.snap
  93. 89
    0
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/SelectAlmStep-test.tsx.snap
  94. 3
    2
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/WebhookStep-test.tsx.snap
  95. 71
    67
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/WebhookStepBitbucket-test.tsx.snap
  96. 3
    1
      server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/WebhookStepGithub-test.tsx.snap
  97. 11
    0
      server/sonar-web/src/main/js/components/tutorials/utils.ts
  98. 1
    2
      server/sonar-web/src/main/js/helpers/mocks/alm-settings.ts
  99. 1
    1
      sonar-application/build.gradle
  100. 0
    0
      sonar-core/src/main/resources/org/sonar/l10n/core.properties

+ 0
- 1
server/sonar-web/public/images/sonarcloud/analysis/Waiting-for-analysis.svg Целия файл

@@ -1 +0,0 @@
<svg width="90" height="90" xmlns="http://www.w3.org/2000/svg"><g stroke="#236A97" stroke-width="2" fill="none" fill-rule="evenodd"><path d="M32.087 83H12V12h66v71H57.913"/><path d="M57.79 78H72V18H18v60h14.21M12 12h66V1H12zM17 7h3M23 7h3M28 7h3M34 7h40"/><path d="M56.355 48.275c0 6.258-5.083 11.327-11.355 11.327s-11.355-5.069-11.355-11.327S38.728 36.948 45 36.948s11.355 5.069 11.355 11.327z"/><path d="M61.336 55.028a7.07 7.07 0 0 1-1.276 8.27 7.114 7.114 0 0 1-8.29 1.273A7.101 7.101 0 0 1 45 69.513a7.098 7.098 0 0 1-6.77-4.942 7.114 7.114 0 0 1-8.29-1.274 7.064 7.064 0 0 1-1.277-8.269c-2.867-.906-4.954-3.58-4.954-6.754 0-3.171 2.087-5.846 4.954-6.752a7.07 7.07 0 0 1 1.277-8.27 7.114 7.114 0 0 1 8.29-1.273A7.1 7.1 0 0 1 45 27.036a7.102 7.102 0 0 1 6.77 4.943 7.114 7.114 0 0 1 8.29 1.274 7.07 7.07 0 0 1 1.276 8.269c2.869.906 4.954 3.58 4.954 6.752a7.084 7.084 0 0 1-4.954 6.754z"/><path d="M36.484 69.514V87.92L45 83.673l8.516 4.247V69.514M45 83.673v-7.08M45 42.611V53.94M45 42.611a4.254 4.254 0 0 1-4.258 4.248M81.903 18.54H89v59.47h-7.097M89 29.868h-7.097M84.742 24.205h-2.839M8.097 18.54H1v59.47h7.097M8.097 29.868H1M8.097 24.205H5.258"/></g></svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/analysis/galaxy.svg Целия файл

@@ -1 +0,0 @@
<svg width="58" height="56" xmlns="http://www.w3.org/2000/svg"><g fill="#4680A5" fill-rule="nonzero"><path d="M28.5 19a9.503 9.503 0 0 0-8.088 4.523 1.198 1.198 0 0 0-.102.172A9.438 9.438 0 0 0 19 28.5c0 1.353.286 2.64.798 3.806.022.061.049.12.08.177C21.388 35.737 24.684 38 28.5 38a9.498 9.498 0 0 0 7.925-4.269 1.2 1.2 0 0 0 .117-.183 9.44 9.44 0 0 0 1.453-4.822c.003-.037.005-.075.005-.114l-.002-.037L38 28.5c0-5.238-4.261-9.5-9.5-9.5zm7.127 8.464h-4.152a5.414 5.414 0 0 0-3.854 1.596l-.788.788a3.13 3.13 0 0 1-2.228.923h-2.938a7.16 7.16 0 0 1-.37-2.271 7.16 7.16 0 0 1 .73-3.156h7.28a1.15 1.15 0 0 0 0-2.298h-5.503a7.17 7.17 0 0 1 4.696-1.748c3.62 0 6.623 2.684 7.127 6.166zm-12.69 5.605h1.668a5.414 5.414 0 0 0 3.853-1.596l.788-.788a3.132 3.132 0 0 1 2.229-.923h4.114a7.147 7.147 0 0 1-.729 2.113h-2.545a1.15 1.15 0 0 0 0 2.298h.615a7.163 7.163 0 0 1-4.43 1.53 7.192 7.192 0 0 1-5.564-2.634z"/><path d="M42.177 15.924c-2.408-2.636-5.517-4.663-8.99-5.863a1.117 1.117 0 0 0-1.423.708c-.2.594.113 1.24.699 1.442 3.123 1.078 5.913 2.896 8.07 5.255 2.287 2.504 3.705 5.49 4.1 8.633.59 4.716-.915 9.5-4.13 13.127-3.111 3.509-7.465 5.503-11.985 5.503-.1 0-.2 0-.3-.003-3.427-.067-6.713-1.208-9.362-3.233.34-.625.535-1.343.535-2.107 0-2.414-1.94-4.379-4.323-4.379-.451 0-.92.072-1.33.202 0 0-1.028-1.91-1.404-5.157a16.581 16.581 0 0 1 .29-5.422c.788-3.618 2.794-6.913 5.643-9.24 1.657-1.352 3.607-2.362 5.643-2.981.593-.18.93-.813.752-1.414a1.118 1.118 0 0 0-1.395-.761c-7.101 2.158-12.34 8.447-13.154 15.923-.382 3.51.207 7.119 1.757 10.286a4.395 4.395 0 0 0-1.124 2.943c0 2.415 1.938 4.38 4.322 4.38.813 0 1.574-.23 2.225-.627 3.062 2.416 6.89 3.78 10.882 3.857.114.003.229.004.343.004 5.156 0 10.116-2.268 13.652-6.256 3.651-4.118 5.36-9.56 4.686-14.93-.454-3.617-2.071-7.037-4.679-9.89zm-29.19 23.462c0-1.162.934-2.107 2.08-2.107 1.148 0 2.082.945 2.082 2.107 0 1.163-.934 2.108-2.081 2.108-1.147 0-2.08-.945-2.08-2.108z"/><path d="M58 17.675c0-1.44-.559-2.793-1.573-3.811a5.329 5.329 0 0 0-3.799-1.579c-.51 0-1.008.072-1.486.21a28.132 28.132 0 0 0-9.442-8.84A27.836 27.836 0 0 0 27.905 0C20.45 0 13.444 2.912 8.173 8.201 2.903 13.489 0 20.521 0 28.001c0 7.478 2.902 14.51 8.173 19.798C13.443 53.088 20.451 56 27.904 56c7.454 0 14.462-2.912 19.732-8.2 5.27-5.29 8.173-12.32 8.173-19.8 0-1.89-.19-3.776-.564-5.617A5.402 5.402 0 0 0 58 17.675zm-4.93 5.373A26.04 26.04 0 0 1 53.543 28c0 6.872-2.667 13.332-7.51 18.192-4.843 4.859-11.281 7.535-18.13 7.535-6.848 0-13.286-2.676-18.13-7.535C4.934 41.332 2.267 34.872 2.267 28S4.933 14.668 9.775 9.808c4.843-4.859 11.281-7.535 18.13-7.535a25.57 25.57 0 0 1 12.674 3.358 25.852 25.852 0 0 1 8.56 7.947 5.364 5.364 0 0 0-1.882 4.097c0 1.44.558 2.793 1.573 3.811a5.39 5.39 0 0 0 4.24 1.562zm1.755-3.17c-.365.367-.798.621-1.26.767a3.13 3.13 0 0 1-3.499-1.208 3.159 3.159 0 0 1-.252-3.08 3.102 3.102 0 0 1 5.01-.885 3.127 3.127 0 0 1 0 4.407z"/><path d="M26.073 10.382c.158.385.558.639.975.617.414-.022.776-.301.905-.694a1.01 1.01 0 0 0-.344-1.1 1.013 1.013 0 0 0-1.166-.039 1.013 1.013 0 0 0-.37 1.216z"/></g></svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/analysis/helmet.svg Целия файл

@@ -1 +0,0 @@
<svg width="59" height="44" xmlns="http://www.w3.org/2000/svg"><g fill="#4680A5" fill-rule="nonzero"><path d="M57.025 34.892h-.064v-5.195c0-12.966-8.998-24.204-21.495-26.99A2.994 2.994 0 0 0 34.64.92 2.96 2.96 0 0 0 32.487 0h-5.974a2.96 2.96 0 0 0-2.154.92 2.995 2.995 0 0 0-.825 1.788C11.037 5.493 2.04 16.73 2.04 29.697v5.195h-.064C.885 34.892 0 35.784 0 36.88v1.309c0 .865.544 1.626 1.354 1.893C9.03 42.608 19.027 44 29.5 44c10.473 0 20.47-1.392 28.146-3.918A1.981 1.981 0 0 0 59 38.189V36.88a1.984 1.984 0 0 0-1.975-1.988zM25.735 2.257c.205-.215.482-.333.778-.333h5.974a1.085 1.085 0 0 1 1.083 1.128l-.88 25.656a1.082 1.082 0 0 1-1.082 1.053h-4.216a1.082 1.082 0 0 1-1.082-1.053l-.88-25.656c-.01-.298.098-.58.304-.795zm31.354 35.932c0 .026-.012.056-.037.064-7.49 2.465-17.275 3.823-27.552 3.823-10.277 0-20.062-1.358-27.552-3.823-.025-.009-.036-.038-.036-.064V36.88c0-.035.028-.064.063-.064h36.7c.528 0 .956-.43.956-.962a.959.959 0 0 0-.956-.962H3.95v-5.195c0-9.67 5.38-18.305 13.5-22.687l2.075 14.614a.958.958 0 0 0 1.08.816.961.961 0 0 0 .812-1.088l-2.16-15.227a25.222 25.222 0 0 1 4.317-1.452l.825 24.102a2.992 2.992 0 0 0 2.993 2.91h4.216a2.993 2.993 0 0 0 2.993-2.91l.826-24.102c1.498.358 2.941.846 4.317 1.453l-2.16 15.226a.961.961 0 0 0 .947 1.098.958.958 0 0 0 .945-.826L41.55 7.01c8.121 4.382 13.5 13.017 13.5 22.687v5.195h-6.18a.959.959 0 0 0-.956.962c0 .532.428.962.955.962h8.156c.035 0 .064.03.064.065v1.308z"/><path d="M45.032 35h-2.064c-.535 0-.968.448-.968 1s.433 1 .968 1h2.064c.535 0 .968-.448.968-1s-.433-1-.968-1zM22.987 27.896l-.397-2.065c-.102-.53-.76-.897-1.472-.821-.712.075-1.206.566-1.105 1.094l.397 2.065c.093.483.65.831 1.287.831.061 0 .123-.003.185-.01.712-.075 1.206-.565 1.105-1.094zM37.882 25.01c-.711-.076-1.37.292-1.472.82l-.397 2.066c-.101.529.393 1.019 1.105 1.094.062.007.124.01.185.01.637 0 1.194-.348 1.287-.83l.397-2.066c.101-.528-.393-1.019-1.105-1.094z"/></g></svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/analysis/manual.svg Целия файл

@@ -1 +0,0 @@
<svg width="62" height="76" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path id="a" d="M0 76h62V0H0z"/></defs><g fill="none" fill-rule="evenodd"><path d="M24 37v4.667c0 .597.244 1.194.733 1.65A2.584 2.584 0 0 0 26.5 44c.64 0 1.279-.227 1.767-.684a2.246 2.246 0 0 0 .733-1.65V37" stroke="#236A97" stroke-width="2"/><path d="M28 37v5.714c0 .585.244 1.17.733 1.616.488.447 1.127.67 1.767.67.64 0 1.279-.223 1.767-.67A2.18 2.18 0 0 0 33 42.714V37M33 36.53v14.117c0 .602.244 1.205.733 1.664.488.46 1.127.689 1.767.689.64 0 1.279-.23 1.767-.69A2.273 2.273 0 0 0 38 50.648V33" stroke="#236A97" stroke-width="2"/><path d="M23.8 36.958v3.625c0 .619-.234 1.238-.703 1.709A2.382 2.382 0 0 1 21.4 43a2.382 2.382 0 0 1-1.697-.708A2.414 2.414 0 0 1 19 40.583V23.667L21.4 14h16.8v3.625l4.8 8.458v7.25c0 .619-.234 1.238-.703 1.709a2.382 2.382 0 0 1-1.697.708 2.382 2.382 0 0 1-1.697-.708 2.414 2.414 0 0 1-.703-1.709V28.5M40 0v14H19V0M36 10V8M56 47V29M60 41l-4.5 5-4.5-5M56 26v-2M56 21v-2M6 47V29M10 41l-4.5 5L1 41M6 26v-2M6 21v-2M41.8 54h18c.307 0 .614.114.848.342.234.227.352.526.352.825v18.666c0 .299-.118.598-.352.825A1.214 1.214 0 0 1 59.8 75H2.2c-.307 0-.614-.114-.848-.342A1.147 1.147 0 0 1 1 73.833V55.167c0-.299.118-.598.352-.825.234-.228.54-.342.848-.342h27.6M25 64h2M30 64h2M35 64h2" stroke="#236A97" stroke-width="2"/><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><path stroke="#236A97" stroke-width="2" mask="url(#b)" d="M6 70h50V58H6z"/></g></svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/analysis/rocket.svg Целия файл

@@ -1 +0,0 @@
<svg width="62" height="62" xmlns="http://www.w3.org/2000/svg"><g fill="#4680A5" fill-rule="nonzero"><path d="M32.561 29.44a1.5 1.5 0 1 0-2.122 2.12 1.5 1.5 0 0 0 2.122-2.12zM48.241 13.759a5.998 5.998 0 0 0-8.487 0 6.01 6.01 0 0 0 0 8.487 6.009 6.009 0 0 0 8.487 0 5.998 5.998 0 0 0 0-8.487zm-1.697 6.79a3.605 3.605 0 0 1-5.092 0 3.606 3.606 0 0 1 0-5.093 3.599 3.599 0 0 1 5.092 0 3.599 3.599 0 0 1 0 5.092z"/><path d="M61.648.352a1.198 1.198 0 0 0-.893-.351c-.272.01-6.743.27-14.435 2.988-6.164 2.177-11.301 5.293-15.27 9.262a45.74 45.74 0 0 0-2.583 2.812c-3.924-2.31-7.069-1.586-9.057-.522-4.577 2.45-7.41 9.1-7.41 13.858a1.202 1.202 0 0 0 2.052.85c2.414-2.414 5.392-2.263 6.364-2.135l.421.421a42.277 42.277 0 0 0-1.985 5.838c-.177.69-.117 1.42.146 2.088a11.383 11.383 0 0 0-3.246 2.288c-3.094 3.094-3.723 10.635-3.748 10.954a1.202 1.202 0 0 0 1.293 1.293c.32-.025 7.86-.653 10.954-3.747a11.383 11.383 0 0 0 2.288-3.245 3.394 3.394 0 0 0 2.09.144 42.282 42.282 0 0 0 5.836-1.985l.421.421c.128.973.279 3.95-2.135 6.364a1.202 1.202 0 0 0 .85 2.052c4.757 0 11.409-2.833 13.858-7.41 1.064-1.988 1.788-5.133-.522-9.057a45.756 45.756 0 0 0 2.813-2.583c3.969-3.969 7.084-9.107 9.26-15.27C61.73 7.988 61.99 1.517 62 1.245a1.202 1.202 0 0 0-.352-.893zm-46.96 25.462c.746-3.614 2.915-7.579 5.857-9.154 1.967-1.052 4.116-.949 6.401.302a48.6 48.6 0 0 0-5.05 8.232c-.018-.01-.234-.283-.636-.374-.166-.037-3.346-.72-6.573.994zm7.863 18.735c-1.653 1.653-5.53 2.524-7.98 2.88.356-2.45 1.228-6.327 2.88-7.98.926-.925 2-1.627 3.078-2.022l4.045 4.045c-.396 1.078-1.097 2.151-2.023 3.077zm5.48-3.73c-.348.09-.75-.041-1.05-.34a22337.974 22337.974 0 0 0-5.459-5.459c-.3-.3-.43-.703-.341-1.05a39.03 39.03 0 0 1 1.5-4.59l9.94 9.939a39.003 39.003 0 0 1-4.59 1.5zm17.309.636c-1.575 2.942-5.54 5.111-9.153 5.858 1.152-2.168 1.406-4.928.985-6.602-.098-.388-.351-.584-.366-.607a48.618 48.618 0 0 0 8.232-5.05c1.251 2.286 1.354 4.435.302 6.401zm2.71-12.205a43.628 43.628 0 0 1-3.467 3.11 46.18 46.18 0 0 1-9.581 5.94L23.7 27a46.172 46.172 0 0 1 5.94-9.583 43.619 43.619 0 0 1 3.11-3.467c3.56-3.56 8.156-6.395 13.662-8.435l10.072 10.072c-2.04 5.506-4.874 10.102-8.435 13.663zm9.3-16.198L48.948 4.65c4.578-1.422 8.56-1.954 10.547-2.146-.191 1.988-.724 5.97-2.145 10.547z"/><path d="M28.636 50.364a1.243 1.243 0 0 0-1.758 0l-3.514 3.515a1.242 1.242 0 1 0 1.758 1.757l3.514-3.515a1.242 1.242 0 0 0 0-1.757zM11.636 33.364a1.242 1.242 0 0 0-1.757 0l-3.515 3.514a1.243 1.243 0 0 0 1.757 1.758l3.515-3.514a1.243 1.243 0 0 0 0-1.758zM20.666 52.334a1.14 1.14 0 0 0-1.612 0l-7.72 7.72a1.14 1.14 0 0 0 1.612 1.612l7.72-7.72a1.14 1.14 0 0 0 0-1.612zM10.666 52.334a1.14 1.14 0 0 0-1.612 0l-7.72 7.72a1.14 1.14 0 0 0 1.612 1.612l7.72-7.72a1.14 1.14 0 0 0 0-1.612zM9.666 41.334a1.14 1.14 0 0 0-1.612 0l-7.72 7.72a1.14 1.14 0 1 0 1.612 1.612l7.72-7.72a1.14 1.14 0 0 0 0-1.612zM37.657 24.343a1.172 1.172 0 0 0-1.657 0L34.343 26A1.172 1.172 0 0 0 36 27.657L37.657 26c.457-.457.457-1.2 0-1.657z"/></g></svg>

+ 0
- 17
server/sonar-web/public/images/sonarcloud/as-a-service.svg Целия файл

@@ -1,17 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-1045.352 -4278.348 41.911 37.021">
<defs>
<style>
.cls-1 {
fill: #434447;
}

.cls-2 {
fill: #f3702a;
}
</style>
</defs>
<g id="cloud-computing" transform="translate(-1045.352 -4278.348)">
<path id="Tracé_10173" data-name="Tracé 10173" class="cls-1" d="M35.607,14.812A11.96,11.96,0,0,0,23.808,3.5a12.313,12.313,0,0,0-9.742,4.9c-.052-.027-.108-.046-.161-.072-.137-.066-.275-.129-.417-.186-.082-.033-.166-.062-.25-.092-.138-.048-.277-.091-.419-.129-.084-.022-.167-.045-.251-.065-.154-.035-.31-.061-.468-.085-.073-.011-.146-.025-.22-.034a6.155,6.155,0,0,0-.7-.043A6.294,6.294,0,0,0,4.89,13.978c0,.09.006.178.011.266A9.659,9.659,0,0,0,0,22.468a8.983,8.983,0,0,0,8.973,8.973h3.6a.7.7,0,1,0,0-1.4h-3.6A7.584,7.584,0,0,1,1.4,22.468,8.3,8.3,0,0,1,5.89,15.306l.4-.189v-.44c0-.086.006-.174.01-.262l.006-.121L6.3,14.152c0-.058-.008-.116-.008-.175a4.857,4.857,0,0,1,5.53-4.843c.054.007.109.016.163.025a4.909,4.909,0,0,1,.551.123l.074.019a4.874,4.874,0,0,1,.583.224c.049.022.1.046.145.07a4.827,4.827,0,0,1,.492.278,4.889,4.889,0,0,1,2.239,4.1.7.7,0,1,0,1.4,0,6.272,6.272,0,0,0-2.235-4.8A11.063,11.063,0,0,1,23.808,4.9,10.545,10.545,0,0,1,34.18,14.6a13.3,13.3,0,0,0-2.852.087.7.7,0,0,0,.1,1.389.686.686,0,0,0,.106-.008,12.879,12.879,0,0,1,3.272,0,7.159,7.159,0,0,1,5.7,6.975,7.013,7.013,0,0,1-7,7H30.735a.7.7,0,1,0,0,1.4H33.51a8.412,8.412,0,0,0,8.4-8.4A8.6,8.6,0,0,0,35.607,14.812Z" transform="translate(0 -3.5)"/>
<path id="Tracé_10174" data-name="Tracé 10174" class="cls-2" d="M33.381,31.281a.7.7,0,1,0,.988-.988l-5.587-5.587a.692.692,0,0,0-.228-.152.7.7,0,0,0-.761.152L22.2,30.293a.7.7,0,1,0,.988.988l4.4-4.4V44.468l-4.4-4.4a.7.7,0,0,0-.988.988l5.587,5.587a.692.692,0,0,0,.228.152.7.7,0,0,0,.761-.152l5.587-5.587a.7.7,0,0,0-.988-.988l-4.4,4.4V26.885Z" transform="translate(-6.632 -9.831)"/>
</g>
</svg>

+ 0
- 3
server/sonar-web/public/images/sonarcloud/azure.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22.009 22">
<path fill="#0078d7" d="M2.916 15.015v-7.25l19.093-3.758v13.446L16.62 21.92l-8.226-2.757V22l-5.478-6.985 13.216 1.728V5.052L9.812 0l.044 2.3-7.516 3L0 8.1v6.3z"/>
</svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/bitbucket-big.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-361.924 -3545.014 58.441 52.551"><defs><linearGradient id="a" x1="1.086" y1=".138" x2=".469" y2=".788" gradientUnits="objectBoundingBox"><stop offset=".18" stop-color="#0052cc"/><stop offset="1" stop-color="#2684ff"/></linearGradient></defs><g data-name="Groupe 6140"><path data-name="Tracé 10420" d="M-360.027-3545.013a1.872 1.872 0 0 0-1.871 2.172l7.947 48.253a2.547 2.547 0 0 0 2.49 2.125h38.133a1.872 1.872 0 0 0 1.872-1.573l7.949-48.8a1.872 1.872 0 0 0-1.872-2.172zm33.47 34.875h-12.171l-3.3-17.217h18.42z" fill="#2684ff"/><path data-name="Tracé 10421" d="M56.464 25.12H38.891l-2.949 17.217H23.771L9.4 59.4a2.537 2.537 0 0 0 1.638.618H49.18a1.872 1.872 0 0 0 1.872-1.573z" transform="translate(-362.499 -3552.476)" fill="url(#a)"/></g></svg>

+ 0
- 12
server/sonar-web/public/images/sonarcloud/bitbucket-unbound.svg Целия файл

@@ -1,12 +0,0 @@
<svg width="59" height="54" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient x1="97.494%" y1="25.5%" x2="46.9%" y2="78.8%" id="a">
<stop stop-color="#B5B5B5" offset="0%"/>
<stop stop-color="#DDD" offset="100%"/>
</linearGradient>
</defs>
<g fill-rule="nonzero" fill="none">
<path d="M1.973.987A1.872 1.872 0 0 0 .102 3.159l7.947 48.253a2.547 2.547 0 0 0 2.49 2.125h38.133a1.872 1.872 0 0 0 1.872-1.573l7.949-48.8A1.872 1.872 0 0 0 56.621.992L1.973.987zm33.47 34.875H23.272l-3.3-17.217h18.42l-2.949 17.217z" fill="#DDD"/>
<path d="M55.965 18.644H38.392l-2.949 17.217H23.272L8.901 52.924a2.537 2.537 0 0 0 1.638.618h38.142a1.872 1.872 0 0 0 1.872-1.573l5.412-33.325z" fill="url(#a)"/>
</g>
</svg>

+ 0
- 10
server/sonar-web/public/images/sonarcloud/bitbucket-white.svg Целия файл

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" focusable="false" role="presentation">
<defs>
<linearGradient id="a-acb7415e-40c7-472a-ade9-3b99b6a8fba4" x1="97.526%" x2="46.927%" y1="25.488%" y2="78.776%">
<stop offset="0%" stop-color="#FFF" stop-opacity=".4"/>
<stop offset="100%" stop-color="#FFF"/>
</linearGradient>
</defs>
<path fill="url(#a-acb7415e-40c7-472a-ade9-3b99b6a8fba4)" d="M20.063 9.297h-5.279l-.886 5.16h-3.656l-4.317 5.116a.763.763 0 0 0 .492.186h11.458a.562.562 0 0 0 .563-.472l1.625-9.99z" transform="matrix(1.33 0 0 1.33 -4 -3.8)"/>
<path fill="#FFF" d="M1.11252 1.52a.74879.74879 0 0 0-.74879.86583L3.5411 21.6296a1.01479 1.01479 0 0 0 .99484.84721l5.89589-7.049h-.82726l-1.29808-6.8628h14.37863l1.0108-6.1712a.7448.7448 0 0 0-.73815-.87381H1.11252z"/>
</svg>

+ 0
- 10
server/sonar-web/public/images/sonarcloud/bitbucket.svg Целия файл

@@ -1,10 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-361.924 -3545.014 58.441 52.551">
<defs>
<linearGradient id="a" x1="1.086" x2=".469" y1=".138" y2=".788" gradientUnits="objectBoundingBox">
<stop offset=".18" stop-color="#0052cc"/>
<stop offset="1" stop-color="#2684ff"/>
</linearGradient>
</defs>
<path fill="#2684ff" d="M-360.027-3545.013a1.872 1.872 0 0 0-1.871 2.172l7.947 48.253a2.547 2.547 0 0 0 2.49 2.125h38.133a1.872 1.872 0 0 0 1.872-1.573l7.949-48.8a1.872 1.872 0 0 0-1.872-2.172zm33.47 34.875h-12.171l-3.3-17.217h18.42z"/>
<path fill="url(#a)" d="M56.464 25.12H38.891l-2.949 17.217H23.771L9.4 59.4a2.537 2.537 0 0 0 1.638.618H49.18a1.872 1.872 0 0 0 1.872-1.573z" transform="translate(-362.499 -3552.476)"/>
</svg>

Двоични данни
server/sonar-web/public/images/sonarcloud/branch-01.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/branch-01@2x.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/branch-02.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/branch-02@2x.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/branch-03.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/branch-03@2x.png Целия файл


+ 0
- 45
server/sonar-web/public/images/sonarcloud/branch-analysis.svg Целия файл

@@ -1,45 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-661.517 -4278.348 19.786 37.022">
<defs>
<style>
.cls-1, .cls-5 {
fill: none;
}

.cls-1, .cls-2 {
stroke: #f3702a;
}

.cls-1, .cls-2, .cls-3 {
stroke-width: 1.75px;
}

.cls-2, .cls-3 {
fill: #fff;
}

.cls-3 {
stroke: #434447;
}

.cls-4 {
stroke: none;
}
</style>
</defs>
<g id="Groupe_6132" data-name="Groupe 6132" transform="translate(-1234 -5514)">
<path id="Tracé_10264" data-name="Tracé 10264" class="cls-1" d="M-1182.043-7730.764v6.537s.38,10.115-11.614,9.954" transform="translate(1770.587 8970.999)"/>
<g id="Ellipse_69" data-name="Ellipse 69" class="cls-2" transform="translate(584.619 1235.652)">
<ellipse class="cls-4" cx="3.825" cy="3.967" rx="3.825" ry="3.967"/>
<ellipse class="cls-5" cx="3.825" cy="3.967" rx="2.95" ry="3.092"/>
</g>
<path id="Tracé_10265" data-name="Tracé 10265" class="cls-3" d="M-1193.77-7704.575v-26.188" transform="translate(1770.077 8970.999)"/>
<g id="Ellipse_70" data-name="Ellipse 70" class="cls-3" transform="translate(572.483 1235.652)">
<ellipse class="cls-4" cx="3.825" cy="3.967" rx="3.825" ry="3.967"/>
<ellipse class="cls-5" cx="3.825" cy="3.967" rx="2.95" ry="3.092"/>
</g>
<g id="Ellipse_71" data-name="Ellipse 71" class="cls-3" transform="translate(572.483 1264.741)">
<ellipse class="cls-4" cx="3.825" cy="3.967" rx="3.825" ry="3.967"/>
<ellipse class="cls-5" cx="3.825" cy="3.967" rx="2.95" ry="3.092"/>
</g>
</g>
</svg>

+ 0
- 3
server/sonar-web/public/images/sonarcloud/check.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17.438 12.801">
<path fill="#3dc92c" d="M17.184.255a.877.877 0 0 0-1.237 0L5.507 10.689 1.491 6.674A.873.873 0 0 0 .254 7.906l4.64 4.64a.877.877 0 0 0 1.237 0L17.184 1.489a.872.872 0 0 0 0-1.234z" data-name="Tracé 9550"/>
</svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/chevron-left.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.9 34.488"><path d="M17.15 0a1.606 1.606 0 0 1 1.1.5 1.693 1.693 0 0 1 0 2.3L3.95 17.1l14.5 14.6a1.693 1.693 0 0 1 0 2.3 1.6 1.6 0 0 1-2.3 0L.45 18.3a1.693 1.693 0 0 1 0-2.3L16.05.5a1.606 1.606 0 0 1 1.1-.5z" fill="#cfd3d7"/></svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/chevron-right.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18.9 34.488"><path d="M1.75 34.488a1.606 1.606 0 0 1-1.1-.5 1.693 1.693 0 0 1 0-2.3l14.3-14.3-14.5-14.6a1.693 1.693 0 0 1 0-2.3 1.6 1.6 0 0 1 2.3 0l15.7 15.7a1.693 1.693 0 0 1 0 2.3l-15.6 15.5a1.606 1.606 0 0 1-1.1.5z" fill="#cfd3d7"/></svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/collab.svg
Файловите разлики са ограничени, защото са твърде много
Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/gears.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/gears@2x.png Целия файл


+ 0
- 1
server/sonar-web/public/images/sonarcloud/github-big.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-738.601 -3545.014 54.017 52.551"><path data-name="Tracé 10732" d="M-711.675-3545.014a26.975 26.975 0 0 0-8.59 52.53c1.322.165 1.817-.661 1.817-1.322v-4.625c-7.433 1.652-9.085-3.634-9.085-3.634-1.156-3.139-2.973-3.965-2.973-3.965-2.478-1.652.165-1.652.165-1.652 2.643.165 4.13 2.808 4.13 2.808 2.478 4.13 6.277 2.973 7.764 2.313a5.752 5.752 0 0 1 1.646-3.634c-5.947-.661-12.224-2.973-12.224-13.38a10.24 10.24 0 0 1 2.808-7.268 9.781 9.781 0 0 1 .33-6.938s2.313-.661 7.433 2.808a23.083 23.083 0 0 1 6.773-.826 30.4 30.4 0 0 1 6.773.826c5.121-3.469 7.433-2.808 7.433-2.808a10.343 10.343 0 0 1 .33 7.1 10.684 10.684 0 0 1 2.815 7.267c0 10.407-6.277 12.554-12.224 13.215.991.826 1.817 2.478 1.817 4.956v7.433c0 .661.5 1.487 1.817 1.322a26.976 26.976 0 0 0-8.755-52.526z" fill="#191717" fill-rule="evenodd"/></svg>

+ 0
- 7
server/sonar-web/public/images/sonarcloud/github-unbound.svg Целия файл

@@ -1,7 +0,0 @@
<svg width="14" height="14" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path d="M-1-1h16v16H-1z"/>
<path d="M13.061 3.574A7.06 7.06 0 0 0 10.514.962 6.719 6.719 0 0 0 7 0a6.72 6.72 0 0 0-3.514.962A7.059 7.059 0 0 0 .94 3.574 7.155 7.155 0 0 0 0 7.175c0 1.564.445 2.97 1.335 4.219.89 1.248 2.04 2.113 3.45 2.592.164.031.286.01.365-.065a.37.37 0 0 0 .118-.28l-.005-.505a85.532 85.532 0 0 1-.004-.831l-.21.037a2.61 2.61 0 0 1-.506.033 3.763 3.763 0 0 1-.633-.066 1.399 1.399 0 0 1-.61-.28 1.185 1.185 0 0 1-.402-.574l-.09-.215a2.346 2.346 0 0 0-.288-.477c-.13-.174-.263-.292-.396-.355l-.064-.047a.676.676 0 0 1-.119-.112.514.514 0 0 1-.082-.13c-.018-.044-.003-.08.046-.108.049-.028.137-.042.264-.042l.182.028c.122.025.272.1.452.224.179.125.326.287.442.486.14.255.308.45.505.584.198.134.397.2.597.2.2 0 .374-.015.52-.046.146-.031.282-.078.41-.14.055-.418.204-.738.447-.962a6.103 6.103 0 0 1-.935-.169 3.67 3.67 0 0 1-.856-.364 2.47 2.47 0 0 1-.734-.626c-.194-.25-.354-.576-.478-.981A4.774 4.774 0 0 1 2.534 6.8c0-.753.24-1.395.72-1.924-.225-.567-.204-1.202.064-1.906.176-.056.437-.014.783.126.347.14.6.26.761.36.162.1.29.183.388.252A6.324 6.324 0 0 1 7 3.466c.601 0 1.185.081 1.75.243l.346-.224c.237-.15.517-.287.839-.411.322-.125.568-.16.738-.103.274.704.298 1.339.073 1.906.48.53.72 1.17.72 1.924 0 .53-.062.998-.187 1.407-.124.408-.285.734-.483.98a2.563 2.563 0 0 1-.738.622c-.295.168-.58.29-.857.364a6.097 6.097 0 0 1-.934.169c.316.28.474.722.474 1.326v1.971c0 .112.038.206.114.28.076.075.196.097.36.066 1.41-.48 2.56-1.344 3.45-2.593C13.555 10.145 14 8.74 14 7.175a7.16 7.16 0 0 0-.939-3.601z" fill="#DDD" fill-rule="nonzero"/>
</g>
</svg>


+ 0
- 3
server/sonar-web/public/images/sonarcloud/github-white.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" x="0" y="0" viewBox="0 0 438.5 438.5" xml:space="preserve">
<path fill="#fff" d="M409.1 114.6c-19.6-33.6-46.2-60.2-79.8-79.8C295.7 15.2 259.1 5.4 219.3 5.4c-39.8 0-76.5 9.8-110.1 29.4 -33.6 19.6-60.2 46.2-79.8 79.8C9.8 148.2 0 184.9 0 224.6c0 47.8 13.9 90.7 41.8 128.9 27.9 38.2 63.9 64.6 108.1 79.2 5.1 1 8.9 0.3 11.4-2 2.5-2.3 3.7-5.1 3.7-8.6 0-0.6 0-5.7-0.1-15.4 -0.1-9.7-0.1-18.2-0.1-25.4l-6.6 1.1c-4.2 0.8-9.5 1.1-15.8 1 -6.4-0.1-13-0.8-19.8-2 -6.9-1.2-13.2-4.1-19.1-8.6 -5.9-4.5-10.1-10.3-12.6-17.6l-2.9-6.6c-1.9-4.4-4.9-9.2-9-14.6 -4.1-5.3-8.2-8.9-12.4-10.8l-2-1.4c-1.3-1-2.6-2.1-3.7-3.4 -1.1-1.3-2-2.7-2.6-4 -0.6-1.3-0.1-2.4 1.4-3.3 1.5-0.9 4.3-1.3 8.3-1.3l5.7 0.9c3.8 0.8 8.5 3 14.1 6.9 5.6 3.8 10.2 8.8 13.8 14.8 4.4 7.8 9.7 13.8 15.8 17.8 6.2 4.1 12.4 6.1 18.7 6.1 6.3 0 11.7-0.5 16.3-1.4 4.6-1 8.8-2.4 12.8-4.3 1.7-12.8 6.4-22.6 14-29.4 -10.8-1.1-20.6-2.9-29.3-5.1 -8.7-2.3-17.6-6-26.8-11.1 -9.2-5.1-16.9-11.5-23-19.1 -6.1-7.6-11.1-17.6-15-30 -3.9-12.4-5.9-26.6-5.9-42.8 0-23 7.5-42.6 22.6-58.8 -7-17.3-6.4-36.7 2-58.2 5.5-1.7 13.7-0.4 24.6 3.9 10.9 4.3 18.8 8 23.8 11 5 3 9.1 5.6 12.1 7.7 17.7-4.9 36-7.4 54.8-7.4s37.1 2.5 54.8 7.4l10.8-6.8c7.4-4.6 16.2-8.8 26.3-12.6 10.1-3.8 17.8-4.9 23.1-3.1 8.6 21.5 9.3 40.9 2.3 58.2 15 16.2 22.6 35.8 22.6 58.8 0 16.2-2 30.5-5.9 43 -3.9 12.5-8.9 22.5-15.1 30 -6.2 7.5-13.9 13.9-23.1 19 -9.2 5.1-18.2 8.9-26.8 11.1 -8.7 2.3-18.4 4-29.3 5.1 9.9 8.6 14.8 22.1 14.8 40.5v60.2c0 3.4 1.2 6.3 3.6 8.6 2.4 2.3 6.1 3 11.3 2 44.2-14.7 80.2-41.1 108.1-79.2 27.9-38.2 41.8-81.1 41.8-128.9C438.5 184.9 428.7 148.2 409.1 114.6z"/>
</svg>

+ 0
- 3
server/sonar-web/public/images/sonarcloud/github.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-738.601 -3545.014 54.017 52.551">
<path fill="#191717" fill-rule="evenodd" d="M-711.675-3545.014a26.975 26.975 0 0 0-8.59 52.53c1.322.165 1.817-.661 1.817-1.322v-4.625c-7.433 1.652-9.085-3.634-9.085-3.634-1.156-3.139-2.973-3.965-2.973-3.965-2.478-1.652.165-1.652.165-1.652 2.643.165 4.13 2.808 4.13 2.808 2.478 4.13 6.277 2.973 7.764 2.313a5.752 5.752 0 0 1 1.646-3.634c-5.947-.661-12.224-2.973-12.224-13.38a10.24 10.24 0 0 1 2.808-7.268 9.781 9.781 0 0 1 .33-6.938s2.313-.661 7.433 2.808a23.083 23.083 0 0 1 6.773-.826 30.4 30.4 0 0 1 6.773.826c5.121-3.469 7.433-2.808 7.433-2.808a10.343 10.343 0 0 1 .33 7.1 10.684 10.684 0 0 1 2.815 7.267c0 10.407-6.277 12.554-12.224 13.215.991.826 1.817 2.478 1.817 4.956v7.433c0 .661.5 1.487 1.817 1.322a26.976 26.976 0 0 0-8.755-52.526z"/>
</svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/home-background-grey-bottom.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3078.8 137.3"><path d="M3.3-.6s688 136.7 945.4 125.4c257.4-11.3 382-99.6 819.5-37s561.1 45.4 859.1 10.7S3078 21.1 3078 21.1l.5-21.7H3.3z" fill="#f9f9fb"/></svg>

Двоични данни
server/sonar-web/public/images/sonarcloud/home-branch.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/home-branch@2x.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/home-easy-to-use.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/home-easy-to-use@2x.png Целия файл


+ 0
- 3
server/sonar-web/public/images/sonarcloud/home-grey-background.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3407.2 300">
<path fill="#f9f9fb" d="M0 299s117.1 9.5 333.1-89.7C574.8 98.2 888.2-28.3 1056 9.5c284 64 294 220 793.6 140.2S2344 21.5 2672 163.5s735.2 136.1 735.2 136.1v29H0V299z"/>
</svg>

Двоични данни
server/sonar-web/public/images/sonarcloud/home-header-people.png Целия файл


+ 0
- 7
server/sonar-web/public/images/sonarcloud/home-header.svg Целия файл

@@ -1,7 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1817.2 417.1">
<linearGradient id="a" x1="1339.6035" x2="627.6036" y1="-266.2397" y2="245.7604" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#fd6a00"/>
<stop offset="1" stop-color="#fdc300"/>
</linearGradient>
<path fill="url(#a)" d="M944.1 264.3c-49.8-120.9-76.4-154.4-167.2-204.9C751 45 695.1 7.2 535.4 5H0V0h526.4v-.1l1289.5.1c.5 1.8.9 3.4 1.3 5-120.9 0-35 198.8-295.3 259.3-223 36.8-169.7 154.2-358.4 152.4-6.9.2-13.4.3-19.8.3-128 0-152.1-37.5-199.6-152.7z"/>
</svg>

Двоични данни
server/sonar-web/public/images/sonarcloud/home-open-transparent.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/home-open-transparent@2x.png Целия файл


+ 0
- 108
server/sonar-web/public/images/sonarcloud/ide.svg Целия файл

@@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 170.5 26.3" style="enable-background:new 0 0 170.5 26.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:#2C2255;}
.st1{fill:#F7941E;}
.st2{fill:url(#SVGID_1_);}
.st3{fill:url(#SVGID_2_);}
.st4{fill:url(#SVGID_3_);}
.st5{fill:#FFFFFF;}
.st6{fill:url(#SVGID_4_);}
.st7{fill:url(#SVGID_5_);}
.st8{fill:url(#SVGID_6_);}
.st9{fill:url(#SVGID_7_);}
.st10{fill:#865FC5;}
.st11{fill:#007ACC;}
</style>
<path class="st0" d="M7.2,16.5h-4c0.6,1.9,1.6,3.5,3,4.9c2.2,2.2,5.2,3.5,8.3,3.4c0.6,0,1.2,0,1.9-0.1c2.4-0.4,4.7-1.5,6.4-3.3
c1.4-1.4,2.4-3,3-4.9C25.7,16.5,7.2,16.5,7.2,16.5z M4.9,11.1H2.8c-0.1,0.5-0.1,0.9-0.1,1.4h23.4c0-0.5-0.1-0.9-0.1-1.4 M2.7,13.8
c0,0.5,0.1,0.9,0.1,1.4H26c0.1-0.5,0.1-0.9,0.2-1.4 M25.7,9.8c-0.6-1.9-1.6-3.6-3-4.9c-1.7-1.8-4-2.9-6.4-3.3
c-0.6-0.1-1.2-0.1-1.9-0.1c-3.1-0.1-6.1,1.2-8.3,3.4c-1.4,1.4-2.4,3.1-3,4.9"/>
<path class="st1" d="M2,13.2C2.1,7,6.6,1.8,12.7,0.9h-0.5C5.5,0.9-0.1,6.3-0.1,13.1S5.3,25.4,12,25.4c0.1,0,0.1,0,0.2,0h0.5
C6.6,24.5,2,19.3,2,13.2z"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-178.5318" y1="636.8593" x2="-178.5318" y2="649.3203" gradientTransform="matrix(15.959 0 0 -1.416 2863.6111 217.4881)">
<stop offset="0.3" style="stop-color:#473788"/>
<stop offset="0.87" style="stop-color:#2C2255"/>
</linearGradient>
<path class="st2" d="M22.4,12.5c0-0.5-0.1-1-0.2-1.4H6.7c-0.1,0.5-0.2,0.9-0.2,1.4H22.4z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-178.5318" y1="638.7803" x2="-178.5318" y2="651.2402" gradientTransform="matrix(15.959 0 0 -1.416 2863.6111 220.2051)">
<stop offset="0.3" style="stop-color:#473788"/>
<stop offset="0.87" style="stop-color:#2C2255"/>
</linearGradient>
<path class="st3" d="M22.4,13.8h-16c0,0.5,0.1,1,0.2,1.4h15.5C22.3,14.8,22.4,14.3,22.4,13.8z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-177.3258" y1="496.7565" x2="-177.3258" y2="500.5446" gradientTransform="matrix(14.498 0 0 -4.658 2585.2869 1629.5679)">
<stop offset="0.3" style="stop-color:#473788"/>
<stop offset="0.86" style="stop-color:#2C2255"/>
</linearGradient>
<path class="st4" d="M14.4,21.2c3.1,0,5.9-1.8,7.2-4.7H7.2C8.5,19.3,11.3,21.2,14.4,21.2z"/>
<path class="st5" d="M5.3,13.8h20.9v-1.3H2.7v1.3H5.3z M7.1,9.8h-4c-0.1,0.4-0.2,0.9-0.3,1.3h23.1c-0.1-0.4-0.2-0.9-0.3-1.3
M24.4,15.2H2.8c0.1,0.4,0.2,0.9,0.3,1.3h22.5c0.1-0.4,0.2-0.9,0.3-1.3H24.4z"/>
<g>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-175.2318" y1="395.6365" x2="-174.2318" y2="395.6365" gradientTransform="matrix(12.113 0 0 -10.807 2169.4619 4290.5869)">
<stop offset="0.26" style="stop-color:#F97A12"/>
<stop offset="0.46" style="stop-color:#B07B58"/>
<stop offset="0.72" style="stop-color:#577BAE"/>
<stop offset="0.91" style="stop-color:#1E7CE5"/>
<stop offset="1" style="stop-color:#087CFA"/>
</linearGradient>
<path class="st6" d="M53.2,20.3l-6.3-5L50,9.5l9,3.5L53.2,20.3z"/>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-179.4619" y1="417.3121" x2="-178.2529" y2="417.7431" gradientTransform="matrix(16.546 0 0 -25.676 3025.4089 10732.9629)">
<stop offset="0" style="stop-color:#F97A12"/>
<stop offset="7.000000e-02" style="stop-color:#CB7A3E"/>
<stop offset="0.15" style="stop-color:#9E7B6A"/>
<stop offset="0.24" style="stop-color:#757B91"/>
<stop offset="0.33" style="stop-color:#537BB1"/>
<stop offset="0.43" style="stop-color:#387CCC"/>
<stop offset="0.54" style="stop-color:#237CE0"/>
<stop offset="0.66" style="stop-color:#147CEF"/>
<stop offset="0.79" style="stop-color:#0B7CF7"/>
<stop offset="1" style="stop-color:#087CFA"/>
</linearGradient>
<path class="st7" d="M72.7,7l-0.5,15.1l-10,4l-6-3.9L65,13l-3.9-8.5l3.5-4.2L72.7,7z"/>
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-174.1182" y1="407.7607" x2="-174.5982" y2="406.7177" gradientTransform="matrix(11.59 0 0 -15.95 2083.77 6512.9512)">
<stop offset="0" style="stop-color:#FE315D"/>
<stop offset="8.000000e-02" style="stop-color:#CB417E"/>
<stop offset="0.16" style="stop-color:#9E4E9B"/>
<stop offset="0.25" style="stop-color:#755BB4"/>
<stop offset="0.34" style="stop-color:#5365CA"/>
<stop offset="0.44" style="stop-color:#386DDB"/>
<stop offset="0.54" style="stop-color:#2374E9"/>
<stop offset="0.66" style="stop-color:#1478F3"/>
<stop offset="0.79" style="stop-color:#0B7BF8"/>
<stop offset="1" style="stop-color:#087CFA"/>
</linearGradient>
<path class="st8" d="M72.7,7l-7.9,9.4L61.1,4.6l3.5-4.2L72.7,7z"/>
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-181.3264" y1="417.0558" x2="-180.4914" y2="418.1408" gradientTransform="matrix(20.013 0 0 -25.452 3678.0662 10635.3623)">
<stop offset="0" style="stop-color:#FE315D"/>
<stop offset="4.000000e-02" style="stop-color:#F63462"/>
<stop offset="0.1" style="stop-color:#DF3A71"/>
<stop offset="0.17" style="stop-color:#C24383"/>
<stop offset="0.29" style="stop-color:#AD4A91"/>
<stop offset="0.55" style="stop-color:#755BB4"/>
<stop offset="0.92" style="stop-color:#1D76ED"/>
<stop offset="1" style="stop-color:#087CFA"/>
</linearGradient>
<path class="st9" d="M59.1,21.7l-10.5,3.8l1.7-5.9l2.2-7.2l-6-2L50.3,0l8.2,1l8,9.2L59.1,21.7z"/>
<path d="M51.7,5h16.1v16.1H51.7L51.7,5z"/>
<path class="st5" d="M53.2,18.1h6v1h-6V18.1z M57.5,8.3V7.1h-3.4v1.2h1v4.2h-1v1.2h3.4v-1.2h-0.9V8.3L57.5,8.3z M60.7,13.9
c-0.5,0-0.9-0.1-1.3-0.3c-0.3-0.2-0.6-0.4-0.9-0.7l0.9-1c0.2,0.2,0.3,0.4,0.6,0.5c0.2,0.1,0.4,0.2,0.6,0.2c0.2,0,0.5-0.1,0.7-0.3
c0.2-0.3,0.3-0.6,0.2-0.9V7.1h1.5v4.4c0,0.4,0,0.7-0.1,1c-0.1,0.3-0.3,0.5-0.5,0.7c-0.2,0.2-0.5,0.4-0.7,0.4
C61.4,13.8,61.1,13.9,60.7,13.9"/>
</g>
<g>
<path class="st10" d="M111.9,0v22.5l-19.7-2.9l19.7,6.6l6.5-2.7V2.8L111.9,0z"/>
<path class="st10" d="M99,12.7l6.1,6l3.6-1.5V5.4l-3.6-1.5l-6.1,6l-3.6-2.8l-1.5,0.6v7.3l1.5,0.5L99,12.7z M105.1,8.1v6.2l-4.1-3.1
L105.1,8.1z M95.4,9l2.2,2.2l-2.2,2.1V9z"/>
</g>
<g>
<path class="st11" d="M158.5,0v22.5l-19.7-2.9l19.7,6.6l6.5-2.7V2.8L158.5,0z"/>
<path class="st11" d="M151.7,3.9l-6.1,6L142,7.1l-1.5,0.5l3.7,3.6l-3.7,3.6l1.5,0.5l3.6-2.7l6.1,6l3.6-1.5V5.4L151.7,3.9z
M151.7,8.1v6.2l-4.1-3.1L151.7,8.1z"/>
</g>
</svg>

+ 0
- 12
server/sonar-web/public/images/sonarcloud/locs.svg Целия файл

@@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36.129 30.884">
<defs>
<style>
.cls-1{fill:#fd6a00}
</style>
</defs>
<rect class="cls-1" width="16.619" height="3.459" rx="1.73"/>
<rect class="cls-1" width="23.604" height="3.459" rx="1.73" transform="translate(6.262 6.856)"/>
<rect class="cls-1" width="19.51" height="3.459" rx="1.73" transform="translate(16.619 13.712)"/>
<rect class="cls-1" width="23.604" height="3.459" rx="1.73" transform="translate(6.262 20.568)"/>
<rect class="cls-1" width="16.619" height="3.459" rx="1.73" transform="translate(0 27.425)"/>
</svg>

+ 0
- 3
server/sonar-web/public/images/sonarcloud/open-source.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 33.164 32.812">
<path fill="#fd6a00" stroke="#fd6a00" stroke-width="1.5" d="M11.236 32.046a.554.554 0 0 1-.188-.033A16.194 16.194 0 0 1 1.017 14.041 15.908 15.908 0 0 1 16.544.75a15.9 15.9 0 0 1 15.588 13.211 16.2 16.2 0 0 1-9.947 18.025.539.539 0 0 1-.695-.317l-3.739-9.668a.568.568 0 0 1 .011-.432.537.537 0 0 1 .314-.294 4.645 4.645 0 0 0 2.999-5.114 4.525 4.525 0 0 0-8.943-.128 4.651 4.651 0 0 0 2.854 5.2.539.539 0 0 1 .3.287.556.556 0 0 1 .012.422l-3.556 9.739a.543.543 0 0 1-.282.311.457.457 0 0 1-.222.056zM16.584 1.88A14.8 14.8 0 0 0 2.156 13.955a15.094 15.094 0 0 0 8.76 16.815l3.181-8.719a5.782 5.782 0 0 1-2.993-6.484 5.6 5.6 0 0 1 10.971.114 5.777 5.777 0 0 1-3.12 6.421l3.34 8.647a15.094 15.094 0 0 0 8.713-16.821A14.8 14.8 0 0 0 16.584 1.88z"/>
</svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/pricing-header.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4546 562.936"><defs><linearGradient id="a" x1=".5" y1=".119" x2=".5" y2=".948" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#fd6a00"/><stop offset="1" stop-color="#fdc300"/></linearGradient></defs><path data-name="Tracé 11995" d="M10512.121 9278.787c-593.871 86.795-566.679 69.7-996.97-151.515s-651.5-6.061-906.06-45.455S8247 8833 8247 8833h4546s-308.176 736.685-1056.637 524.575-630.371-165.583-1224.242-78.788z" transform="translate(-8247 -8833)" fill="url(#a)"/></svg>

+ 0
- 3
server/sonar-web/public/images/sonarcloud/pull-request.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 27.86 31.6">
<path fill="#fd6a00" d="M4.643 0A4.739 4.739 0 0 0 3.1 9.184v13.232A4.739 4.739 0 0 0 4.643 31.6a4.739 4.739 0 0 0 1.548-9.184V9.184A4.739 4.739 0 0 0 4.643 0zm10.835 0l-4.643 4.74 4.643 4.74V6.32h1.548a4.669 4.669 0 0 1 4.643 4.74v11.356a4.644 4.644 0 1 0 3.1 0V11.06a7.845 7.845 0 0 0-7.739-7.9h-1.552zM4.643 3.16a1.541 1.541 0 0 1 1.548 1.58 1.55 1.55 0 1 1-3.1 0 1.541 1.541 0 0 1 1.552-1.58zm0 22.12A1.58 1.58 0 1 1 3.1 26.86a1.541 1.541 0 0 1 1.543-1.58zm18.574 0a1.58 1.58 0 1 1-1.548 1.58 1.541 1.541 0 0 1 1.548-1.58z"/>
</svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/rules.svg Целия файл

@@ -1 +0,0 @@
<svg id="document" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34.625 32.632"><defs><style>.cls-1{fill:#fd6a00}</style></defs><g id="Groupe_7446" data-name="Groupe 7446" transform="translate(4.777)"><g id="Groupe_7445" data-name="Groupe 7445"><path id="Tracé_11906" data-name="Tracé 11906" class="cls-1" d="M74.735 19.652a3.977 3.977 0 0 0-3.951 3.988l-.144 20.68 2.155.016.144-20.687a1.8 1.8 0 0 1 1.8-1.8h21.655v-2.2z" transform="translate(-70.64 -19.652)"/></g></g><g id="Groupe_7448" data-name="Groupe 7448"><g id="Groupe_7447" data-name="Groupe 7447"><path id="Tracé_11907" data-name="Tracé 11907" class="cls-1" d="M30.531 19.652a4.143 4.143 0 0 0-4.095 4.18v23.209a2.982 2.982 0 1 1-5.962 0v-2.677a1.089 1.089 0 0 0-1.078-1.1H1.078A1.089 1.089 0 0 0 0 44.364v2.677a5.2 5.2 0 0 0 5.136 5.243v-2.2a3.016 3.016 0 0 1-2.981-3.043v-1.577h16.163v1.577a5.137 5.137 0 1 0 10.273 0v-17.2h4.957a1.089 1.089 0 0 0 1.078-1.1v-4.909a4.143 4.143 0 0 0-4.095-4.18zm1.94 7.993h-3.88v-3.813a1.94 1.94 0 1 1 3.879 0v3.813z" transform="translate(0 -19.652)"/></g></g><g id="Groupe_7450" data-name="Groupe 7450" transform="translate(4.921 30.432)"><g id="Groupe_7449" data-name="Groupe 7449"><path id="Rectangle_11314" data-name="Rectangle 11314" class="cls-1" d="M0 0h18.282v2.2H0z"/></g></g><g id="Groupe_7452" data-name="Groupe 7452" transform="translate(9.375 6.123)"><g id="Groupe_7451" data-name="Groupe 7451"><path id="Tracé_11908" data-name="Tracé 11908" class="cls-1" d="M145.267 108.349H139.7a1.1 1.1 0 0 0 0 2.2h5.567a1.1 1.1 0 0 0 0-2.2z" transform="translate(-138.622 -108.349)"/></g></g><g id="Groupe_7454" data-name="Groupe 7454" transform="translate(9.375 10.523)"><g id="Groupe_7453" data-name="Groupe 7453"><path id="Tracé_11909" data-name="Tracé 11909" class="cls-1" d="M151.732 172.083H139.7a1.1 1.1 0 0 0 0 2.2h12.033a1.1 1.1 0 0 0 0-2.2z" transform="translate(-138.622 -172.083)"/></g></g><g id="Groupe_7456" data-name="Groupe 7456" transform="translate(9.375 14.923)"><g id="Groupe_7455" data-name="Groupe 7455"><path id="Tracé_11910" data-name="Tracé 11910" class="cls-1" d="M151.732 235.817H139.7a1.1 1.1 0 0 0 0 2.2h12.033a1.1 1.1 0 0 0 0-2.2z" transform="translate(-138.622 -235.817)"/></g></g><g id="Groupe_7458" data-name="Groupe 7458" transform="translate(9.375 19.323)"><g id="Groupe_7457" data-name="Groupe 7457"><path id="Tracé_11911" data-name="Tracé 11911" class="cls-1" d="M151.732 299.552H139.7a1.1 1.1 0 0 0 0 2.2h12.033a1.1 1.1 0 0 0 0-2.2z" transform="translate(-138.622 -299.552)"/></g></g></svg>

+ 0
- 4
server/sonar-web/public/images/sonarcloud/scale.svg Целия файл

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.4 19.4">
<path fill="#8a8c8f" d="M18.832 0H5.191a.568.568 0 0 0-.568.568v8.526H.568A.568.568 0 0 0 0 9.662v9.17a.568.568 0 0 0 .568.568h9.17a.568.568 0 0 0 .568-.568v-4.055h8.525a.568.568 0 0 0 .568-.568V.568A.568.568 0 0 0 18.832 0zM9.17 18.263H1.137V10.23h3.486v3.979a.568.568 0 0 0 .568.568H9.17zm0-4.623H5.759v-3.41H9.17zm9.094 0h-7.958V9.662a.568.568 0 0 0-.568-.568H5.759V1.137h12.5z"/>
<path fill="#8a8c8f" d="M17.126 2.84a.568.568 0 0 0-.568-.567h-3.415a.5685.5685 0 0 0 0 1.137h2.038l-3.577 3.577a.568.568 0 1 0 .8.8l3.577-3.577v2.038a.5685.5685 0 0 0 1.137 0V2.84z"/>
</svg>

Двоични данни
server/sonar-web/public/images/sonarcloud/sl-notif.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/sl-notif@2x.png Целия файл


+ 0
- 3
server/sonar-web/public/images/sonarcloud/sonarcloud-logo-text-only.svg Целия файл

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 84.346 22">
<path fill="#070706" d="M.532 14.094a5.73 5.73 0 0 0 2.508.7c.893 0 1.254-.3 1.254-.779s-.285-.7-1.387-1.083C.969 12.289.209 11.227.247 10.105c0-1.748 1.501-3.078 3.818-3.078a6.261 6.261 0 0 1 2.641.532l-.513 2.014a4.65 4.65 0 0 0-2.033-.532c-.7 0-1.121.285-1.121.76 0 .437.361.665 1.52 1.083 1.786.608 2.527 1.52 2.546 2.907 0 1.748-1.387 3.04-4.065 3.04A6.751 6.751 0 0 1 0 16.184zm16.869-2.261a4.711 4.711 0 0 1-4.958 5.015 4.61 4.61 0 0 1-4.863-4.844 4.687 4.687 0 0 1 5.015-4.977 4.587 4.587 0 0 1 4.806 4.806zm-6.8.095c0 1.615.665 2.831 1.919 2.831 1.14 0 1.862-1.14 1.862-2.831 0-1.406-.532-2.831-1.862-2.831-1.407.02-1.919 1.463-1.919 2.83zm7.845-1.691c0-1.178-.038-2.166-.076-3h2.527l.133 1.29h.057a3.459 3.459 0 0 1 2.907-1.5c1.919 0 3.362 1.273 3.362 4.027v5.566H24.43v-5.186c0-1.216-.418-2.033-1.482-2.033a1.558 1.558 0 0 0-1.482 1.1 1.984 1.984 0 0 0-.114.722v5.414h-2.906zm15.805 6.402l-.171-.95h-.057a3.413 3.413 0 0 1-2.7 1.159 2.888 2.888 0 0 1-3.04-2.888c0-2.432 2.185-3.609 5.509-3.59v-.133c0-.494-.266-1.216-1.71-1.216a5.3 5.3 0 0 0-2.584.7l-.532-1.881a7.787 7.787 0 0 1 3.651-.813c3.134 0 4.122 1.843 4.122 4.046v3.267a14.661 14.661 0 0 0 .133 2.28H34.25zm-.342-4.445c-1.539-.019-2.736.342-2.736 1.482a1.057 1.057 0 0 0 1.159 1.121 1.594 1.594 0 0 0 1.52-1.083 2.07 2.07 0 0 0 .057-.494zm4.389-1.862c0-1.387-.038-2.28-.076-3.1h2.508l.095 1.729h.076a2.745 2.745 0 0 1 2.526-1.934 2.976 2.976 0 0 1 .608.038V9.82a4.139 4.139 0 0 0-.779-.076 1.861 1.861 0 0 0-1.994 1.483 3.406 3.406 0 0 0-.057.646v4.768h-2.926v-6.309zm13.374 5.966a6.261 6.261 0 0 1-2.66.532 4.418 4.418 0 0 1-4.635-4.749 4.721 4.721 0 0 1 5-4.939 5.617 5.617 0 0 1 2.337.475l-.38 1.311a3.96 3.96 0 0 0-1.957-.437 3.221 3.221 0 0 0-3.286 3.514 3.192 3.192 0 0 0 3.229 3.476 4.846 4.846 0 0 0 2.071-.456zM52.887 3h1.691v13.64h-1.691zm12.177 8.909a4.543 4.543 0 0 1-4.635 4.939c-2.508 0-4.445-1.843-4.445-4.787 0-3.115 2.033-4.939 4.616-4.939 2.659.019 4.464 1.957 4.464 4.787zm-7.371.095c0 2.033 1.178 3.571 2.831 3.571 1.615 0 2.83-1.52 2.83-3.609 0-1.577-.779-3.571-2.773-3.571s-2.888 1.842-2.888 3.609zm16.509 2.109c0 .95.019 1.8.076 2.527h-1.5l-.095-1.52h-.038a3.515 3.515 0 0 1-3.079 1.73c-1.463 0-3.211-.8-3.211-4.065V7.35h1.691v5.148c0 1.767.532 2.964 2.071 2.964a2.439 2.439 0 0 0 2.223-1.539 2.474 2.474 0 0 0 .152-.874V7.35h1.691v6.763zM84.27 3v11.246c0 .817.019 1.767.076 2.394h-1.52l-.076-1.615h-.038a3.421 3.421 0 0 1-3.173 1.824c-2.242 0-3.97-1.9-3.97-4.73-.019-3.1 1.9-5 4.16-5a3.114 3.114 0 0 1 2.812 1.425h.038V3zm-1.691 8.131a2.952 2.952 0 0 0-.076-.7 2.477 2.477 0 0 0-2.433-1.96c-1.748 0-2.792 1.539-2.792 3.59 0 1.881.931 3.438 2.754 3.438a2.516 2.516 0 0 0 2.47-2.014 2.9 2.9 0 0 0 .076-.722z"/>
</svg>

+ 0
- 15
server/sonar-web/public/images/sonarcloud/sonarlint-integration.svg Целия файл

@@ -1,15 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-276.765 -4280.348 36.674 37.341">
<defs>
<style>
.cls-4{fill:none}.cls-3{stroke:none}
</style>
</defs>
<g fill="none" stroke="#434447" stroke-width="1.5" transform="translate(-276.765 -4274.167)">
<rect width="31.16" height="31.16" class="cls-3" rx="3"/>
<rect width="29.66" height="29.66" x=".75" y=".75" class="cls-4" rx="2.25"/>
</g>
<g fill="#fff" stroke="#f3702a" stroke-width="2" transform="translate(-254.76 -4280.348)">
<circle cx="7.335" cy="7.335" r="7.335" class="cls-3"/>
<circle cx="7.335" cy="7.335" r="6.335" class="cls-4"/>
</g>
</svg>

+ 0
- 4
server/sonar-web/public/images/sonarcloud/sonarlint-logo.svg Целия файл

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 67.01 22">
<path fill="#1b171b" d="M.532 14.067a5.726 5.726 0 0 0 2.506.7c.892 0 1.253-.3 1.253-.778s-.286-.701-1.391-1.084C.968 12.263.209 11.205.247 10.08c0-1.746 1.5-3.075 3.816-3.075a6.256 6.256 0 0 1 2.639.532l-.513 2.012a4.647 4.647 0 0 0-2.031-.532c-.7 0-1.12.285-1.12.759 0 .437.361.664 1.519 1.082 1.784.607 2.525 1.519 2.544 2.9-.001 1.747-1.387 3.047-4.064 3.047A6.746 6.746 0 0 1 0 16.155zm16.856-2.243a4.708 4.708 0 0 1-4.955 5.012 4.607 4.607 0 0 1-4.86-4.841 4.684 4.684 0 0 1 5.013-4.971 4.563 4.563 0 0 1 4.802 4.8zm-6.8.095c0 1.614.664 2.828 1.917 2.828 1.139 0 1.86-1.139 1.86-2.828 0-1.4-.532-2.828-1.86-2.828-1.4.002-1.913 1.445-1.913 2.833zm7.845-1.687c0-1.177-.038-2.164-.076-3h2.525l.133 1.291h.057a3.456 3.456 0 0 1 2.9-1.5c1.917 0 3.36 1.272 3.36 4.024v5.562h-2.923v-5.185c0-1.215-.418-2.031-1.481-2.031a1.557 1.557 0 0 0-1.481 1.1 1.983 1.983 0 0 0-.114.721v5.41h-2.9zm15.794 6.397l-.171-.949h-.057a3.41 3.41 0 0 1-2.7 1.158 2.886 2.886 0 0 1-3.037-2.885c0-2.43 2.183-3.607 5.505-3.588v-.133c0-.494-.266-1.215-1.708-1.215a5.3 5.3 0 0 0-2.582.7l-.532-1.879a7.782 7.782 0 0 1 3.645-.816c3.132 0 4.119 1.841 4.119 4.043v3.265a14.649 14.649 0 0 0 .133 2.278h-2.62zm-.342-4.442c-1.538-.019-2.734.342-2.734 1.481a1.056 1.056 0 0 0 1.158 1.12 1.592 1.592 0 0 0 1.519-1.082 2.069 2.069 0 0 0 .057-.494zm4.385-1.863c0-1.386-.038-2.278-.076-3.094H40.7l.095 1.727h.076a2.743 2.743 0 0 1 2.523-1.933 2.974 2.974 0 0 1 .607.038v2.753a4.136 4.136 0 0 0-.778-.076 1.86 1.86 0 0 0-1.993 1.481 3.4 3.4 0 0 0-.057.645v4.765H38.25v-6.306zM45.028 3h1.69v13.63h-1.69zm5.638 1.727a1.054 1.054 0 0 1-2.107 0 1.038 1.038 0 0 1 1.063-1.063 1.011 1.011 0 0 1 1.044 1.063zm-1.879 11.9v-9.3h1.689v9.283h-1.689zm3.72-6.774c0-.949-.019-1.746-.076-2.506h1.5l.095 1.538h.038a3.4 3.4 0 0 1 3.075-1.746c1.291 0 3.284.759 3.284 3.948v5.543h-1.692v-5.354c0-1.5-.551-2.753-2.145-2.753a2.373 2.373 0 0 0-2.255 1.728 2.4 2.4 0 0 0-.114.778v5.581h-1.69V9.853zm11.845-5.182v2.658h2.411V8.62h-2.411v5.011c0 1.158.323 1.8 1.272 1.8a3.887 3.887 0 0 0 .987-.114l.076 1.272a4.13 4.13 0 0 1-1.5.228 2.358 2.358 0 0 1-1.822-.7 3.458 3.458 0 0 1-.645-2.411V8.619h-1.443v-1.29h1.443V5.108z"/>
<path fill="#cc202a" fill-rule="evenodd" d="M66.82 21.736a1.594 1.594 0 0 1-1.044-.59 1.844 1.844 0 0 0-1.348-.759 1.877 1.877 0 0 0-1.348.759 1.854 1.854 0 0 1-2.828 0 1.8 1.8 0 0 0-2.753 0 2.7 2.7 0 0 1-.7.607 3.029 3.029 0 0 1-.437.19c-.683.247-1.31-.361-1.69-.816a1.791 1.791 0 0 0-2.734 0 2.061 2.061 0 0 1-3.075.171 1.186 1.186 0 0 0-.19-.418 1.277 1.277 0 0 0-.266-.285c-.664-.57-1.614.019-2.05.551a1.618 1.618 0 0 1-1.253.626.174.174 0 0 1-.114-.076c-.019-.038-.057-.057-.076-.114a.171.171 0 0 1-.019-.095.778.778 0 0 1-.019-.209.462.462 0 0 1 .057-.209.448.448 0 0 1 .114-.171c.057-.038.209-.209.285-.247a2.2 2.2 0 0 0 .38-.456c.721-.816 2.43-1.519 3.3-.513.114.133.209.247.323.38.323.361.873.93 1.424.607a1.72 1.72 0 0 0 .3-.209c.209-.209.4-.456.589-.683a2.443 2.443 0 0 1 1.9-.626 1.475 1.475 0 0 1 1.139.456c.4.456 1.025 1.082 1.727.816a1.356 1.356 0 0 0 .285-.152c.114-.076.228-.152.323-.228l.342-.342a1.807 1.807 0 0 1 2.772-.076c.456.551 1.386 1.31 2.164.759a3.884 3.884 0 0 0 .664-.7 2 2 0 0 1 1.481-.74.323.323 0 0 1 .133.019 3.056 3.056 0 0 1 1.5.968c.19.209.569.721.778.968.114.19.152.171.152.361v.057a.282.282 0 0 1-.019.114c0 .038-.019.114-.019.152-.017.063-.055.153-.15.153z"/>
</svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/sq-background.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4654 2264"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="499.375" y1="1043.472" x2="1164.943" y2="1939.597" gradientTransform="matrix(1 0 0 -1 0 2264)"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#f8f8f9"/></linearGradient><path d="M1461.5 149.4C1403.1 91.3 1338.4 41.2 1268.4 0H285.1C215.1 41.2 150.4 91.3 92 149.4 1.8 239.3-69.1 344.2-118.9 461.2-170.8 583.3-197 713.2-197 847s26.2 263.7 78.1 385.8c49.7 117 120.6 221.9 210.9 311.8 89.5 89.1 193.4 158.9 309 207.7 119.1 50.1 245.5 75.7 375.7 75.7s256.5-25.4 375.7-75.7c115.6-48.7 219.6-118.6 309-207.7 90.2-89.8 161.2-194.7 210.9-311.8 51.9-122.1 78.1-252 78.1-385.8s-26.2-263.7-78.1-385.8c-49.7-117-120.6-221.9-210.8-311.8zm28.8 988.8c-38.3 90-93.2 171.2-163.4 241-71 70.6-153.7 126.2-246 165.1-96.2 40.5-198.4 61.1-304 61.1s-207.9-20.6-304-61.1c-92.3-38.9-175.1-94.4-246-165.1-70.2-69.9-125.1-151-163.4-241C24.1 1045.9 4.2 948 4.2 847s19.9-198.9 59-291.2c38.3-90 93.2-171.2 163.4-241 71-70.6 153.7-126.2 246-165.1 96.2-40.5 198.4-61.1 304-61.1s207.9 20.6 304 61.1c92.3 38.9 175.1 94.4 246 165.1 70.2 69.9 125.1 151 163.4 241 39.2 92.3 59 190.3 59 291.2s-19.6 198.9-58.7 291.2z" fill="url(#a)"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="3828.883" y1="1759.166" x2="3080.553" y2="1407.541" gradientTransform="matrix(1 0 0 -1 0 2264)"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#f8f8f9"/></linearGradient><path d="M4683.7 0H4458c187.3 355.4 121.9 776.4-165.1 973.8-310.4 213.4-764.3 85.3-1011.8-285.4C3135.5 470.2 3093.3 215.9 3146.5 0h-208.9c-4.2 22.3-7.7 44.8-10.4 67.8-14.5 123-6.3 248.7 24.4 373.5 31.5 128.5 85.6 250.6 160.6 363.1s166.8 208.6 272.7 286c102.9 75.2 214.9 129.6 332.8 161.5 78.7 21.3 157.4 32.1 235.3 32.1 40.2 0 80.1-2.8 119.7-8.5 121.7-17.6 234.2-61.4 334.6-130.4 100.3-69 182.3-158.8 243.5-266.9 58.5-103.3 95.6-218.8 110.2-343.2 14.5-123 6.3-248.7-24.4-373.5-13.6-55.1-31.3-109-52.9-161.5z" fill="url(#b)"/></svg>

Двоични данни
server/sonar-web/public/images/sonarcloud/sq-homepage.png Целия файл


Двоични данни
server/sonar-web/public/images/sonarcloud/sq-homepage@2x.png Целия файл


+ 0
- 9
server/sonar-web/public/images/sonarcloud/stop.svg Целия файл

@@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14.5 15.117">
<defs>
<style>
.cls-1{fill:#8a8c8f}
</style>
</defs>
<path d="M7.25 15.117A7.149 7.149 0 0 1 0 8.09a6.973 6.973 0 0 1 4.075-6.321.63.63 0 0 1 .54 1.138A5.722 5.722 0 0 0 1.261 8.09a5.992 5.992 0 0 0 11.976 0 5.777 5.777 0 0 0-3.461-5.229.62911.62911 0 1 1 .515-1.148A7.035 7.035 0 0 1 14.5 8.09a7.149 7.149 0 0 1-7.25 7.028z" class="cls-1"/>
<path d="M7.25 8.543a.628.628 0 0 1-.629-.629V.629a.6295.6295 0 0 1 1.259 0v7.284a.628.628 0 0 1-.63.63z" class="cls-1"/>
</svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/vsts-big.svg Целия файл

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-557.666 -3550.073 61.865 62.081"><defs><style>.cls-1{fill:#0078d7}</style></defs><g id="Groupe_6141" data-name="Groupe 6141" transform="translate(-557.666 -3550.073)"><path id="path951_1_" class="cls-1" d="M46.453 0v53.28L0 46.453l46.453 15.628L61.865 55.7V6.611z"/><path id="Tracé_10734" data-name="Tracé 10734" class="cls-1" d="M22.239 84.1V72.318l31.026-6.107v21.85l-8.758 7.26-13.367-4.48v4.609l-8.9-11.35 21.476 2.809v-19L33.445 59.7l.072 3.731L21.3 68.314l-3.8 4.552v10.24z" transform="translate(-14.979 -51.101)"/></g></svg>

+ 0
- 1
server/sonar-web/public/images/sonarcloud/windows.svg Целия файл

@@ -1 +0,0 @@
<svg viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill="#ff3d00" d="M0 0h17.5v17.5H0z"/><path fill="#00a6f6" d="M0 20.5h17.5V38H0z"/><path fill="#69bd00" d="M20.5 0H38v17.5H20.5z"/><path fill="#ffb600" d="M20.5 20.5H38V38H20.5z"/></svg>

+ 16
- 0
server/sonar-web/public/images/tutorials/manual.svg Целия файл

@@ -0,0 +1,16 @@
<svg width="62" height="76"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="a" d="M0 76h62V0H0z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<path d="M24 37v4.667c0 .597.244 1.194.733 1.65A2.584 2.584 0 0 0 26.5 44c.64 0 1.279-.227 1.767-.684a2.246 2.246 0 0 0 .733-1.65V37" stroke="#236A97" stroke-width="2"/>
<path d="M28 37v5.714c0 .585.244 1.17.733 1.616.488.447 1.127.67 1.767.67.64 0 1.279-.223 1.767-.67A2.18 2.18 0 0 0 33 42.714V37M33 36.53v14.117c0 .602.244 1.205.733 1.664.488.46 1.127.689 1.767.689.64 0 1.279-.23 1.767-.69A2.273 2.273 0 0 0 38 50.648V33" stroke="#236A97" stroke-width="2"/>
<path d="M23.8 36.958v3.625c0 .619-.234 1.238-.703 1.709A2.382 2.382 0 0 1 21.4 43a2.382 2.382 0 0 1-1.697-.708A2.414 2.414 0 0 1 19 40.583V23.667L21.4 14h16.8v3.625l4.8 8.458v7.25c0 .619-.234 1.238-.703 1.709a2.382 2.382 0 0 1-1.697.708 2.382 2.382 0 0 1-1.697-.708 2.414 2.414 0 0 1-.703-1.709V28.5M40 0v14H19V0M36 10V8M56 47V29M60 41l-4.5 5-4.5-5M56 26v-2M56 21v-2M6 47V29M10 41l-4.5 5L1 41M6 26v-2M6 21v-2M41.8 54h18c.307 0 .614.114.848.342.234.227.352.526.352.825v18.666c0 .299-.118.598-.352.825A1.214 1.214 0 0 1 59.8 75H2.2c-.307 0-.614-.114-.848-.342A1.147 1.147 0 0 1 1 73.833V55.167c0-.299.118-.598.352-.825.234-.228.54-.342.848-.342h27.6M25 64h2M30 64h2M35 64h2" stroke="#236A97" stroke-width="2"/>
<mask id="b" fill="#fff">
<use xlink:href="#a"/>
</mask>
<path stroke="#236A97" stroke-width="2" mask="url(#b)" d="M6 70h50V58H6z"/>
</g>
</svg>

+ 4
- 10
server/sonar-web/src/main/js/components/tutorials/TutorialSelection.tsx Целия файл

@@ -37,7 +37,6 @@ interface Props extends Pick<WithRouterProps, 'router' | 'location'> {
interface State {
almBinding?: AlmSettingsInstance;
baseUrl: string;
forceManual: boolean;
loading: boolean;
}

@@ -45,7 +44,6 @@ export class TutorialSelection extends React.PureComponent<Props, State> {
mounted = false;
state: State = {
baseUrl: getHostUrl(),
forceManual: true,
loading: true
};

@@ -66,16 +64,14 @@ export class TutorialSelection extends React.PureComponent<Props, State> {
fetchAlmBindings = async () => {
const { component, projectBinding } = this.props;

if (projectBinding === undefined) {
this.setState({ forceManual: true });
} else {
if (projectBinding !== undefined) {
const almSettings = await getAlmSettingsNoCatch(component.key).catch(() => undefined);
if (this.mounted) {
let almBinding;
if (almSettings !== undefined) {
almBinding = almSettings.find(d => d.key === projectBinding.key);
}
this.setState({ almBinding, forceManual: false });
this.setState({ almBinding });
}
}
};
@@ -102,11 +98,9 @@ export class TutorialSelection extends React.PureComponent<Props, State> {

render() {
const { component, currentUser, location, projectBinding } = this.props;
const { almBinding, baseUrl, forceManual, loading } = this.state;
const { almBinding, baseUrl, loading } = this.state;

const selectedTutorial: TutorialModes | undefined = forceManual
? TutorialModes.Manual
: location.query?.selectedTutorial;
const selectedTutorial: TutorialModes | undefined = location.query?.selectedTutorial;

return (
<TutorialSelectionRenderer

+ 63
- 63
server/sonar-web/src/main/js/components/tutorials/TutorialSelectionRenderer.tsx Целия файл

@@ -55,14 +55,24 @@ export default function TutorialSelectionRenderer(props: TutorialSelectionRender
return <i className="spinner" />;
}

const isAzureAvailable =
projectBinding && [AlmKeys.Azure, AlmKeys.GitHub].includes(projectBinding.alm);

const jenkinsAvailable =
projectBinding &&
[AlmKeys.BitbucketCloud, AlmKeys.BitbucketServer, AlmKeys.GitHub, AlmKeys.GitLab].includes(
projectBinding.alm
);
let showGitHubActions = true;
let showGitLabCICD = true;
let showBitbucketPipelines = true;
let showAzurePipelines = true;
let showJenkins = true;

if (projectBinding !== undefined) {
showGitHubActions = projectBinding.alm === AlmKeys.GitHub;
showGitLabCICD = projectBinding.alm === AlmKeys.GitLab;
showBitbucketPipelines = projectBinding?.alm === AlmKeys.BitbucketCloud;
showAzurePipelines = [AlmKeys.Azure, AlmKeys.GitHub].includes(projectBinding.alm);
showJenkins = [
AlmKeys.BitbucketCloud,
AlmKeys.BitbucketServer,
AlmKeys.GitHub,
AlmKeys.GitLab
].includes(projectBinding.alm);
}

return (
<>
@@ -75,72 +85,86 @@ export default function TutorialSelectionRenderer(props: TutorialSelectionRender
</header>

<div className="display-flex-justify-center">
{projectBinding?.alm === AlmKeys.GitHub && (
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
onClick={() => props.onSelectTutorial(TutorialModes.Manual)}
type="button">
<img
alt="" // Should be ignored by screen readers
height={80}
src={`${getBaseUrl()}/images/tutorials/manual.svg`}
/>
<div className="medium big-spacer-top">
{translate('onboarding.tutorial.choose_method.manual')}
</div>
</button>

{showAzurePipelines && (
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-github"
onClick={() => props.onSelectTutorial(TutorialModes.GitHubActions)}
className="button button-huge display-flex-column spacer-left spacer-right azure-pipelines"
onClick={() => props.onSelectTutorial(TutorialModes.AzurePipelines)}
type="button">
<img
alt="" // Should be ignored by screen readers
height={64}
className="spacer-bottom spacer-top"
src={`${getBaseUrl()}/images/tutorials/github-actions.svg`}
height={80}
src={`${getBaseUrl()}/images/tutorials/azure-pipelines.svg`}
/>
<div className="medium big-spacer-top">
{translate('onboarding.tutorial.choose_method.github_action')}
{translate('onboarding.tutorial.choose_method.azure_pipelines')}
</div>
</button>
)}

{projectBinding?.alm === AlmKeys.GitLab && (
{showBitbucketPipelines && (
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-gitlab"
onClick={() => props.onSelectTutorial(TutorialModes.GitLabCI)}
className="button button-huge display-flex-column spacer-left spacer-right bitbucket-pipelines"
onClick={() => props.onSelectTutorial(TutorialModes.BitbucketPipelines)}
type="button">
<img
alt="" // Should be ignored by screen readers
height={80}
src={`${getBaseUrl()}/images/alm/gitlab.svg`}
src={`${getBaseUrl()}/images/alm/bitbucket.svg`}
/>
<div className="medium big-spacer-top">
{translate('onboarding.tutorial.choose_method.gitlab_ci')}
{translate('onboarding.tutorial.choose_method.bitbucket_pipelines')}
</div>
</button>
)}

{isAzureAvailable && (
{showGitHubActions && (
<button
className="button button-huge display-flex-column spacer-left spacer-right azure-pipelines"
onClick={() => props.onSelectTutorial(TutorialModes.AzurePipelines)}
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-github"
onClick={() => props.onSelectTutorial(TutorialModes.GitHubActions)}
type="button">
<img
alt="" // Should be ignored by screen readers
height={80}
src={`${getBaseUrl()}/images/tutorials/azure-pipelines.svg`}
height={64}
className="spacer-bottom spacer-top"
src={`${getBaseUrl()}/images/tutorials/github-actions.svg`}
/>
<div className="medium big-spacer-top">
{translate('onboarding.tutorial.choose_method.azure_pipelines')}
{translate('onboarding.tutorial.choose_method.github_action')}
</div>
</button>
)}

{projectBinding?.alm === AlmKeys.BitbucketCloud && (
{showGitLabCICD && (
<button
className="button button-huge display-flex-column spacer-left spacer-right bitbucket-pipelines"
onClick={() => props.onSelectTutorial(TutorialModes.BitbucketPipelines)}
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-gitlab"
onClick={() => props.onSelectTutorial(TutorialModes.GitLabCI)}
type="button">
<img
alt="" // Should be ignored by screen readers
height={80}
src={`${getBaseUrl()}/images/alm/bitbucket.svg`}
src={`${getBaseUrl()}/images/alm/gitlab.svg`}
/>
<div className="medium big-spacer-top">
{translate('onboarding.tutorial.choose_method.bitbucket_pipelines')}
{translate('onboarding.tutorial.choose_method.gitlab_ci')}
</div>
</button>
)}

{jenkinsAvailable && (
{showJenkins && (
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
onClick={() => props.onSelectTutorial(TutorialModes.Jenkins)}
@@ -155,20 +179,6 @@ export default function TutorialSelectionRenderer(props: TutorialSelectionRender
</div>
</button>
)}

<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
onClick={() => props.onSelectTutorial(TutorialModes.Manual)}
type="button">
<img
alt="" // Should be ignored by screen readers
height={80}
src={`${getBaseUrl()}/images/sonarcloud/analysis/manual.svg`}
/>
<div className="medium big-spacer-top">
{translate('onboarding.tutorial.choose_method.manual')}
</div>
</button>
</div>
</div>
)}
@@ -177,7 +187,7 @@ export default function TutorialSelectionRenderer(props: TutorialSelectionRender
<ManualTutorial component={component} currentUser={currentUser} />
)}

{selectedTutorial === TutorialModes.BitbucketPipelines && projectBinding !== undefined && (
{selectedTutorial === TutorialModes.BitbucketPipelines && (
<BitbucketPipelinesTutorial
almBinding={almBinding}
baseUrl={baseUrl}
@@ -187,7 +197,7 @@ export default function TutorialSelectionRenderer(props: TutorialSelectionRender
/>
)}

{selectedTutorial === TutorialModes.GitHubActions && projectBinding !== undefined && (
{selectedTutorial === TutorialModes.GitHubActions && (
<GitHubActionTutorial
almBinding={almBinding}
baseUrl={baseUrl}
@@ -197,7 +207,7 @@ export default function TutorialSelectionRenderer(props: TutorialSelectionRender
/>
)}

{selectedTutorial === TutorialModes.Jenkins && projectBinding !== undefined && (
{selectedTutorial === TutorialModes.Jenkins && (
<JenkinsTutorial
almBinding={almBinding}
component={component}
@@ -205,22 +215,12 @@ export default function TutorialSelectionRenderer(props: TutorialSelectionRender
/>
)}

{selectedTutorial === TutorialModes.GitLabCI && projectBinding !== undefined && (
<GitLabCITutorial
baseUrl={baseUrl}
component={component}
currentUser={currentUser}
projectBinding={projectBinding}
/>
{selectedTutorial === TutorialModes.GitLabCI && (
<GitLabCITutorial baseUrl={baseUrl} component={component} currentUser={currentUser} />
)}

{selectedTutorial === TutorialModes.AzurePipelines && projectBinding !== undefined && (
<AzurePipelinesTutorial
baseUrl={baseUrl}
component={component}
currentUser={currentUser}
projectBinding={projectBinding}
/>
{selectedTutorial === TutorialModes.AzurePipelines && (
<AzurePipelinesTutorial baseUrl={baseUrl} component={component} currentUser={currentUser} />
)}
</>
);

+ 0
- 12
server/sonar-web/src/main/js/components/tutorials/__tests__/TutorialSelection-test.tsx Целия файл

@@ -55,18 +55,6 @@ it('should render correctly', () => {
expect(shallowRender()).toMatchSnapshot();
});

it('should select manual if project is not bound', async () => {
const wrapper = shallowRender();
await waitAndUpdate(wrapper);
expect(wrapper.state().forceManual).toBe(true);
});

it('should not select anything if project is bound', async () => {
const wrapper = shallowRender({ projectBinding: mockProjectBitbucketBindingResponse() });
await waitAndUpdate(wrapper);
expect(wrapper.state().forceManual).toBe(false);
});

it('should correctly find the global ALM binding definition', async () => {
const key = 'foo';
const almBinding = mockAlmSettingsInstance({ key });

+ 0
- 1
server/sonar-web/src/main/js/components/tutorials/__tests__/__snapshots__/TutorialSelection-test.tsx.snap Целия файл

@@ -36,6 +36,5 @@ exports[`should render correctly 1`] = `
}
loading={true}
onSelectTutorial={[Function]}
selectedTutorial="manual"
/>
`;

+ 115
- 53
server/sonar-web/src/main/js/components/tutorials/__tests__/__snapshots__/TutorialSelectionRenderer-test.tsx.snap Целия файл

@@ -18,35 +18,35 @@ exports[`should render correctly for azure 1`] = `
className="display-flex-justify-center"
>
<button
className="button button-huge display-flex-column spacer-left spacer-right azure-pipelines"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/tutorials/azure-pipelines.svg"
src="/images/tutorials/manual.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.azure_pipelines
onboarding.tutorial.choose_method.manual
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
className="button button-huge display-flex-column spacer-left spacer-right azure-pipelines"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/sonarcloud/analysis/manual.svg"
src="/images/tutorials/azure-pipelines.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.manual
onboarding.tutorial.choose_method.azure_pipelines
</div>
</button>
</div>
@@ -72,35 +72,35 @@ exports[`should render correctly for bitbucket server 1`] = `
className="display-flex-justify-center"
>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/tutorials/jenkins.svg"
src="/images/tutorials/manual.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.jenkins
onboarding.tutorial.choose_method.manual
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/sonarcloud/analysis/manual.svg"
src="/images/tutorials/jenkins.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.manual
onboarding.tutorial.choose_method.jenkins
</div>
</button>
</div>
@@ -126,20 +126,19 @@ exports[`should render correctly for github 1`] = `
className="display-flex-justify-center"
>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-github"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
onClick={[Function]}
type="button"
>
<img
alt=""
className="spacer-bottom spacer-top"
height={64}
src="/images/tutorials/github-actions.svg"
height={80}
src="/images/tutorials/manual.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.github_action
onboarding.tutorial.choose_method.manual
</div>
</button>
<button
@@ -159,35 +158,36 @@ exports[`should render correctly for github 1`] = `
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-github"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/tutorials/jenkins.svg"
className="spacer-bottom spacer-top"
height={64}
src="/images/tutorials/github-actions.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.jenkins
onboarding.tutorial.choose_method.github_action
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/sonarcloud/analysis/manual.svg"
src="/images/tutorials/jenkins.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.manual
onboarding.tutorial.choose_method.jenkins
</div>
</button>
</div>
@@ -213,51 +213,51 @@ exports[`should render correctly for gitlab 1`] = `
className="display-flex-justify-center"
>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-gitlab"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/alm/gitlab.svg"
src="/images/tutorials/manual.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.gitlab_ci
onboarding.tutorial.choose_method.manual
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-gitlab"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/tutorials/jenkins.svg"
src="/images/alm/gitlab.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.jenkins
onboarding.tutorial.choose_method.gitlab_ci
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-manual"
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/sonarcloud/analysis/manual.svg"
src="/images/tutorials/jenkins.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.manual
onboarding.tutorial.choose_method.jenkins
</div>
</button>
</div>
@@ -300,16 +300,6 @@ exports[`should render correctly: azure pipelines tutorial 1`] = `
"scmAccounts": Array [],
}
}
projectBinding={
Object {
"alm": "azure",
"key": "foo",
"monorepo": false,
"repository": "REPOSITORY_NAME",
"slug": "PROJECT_NAME",
"url": "https://ado.my_company.com/mycollection",
}
}
/>
</Fragment>
`;
@@ -402,15 +392,6 @@ exports[`should render correctly: gitlab tutorial 1`] = `
"scmAccounts": Array [],
}
}
projectBinding={
Object {
"alm": "gitlab",
"key": "foo",
"monorepo": true,
"repository": "PROJECT_KEY",
"url": "https://gitlab.com/api/v4",
}
}
/>
</Fragment>
`;
@@ -528,7 +509,7 @@ exports[`should render correctly: selection 1`] = `
<img
alt=""
height={80}
src="/images/sonarcloud/analysis/manual.svg"
src="/images/tutorials/manual.svg"
/>
<div
className="medium big-spacer-top"
@@ -536,6 +517,87 @@ exports[`should render correctly: selection 1`] = `
onboarding.tutorial.choose_method.manual
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right azure-pipelines"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/tutorials/azure-pipelines.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.azure_pipelines
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right bitbucket-pipelines"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/alm/bitbucket.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.bitbucket_pipelines
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-github"
onClick={[Function]}
type="button"
>
<img
alt=""
className="spacer-bottom spacer-top"
height={64}
src="/images/tutorials/github-actions.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.github_action
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-gitlab"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/alm/gitlab.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.gitlab_ci
</div>
</button>
<button
className="button button-huge display-flex-column spacer-left spacer-right tutorial-mode-jenkins"
onClick={[Function]}
type="button"
>
<img
alt=""
height={80}
src="/images/tutorials/jenkins.svg"
/>
<div
className="medium big-spacer-top"
>
onboarding.tutorial.choose_method.jenkins
</div>
</button>
</div>
</div>
</Fragment>

+ 27
- 1
server/sonar-web/src/main/js/components/tutorials/__tests__/utils-test.ts Целия файл

@@ -19,9 +19,10 @@
*/
import {
mockAlmSettingsInstance,
mockProjectBitbucketCloudBindingResponse,
mockProjectGithubBindingResponse
} from '../../../helpers/mocks/alm-settings';
import { buildGithubLink, getUniqueTokenName } from '../utils';
import { buildBitbucketCloudLink, buildGithubLink, getUniqueTokenName } from '../utils';

describe('getUniqueTokenName', () => {
const initialTokenName = 'Analyze "lightsaber"';
@@ -70,3 +71,28 @@ describe('buildGithubLink', () => {
expect(buildGithubLink(mockAlmSettingsInstance({ url: undefined }), projectBinding)).toBeNull();
});
});

describe('buildBitbucketCloudLink', () => {
const projectBinding = mockProjectBitbucketCloudBindingResponse({ repository: 'reponame' });

it('should work', () => {
expect(
buildBitbucketCloudLink(
mockAlmSettingsInstance({ url: 'http://bitbucket.org/workspace/' }),
projectBinding
)
).toBe('http://bitbucket.org/workspace/reponame');
});

it('should return null if there is no url defined', () => {
expect(
buildBitbucketCloudLink(mockAlmSettingsInstance({ url: undefined }), projectBinding)
).toBeNull();
expect(
buildBitbucketCloudLink(
mockAlmSettingsInstance(),
mockProjectBitbucketCloudBindingResponse({ repository: undefined })
)
).toBeNull();
});
});

+ 1
- 20
server/sonar-web/src/main/js/components/tutorials/azure-pipelines/AzurePipelinesTutorial.tsx Целия файл

@@ -19,13 +19,7 @@
*/
import * as React from 'react';
import { Button } from 'sonar-ui-common/components/controls/buttons';
import { Alert } from 'sonar-ui-common/components/ui/Alert';
import { translate } from 'sonar-ui-common/helpers/l10n';
import {
isProjectAzureBindingResponse,
isProjectGitHubBindingResponse,
ProjectAlmBindingResponse
} from '../../../types/alm-settings';
import Step from '../components/Step';
import BranchAnalysisStepContent from './BranchAnalysisStepContent';
import ExtensionInstallationStepContent from './ExtensionInstallationStepContent';
@@ -36,7 +30,6 @@ export interface AzurePipelinesTutorialProps {
baseUrl: string;
component: T.Component;
currentUser: T.LoggedInUser;
projectBinding: ProjectAlmBindingResponse;
}

export enum Steps {
@@ -53,23 +46,11 @@ interface Step {
}

export default function AzurePipelinesTutorial(props: AzurePipelinesTutorialProps) {
const { baseUrl, component, currentUser, projectBinding } = props;
const { baseUrl, component, currentUser } = props;

const [currentStep, setCurrentStep] = React.useState(Steps.ExtensionInstallation);
const [isCurrentStepValid, setIsCurrentStepValid] = React.useState(false);

// Failsafe; should never happen.
if (
!isProjectAzureBindingResponse(projectBinding) &&
!isProjectGitHubBindingResponse(projectBinding)
) {
return (
<Alert variant="error">
{translate('onboarding.tutorial.with.azure_pipelines.unsupported')}
</Alert>
);
}

const steps: Array<Step> = [
{ step: Steps.ExtensionInstallation, content: <ExtensionInstallationStepContent /> },
{

+ 0
- 12
server/sonar-web/src/main/js/components/tutorials/azure-pipelines/__tests__/AzurePipelinesTutorial-test.tsx Целия файл

@@ -21,11 +21,6 @@ import { shallow } from 'enzyme';
import * as React from 'react';
import { Button } from 'sonar-ui-common/components/controls/buttons';
import { click } from 'sonar-ui-common/helpers/testUtils';
import {
mockProjectAzureBindingResponse,
mockProjectGithubBindingResponse,
mockProjectGitLabBindingResponse
} from '../../../../helpers/mocks/alm-settings';
import { mockComponent, mockLoggedInUser } from '../../../../helpers/testMocks';
import Step from '../../components/Step';
import AzurePipelinesTutorial, { AzurePipelinesTutorialProps } from '../AzurePipelinesTutorial';
@@ -45,12 +40,6 @@ it('should render correctly', () => {
.last()
.dive()
).toMatchSnapshot('last-step-wrapper');
expect(shallowRender({ projectBinding: mockProjectGithubBindingResponse() })).toMatchSnapshot(
'for github'
);
expect(shallowRender({ projectBinding: mockProjectGitLabBindingResponse() })).toMatchSnapshot(
'wrong alm'
);
});

it('should display the next step when one is finished', () => {
@@ -108,7 +97,6 @@ function shallowRender(props: Partial<AzurePipelinesTutorialProps> = {}) {
baseUrl="http://localhost:9000"
component={mockComponent()}
currentUser={mockLoggedInUser()}
projectBinding={mockProjectAzureBindingResponse()}
{...props}
/>
);

+ 0
- 58
server/sonar-web/src/main/js/components/tutorials/azure-pipelines/__tests__/__snapshots__/AzurePipelinesTutorial-test.tsx.snap Целия файл

@@ -86,56 +86,6 @@ exports[`should render correctly: first-step-wrapper 1`] = `
</div>
`;

exports[`should render correctly: for github 1`] = `
<Fragment>
<div
className="page-header big-spacer-bottom"
>
<h1
className="page-title"
>
onboarding.tutorial.with.azure_pipelines.title
</h1>
</div>
<Step
finished={false}
key="0"
onOpen={[Function]}
open={true}
renderForm={[Function]}
stepNumber={1}
stepTitle="onboarding.tutorial.with.azure_pipelines.ExtensionInstallation.title"
/>
<Step
finished={false}
key="1"
onOpen={[Function]}
open={false}
renderForm={[Function]}
stepNumber={2}
stepTitle="onboarding.tutorial.with.azure_pipelines.ServiceEndpoint.title"
/>
<Step
finished={false}
key="2"
onOpen={[Function]}
open={false}
renderForm={[Function]}
stepNumber={3}
stepTitle="onboarding.tutorial.with.azure_pipelines.BranchAnalysis.title"
/>
<Step
finished={false}
key="3"
onOpen={[Function]}
open={false}
renderForm={[Function]}
stepNumber={4}
stepTitle="onboarding.tutorial.with.azure_pipelines.SaveAndRun.title"
/>
</Fragment>
`;

exports[`should render correctly: last-step-wrapper 1`] = `
<div
className="boxed-group onboarding-step"
@@ -168,11 +118,3 @@ exports[`should render correctly: last-step-wrapper 1`] = `
</div>
</div>
`;

exports[`should render correctly: wrong alm 1`] = `
<Alert
variant="error"
>
onboarding.tutorial.with.azure_pipelines.unsupported
</Alert>
`;

+ 1
- 1
server/sonar-web/src/main/js/components/tutorials/bitbucket-pipelines/BitbucketPipelinesTutorial.tsx Целия файл

@@ -35,7 +35,7 @@ export interface BitbucketPipelinesTutorialProps {
baseUrl: string;
component: T.Component;
currentUser: T.LoggedInUser;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
}

export default function BitbucketPipelinesTutorial(props: BitbucketPipelinesTutorialProps) {

+ 18
- 13
server/sonar-web/src/main/js/components/tutorials/bitbucket-pipelines/RepositoryVariables.tsx Целия файл

@@ -25,6 +25,7 @@ import { translate } from 'sonar-ui-common/helpers/l10n';
import { AlmSettingsInstance, ProjectAlmBindingResponse } from '../../../types/alm-settings';
import SentenceWithHighlights from '../components/SentenceWithHighlights';
import TokenStepGenerator from '../components/TokenStepGenerator';
import { buildBitbucketCloudLink } from '../utils';

export interface RepositoryVariablesProps {
almBinding?: AlmSettingsInstance;
@@ -32,7 +33,7 @@ export interface RepositoryVariablesProps {
component: T.Component;
currentUser: T.LoggedInUser;
onDone: () => void;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
}

export default function RepositoryVariables(props: RepositoryVariablesProps) {
@@ -44,18 +45,22 @@ export default function RepositoryVariables(props: RepositoryVariablesProps) {
defaultMessage={translate('onboarding.tutorial.with.bitbucket_pipelines.variables.intro')}
id="onboarding.tutorial.with.bitbucket_pipelines.variables.intro"
values={{
repository_variables: almBinding?.url ? (
<a
href={`${almBinding.url}/${projectBinding.slug}/admin/addon/admin/pipelines/repository-variables`}
target="_blank"
rel="noopener noreferrer">
{translate('onboarding.tutorial.with.bitbucket_pipelines.variables.intro.link')}
</a>
) : (
<b>
{translate('onboarding.tutorial.with.bitbucket_pipelines.variables.intro.link')}
</b>
)
repository_variables:
almBinding?.url && projectBinding?.repository ? (
<a
href={`${buildBitbucketCloudLink(
almBinding,
projectBinding
)}/admin/addon/admin/pipelines/repository-variables`}
target="_blank"
rel="noopener noreferrer">
{translate('onboarding.tutorial.with.bitbucket_pipelines.variables.intro.link')}
</a>
) : (
<strong>
{translate('onboarding.tutorial.with.bitbucket_pipelines.variables.intro.link')}
</strong>
)
}}
/>
</p>

+ 2
- 2
server/sonar-web/src/main/js/components/tutorials/bitbucket-pipelines/__tests__/__snapshots__/RepositoryVariables-test.tsx.snap Целия файл

@@ -12,9 +12,9 @@ exports[`should render correctly 1`] = `
id="onboarding.tutorial.with.bitbucket_pipelines.variables.intro"
values={
Object {
"repository_variables": <b>
"repository_variables": <strong>
onboarding.tutorial.with.bitbucket_pipelines.variables.intro.link
</b>,
</strong>,
}
}
/>

+ 1
- 1
server/sonar-web/src/main/js/components/tutorials/github-action/GitHubActionTutorial.tsx Целия файл

@@ -35,7 +35,7 @@ export interface GitHubActionTutorialProps {
baseUrl: string;
component: T.Component;
currentUser: T.LoggedInUser;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
}

export default function GitHubActionTutorial(props: GitHubActionTutorialProps) {

+ 14
- 11
server/sonar-web/src/main/js/components/tutorials/github-action/SecretStep.tsx Целия файл

@@ -32,7 +32,7 @@ export interface SecretStepProps {
baseUrl: string;
component: T.Component;
currentUser: T.LoggedInUser;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
onDone: () => void;
}

@@ -46,16 +46,19 @@ export default function SecretStep(props: SecretStepProps) {
defaultMessage={translate('onboarding.tutorial.with.github_action.secret.intro')}
id="onboarding.tutorial.with.github_action.secret.intro"
values={{
settings_secret: almBinding ? (
<a
href={`${buildGithubLink(almBinding, projectBinding)}/settings/secrets`}
target="_blank"
rel="noopener noreferrer">
{translate('onboarding.tutorial.with.github_action.secret.intro.link')}
</a>
) : (
translate('onboarding.tutorial.with.github_action.secret.intro.link')
)
settings_secret:
almBinding && projectBinding ? (
<a
href={`${buildGithubLink(almBinding, projectBinding)}/settings/secrets`}
target="_blank"
rel="noopener noreferrer">
{translate('onboarding.tutorial.with.github_action.secret.intro.link')}
</a>
) : (
<strong>
{translate('onboarding.tutorial.with.github_action.secret.intro.link')}
</strong>
)
}}
/>
</p>

+ 2
- 2
server/sonar-web/src/main/js/components/tutorials/github-action/__tests__/SecretStep-test.tsx Целия файл

@@ -30,7 +30,8 @@ it('should render correctly', () => {
expect(shallowRender()).toMatchSnapshot('default');
expect(
shallowRender({
almBinding: mockAlmSettingsInstance({ url: 'http://github.enterprise.com/api/v3' })
almBinding: mockAlmSettingsInstance({ url: 'http://github.enterprise.com/api/v3' }),
projectBinding: mockProjectGithubBindingResponse()
})
).toMatchSnapshot('with binding information');
});
@@ -42,7 +43,6 @@ function shallowRender(props: Partial<SecretStepProps> = {}) {
component={mockComponent()}
currentUser={mockLoggedInUser()}
onDone={jest.fn()}
projectBinding={mockProjectGithubBindingResponse()}
{...props}
/>
);

+ 3
- 1
server/sonar-web/src/main/js/components/tutorials/github-action/__tests__/__snapshots__/SecretStep-test.tsx.snap Целия файл

@@ -12,7 +12,9 @@ exports[`should render correctly: default 1`] = `
id="onboarding.tutorial.with.github_action.secret.intro"
values={
Object {
"settings_secret": "onboarding.tutorial.with.github_action.secret.intro.link",
"settings_secret": <strong>
onboarding.tutorial.with.github_action.secret.intro.link
</strong>,
}
}
/>

+ 1
- 14
server/sonar-web/src/main/js/components/tutorials/gitlabci/GitLabCITutorial.tsx Целия файл

@@ -18,12 +18,7 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
import { Alert } from 'sonar-ui-common/components/ui/Alert';
import { translate } from 'sonar-ui-common/helpers/l10n';
import {
isProjectGitLabBindingResponse,
ProjectAlmBindingResponse
} from '../../../types/alm-settings';
import EnvironmentVariablesStep from './EnvironmentVariablesStep';
import ProjectKeyStep from './ProjectKeyStep';
import { GitlabBuildTools } from './types';
@@ -39,22 +34,14 @@ export interface GitLabCITutorialProps {
baseUrl: string;
component: T.Component;
currentUser: T.LoggedInUser;
projectBinding: ProjectAlmBindingResponse;
}

export default function GitLabCITutorial(props: GitLabCITutorialProps) {
const { baseUrl, component, currentUser, projectBinding } = props;
const { baseUrl, component, currentUser } = props;

const [step, setStep] = React.useState(Steps.PROJECT_KEY);
const [buildTool, setBuildTool] = React.useState<GitlabBuildTools | undefined>();

// Failsafe; should never happen.
if (!isProjectGitLabBindingResponse(projectBinding)) {
return (
<Alert variant="error">{translate('onboarding.tutorial.with.gitlab_ci.unsupported')}</Alert>
);
}

return (
<>
<div className="page-header big-spacer-bottom">

+ 0
- 8
server/sonar-web/src/main/js/components/tutorials/gitlabci/__tests__/GitLabCITutorial-test.tsx Целия файл

@@ -19,18 +19,11 @@
*/
import { shallow } from 'enzyme';
import * as React from 'react';
import {
mockProjectGithubBindingResponse,
mockProjectGitLabBindingResponse
} from '../../../../helpers/mocks/alm-settings';
import { mockComponent, mockLoggedInUser } from '../../../../helpers/testMocks';
import GitLabCITutorial, { GitLabCITutorialProps } from '../GitLabCITutorial';

it('should render correctly', () => {
expect(shallowRender()).toMatchSnapshot();
expect(shallowRender({ projectBinding: mockProjectGithubBindingResponse() })).toMatchSnapshot(
'wrong alm'
);
});

function shallowRender(props: Partial<GitLabCITutorialProps> = {}) {
@@ -39,7 +32,6 @@ function shallowRender(props: Partial<GitLabCITutorialProps> = {}) {
baseUrl="http://localhost:9000"
component={mockComponent()}
currentUser={mockLoggedInUser()}
projectBinding={mockProjectGitLabBindingResponse()}
{...props}
/>
);

+ 0
- 8
server/sonar-web/src/main/js/components/tutorials/gitlabci/__tests__/__snapshots__/GitLabCITutorial-test.tsx.snap Целия файл

@@ -84,11 +84,3 @@ exports[`should render correctly 1`] = `
/>
</Fragment>
`;

exports[`should render correctly: wrong alm 1`] = `
<Alert
variant="error"
>
onboarding.tutorial.with.gitlab_ci.unsupported
</Alert>
`;

+ 76
- 64
server/sonar-web/src/main/js/components/tutorials/jenkins/JenkinsTutorial.tsx Целия файл

@@ -19,59 +19,52 @@
*/
import * as React from 'react';
import { connect } from 'react-redux';
import { Alert } from 'sonar-ui-common/components/ui/Alert';
import { translate } from 'sonar-ui-common/helpers/l10n';
import { getAppState, getCurrentUserSetting, Store } from '../../../store/rootReducer';
import { setCurrentUserSetting } from '../../../store/users';
import {
AlmKeys,
AlmSettingsInstance,
isProjectBitbucketBindingResponse,
isProjectBitbucketCloudBindingResponse,
isProjectGitHubBindingResponse,
isProjectGitLabBindingResponse,
ProjectAlmBindingResponse
} from '../../../types/alm-settings';
import JenkinsfileStep from './JenkinsfileStep';
import MultiBranchPipelineStep from './MultiBranchPipelineStep';
import PipelineStep from './PipelineStep';
import PreRequisitesStep from './PreRequisitesStep';
import SelectAlmStep from './SelectAlmStep';
import WebhookStep from './WebhookStep';

export interface JenkinsTutorialProps {
almBinding?: AlmSettingsInstance;
branchesEnabled: boolean;
component: T.Component;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
setCurrentUserSetting: (setting: T.CurrentUserSetting) => void;
skipPreReqs: boolean;
}

enum Steps {
PreRequisites = 0,
MultiBranchPipeline = 1,
Webhook = 2,
Jenkinsfile = 3
SelectAlm = 0,
PreRequisites = 1,
MultiBranchPipeline = 2,
Webhook = 3,
Jenkinsfile = 4
}

const USER_SETTING_SKIP_BITBUCKET_PREREQS = 'tutorials.jenkins.skipBitbucketPreReqs';

export function JenkinsTutorial(props: JenkinsTutorialProps) {
const { almBinding, branchesEnabled, component, projectBinding, skipPreReqs } = props;
const [step, setStep] = React.useState(
skipPreReqs ? Steps.MultiBranchPipeline : Steps.PreRequisites
);
const hasSelectAlmStep = projectBinding?.alm === undefined;
const [alm, setAlm] = React.useState<AlmKeys | undefined>(projectBinding?.alm);

// Failsafe; should never happen.
if (
!isProjectBitbucketCloudBindingResponse(projectBinding) &&
!isProjectBitbucketBindingResponse(projectBinding) &&
!isProjectGitHubBindingResponse(projectBinding) &&
!isProjectGitLabBindingResponse(projectBinding)
) {
return (
<Alert variant="error">{translate('onboarding.tutorial.with.jenkins.unsupported')}</Alert>
);
let startStep;
if (alm) {
startStep = skipPreReqs ? Steps.MultiBranchPipeline : Steps.PreRequisites;
} else {
startStep = Steps.SelectAlm;
}
const [step, setStep] = React.useState(startStep);

return (
<>
@@ -79,51 +72,70 @@ export function JenkinsTutorial(props: JenkinsTutorialProps) {
<h1 className="page-title">{translate('onboarding.tutorial.with.jenkins.title')}</h1>
</div>

<PreRequisitesStep
alm={projectBinding.alm}
branchesEnabled={branchesEnabled}
onDone={() => setStep(Steps.MultiBranchPipeline)}
onOpen={() => setStep(Steps.PreRequisites)}
onChangeSkipNextTime={skip => {
props.setCurrentUserSetting({
key: USER_SETTING_SKIP_BITBUCKET_PREREQS,
value: skip.toString()
});
}}
open={step === Steps.PreRequisites}
skipNextTime={skipPreReqs}
/>

{branchesEnabled ? (
<MultiBranchPipelineStep
almBinding={almBinding}
finished={step > Steps.MultiBranchPipeline}
onDone={() => setStep(Steps.Webhook)}
onOpen={() => setStep(Steps.MultiBranchPipeline)}
open={step === Steps.MultiBranchPipeline}
projectBinding={projectBinding}
/>
) : (
<PipelineStep
alm={projectBinding.alm}
finished={step > Steps.MultiBranchPipeline}
onDone={() => setStep(Steps.Webhook)}
onOpen={() => setStep(Steps.MultiBranchPipeline)}
open={step === Steps.MultiBranchPipeline}
{hasSelectAlmStep && (
<SelectAlmStep
alm={alm}
open={step === Steps.SelectAlm}
onCheck={value => {
setAlm(value);
setStep(Steps.PreRequisites);
}}
onOpen={() => setStep(Steps.SelectAlm)}
/>
)}

<WebhookStep
almBinding={almBinding}
branchesEnabled={branchesEnabled}
finished={step > Steps.Webhook}
onDone={() => setStep(Steps.Jenkinsfile)}
onOpen={() => setStep(Steps.Webhook)}
open={step === Steps.Webhook}
projectBinding={projectBinding}
/>
{alm && (
<>
<PreRequisitesStep
alm={alm}
branchesEnabled={branchesEnabled}
finished={step > Steps.PreRequisites}
onDone={() => setStep(Steps.MultiBranchPipeline)}
onOpen={() => setStep(Steps.PreRequisites)}
onChangeSkipNextTime={skip => {
props.setCurrentUserSetting({
key: USER_SETTING_SKIP_BITBUCKET_PREREQS,
value: skip.toString()
});
}}
open={step === Steps.PreRequisites}
skipNextTime={skipPreReqs}
/>

<JenkinsfileStep component={component} open={step === Steps.Jenkinsfile} />
{branchesEnabled ? (
<MultiBranchPipelineStep
alm={alm}
almBinding={almBinding}
finished={step > Steps.MultiBranchPipeline}
onDone={() => setStep(Steps.Webhook)}
onOpen={() => setStep(Steps.MultiBranchPipeline)}
open={step === Steps.MultiBranchPipeline}
projectBinding={projectBinding}
/>
) : (
<PipelineStep
alm={alm}
finished={step > Steps.MultiBranchPipeline}
onDone={() => setStep(Steps.Webhook)}
onOpen={() => setStep(Steps.MultiBranchPipeline)}
open={step === Steps.MultiBranchPipeline}
/>
)}

<WebhookStep
alm={alm}
almBinding={almBinding}
branchesEnabled={branchesEnabled}
finished={step > Steps.Webhook}
onDone={() => setStep(Steps.Jenkinsfile)}
onOpen={() => setStep(Steps.Webhook)}
open={step === Steps.Webhook}
projectBinding={projectBinding}
/>

<JenkinsfileStep component={component} open={step === Steps.Jenkinsfile} />
</>
)}
</>
);
}

+ 36
- 34
server/sonar-web/src/main/js/components/tutorials/jenkins/MultiBranchPipelineStep.tsx Целия файл

@@ -21,15 +21,9 @@ import * as React from 'react';
import { Button } from 'sonar-ui-common/components/controls/buttons';
import { translate } from 'sonar-ui-common/helpers/l10n';
import {
AlmKeys,
AlmSettingsInstance,
isProjectBitbucketBindingResponse,
isProjectBitbucketCloudBindingResponse,
isProjectGitHubBindingResponse,
isProjectGitLabBindingResponse,
ProjectBitbucketBindingResponse,
ProjectBitbucketCloudBindingResponse,
ProjectGitHubBindingResponse,
ProjectGitLabBindingResponse
ProjectAlmBindingResponse
} from '../../../types/alm-settings';
import LabelActionPair from '../components/LabelActionPair';
import LabelValuePair from '../components/LabelValuePair';
@@ -37,19 +31,14 @@ import SentenceWithHighlights from '../components/SentenceWithHighlights';
import Step from '../components/Step';
import { buildGithubLink } from '../utils';

type validBindingResponse =
| ProjectBitbucketCloudBindingResponse
| ProjectBitbucketBindingResponse
| ProjectGitHubBindingResponse
| ProjectGitLabBindingResponse;

export interface MultiBranchPipelineStepProps {
alm: AlmKeys;
almBinding?: AlmSettingsInstance;
finished: boolean;
onDone: () => void;
onOpen: () => void;
open: boolean;
projectBinding: validBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
}

/* Capture [workspaceID] from this pattern: https://bitbucket.org/[workspaceId]/ */
@@ -64,7 +53,7 @@ function extractBitbucketCloudWorkspaceId(almBinding?: AlmSettingsInstance): str
}

export default function MultiBranchPipelineStep(props: MultiBranchPipelineStepProps) {
const { almBinding, finished, open, projectBinding } = props;
const { alm, almBinding, finished, open, projectBinding } = props;

const workspaceId = extractBitbucketCloudWorkspaceId(almBinding);

@@ -88,10 +77,10 @@ export default function MultiBranchPipelineStep(props: MultiBranchPipelineStepPr
<li>
<SentenceWithHighlights
highlightKeys={['tab', 'source']}
translationKey={`onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.${projectBinding.alm}`}
translationKey={`onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.${alm}`}
/>
<ul className="list-styled">
{isProjectBitbucketBindingResponse(projectBinding) && (
{alm === AlmKeys.BitbucketServer && (
<>
<li>
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.server" />
@@ -100,20 +89,28 @@ export default function MultiBranchPipelineStep(props: MultiBranchPipelineStepPr
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.creds" />
</li>
<li>
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.owner"
value={projectBinding.repository}
/>
{projectBinding?.repository ? (
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.owner"
value={projectBinding.repository}
/>
) : (
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.owner" />
)}
</li>
<li>
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.repo"
value={projectBinding.slug}
/>
{projectBinding?.slug ? (
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.repo"
value={projectBinding.slug}
/>
) : (
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.repo" />
)}
</li>
</>
)}
{isProjectBitbucketCloudBindingResponse(projectBinding) && (
{alm === AlmKeys.BitbucketCloud && (
<>
<li>
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.server" />
@@ -132,20 +129,25 @@ export default function MultiBranchPipelineStep(props: MultiBranchPipelineStepPr
)}
</li>
<li>
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.repo"
value={projectBinding.repository}
/>
{projectBinding?.repository ? (
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.repo"
value={projectBinding.repository}
/>
) : (
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.repo" />
)}
</li>
</>
)}
{isProjectGitHubBindingResponse(projectBinding) && (
{alm === AlmKeys.GitHub && (
<>
<li>
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.github.creds" />
</li>
<li>
{almBinding !== undefined &&
projectBinding !== undefined &&
buildGithubLink(almBinding, projectBinding) !== null ? (
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.github.repo_url"
@@ -157,7 +159,7 @@ export default function MultiBranchPipelineStep(props: MultiBranchPipelineStepPr
</li>
</>
)}
{isProjectGitLabBindingResponse(projectBinding) && (
{alm === AlmKeys.GitLab && (
<>
<li>
<LabelActionPair translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.gitlab.creds" />
@@ -172,7 +174,7 @@ export default function MultiBranchPipelineStep(props: MultiBranchPipelineStepPr
)}
<li>
<LabelActionPair
translationKey={`onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.${projectBinding.alm}.behaviour`}
translationKey={`onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.${alm}.behaviour`}
/>
</li>
</ul>

+ 3
- 2
server/sonar-web/src/main/js/components/tutorials/jenkins/PreRequisitesStep.tsx Целия файл

@@ -30,6 +30,7 @@ import Step from '../components/Step';
export interface PreRequisitesStepProps {
alm: AlmKeys;
branchesEnabled: boolean;
finished: boolean;
onChangeSkipNextTime: (skip: boolean) => void;
onDone: () => void;
onOpen: () => void;
@@ -38,10 +39,10 @@ export interface PreRequisitesStepProps {
}

export default function PreRequisitesStep(props: PreRequisitesStepProps) {
const { alm, branchesEnabled, open, skipNextTime } = props;
const { alm, branchesEnabled, finished, open, skipNextTime } = props;
return (
<Step
finished={!open}
finished={finished}
onOpen={props.onOpen}
open={open}
renderForm={() => (

+ 74
- 0
server/sonar-web/src/main/js/components/tutorials/jenkins/SelectAlmStep.tsx Целия файл

@@ -0,0 +1,74 @@
/*
* SonarQube
* Copyright (C) 2009-2021 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
import * as React from 'react';
import RadioToggle from 'sonar-ui-common/components/controls/RadioToggle';
import AlertSuccessIcon from 'sonar-ui-common/components/icons/AlertSuccessIcon';
import { hasMessage, translate } from 'sonar-ui-common/helpers/l10n';
import { AlmKeys } from '../../../types/alm-settings';
import Step from '../components/Step';

export interface SelectAlmStepProps {
alm?: AlmKeys;
open: boolean;
onCheck: (value: AlmKeys) => void;
onOpen: () => void;
}

function getAlmLongName(alm: AlmKeys) {
return hasMessage('alm', alm, 'long') ? translate('alm', alm, 'long') : translate('alm', alm);
}

export default function SelectAlmStep(props: SelectAlmStepProps) {
const { alm, open } = props;
return (
<Step
finished={true}
open={open}
onOpen={props.onOpen}
renderForm={() => (
<div className="boxed-group-inner">
<RadioToggle
name="alm"
onCheck={props.onCheck}
options={[
AlmKeys.BitbucketCloud,
AlmKeys.BitbucketServer,
AlmKeys.GitHub,
AlmKeys.GitLab
].map(almKey => ({
label: getAlmLongName(almKey),
value: almKey
}))}
value={alm}
/>
</div>
)}
renderResult={() =>
alm && (
<div className="boxed-group-actions display-flex-center">
<AlertSuccessIcon className="spacer-right" />
{getAlmLongName(alm)}
</div>
)
}
stepTitle={translate('onboarding.tutorial.with.jenkins.alm_selection.title')}
/>
);
}

+ 7
- 5
server/sonar-web/src/main/js/components/tutorials/jenkins/WebhookStep.tsx Целия файл

@@ -32,23 +32,25 @@ import WebhookStepGithub from './WebhookStepGithub';
import WebhookStepGitLab from './WebhookStepGitLab';

export interface WebhookStepProps {
alm: AlmKeys;
almBinding?: AlmSettingsInstance;
branchesEnabled: boolean;
finished: boolean;
onDone: () => void;
onOpen: () => void;
open: boolean;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
}

function renderAlmSpecificInstructions(props: WebhookStepProps) {
const { almBinding, branchesEnabled, projectBinding } = props;
const { alm, almBinding, branchesEnabled, projectBinding } = props;

switch (projectBinding.alm) {
switch (alm) {
case AlmKeys.BitbucketCloud:
case AlmKeys.BitbucketServer:
return (
<WebhookStepBitbucket
alm={alm}
almBinding={almBinding}
branchesEnabled={branchesEnabled}
projectBinding={projectBinding}
@@ -73,7 +75,7 @@ function renderAlmSpecificInstructions(props: WebhookStepProps) {
}

export default function WebhookStep(props: WebhookStepProps) {
const { finished, open, projectBinding } = props;
const { alm, finished, open } = props;

return (
<Step
@@ -100,7 +102,7 @@ export default function WebhookStep(props: WebhookStepProps) {
</div>
)}
stepNumber={2}
stepTitle={translate('onboarding.tutorial.with.jenkins.webhook', projectBinding.alm, 'title')}
stepTitle={translate('onboarding.tutorial.with.jenkins.webhook', alm, 'title')}
/>
);
}

+ 20
- 20
server/sonar-web/src/main/js/components/tutorials/jenkins/WebhookStepBitbucket.tsx Целия файл

@@ -21,6 +21,7 @@ import * as React from 'react';
import { FormattedMessage } from 'react-intl';
import { Alert } from 'sonar-ui-common/components/ui/Alert';
import { translate } from 'sonar-ui-common/helpers/l10n';
import { stripTrailingSlash } from '../../../helpers/urls';
import {
AlmKeys,
AlmSettingsInstance,
@@ -29,11 +30,13 @@ import {
import CodeSnippet from '../../common/CodeSnippet';
import LabelActionPair from '../components/LabelActionPair';
import SentenceWithHighlights from '../components/SentenceWithHighlights';
import { buildBitbucketCloudLink } from '../utils';

export interface WebhookStepBitbucketProps {
alm: AlmKeys;
almBinding?: AlmSettingsInstance;
branchesEnabled: boolean;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
}

function buildUrlSnippet(
@@ -50,18 +53,21 @@ function buildUrlSnippet(
}

export default function WebhookStepBitbucket(props: WebhookStepBitbucketProps) {
const { almBinding, branchesEnabled, projectBinding } = props;
const { alm, almBinding, branchesEnabled, projectBinding } = props;

const isBitbucketCloud = projectBinding.alm === AlmKeys.BitbucketCloud;
const isBitbucketCloud = alm === AlmKeys.BitbucketCloud;

let linkUrl;
if (almBinding?.url) {
if (isBitbucketCloud) {
linkUrl =
projectBinding.repository &&
`${almBinding.url}${projectBinding.repository}/admin/addon/admin/bitbucket-webhooks/bb-webhooks-repo-admin`;
} else {
linkUrl = `${almBinding.url}/plugins/servlet/webhooks/projects/${projectBinding.repository}/repos/${projectBinding.slug}/create`;
if (almBinding?.url && projectBinding) {
if (isBitbucketCloud && projectBinding?.repository) {
linkUrl = `${buildBitbucketCloudLink(
almBinding,
projectBinding
)}/admin/addon/admin/bitbucket-webhooks/bb-webhooks-repo-admin`;
} else if (projectBinding.slug) {
linkUrl = `${stripTrailingSlash(almBinding.url)}/plugins/servlet/webhooks/projects/${
projectBinding.repository
}/repos/${projectBinding.slug}/create`;
}
}

@@ -74,18 +80,12 @@ export default function WebhookStepBitbucket(props: WebhookStepBitbucketProps) {
values={{
link: linkUrl ? (
<a href={linkUrl} rel="noopener noreferrer" target="_blank">
{translate(
'onboarding.tutorial.with.jenkins.webhook',
projectBinding.alm,
'step1.link'
)}
{translate('onboarding.tutorial.with.jenkins.webhook', alm, 'step1.link')}
</a>
) : (
translate(
'onboarding.tutorial.with.jenkins.webhook',
projectBinding.alm,
'step1.link'
)
<strong>
{translate('onboarding.tutorial.with.jenkins.webhook', alm, 'step1.link')}
</strong>
)
}}
/>

+ 6
- 3
server/sonar-web/src/main/js/components/tutorials/jenkins/WebhookStepGithub.tsx Целия файл

@@ -29,13 +29,14 @@ import { buildGithubLink } from '../utils';
export interface WebhookStepGithubProps {
almBinding?: AlmSettingsInstance;
branchesEnabled: boolean;
projectBinding: ProjectAlmBindingResponse;
projectBinding?: ProjectAlmBindingResponse;
}

export default function WebhookStepGithub(props: WebhookStepGithubProps) {
const { almBinding, branchesEnabled, projectBinding } = props;

const linkUrl = almBinding && `${buildGithubLink(almBinding, projectBinding)}/settings/hooks`;
const linkUrl =
almBinding && projectBinding && `${buildGithubLink(almBinding, projectBinding)}/settings/hooks`;

const webhookUrl = branchesEnabled
? '***JENKINS_SERVER_URL***/github-webhook/'
@@ -53,7 +54,9 @@ export default function WebhookStepGithub(props: WebhookStepGithubProps) {
{translate('onboarding.tutorial.with.jenkins.webhook.github.step1.link')}
</a>
) : (
translate('onboarding.tutorial.with.jenkins.webhook.github.step1.link')
<strong>
{translate('onboarding.tutorial.with.jenkins.webhook.github.step1.link')}
</strong>
)
}}
/>

+ 59
- 34
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/JenkinsTutorial-test.tsx Целия файл

@@ -19,66 +19,80 @@
*/
import { shallow } from 'enzyme';
import * as React from 'react';
import {
mockProjectAlmBindingResponse,
mockProjectBitbucketBindingResponse
} from '../../../../helpers/mocks/alm-settings';
import { mockProjectBitbucketBindingResponse } from '../../../../helpers/mocks/alm-settings';
import { mockComponent } from '../../../../helpers/testMocks';
import { AlmKeys } from '../../../../types/alm-settings';
import JenkinsfileStep from '../JenkinsfileStep';
import { JenkinsTutorial, JenkinsTutorialProps } from '../JenkinsTutorial';
import MultiBranchPipelineStep from '../MultiBranchPipelineStep';
import PreRequisitesStep from '../PreRequisitesStep';
import SelectAlmStep from '../SelectAlmStep';
import WebhookStep from '../WebhookStep';

it('should render correctly', () => {
expect(shallowRender()).toMatchSnapshot('default');
expect(shallowRender({ branchesEnabled: false })).toMatchSnapshot('branches not enabled');
expect(
shallowRender({ projectBinding: mockProjectAlmBindingResponse({ alm: AlmKeys.Azure }) })
).toMatchSnapshot('unsupported alm');
expect(shallowRender({ projectBinding: undefined })).toMatchSnapshot('no project binding');
});

it('should correctly navigate between steps', () => {
const wrapper = shallowRender();

expect(wrapper.find(PreRequisitesStep).prop('open')).toBe(true);
expect(wrapper.find(MultiBranchPipelineStep).prop('open')).toBe(false);
expect(wrapper.find(WebhookStep).prop('open')).toBe(false);
expect(wrapper.find(JenkinsfileStep).prop('open')).toBe(false);
expect(wrapper.find(PreRequisitesStep).props().open).toBe(true);
expect(wrapper.find(MultiBranchPipelineStep).props().open).toBe(false);
expect(wrapper.find(WebhookStep).props().open).toBe(false);
expect(wrapper.find(JenkinsfileStep).props().open).toBe(false);

// Pre-reqs done.
wrapper.find(PreRequisitesStep).prop('onDone')();
expect(wrapper.find(PreRequisitesStep).prop('open')).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).prop('open')).toBe(true);
expect(wrapper.find(WebhookStep).prop('open')).toBe(false);
expect(wrapper.find(JenkinsfileStep).prop('open')).toBe(false);
wrapper
.find(PreRequisitesStep)
.props()
.onDone();
expect(wrapper.find(PreRequisitesStep).props().open).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).props().open).toBe(true);
expect(wrapper.find(WebhookStep).props().open).toBe(false);
expect(wrapper.find(JenkinsfileStep).props().open).toBe(false);

// Multibranch done.
wrapper.find(MultiBranchPipelineStep).prop('onDone')();
expect(wrapper.find(PreRequisitesStep).prop('open')).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).prop('open')).toBe(false);
expect(wrapper.find(WebhookStep).prop('open')).toBe(true);
expect(wrapper.find(JenkinsfileStep).prop('open')).toBe(false);
wrapper
.find(MultiBranchPipelineStep)
.props()
.onDone();
expect(wrapper.find(PreRequisitesStep).props().open).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).props().open).toBe(false);
expect(wrapper.find(WebhookStep).props().open).toBe(true);
expect(wrapper.find(JenkinsfileStep).props().open).toBe(false);

// Webhook done.
wrapper.find(WebhookStep).prop('onDone')();
expect(wrapper.find(PreRequisitesStep).prop('open')).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).prop('open')).toBe(false);
expect(wrapper.find(WebhookStep).prop('open')).toBe(false);
expect(wrapper.find(JenkinsfileStep).prop('open')).toBe(true);
wrapper
.find(WebhookStep)
.props()
.onDone();
expect(wrapper.find(PreRequisitesStep).props().open).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).props().open).toBe(false);
expect(wrapper.find(WebhookStep).props().open).toBe(false);
expect(wrapper.find(JenkinsfileStep).props().open).toBe(true);

// Open Pre-reqs.
wrapper.find(PreRequisitesStep).prop('onOpen')();
expect(wrapper.find(PreRequisitesStep).prop('open')).toBe(true);
wrapper
.find(PreRequisitesStep)
.props()
.onOpen();
expect(wrapper.find(PreRequisitesStep).props().open).toBe(true);

// Open Multibranch.
wrapper.find(MultiBranchPipelineStep).prop('onOpen')();
expect(wrapper.find(MultiBranchPipelineStep).prop('open')).toBe(true);
wrapper
.find(MultiBranchPipelineStep)
.props()
.onOpen();
expect(wrapper.find(MultiBranchPipelineStep).props().open).toBe(true);

// Open Webhook.
wrapper.find(WebhookStep).prop('onOpen')();
expect(wrapper.find(WebhookStep).prop('open')).toBe(true);
wrapper
.find(WebhookStep)
.props()
.onOpen();
expect(wrapper.find(WebhookStep).props().open).toBe(true);
});

it('should correctly store the user setting', () => {
@@ -100,8 +114,19 @@ it('should correctly store the user setting', () => {

it('should correctly skip the pre-reqs step if the user requested it', () => {
const wrapper = shallowRender({ skipPreReqs: true });
expect(wrapper.find(PreRequisitesStep).prop('open')).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).prop('open')).toBe(true);
expect(wrapper.find(PreRequisitesStep).props().open).toBe(false);
expect(wrapper.find(MultiBranchPipelineStep).props().open).toBe(true);
});

it('should correctly select an ALM if no project is bound', () => {
const wrapper = shallowRender({ projectBinding: undefined });
expect(wrapper.find(PreRequisitesStep).exists()).toBe(false);
wrapper
.find(SelectAlmStep)
.props()
.onCheck(AlmKeys.BitbucketCloud);
expect(wrapper.find(SelectAlmStep).props().open).toBe(false);
expect(wrapper.find(PreRequisitesStep).exists()).toBe(true);
});

function shallowRender(props: Partial<JenkinsTutorialProps> = {}) {

+ 25
- 1
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/MultiBranchPipelineStep-test.tsx Целия файл

@@ -26,6 +26,7 @@ import {
mockProjectGithubBindingResponse,
mockProjectGitLabBindingResponse
} from '../../../../helpers/mocks/alm-settings';
import { AlmKeys } from '../../../../types/alm-settings';
import MultiBranchPipelineStep, { MultiBranchPipelineStepProps } from '../MultiBranchPipelineStep';
import { renderStepContent } from '../test-utils';

@@ -33,9 +34,13 @@ it('should render correctly', () => {
const wrapper = shallowRender();
expect(wrapper).toMatchSnapshot('Step wrapper');
expect(renderStepContent(wrapper)).toMatchSnapshot('content for bitbucket');
expect(renderStepContent(shallowRender({ projectBinding: undefined }))).toMatchSnapshot(
'content for bitbucket, no binding'
);
expect(
renderStepContent(
shallowRender({
alm: AlmKeys.BitbucketCloud,
almBinding: mockAlmSettingsInstance({ url: 'https://bitbucket.org/workspaceId/' }),
projectBinding: mockProjectBitbucketCloudBindingResponse()
})
@@ -44,19 +49,38 @@ it('should render correctly', () => {
expect(
renderStepContent(
shallowRender({
alm: AlmKeys.BitbucketCloud,
projectBinding: undefined
})
)
).toMatchSnapshot('content for bitbucket cloud, no binding');
expect(
renderStepContent(
shallowRender({
alm: AlmKeys.GitHub,
almBinding: mockAlmSettingsInstance({ url: 'https://api.github.com/' }),
projectBinding: mockProjectGithubBindingResponse()
})
)
).toMatchSnapshot('content for github');
expect(
renderStepContent(shallowRender({ projectBinding: mockProjectGitLabBindingResponse() }))
renderStepContent(
shallowRender({
alm: AlmKeys.GitHub
})
)
).toMatchSnapshot('content for github, no binding');
expect(
renderStepContent(
shallowRender({ alm: AlmKeys.GitLab, projectBinding: mockProjectGitLabBindingResponse() })
)
).toMatchSnapshot('content for gitlab');
});

function shallowRender(props: Partial<MultiBranchPipelineStepProps> = {}) {
return shallow<MultiBranchPipelineStepProps>(
<MultiBranchPipelineStep
alm={AlmKeys.BitbucketServer}
finished={false}
onDone={jest.fn()}
onOpen={jest.fn()}

+ 1
- 0
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/PreRequisitesStep-test.tsx Целия файл

@@ -41,6 +41,7 @@ function shallowRender(props: Partial<PreRequisitesStepProps> = {}) {
<PreRequisitesStep
alm={AlmKeys.BitbucketServer}
branchesEnabled={true}
finished={false}
onChangeSkipNextTime={jest.fn()}
onDone={jest.fn()}
onOpen={jest.fn()}

+ 62
- 0
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/SelectAlmStep-test.tsx Целия файл

@@ -0,0 +1,62 @@
/*
* SonarQube
* Copyright (C) 2009-2021 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

import { shallow } from 'enzyme';
import * as React from 'react';
import { AlmKeys } from '../../../../types/alm-settings';
import Step from '../../components/Step';
import SelectAlmStep, { SelectAlmStepProps } from '../SelectAlmStep';

jest.mock('sonar-ui-common/helpers/l10n', () => ({
hasMessage: (_a: string, k: string, _b: string) => k === AlmKeys.BitbucketCloud,
translate: (...k: string[]) => k.join('.')
}));

it('should render correctly', () => {
expect(shallowRender()).toMatchSnapshot('default');
expect(
shallowRender()
.find(Step)
.props()
.renderForm()
).toMatchSnapshot('form, default');
expect(
shallowRender({ alm: AlmKeys.Azure })
.find(Step)
.props()
.renderForm()
).toMatchSnapshot('form, with alm');
expect(
shallowRender()
.find(Step)
.props().renderResult!()
).toBeUndefined();
expect(
shallowRender({ alm: AlmKeys.BitbucketCloud })
.find(Step)
.props().renderResult!()
).toMatchSnapshot('result, with alm');
});

function shallowRender(props: Partial<SelectAlmStepProps> = {}) {
return shallow<SelectAlmStepProps>(
<SelectAlmStep onCheck={jest.fn()} onOpen={jest.fn()} open={true} {...props} />
);
}

+ 3
- 2
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/WebhookStep-test.tsx Целия файл

@@ -36,8 +36,8 @@ it.each([
[AlmKeys.BitbucketServer, mockProjectBitbucketBindingResponse()],
[AlmKeys.GitHub, mockProjectGithubBindingResponse()],
[AlmKeys.GitLab, mockProjectAlmBindingResponse({ alm: AlmKeys.GitLab })]
])('it should render correctly for %s', (_, projectBinding) => {
const wrapper = shallowRender({ projectBinding });
])('it should render correctly for %s', (alm, projectBinding) => {
const wrapper = shallowRender({ alm, projectBinding });
expect(wrapper).toMatchSnapshot('wrapper');
expect(renderStepContent(wrapper)).toMatchSnapshot('content');
});
@@ -45,6 +45,7 @@ it.each([
function shallowRender(props: Partial<WebhookStepProps> = {}) {
return shallow<WebhookStepProps>(
<WebhookStep
alm={AlmKeys.BitbucketServer}
almBinding={mockAlmSettingsInstance()}
branchesEnabled={true}
finished={false}

+ 18
- 9
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/WebhookStepBitbucket-test.tsx Целия файл

@@ -24,25 +24,34 @@ import {
mockProjectBitbucketBindingResponse,
mockProjectBitbucketCloudBindingResponse
} from '../../../../helpers/mocks/alm-settings';
import { AlmKeys } from '../../../../types/alm-settings';
import WebhookStepBitbucket, { WebhookStepBitbucketProps } from '../WebhookStepBitbucket';

it.each([
['bitbucket server', mockProjectBitbucketBindingResponse()],
['bitbucket cloud', mockProjectBitbucketCloudBindingResponse()]
])('should render correctly for %s', (_name, projectBinding) => {
expect(shallowRender({ projectBinding })).toMatchSnapshot();
expect(shallowRender({ projectBinding, almBinding: undefined })).toMatchSnapshot(
[
AlmKeys.BitbucketServer,
mockProjectBitbucketBindingResponse(),
mockAlmSettingsInstance({ url: 'http://bbs.enterprise.com' })
],
[
AlmKeys.BitbucketCloud,
mockProjectBitbucketCloudBindingResponse(),
mockAlmSettingsInstance({ url: 'http://bitbucket.org/workspace/' })
]
])('should render correctly for %s', (alm, projectBinding, almBinding) => {
expect(shallowRender({ alm, projectBinding, almBinding })).toMatchSnapshot();
expect(shallowRender({ alm, projectBinding, almBinding: undefined })).toMatchSnapshot(
'with no alm binding'
);
expect(shallowRender({ projectBinding, branchesEnabled: false })).toMatchSnapshot(
'with branches disabled'
);
expect(
shallowRender({ alm, projectBinding, almBinding, branchesEnabled: false })
).toMatchSnapshot('with branches disabled');
});

function shallowRender(props: Partial<WebhookStepBitbucketProps> = {}) {
return shallow<WebhookStepBitbucketProps>(
<WebhookStepBitbucket
almBinding={mockAlmSettingsInstance({ url: 'http://bbs.enterprise.com' })}
alm={AlmKeys.BitbucketServer}
branchesEnabled={true}
projectBinding={mockProjectBitbucketBindingResponse()}
{...props}

+ 22
- 6
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/JenkinsTutorial-test.tsx.snap Целия файл

@@ -14,6 +14,7 @@ exports[`should render correctly: branches not enabled 1`] = `
<PreRequisitesStep
alm="bitbucket"
branchesEnabled={false}
finished={false}
onChangeSkipNextTime={[Function]}
onDone={[Function]}
onOpen={[Function]}
@@ -28,6 +29,7 @@ exports[`should render correctly: branches not enabled 1`] = `
open={false}
/>
<WebhookStep
alm="bitbucket"
branchesEnabled={false}
finished={false}
onDone={[Function]}
@@ -85,6 +87,7 @@ exports[`should render correctly: default 1`] = `
<PreRequisitesStep
alm="bitbucket"
branchesEnabled={true}
finished={false}
onChangeSkipNextTime={[Function]}
onDone={[Function]}
onOpen={[Function]}
@@ -92,6 +95,7 @@ exports[`should render correctly: default 1`] = `
skipNextTime={false}
/>
<MultiBranchPipelineStep
alm="bitbucket"
finished={false}
onDone={[Function]}
onOpen={[Function]}
@@ -107,6 +111,7 @@ exports[`should render correctly: default 1`] = `
}
/>
<WebhookStep
alm="bitbucket"
branchesEnabled={true}
finished={false}
onDone={[Function]}
@@ -150,10 +155,21 @@ exports[`should render correctly: default 1`] = `
</Fragment>
`;

exports[`should render correctly: unsupported alm 1`] = `
<Alert
variant="error"
>
onboarding.tutorial.with.jenkins.unsupported
</Alert>
exports[`should render correctly: no project binding 1`] = `
<Fragment>
<div
className="page-header big-spacer-bottom"
>
<h1
className="page-title"
>
onboarding.tutorial.with.jenkins.title
</h1>
</div>
<SelectAlmStep
onCheck={[Function]}
onOpen={[Function]}
open={true}
/>
</Fragment>
`;

+ 330
- 1
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/MultiBranchPipelineStep-test.tsx.snap Целия файл

@@ -182,7 +182,120 @@ exports[`should render correctly: content for bitbucket cloud 1`] = `
<li>
<LabelValuePair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.repo"
value="PROJECT_KEY"
value="repo-slug"
/>
</li>
</React.Fragment>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.behaviour"
/>
</li>
</ul>
<p
className="big-spacer-left padder-left"
>
onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.leave_defaults
</p>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"tab",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3.mode"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3.script_path"
/>
</li>
</ul>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"save",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step4"
/>
</li>
</ol>
<Button
onClick={[MockFunction]}
>
continue
</Button>
</div>
`;

exports[`should render correctly: content for bitbucket cloud, no binding 1`] = `
<div
className="boxed-group-inner"
>
<p
className="big-spacer-bottom"
>
onboarding.tutorial.with.jenkins.multi_branch_pipeline.intro
</p>
<ol
className="list-styled"
>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"new_item",
"type",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step1"
/>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"tab",
"source",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud"
/>
<ul
className="list-styled"
>
<React.Fragment>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.server"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.creds"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.owner"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucketcloud.repo"
/>
</li>
</React.Fragment>
@@ -241,6 +354,119 @@ exports[`should render correctly: content for bitbucket cloud 1`] = `
</div>
`;

exports[`should render correctly: content for bitbucket, no binding 1`] = `
<div
className="boxed-group-inner"
>
<p
className="big-spacer-bottom"
>
onboarding.tutorial.with.jenkins.multi_branch_pipeline.intro
</p>
<ol
className="list-styled"
>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"new_item",
"type",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step1"
/>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"tab",
"source",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket"
/>
<ul
className="list-styled"
>
<React.Fragment>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.server"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.creds"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.owner"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.repo"
/>
</li>
</React.Fragment>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.bitbucket.behaviour"
/>
</li>
</ul>
<p
className="big-spacer-left padder-left"
>
onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.leave_defaults
</p>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"tab",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3.mode"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3.script_path"
/>
</li>
</ul>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"save",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step4"
/>
</li>
</ol>
<Button
onClick={[MockFunction]}
>
continue
</Button>
</div>
`;

exports[`should render correctly: content for github 1`] = `
<div
className="boxed-group-inner"
@@ -345,6 +571,109 @@ exports[`should render correctly: content for github 1`] = `
</div>
`;

exports[`should render correctly: content for github, no binding 1`] = `
<div
className="boxed-group-inner"
>
<p
className="big-spacer-bottom"
>
onboarding.tutorial.with.jenkins.multi_branch_pipeline.intro
</p>
<ol
className="list-styled"
>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"new_item",
"type",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step1"
/>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"tab",
"source",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.github"
/>
<ul
className="list-styled"
>
<React.Fragment>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.github.creds"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.github.repo_url"
/>
</li>
</React.Fragment>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.github.behaviour"
/>
</li>
</ul>
<p
className="big-spacer-left padder-left"
>
onboarding.tutorial.with.jenkins.multi_branch_pipeline.step2.leave_defaults
</p>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"tab",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3.mode"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step3.script_path"
/>
</li>
</ul>
</li>
<li>
<SentenceWithHighlights
highlightKeys={
Array [
"save",
]
}
translationKey="onboarding.tutorial.with.jenkins.multi_branch_pipeline.step4"
/>
</li>
</ol>
<Button
onClick={[MockFunction]}
>
continue
</Button>
</div>
`;

exports[`should render correctly: content for gitlab 1`] = `
<div
className="boxed-group-inner"

+ 1
- 1
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/PreRequisitesStep-test.tsx.snap Целия файл

@@ -2,7 +2,7 @@

exports[`should render correctly: Step wrapper 1`] = `
<Step
finished={true}
finished={false}
onOpen={[MockFunction]}
open={false}
renderForm={[Function]}

+ 89
- 0
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/SelectAlmStep-test.tsx.snap Целия файл

@@ -0,0 +1,89 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should render correctly: default 1`] = `
<Step
finished={true}
onOpen={[MockFunction]}
open={true}
renderForm={[Function]}
renderResult={[Function]}
stepTitle="onboarding.tutorial.with.jenkins.alm_selection.title"
/>
`;

exports[`should render correctly: form, default 1`] = `
<div
className="boxed-group-inner"
>
<RadioToggle
disabled={false}
name="alm"
onCheck={[MockFunction]}
options={
Array [
Object {
"label": "alm.bitbucketcloud.long",
"value": "bitbucketcloud",
},
Object {
"label": "alm.bitbucket",
"value": "bitbucket",
},
Object {
"label": "alm.github",
"value": "github",
},
Object {
"label": "alm.gitlab",
"value": "gitlab",
},
]
}
value={null}
/>
</div>
`;

exports[`should render correctly: form, with alm 1`] = `
<div
className="boxed-group-inner"
>
<RadioToggle
disabled={false}
name="alm"
onCheck={[MockFunction]}
options={
Array [
Object {
"label": "alm.bitbucketcloud.long",
"value": "bitbucketcloud",
},
Object {
"label": "alm.bitbucket",
"value": "bitbucket",
},
Object {
"label": "alm.github",
"value": "github",
},
Object {
"label": "alm.gitlab",
"value": "gitlab",
},
]
}
value="azure"
/>
</div>
`;

exports[`should render correctly: result, with alm 1`] = `
<div
className="boxed-group-actions display-flex-center"
>
<AlertSuccessIcon
className="spacer-right"
/>
alm.bitbucketcloud.long
</div>
`;

+ 3
- 2
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/WebhookStep-test.tsx.snap Целия файл

@@ -68,6 +68,7 @@ exports[`it should render correctly for bitbucket: content 1`] = `
className="list-styled"
>
<WebhookStepBitbucket
alm="bitbucket"
almBinding={
Object {
"alm": "github",
@@ -130,6 +131,7 @@ exports[`it should render correctly for bitbucketcloud: content 1`] = `
className="list-styled"
>
<WebhookStepBitbucket
alm="bitbucketcloud"
almBinding={
Object {
"alm": "github",
@@ -142,8 +144,7 @@ exports[`it should render correctly for bitbucketcloud: content 1`] = `
"alm": "bitbucketcloud",
"key": "foo",
"monorepo": true,
"repository": "PROJECT_KEY",
"slug": "repo-slug",
"repository": "repo-slug",
}
}
/>

+ 71
- 67
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/WebhookStepBitbucket-test.tsx.snap Целия файл

@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`should render correctly for bitbucket cloud 1`] = `
exports[`should render correctly for bitbucket 1`] = `
<Fragment>
<li>
<FormattedMessage
@@ -9,11 +9,11 @@ exports[`should render correctly for bitbucket cloud 1`] = `
values={
Object {
"link": <a
href="http://bbs.enterprise.comPROJECT_KEY/admin/addon/admin/bitbucket-webhooks/bb-webhooks-repo-admin"
href="http://bbs.enterprise.com/plugins/servlet/webhooks/projects/PROJECT_KEY/repos/repo-slug/create"
rel="noopener noreferrer"
target="_blank"
>
onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step1.link
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.link
</a>,
}
}
@@ -36,8 +36,13 @@ exports[`should render correctly for bitbucket cloud 1`] = `
</p>
<CodeSnippet
isOneLine={true}
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify"
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify?server_url=http://bbs.enterprise.com"
/>
<Alert
variant="info"
>
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.url.warning
</Alert>
</li>
</ul>
</li>
@@ -45,23 +50,22 @@ exports[`should render correctly for bitbucket cloud 1`] = `
<SentenceWithHighlights
highlightKeys={
Array [
"triggers",
"option",
"events",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.repo"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.repo"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.pr"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.pr"
/>
</li>
</ul>
@@ -70,16 +74,16 @@ exports[`should render correctly for bitbucket cloud 1`] = `
<SentenceWithHighlights
highlightKeys={
Array [
"save",
"create",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step3"
translationKey="onboarding.tutorial.with.jenkins.webhook.step3"
/>
</li>
</Fragment>
`;

exports[`should render correctly for bitbucket cloud: with branches disabled 1`] = `
exports[`should render correctly for bitbucket: with branches disabled 1`] = `
<Fragment>
<li>
<FormattedMessage
@@ -88,11 +92,11 @@ exports[`should render correctly for bitbucket cloud: with branches disabled 1`]
values={
Object {
"link": <a
href="http://bbs.enterprise.comPROJECT_KEY/admin/addon/admin/bitbucket-webhooks/bb-webhooks-repo-admin"
href="http://bbs.enterprise.com/plugins/servlet/webhooks/projects/PROJECT_KEY/repos/repo-slug/create"
rel="noopener noreferrer"
target="_blank"
>
onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step1.link
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.link
</a>,
}
}
@@ -124,18 +128,17 @@ exports[`should render correctly for bitbucket cloud: with branches disabled 1`]
<SentenceWithHighlights
highlightKeys={
Array [
"triggers",
"option",
"events",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.repo"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.repo"
/>
</li>
</ul>
@@ -144,16 +147,16 @@ exports[`should render correctly for bitbucket cloud: with branches disabled 1`]
<SentenceWithHighlights
highlightKeys={
Array [
"save",
"create",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step3"
translationKey="onboarding.tutorial.with.jenkins.webhook.step3"
/>
</li>
</Fragment>
`;

exports[`should render correctly for bitbucket cloud: with no alm binding 1`] = `
exports[`should render correctly for bitbucket: with no alm binding 1`] = `
<Fragment>
<li>
<FormattedMessage
@@ -161,7 +164,9 @@ exports[`should render correctly for bitbucket cloud: with no alm binding 1`] =
id="onboarding.tutorial.with.jenkins.webhook.step1.sentence"
values={
Object {
"link": "onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step1.link",
"link": <strong>
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.link
</strong>,
}
}
/>
@@ -183,8 +188,13 @@ exports[`should render correctly for bitbucket cloud: with no alm binding 1`] =
</p>
<CodeSnippet
isOneLine={true}
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify"
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify?server_url=***BITBUCKET_URL***"
/>
<Alert
variant="info"
>
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.url.warning
</Alert>
</li>
</ul>
</li>
@@ -192,23 +202,22 @@ exports[`should render correctly for bitbucket cloud: with no alm binding 1`] =
<SentenceWithHighlights
highlightKeys={
Array [
"triggers",
"option",
"events",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.repo"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.repo"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.pr"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.pr"
/>
</li>
</ul>
@@ -217,16 +226,16 @@ exports[`should render correctly for bitbucket cloud: with no alm binding 1`] =
<SentenceWithHighlights
highlightKeys={
Array [
"save",
"create",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step3"
translationKey="onboarding.tutorial.with.jenkins.webhook.step3"
/>
</li>
</Fragment>
`;

exports[`should render correctly for bitbucket server 1`] = `
exports[`should render correctly for bitbucketcloud 1`] = `
<Fragment>
<li>
<FormattedMessage
@@ -235,11 +244,11 @@ exports[`should render correctly for bitbucket server 1`] = `
values={
Object {
"link": <a
href="http://bbs.enterprise.com/plugins/servlet/webhooks/projects/PROJECT_KEY/repos/repo-slug/create"
href="http://bitbucket.org/workspace/repo-slug/admin/addon/admin/bitbucket-webhooks/bb-webhooks-repo-admin"
rel="noopener noreferrer"
target="_blank"
>
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.link
onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step1.link
</a>,
}
}
@@ -262,13 +271,8 @@ exports[`should render correctly for bitbucket server 1`] = `
</p>
<CodeSnippet
isOneLine={true}
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify?server_url=http://bbs.enterprise.com"
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify"
/>
<Alert
variant="info"
>
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.url.warning
</Alert>
</li>
</ul>
</li>
@@ -276,22 +280,23 @@ exports[`should render correctly for bitbucket server 1`] = `
<SentenceWithHighlights
highlightKeys={
Array [
"events",
"triggers",
"option",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.repo"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.repo"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.pr"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.pr"
/>
</li>
</ul>
@@ -300,16 +305,16 @@ exports[`should render correctly for bitbucket server 1`] = `
<SentenceWithHighlights
highlightKeys={
Array [
"create",
"save",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.step3"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step3"
/>
</li>
</Fragment>
`;

exports[`should render correctly for bitbucket server: with branches disabled 1`] = `
exports[`should render correctly for bitbucketcloud: with branches disabled 1`] = `
<Fragment>
<li>
<FormattedMessage
@@ -318,11 +323,11 @@ exports[`should render correctly for bitbucket server: with branches disabled 1`
values={
Object {
"link": <a
href="http://bbs.enterprise.com/plugins/servlet/webhooks/projects/PROJECT_KEY/repos/repo-slug/create"
href="http://bitbucket.org/workspace/repo-slug/admin/addon/admin/bitbucket-webhooks/bb-webhooks-repo-admin"
rel="noopener noreferrer"
target="_blank"
>
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.link
onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step1.link
</a>,
}
}
@@ -354,17 +359,18 @@ exports[`should render correctly for bitbucket server: with branches disabled 1`
<SentenceWithHighlights
highlightKeys={
Array [
"events",
"triggers",
"option",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.repo"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.repo"
/>
</li>
</ul>
@@ -373,16 +379,16 @@ exports[`should render correctly for bitbucket server: with branches disabled 1`
<SentenceWithHighlights
highlightKeys={
Array [
"create",
"save",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.step3"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step3"
/>
</li>
</Fragment>
`;

exports[`should render correctly for bitbucket server: with no alm binding 1`] = `
exports[`should render correctly for bitbucketcloud: with no alm binding 1`] = `
<Fragment>
<li>
<FormattedMessage
@@ -390,7 +396,9 @@ exports[`should render correctly for bitbucket server: with no alm binding 1`] =
id="onboarding.tutorial.with.jenkins.webhook.step1.sentence"
values={
Object {
"link": "onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.link",
"link": <strong>
onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step1.link
</strong>,
}
}
/>
@@ -412,13 +420,8 @@ exports[`should render correctly for bitbucket server: with no alm binding 1`] =
</p>
<CodeSnippet
isOneLine={true}
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify?server_url=***BITBUCKET_URL***"
snippet="***JENKINS_SERVER_URL***/bitbucket-scmsource-hook/notify"
/>
<Alert
variant="info"
>
onboarding.tutorial.with.jenkins.webhook.bitbucket.step1.url.warning
</Alert>
</li>
</ul>
</li>
@@ -426,22 +429,23 @@ exports[`should render correctly for bitbucket server: with no alm binding 1`] =
<SentenceWithHighlights
highlightKeys={
Array [
"events",
"triggers",
"option",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2"
/>
<ul
className="list-styled"
>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.repo"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.repo"
/>
</li>
<li>
<LabelActionPair
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucket.step2.pr"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step2.pr"
/>
</li>
</ul>
@@ -450,10 +454,10 @@ exports[`should render correctly for bitbucket server: with no alm binding 1`] =
<SentenceWithHighlights
highlightKeys={
Array [
"create",
"save",
]
}
translationKey="onboarding.tutorial.with.jenkins.webhook.step3"
translationKey="onboarding.tutorial.with.jenkins.webhook.bitbucketcloud.step3"
/>
</li>
</Fragment>

+ 3
- 1
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/WebhookStepGithub-test.tsx.snap Целия файл

@@ -151,7 +151,9 @@ exports[`should render correctly: with no alm binding 1`] = `
id="onboarding.tutorial.with.jenkins.webhook.step1.sentence"
values={
Object {
"link": "onboarding.tutorial.with.jenkins.webhook.github.step1.link",
"link": <strong>
onboarding.tutorial.with.jenkins.webhook.github.step1.link
</strong>,
}
}
/>

+ 11
- 0
server/sonar-web/src/main/js/components/tutorials/utils.ts Целия файл

@@ -69,3 +69,14 @@ export function buildGithubLink(

return `${stripTrailingSlash(urlRoot)}/${projectBinding.repository}`;
}

export function buildBitbucketCloudLink(
almBinding: AlmSettingsInstance,
projectBinding: ProjectAlmBindingResponse
) {
if (almBinding.url === undefined || projectBinding.repository === undefined) {
return null;
}

return `${stripTrailingSlash(almBinding.url)}/${projectBinding.repository}`;
}

+ 1
- 2
server/sonar-web/src/main/js/helpers/mocks/alm-settings.ts Целия файл

@@ -144,8 +144,7 @@ export function mockProjectBitbucketCloudBindingResponse(
return {
alm: AlmKeys.BitbucketCloud,
key: 'foo',
repository: 'PROJECT_KEY',
slug: 'repo-slug',
repository: 'repo-slug',
monorepo: true,
...overrides
};

+ 1
- 1
sonar-application/build.gradle Целия файл

@@ -220,7 +220,7 @@ zip.doFirst {
}
// Check the size of the archive
zip.doLast {
def minLength = 270000000
def minLength = 260000000
def maxLength = 290000000

def length = archiveFile.get().asFile.length()

+ 0
- 0
sonar-core/src/main/resources/org/sonar/l10n/core.properties Целия файл


Някои файлове не бяха показани, защото твърде много файлове са промени

Loading…
Отказ
Запис