Requirements specification is a top-down activity. It is only driven by
end users needs and project objects. NOT by implementation. That is
the nature of System Engineering: top-down
Just throwing some thoughts out here as a starting point for that
top-down discussion:
Users of NuttX can:
* Use NuttX with our Apps
* Use NuttX by itself and provide their own Apps
For the toolchain, they can:
* Use the toolchains we provide with buildroot
* Use their own toolchains
They can get NuttX and/or apps:
* From Git
* From source release tarballs
If getting from Git, they can:
* Live on the bleeding edge with Master
* Work from a branch or tag for more stability
When they wish to contribute, they can do so:
* Via a pull request
* Via a patch transmitted to us by some method
Regardless of the method, we would convert the pull request and/or
patch into a form that is useful for us. For example, if we work with
pull requests and we are given a patch, we convert the patch into a
pull request.
Contributions may be based on:
* Master.
* Or the latest release. When contributions are based on the latest
release, we should rebase them onto master.
I wrote this a long time ago:
Proposed Steps from Contribution to Commit
I think the work flow should be like this:
1.
PR or patch received (basically what Nathan wrote above)
2.
Triggers automated checking:
1.
Verify that it follows the coding standard, and
2.
verify that the build is not broken.
If either fail, ask the contributor to fix the problem and resubmit
the change.
3.
PMC should triage and assign the change to a committer. PMC may
also review for conformance with the Inviolables If this review
fails, the change is declined.
4.
Committer performs final review for technical correctness and
conformance to the Inviolables. If this review fails, the change is
declined otherwise the committer commits the change.
5.
2:42 PM <https://nuttx.slack.com/archives/GM2JH0P3M/p1575146565176000>
Step 1
Changes should include some information about how to test the change.
For modifications to code that is tested by existing configurations, we
would need to know the relevant configurations settings. From that we
should be able to select a set of relevant test configurations.
If the change is a new feature, then it may not be testable using any
existing configuration. In that case, we will have to insist that the
change be accompanied by a configuration that can be used for testing.
Step 2
For now we just need this minimum, but this should extend in the future
as we aim for a higher level of quality assurance.
Step 2a)The NuttX style verification tool, nxstyle, should be used to
check coding style. If the submission does not follow the NuttX coding
style, we will need to ask the contributor to update the change so that
it does.
Nxstyle is an imperfect tool, however. We probably need to manually
check any failed output to verify that the failures are not false alarms.
Step 2b) The brute force Jenkins-style testing is not useful here.
Rather, we need a smarter build. We need to build configurations that
ACTUALLY build the code that is changed by the contribution. Per step
1) the contributor has either provided a new test configuration (which
should be included) as a part of the change, or 2) the contributor has
provided the relevant configuration settings for testing the change.
In the latter case, we should be able to build a test configuration list
by selecting existing configuration that include these configuration
settings.
Step 2c) This is where we may want to add hardware-in-the-loop testing
with a reference board in the future.
Step 3
There should be a list of all committers with the areas in which they
have the best expertise. Assigning a change to a committer should be
simply picking the person with the best expertise, but also accounting
for any backlog. Other committers may need to take up the slack.
Step 4
Ultimately, it is the committer who is responsible for assuring that (1)
the change is technically correct, complete, and of the highest
quality. And that (2) the change is consistent with all of the
principles of the Inviolables: The change must not violate the portable
POSIX interface, the change must conform to the architectural principles
of the OS, the change must not expose any platform dependencies that
would have any impact on other users of NuttX.
At this point, the committer should be confident that the change is in
full compliance with the coding standard and will not break the build.