@node GNUnet Contributors Handbook
@chapter GNUnet Contributors Handbook

@menu
* Contributing to GNUnet::
* Licenses of contributions::
* Copyright Assignment::
* Contributing to the Reference Manual::
* Contributing testcases::
@end menu

@node Contributing to GNUnet
@section Contributing to GNUnet

@cindex licenses
@cindex licenses of contributions
@node Licenses of contributions
@section Licenses of contributions

GNUnet is a @uref{https://www.gnu.org/, GNU} package.
All code contributions must thus be put under the
@uref{https://www.gnu.org/licenses/agpl.html, GNU Affero Public License (AGPL)}.
All documentation should be put under FSF approved licenses
(see @uref{https://www.gnu.org/copyleft/fdl.html, fdl}).

By submitting documentation, translations, and other content to GNUnet
you automatically grant the right to publish code under the
GNU Public License and documentation under either or both the
GNU Public License or the GNU Free Documentation License.
When contributing to the GNUnet project, GNU standards and the
@uref{https://www.gnu.org/philosophy/philosophy.html, GNU philosophy}
should be adhered to.

@cindex copyright assignment
@node Copyright Assignment
@section Copyright Assignment
We require a formal copyright assignment for GNUnet contributors
to GNUnet e.V.; nevertheless, we do allow pseudonymous contributions.
By signing the copyright agreement and submitting your code (or
documentation) to us, you agree to share the rights to your code
with GNUnet e.V.; GNUnet e.V. receives non-exclusive ownership
rights, and in particular is allowed to dual-license the code. You
retain non-exclusive rights to your contributions, so you can also
share your contributions freely with other projects.

GNUnet e.V. will publish all accepted contributions under the AGPLv3
or any later version. The association may decide to publish
contributions under additional licenses (dual-licensing).

We do not intentionally remove your name from your contributions;
however, due to extensive editing it is not always trivial to
attribute contributors properly. If you find that you significantly
contributed to a file (or the project as a whole) and are not listed
in the respective authors file or section, please do let us know.

@node Contributing to the Reference Manual
@section Contributing to the Reference Manual

@itemize @bullet

@item When writing documentation, please use
@uref{https://en.wikipedia.org/wiki/Singular_they, gender-neutral wording}
when referring to people, such as singular “they”, “their”, “them”, and so
forth.

@item Keep line length below 74 characters, except for URLs.
URLs break in the PDF output when they contain linebreaks.

@item Do not use tab characters (see chapter 2.1 texinfo manual)

@item Write texts in the third person perspective.

@c FIXME: This is questionable, it feels like bike shed painging to do
@c this for several k lines. It only helps to jump between sentences in
@c editors afaik.
@c @item Use 2 spaces between sentences, so instead of:

@c @example
@c We do this and the other thing. This is done by foo.
@c @end example

@c Write:

@c @example
@c We do this and the other thing.  This is done by foo.
@c @end example

@end itemize

@node Contributing testcases
@section Contributing testcases

In the core of gnunet, we restrict new testcases to a small subset
of languages, in order of preference:
@enumerate
@item C
@item Portable Shell Scripts
@item Python (3.7 or later)
@end enumerate

We welcome efforts to remove our existing python-2.7 scripts to
replace them either with portable shell scripts or,
at your choice, python-3.7+.

If you contribute new python based testcases, we advise you to
not repeat our past misfortunes and write the tests in a standard
test framework like for example pytest.

For writing portable shell scripts, these tools are useful:
@uref{https://github.com/koalaman/shellcheck, Shellcheck},
@uref{https://salsa.debian.org/debian/devscripts/blob/master/scripts/checkbashisms.pl, checkbashisms},
@uref{http://www.etalabs.net/sh_tricks.html},
@uref{https://wiki.ubuntu.com/DashAsBinSh},
and @uref{https://mywiki.wooledge.org/Bashism}

@c You could also run "bin/check_shell_script" (which we still have
@c to write).
