1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
|
Contributing
************
Thank you for considering contributing to Modules! Modules is an open
source project. Questions, discussion, and contributions are welcome.
By contributing to this project, you agree to follow our Code of
conduct, which ensures a respectful and inclusive environment for all
contributors. Please review it before participating in discussions or
submitting contributions.
This project also adheres to a Technical charter, which defines its
governance model, decision-making process, and long-term vision.
Support questions
=================
Please use the modules-interest mailing list ("modules-
interest@lists.sourceforge.net") or the Modules chat room
("#modules:matrix.org") for questions. Do not use the issue tracker
for this.
Asking for new features
=======================
Please submit your new feature wishes first to the modules-interest
mailing list or Modules chat room. Discussion will help to clarify
your needs and sometimes the wanted feature may already be available.
Reporting issues
================
* Describe what you expected to happen.
* If possible, include a minimal, complete, and verifiable example to
help us identify the issue.
* Describe what actually happened. Run the "module" command in "--
debug" mode and include all the debug output obtained in your
report.
* Provide the current configuration and state of your Modules
installation by running the "module config --dump-state" command.
* Provide the name and content of the modulefiles you try to
manipulate.
If you find a security vulnerability, please refer to our security
policy for guidelines on how to report such issues responsibly.
Submitting patches
==================
* Whether your patch is supposed to solve a bug or add a new feature,
please include tests. In case of a bug, explain clearly under which
circumstances it happens and make sure the test fails without your
patch.
* If you are not yet familiar with the "git" command and GitHub,
please read the don't be afraid to commit tutorial.
Start coding
------------
* Create a branch to identify the issue or feature you would like to
work on
* Using your favorite editor, make your changes, committing as you go.
* Comply to the coding conventions of this project.
* Your Tcl code has to be compatible with Tcl version 8.5 and above
(see Tcl 8.5 commands reference)
* Include tests that cover any code changes you make. Make sure the
test fails without your patch.
* Run the tests and verify coverage.
* Sign-off your commits.
* Push your commits to GitHub and create a pull request.
Developer notes
---------------
See the Design notes for recent feature specifications. Some
development howtos are also available:
* Add new module sub-command
* Add new configuration option
Running the tests
-----------------
Run the basic test suite with:
make test
This only runs the tests for the current environment. GitHub Actions
and Cirrus CI will run the full suite when you submit your pull
request.
There are more than 17 000 test cases thus it generally takes around
12 minutes to run the full test suite. It can be executed in *quick*
mode to just run the most essential tests in about 1 minute:
make test QUICKTEST=y
The **script/mt** utility is also available to just execute one or
several testfiles. If a test fails, **script/mt** reports the *diff*
comparison between expected and actual results. For instance, to only
execute "testsuite/modules.50-cmds/470-variant.exp" testfile, run:
script/mt 50/470
Run **script/mt** with "--help" option to get usage details and syntax
to select several testfiles.
Running test coverage
---------------------
Generating a report of lines that do not have test coverage can
indicate where to start contributing or what your tests should cover
for the code changes you submit.
Run "make test COVERAGE=y" which will automatically setup the Nagelfar
Tcl code coverage tool in your "modules" development directory and
instrument the source Tcl scripts. Then the full testsuite will be run
in coverage mode and an annotated script will be produced for each Tcl
script in "tcl" source directory ("tcl/*.tcl_m"):
make test COVERAGE=y
# then open tcl/*.tcl_m files and look for ';# Not covered' lines
The **script/mt** utility may also be used to run the test suite in
coverage mode on full testsuite or on a few testfiles:
script/mt cov 70/{280,290}
Running linter tests
--------------------
Linter tools check code syntax and report issues and good practices to
follow. Modules uses Nagelfar to check syntax of Tcl scripts and
ShellCheck to lint sh, bash and ksh scripts.
Run "make testlint" to lint all sh, bash, ksh and Tcl scripts in your
local Modules repository.
The **script/mt** utility may also be used to run the full *lint* test
suite or just specific testfiles. For instance to only lint Tcl
scripts:
script/mt lint 00/030
Check performances
------------------
The **script/mb** utility checks from your local repository the
performances of major releases of Modules and current branch. Current
ongoing modifications are first stashed, then **modulecmd.tcl** of the
releases and current branch are built. Different tests are run against
each version and the execution time of each test is reported in
millisecond:
$ script/mb
| v4.1.4 | v4.3.1 | v4.5.3 | v4.7.1 | v5.1.1 | main |
----------+----------+----------+----------+----------+----------+----------+
help | 9 | 12 | 12 | 15 | 16 | 16 |
avail | 61 | 67 | 76 | 82 | 91 | 86 |
avail2 | 11 | 16 | 19 | 21 | 23 | 23 |
avail3 | - | - | - | 120 | 128 | 130 |
whatis | 208 | 155 | 233 | 216 | 221 | 224 |
whatis2 | 10 | 15 | 17 | 20 | 21 | 22 |
whatis3 | - | - | - | 287 | 307 | 314 |
apropos | 208 | 153 | 222 | 210 | 220 | 223 |
load | 66 | 87 | 134 | 162 | 120 | 126 |
list | 24 | 23 | 33 | 22 | 25 | 25 |
unload | 46 | 24 | 25 | 29 | 31 | 31 |
It helps to verify that current work committed in local repository
does not impact performances on simple test scenarios. Run
**script/mb** with "--help" option to get its usage details.
The "profile" mode may also be interesting to learn what are the
internal procedures of **modulecmd.tcl** taking most of the execution
time for each test:
script/mb profile
Building the docs
-----------------
Build the docs in the "doc" directory using Sphinx:
cd doc
make html
Open "_build/html/index.html" in your browser to view the docs.
Read more about Sphinx.
Coding conventions
------------------
* Maximum line length is 78 characters
* Use 3 spaces to indent code (do not use tab character)
* Adopt Tcl minimal escaping style
* Procedure names: "lowerCameCase"
* Variable names: "no_case_at_all"
* Curly brace and square bracket placement:
if {![isStateDefined already_report]} {
setState already_report 1
}
* No trailing space nor misspelling
Developer Certificate of Origin (DCO)
-------------------------------------
In order to ensure that all contributions are properly authorized and
in compliance with licensing requirements, Modules project follows the
Developer Certificate of Origin (DCO) process. The DCO is a
lightweight mechanism to certify that you, as a contributor, have the
right to submit your code and agree to the project’s licensing terms.
How to sign off your commits
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Every commit must include a "Signed-off-by" line, which certifies that
the contribution adheres to the DCO. You can do this by adding the
following line at the end of your commit message:
Signed-off-by: Your Name <your.email@example.com>
The name and email must match your Git configuration ("git config
user.name" and "git config user.email").
To simplify the process, you can use the "-s" flag of "git" command
when committing:
git commit -s -m "Your commit message"
Verifying DCO Compliance
~~~~~~~~~~~~~~~~~~~~~~~~
Modules repository automates checks to enforce the DCO. If your
contribution does not include the proper "Signed-off-by" line, the
pull request check will fail. You will need to amend your commit:
git commit --amend -s
Commit hooks
------------
A **pre-commit** hook script is provided in the "script" directory of
the project to help you check that the contribution made is free of
misspellings and trailing spaces. It requires the codespell utility
that checks for typos in any kind of files and the Hunspell utility
that spell checks documentation files. The **pre-commit** could be
enabled in your local repository with following command:
ln -s ../../script/pre-commit .git/hooks/pre-commit
A **commit-msg** hook script is also provided in the "script"
directory of the project to help you check that your commit messages
are free of misspellings. It requires the Hunspell utility and could
be enabled in your local repository with following command:
ln -s ../../script/commit-msg .git/hooks/commit-msg
Emacs settings for coding conventions
-------------------------------------
This is an example Emacs configuration that adheres to the first two
coding conventions. You may wish to add this to your ".emacs" or
".emacs.d/" to modify your tcl-mode:
(add-hook 'tcl-mode-hook
(lambda ()
(setq indent-tabs-mode nil)
(setq tcl-indent-level 3)
(setq tcl-continued-indent-level 3)
(font-lock-add-keywords nil '(("^[^\n]\\{79\\}\\(.*\\)$" 1
font-lock-warning-face prepend)))))
Submitting installation recipes
===============================
* If you want to share your installation tips and tricks, efficient
ways you have to write or organize your modulefiles or some
extension you made to the "module" command please add a recipe to
the cookbook section of the documentation.
* Create a directory under "doc/example" and put there the extension
code or example modulefiles your recipe is about.
* Describe this recipe through a reStructuredText document in
"doc/source/cookbook". It is suggested to have an *Implementation*,
an *Installation* and an *Usage example* sections in that document
to get as much as possible the same document layout across recipes.
* Submit a patch with all the above content.
|