From 0481d4ff7d1ce6f6b27bb0191c99ef032ef1c701 Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <70532144+arseniy-sonar@users.noreply.github.com> Date: Fri, 19 Feb 2021 16:54:29 +0100 Subject: [PATCH] Add the flow-charts and remarks to the documentation. (#43) --- README.adoc | 92 ++++++++++++++++++++++++++---------------- img/RSPEC-flow-1.png | Bin 0 -> 22773 bytes img/RSPEC-flow-2.png | Bin 0 -> 22934 bytes img/RSPEC-flow.drawio | 1 + 4 files changed, 58 insertions(+), 35 deletions(-) create mode 100644 img/RSPEC-flow-1.png create mode 100644 img/RSPEC-flow-2.png create mode 100644 img/RSPEC-flow.drawio diff --git a/README.adoc b/README.adoc index dab0570a5d..028b6ce62e 100644 --- a/README.adoc +++ b/README.adoc @@ -1,73 +1,76 @@ +ifdef::env-github[] +:warning-caption: :warning: +:note-caption: :information_source: +endif::[] = SonarSource Rule Specification repository -This repository contains the specification of every static analysis rule available in SonarLint, SonarCloud and SonarQube. +This repository contains the specification of every static-analysis rule available in SonarLint, SonarCloud, or SonarQube. It also contains rules which have been dropped and rules which will one day be implemented. -WARNING: **Beta status**: -This repository is not used yet in production. The current source of truth remains the https://jira.sonarsource.com/issues/?jql=project%20%3D%20RSPEC[Rule Respository project in Jira]. **Don't create rules in this repository for now**. See <> for more information. +WARNING: **Beta status**: This repository is not used yet in production. The current source of truth remains the https://jira.sonarsource.com/issues/?jql=project%20%3D%20RSPEC[Rule Respository project in Jira]. **Do not create rules in this repository for now**. See <> for more information. == Rules directory structure * https://github.com/SonarSource/rspec/tree/master/rules[rules] directory: contains every specified rule. ** `rules/Sxxxx`: contains every specification for rule `Sxxxx`. -*** `rules/Sxxxx/*.adoc`: Asciidoc files which can be shared/included by multiple languages. -*** `rules/Sxxxx//metadata.json`: rule metadata which are shared between rules. Each language can override fields in its own `metadata.json` file. -*** `rules/Sxxxx/[LANGUAGE]`: contains specifications specific to a given language. `[LANGUAGE]` can be `java`, `cfamily`, `python`... -**** `rules/Sxxxx/[LANGUAGE]/rule.adoc`: asciidoc file used to generate the rule description for programming language `[LANGUAGE]`. It can include parts from `*.adoc` files located in the parent directory. +*** `rules/Sxxxx/*.adoc`: Asciidoc files which can be reused by multiple language-specific descriptions. +*** `rules/Sxxxx/metadata.json`: rule metadata shared between language-specific RSPECs. Each language can override fields in its own `metadata.json` file. +*** `rules/Sxxxx/[LANGUAGE]`: contains the language-specific RSPEC. `[LANGUAGE]` can be `java`, `cfamily`, `python`... +**** `rules/Sxxxx/[LANGUAGE]/rule.adoc`: asciidoc file used to generate the `Sxxxx` rule description for programming language `[LANGUAGE]`. It can include parts from `*.adoc` files located in the parent directory. **** `rules/Sxxxx/[LANGUAGE]/metadata.json`: metadatas for the specific language. Each key at the top will completely override the key of the `metadata.json` file of the parent directory. == Search rules -Go to the https://sonarsource.github.io/rspec/#/[Search Page] to find rules which have already been merged in the Master branch. +Go to the https://sonarsource.github.io/rspec/#/[Search Page] to find the rules that have already been merged in the `master` branch. -Go the the Github Pull Request tab to find rules which have not been merged yet. +Go the the GitHub https://github.com/SonarSource/rspec/pulls[pull-request] tab to find the rules that have not been merged yet. == Create or modify a rule Jira currently contains both implemented and unimplemented rules. This is why the `rules` directory contains both too. -However one of the reasons we are migrating to a git repository is that we want to have a clean process and history for rule creation and modification. Thus every newly created rule should follow the this workflow: +However, one of the reasons we are migrating to a git repository is that we want to have a clean process and history for rule creation and modification. Thus every newly created rule should follow this workflow: -=== 1. Create a Pull Request +=== 1. Create a pull request ==== For a new rule -* go to the https://github.com/SonarSource/rspec/actions/workflows/create_new_rspec.yml[Create new RSPEC] github action +* go to the https://github.com/SonarSource/rspec/actions/workflows/create_new_rspec.yml[Create new RSPEC] GitHub action * click on the grey _Run wokflow_ button. * in the field _"Comma-separated list of targeted languages"_ write the list of languages you want to specify this rule for. * click on the green _Run workflow_ button. ==== To modify an existing rule -Create the Pull Request manually -In the description add the following text: -``` +Create a pull request manually +In the subject add the following text: +---- MODIFIES RULE: Sxxxx -``` +---- === 2. Edit the pull request -You should see https://github.com/pulls/assigned[a new Pull request assigned to you]. It contains a scaffolding of files for the new rule. Feel free to modify it as you please. +You should see https://github.com/pulls/assigned[a new pull request assigned to you]. It contains a scaffolding of files for the new rule. Feel free to modify it as you please. === 3. Ask for a review Every new rule should be reviewed. -If it is a new rule, or if it requires the analyzer to change its implementation, do not merge the Pull Request yet. +If it is a new rule, or if it requires the analyzer to change its implementation, do not merge the pull request yet. -If the change does not require an implementation, merge the Pull Request +If the change does not require an implementation, merge the pull request after the review. === 4. Create an implementation ticket -In your analyzer, create an implementation ticket and reference the Pull request as follow: -``` +In your analyzer create an implementation ticket and reference the pull request as follow: +---- RSPEC PR: SonarSource/rspec#xxxx -``` +---- -In the Pull Request adding the rule specification add the following text referencing the implementation ticket. -``` +In the pull request adding the rule specification add the following text referencing the implementation ticket. +---- IMPLEMENTATION TICKET: SonarSource/sonar-java#xxx -``` +---- Replace the repository with the one you currently work on. === 5. Implement the rule @@ -80,24 +83,43 @@ Implement the rule, update analyzer's metadata, and merge pull requests in both * call `gh_generate` if you are adding a rule, or `gh_update` if you just want the last specification version. Example: -```sh +[source,shell] +---- $ java -jar rule-api-1.24.3.jar gh_generate -rule S4328 # or $ java -jar rule-api-1.24.3.jar gh_update -``` +---- + +NOTE: If you generate rules in an empty directory, +you have to run `gh_update` immediately after, +because rule-api relies on the files in the directory to determine the covered set of rules +when generating the deprecation notes for superseded rules. == During the Beta [#beta] -A cron job currenlty imports rules from https://jira.sonarsource.com/issues/?jql=project%20%3D%20RSPEC[Jira] to this repository every night. You can edit rules in this repository just to test it, but real specification work should be done on Jira. +A https://en.wikipedia.org/wiki/Cron[cron job] currenlty imports rules from https://jira.sonarsource.com/issues/?jql=project%20%3D%20RSPEC[Jira] to this repository every night. You can edit rules in this repository just to test it, but real specification work should be done in Jira. + +WARNING: On top of the Jira Markdown pitfalls, the conversion script tends to break on specific syntax. Please see https://docs.google.com/document/d/1kseOIF8fVKTwg0v5-pw7GZYUg15uY8XHM3augh5OoUA/edit[Jira markdown quirks] for the list of known issues to avoid in your RSPECs. == Tooling - -=== https://github.com/SonarSource/rspec/tree/master/rspec-tools[rspec-tools] - -Python CLI tool enabling to add and validate rules. It is used by Github checks and Github actions. +https://github.com/SonarSource/rspec/tree/master/rspec-tools[rspec-tools]:: +A python CLI tool for adding and validating rules. It is used by GitHub checks and GitHub actions. For more information see the README file in the `rspec-tools` directory. +https://github.com/SonarSource/rspec/tree/master/frontend[frontend]:: +The GitHub page that enables the search for rules. +For more information see the README file in the `frontend` directory. -=== https://github.com/SonarSource/rspec/tree/master/frontend[frontend] +== RSPEC dataflow +Current path of an RSPEC from its inception in Jira RSPEC project to its consumption in SQ/SC/SL or on rules.sonarsource.com: -Github page which enables the search of rules. -For more information see the README file in the `frontend` directory. \ No newline at end of file +image::img/RSPEC-flow-1.png[] + +Here the github flow is grayed out, because it is rudimentary and exists solely for the beta-testing purpose. +However, once the beta-testing period is over, the flow will look differently: + +image::img/RSPEC-flow-2.png[] + +Here Jira RSPEC project becomes read-only, and the github repository becomes the source of truth. +Once Jira RSPEC is frozen, the export script becomes unncessary and will be stopped. +The https://sonarsource.github.io/rspec/#/[search page] taps directly into the GitHub repository and indexes the rules to +replace the powerful search from the now-obsolete Jira database. diff --git a/img/RSPEC-flow-1.png b/img/RSPEC-flow-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f47c7c370c329ba47b6f9d03e2654adc2033ad63 GIT binary patch literal 22773 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 literal 0 HcmV?d00001 diff --git a/img/RSPEC-flow-2.png b/img/RSPEC-flow-2.png new file mode 100644 index 0000000000000000000000000000000000000000..19dc63698db653b3a7411b3550c15e6ba82ebe94 GIT binary patch literal 22934 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 \ No newline at end of file