Here's a v2. I've changed the structure to something close to what Julien proposed, it looks a lot better now to me!
The (^) should probably be tested before the final version.
I don't think the list of 'guiding principles' is worded well, probably needs more work.
[something I wrote previously]
Well seems like I was wrong, it splits nicely in three subsections!Feel free to try to separate the things, but going previous discussions, many tings are important, and they appear all to be inseparable.
As written in another response, I don't really have an opinion on what's more pressing than another. I have written three 'points', but we don't have to discuss them all at once, maybe first 20.4.5.2? That one sounds relatively simple to me.I’d suggest starting with a patch against that section to address one specific point that you think is the most pressing one. From there we can continue the discussion.
--- [start]
20.4.5 Snippets, phases and patches.
Snippets, phases and patches at times serve overlapping purposes. To decide between the three, there are a few guiding principles:
To make things more concrete and to resolve conflicts between the
principles, a few cases have been worked out:
Non-free software has to be removed in a snippet; the reason is that a patch or phase will not work.
For a patch, the problem is that a patch removing a non-free file
automatically contains the non-free file (^), and we do not want
anything non-free to appear in Guix even if only in its patches.
For a phase, the problem is that phases do not influence the result of ‘guix build --source’.
(^) It has been noted that git patches support removing files without including the file in the patch in <insert link to Philip McGrath's e-mail>. If it is verified that the 'patch' utility supports such patches, this method can be used and this policy adjusted appropriately.
20.4.5.2 Removing bundled libraries.
Bundled libraries should not be removed with a patch, because
then the patch would contain the full bundled library, which can
be large. They can be removed either in a snippet or a phase,
often using the procedure 'delete-file-recursively'. There are a
few benefits for snippets here:
When using snippets, the bundled library does not occur in the source returned by ‘guix build --source’, so users and reviewers do not have to worry about whether the bundled library contains malware, whether it is non-free, if it contains pre-compiled binaries ... There are also less licensing concerns: if the bundled libraries are removed, it becomes less likely that the licensing conditions apply to people sharing the source returned by ‘guix build --source’, especially if the bundled library is not actually used on Guix systems. (*)
As such, snippets are recommended here.
(*) This is _not_ a claim that you can simply ignore the licenses of libraries when they are unbundled and replaced by Guix packages -- there are less concerns, not none.
20.4.5.3 Fixing technical issues (compilation errors, test failures, other bugs ...)
Usually, a bug fix comes in the form of a patch copied from upstream or another distribution. In that case, simply adding the patch to the 'patches' field is the most convenient and usually does not cause any problems; there is no need to rewrite it as a snippet or a phase.
If no ready-made patch already exists, then choosing between a
patch or a snippet is a matter of convenience. However, there are
two things to keep in mind:
First, when the fix is not Guix-specific, it is strongly desired to upstream the fix to avoid the additional maintenance cost to Guix. As upstreams cannot accept a snippet, writing a patch can be a more efficient use of time. Secondly, if the fix of a technical issue embeds a store file name, then it has to be a phase. Otherwise, if a store file name was embedded in the source, the result of 'guix build --source' would be unusable on non-Guix systems and likely also unusable on Guix systems of another architecture.