[poky] Commit and Patch message guidelines - fifth draft
Darren Hart
dvhart at linux.intel.com
Thu May 12 14:00:01 PDT 2011
Hi Mark,
Thanks for writing this up. I think this is on the right track. A few
comments inline...
As a side note, I'm currently working with various people on improving
our review/pull process which dovetails with this a bit, but probably
doesn't need to be explicitly called out here.
On 05/12/2011 12:57 PM, Mark Hatle wrote:
> This is the fifth draft of the guidelines... All previous feedback has been
> incorporated...
>
> (The fourth draft was reviewed and found lacking in a few key areas, so I
> skipped the public posting.)
>
> The new concept of Upstream-Status was added by the fourth draft as
> something strongly suggested, but optional. This is likely an area that may
> still need some revision before we call this final.
>
> ----
>
> Introduction
> ------------
>
> This set of guidelines is intended to help both the developer and reviewers of
> changes determine reasonable patch headers and change commit messages. Often
> when working with the code, you forget that not everyone is as familiar with the
> problem and/or fix as you are. Often the next person in the code doesn't
> understand what or why something is done so they quickly look at patch header
> and commit messages. Unless these messages are clear it will be difficult to
> understand the relevance of a given change and how future changes may impact
> previous decisions.
>
> This policy refers both to patches that are being applied by recipes as well as
> commit messages that are part of the source control system, usually git. A patch
> file needs a header in order to describe the specific change that that are made
> within that patch, while a commit message describes one or more changes to the
> overall project or system. Both the patch headers and commit messages require
> the same attention and basic details, however the purposes of the messages are
> slightly different. A commit message documents all of the changes made as part
> of a commit, while a patch header documents items specific to a single patch. In
> many cases the patch header can also be used as the commit message.
>
> This policy does not cover the testing of the changes, or the technical criteria
> for accepting a patch.
>
> By following these guidelines we will have a better record of the problems and
> solutions made over the course of development. It will also help establish a
> clear provenance of all of the code and changes within the development.
>
>
> General Information
> -------------------
>
> While specific to the Linux kernel development, the following could also be
> considered a general guide for any Open Source development:
>
> http://ldn.linuxfoundation.org/book/how-participate-linux-community
>
> Many of the guidelines in this document are related to the items in that
> information.
>
> Pay particular attention to section 5.3 that talks about patch preparation.
> The key thing to remember is to break up your changes into logical sections.
> Otherwise you run the risk of not being able to even explain the purpose of a
> change in the patch headers!
>
> In addition section 5.4 explains the purpose of the Signed-off-by: tag line as
> discussed in later parts of this document. Due to the importance of the
> Signed-off-by: tag line a copy of the description follows:
>
> Signed-off-by: this is a developer's certification that he or she has
> the right to submit the patch for inclusion into the [project]. It is
> an agreement to the Developer's Certificate of Origin, the full text of
> which can be found in [Linux Kernel] Documentation/SubmittingPatches.
> Code without a proper signoff cannot be merged into the mainline.
>
> For more information on the Developer's Certificate of Origin and the Linux
> Kernel Documentation/SubmittingPatches, see:
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches
>
> Patch Headers and Commit Messages
> ---------------------------------
> There seems to always be a question or two surrounding what a person
> should put in a patch header, or commit message.
>
> The general rules always apply, those being that there is a single line
> short log or summary of the change (think of this as the subject when the patch
> is e-mailed), and then the more detailed long log, and closure with tag lines
> such as "Signed-off-by:".
A complete list of acceptable tag lines should be documented. Consider:
Signed-off-by:
Acked-by: \__ The difference between these two is subtle. Acked-by
Reviewed-by: / implies a certain degree of authority over the affected
Tested-by: code.
Reported-by:
>
>
> New development
> ---------------
>
> A minimal patch or commit message would be of the format:
>
> Short log / Statement of what needed to be changed.
>
> (Optional pointers to external resources, such as defect tracking)
>
> The intent of your change.
>
> (Optional, if it's not clear from above) how your change resolves the
> issues in the first part.
>
> Tag line(s) at the end.
>
> For example:
>
> foobar: Adjusted the foo setting in bar
>
> When using foobar on systems with less than a gigabyte of RAM common
> usage patterns often result in an Out-of-memory condition causing
> slowdowns and unexpected application termination.
>
> Low-memory systems should continue to function without running into
> memory-starvation conditions with minimal cost to systems with more
> available memory. High-memory systems will be less able to use the
> full extent of the system, a dynamically tunable option may be best,
> long-term.
>
> The foo setting in bar was decreased from X to X-50% in order to
> ensure we don't exhaust all system memory with foobar threads.
>
> Signed-off-by: Joe Developer <joe.developer at example.com>
>
> The minimal commit message is good for new code development and simple changes.
>
> The single short log message indicates what needed to be changed. It should
> begin with an indicator as to the primary item changed by this work,
> followed by a short summary of the change. In the above case we're indicating
> that we've changed the "foobar" item, by "adjusting the foo setting in bar".
>
> The single short log message is analogous to the git "commit summary". While no
> maximum line length is specified by this policy, it is suggested that it remains
> under 78 characters wherever possible.
>
> Optionally, you may include pointers to defects this change corrects. Unless
> the defect format is specified by the component you are modifying, it is
> suggested that you use a full URL to specify the reference to the defect
> information. Generally these pointers will precede any long description, but as
> an optional item it may be after the long description.
>
> For example, you might refer to an open source defect in the RPM project:
>
> rpm: Adjusted the foo setting in bar
>
> [RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5
>
Another URL example would be mailing list reference. H. Peter Anvin
recently proposed a new automated system for dealing with this for LKML.
We might want to do something similar.
> The foo setting in bar was decreased from X to X-50% in order to
> ensure we don't exhaust all system memory with foobar threads.
>
> Signed-off-by: Joe Developer <joe.developer at example.com>
>
> You must then have a full description of the change. Specifying the intent of
> your change and if necessary how the change resolves the issue.
>
> As mentioned above this is intended to answer the "what were you thinking"
> questions down the road and to know what other impacts are likely to
> result of the change needs to be reverted. It also allows for better
> solutions if someone comes along later and agrees with paragraph 1
> (the problem statement) and either disagrees with paragraph 2
> (the design) or paragraph 3 (the implementation).
>
> Finally one or more tag lines should exist. Each developer responsible
> for working on the patch is responsible for adding a Signed-off-by: tag line.
>
> It is not acceptable to have an empty or non-existent header, or just a single
> line message. The summary and description is required for all changes.
>
>
> Importing from elsewhere
> -----------------------------
> If you are importing work from somewhere else, such as a cherry-pick from
> another repository or a code patch pulled from a mailing list, the minimum patch
> header or commit message is not enough. It does not clearly establish the
> provenance of the code.
>
> The following specifies the additional guidelines required for importing changes
> from elsewhere.
>
> By default you should keep the original authors summary and description,
> along with any tag lines such as, "Signed-off-by:". If the original change that
> was imported does not have a summary and/or commit message from the original
> author, it is still your responsibility to add them to the patch header. Just as
> if you wrote the code, you should be able to clearly explain what the change
> does. It is also necessary to document the original author of the change. You
> should indicate the original author by simply stating "written by" or "posted to
> the ... mailing list by". Only the original author can commit using a
> Signed-off-by: tag line.
Is this right? It was my understanding that the Signed-off-by come from
each person that handles the patch between creation and commit. For the
Linux kernel, which you reference above, many (most?) patches have
multiple SOB lines.
>
> It is also required that the origin of the work be fully documented. The origin
> should be specified as part of the commit message in a way that an average
> developer would be able to track down the original code. URLs should reference
> original authoritative sources and not mirrors.
>
> If changes were required to resolve conflicts, they should be documented as
> well. When incorporating a commit or patch from an external source, changes to
> the functionality not related to resolving conflicts should be made in a
> second commit or patch. This preserves the original external commit, and makes
> the modifications clearly visible, and prevents confusion over the author of the
> code.
>
> Finally a "Signed-off-by:" tag line should be added to indicate that you worked
> with the patch.
OK, this seems at odds with the statement 3 paragraphs up about only the
original author adding an SOB line. A clarification is needed.
>
> Example: Importing form elsewhere unmodified
> --------------------------------------------
>
> For example, if you were to pull in the patch from the above example unmodified:
>
> foobar: Adjusted the foo setting in bar
>
> When using foobar on systems with less than a gigabyte of RAM common
> usage patterns often result in an Out-of-memory condition causing
> slowdowns and unexpected application termination.
>
> Low-memory systems should continue to function without running into
> memory-starvation conditions with minimal cost to systems with more
> available memory. High-memory systems will be less able to use the
> full extent of the system, a dynamically tunable option may be best,
> long-term.
>
> The foo setting in bar was decreased from X to X-50% in order to
> ensure we don't exhaust all system memory with foobar threads.
>
> Signed-off-by: Joe Developer <joe.developer at example.com>
>
> The patch was imported from the OpenEmbedded git server
> (git://git.openembedded.org/openembedded) as of commit id
> b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.
>
> Signed-off-by: Your Name <your.name at openembedded.org>
>
> The above example shows a clear way for a developer to find the original source
> of the change. It indicates that the OpenEmbedded developer simply integrated
> the change into the system without making any further modifications.
>
> Example: Importing from Elsewhere modified
> ------------------------------------------
>
> When importing a patch, occasionally changes have to be made in order to resolve
> conflicts. The following is an example of the commit message when the item needed
> to be modified:
>
> foobar: Adjusted the foo setting in bar
>
> When using foobar on systems with less than a gigabyte of RAM common
> usage patterns often result in an Out-of-memory condition causing
> slowdowns and unexpected application termination.
>
> Low-memory systems should continue to function without running into
> memory-starvation conditions with minimal cost to systems with more
> available memory. High-memory systems will be less able to use the
> full extent of the system, a dynamically tunable option may be best,
> long-term.
>
> The foo setting in bar was decreased from X to X-50% in order to
> ensure we don't exhaust all system memory with foobar threads.
>
> Signed-off-by: Joe Developer <joe.developer at example.com>
>
> The patch was imported from the OpenEmbedded git server
> (git://git.openembedded.org/openembedded) as of commit id
> b65a0e0c84cf489bfa00d6aa6c48abc5a237100f.
>
> A previous change had modified the memory threshold calculation,
> causing a conflict. The conflict was resolved by preserving the
> memory threshold calculation from the existing implementation.
>
> Signed-off-by: Your Name <your.name at openembedded.org>
>
>
> Patch Header Recommendations
> ----------------------------
> In order to keep track of patches and ultimately reduce the number of patches
> that are required to be maintained, we need to track the status of the patches
> that are created. The following items are specific to patches applied by recipes.
>
> In addition to the items mentioned above, we also want to track if it's
> appropriate to get this particular patch into the upstream project. Since we
> want to track this information, we need a consistent tag and set of status that
> can be searched.
>
> While adding this tracking information to the patch headers is currently optional,
> it is highly recommended and some maintainers may require it. It is optional at
> this time so that it can be evaluated as to it's usefulness over time. Existing
> patches will be modified with the tag as they are modified.
>
> As mentioned in the above, be sure to include any URL to bug tracking, mailing
> lists or other reference material pertaining to the patch. Then add a new tag
> "Upstream-Status:" which contains one of the following items:
>
> Pending
> - No determination has been made yet or not yet submitted to upstream
>
> Submitted [where]
> - Submitted to upstream, waiting approval
> - Optionally include where it was submitted, such as the author, mailing
> list, etc.
>
> Accepted
> - Accepted in upstream, expect it to be removed at next update, include
> expected version info
>
> Backport
> - Backported from new upstream version, because we are at a fixed version,
> include upstream version info
>
> Denied
> - Not accepted by upstream, include reason in patch
>
> Inappropriate [reason]
> - The patch is not appropriate for upstream, include a brief reason on the
> same line enclosed with []
> reason can be:
> not author (You are not the author and do not intend to upstream this,
> source must be listed in the comments)
> native
> licensing
> configuration
> enable feature
> disable feature
> bugfix (add bug URL here)
> embedded specific
> no upstream (the upstream is no longer available -- dead project)
> other (give details in comments)
>
> The various "Inappropriate [reason]" status items are meant to indicate that the
> person reasonable for adding this patch to the system does not intend to upstream
> the patch for a specific reason. Unless otherwise noted, another person could
> submit this patch to the upstream, if they do the status should be changed to
> "Submitted [where]", and an additional signed-off-by: line added to the patch by
s/signed-off-by:/Signed-off-by:/
> the person claiming responsibility for upstreaming.
>
> For example, if the patch has been submitted upstream:
>
> rpm: Adjusted the foo setting in bar
>
> [RPM Ticket #65] -- http://rpm5.org/cvs/tktview?tn=65,5
>
> The foo setting in bar was decreased from X to X-50% in order to
> ensure we don't exhaust all system memory with foobar threads.
>
> Upstream-Status: Submitted [rpm5-devel at rpm5.org]
>
> Signed-off-by: Joe Developer <joe.developer at example.com>
>
> A future commit can change the value to "Accepted" or "Denied" as appropriate.
>
> Common Errors in Patch and Commit messages
> ------------------------------------------
s/messages/Messages/
>
> - Short log does not start with the file or component being modified. Such as
> "foo: Update to new upstream version 5.8.9"
>
> - Avoid starting the summary line with a capital letter, unless the component
> being referred to also begins with a capital letter.
>
> - Don't have one huge patch, split your change into logical subparts. It's
> easier to track down problems afterward using tools such as git bisect. It also
> makes it easy for people to cherry-pick changes into things like stable branches.
>
> - Don't simply translate your change into English for a commit log. The log
> "Change compare from zero to one" is bad because it describes only the code
> change in the patch; we can see that from reading the patch itself. Let the code
> tell the story of the mechanics of the change (as much as possible), and let
> your comment tell the other details -- i.e. what the problem was, how it
> manifested itself (symptoms), and if necessary, the justification for why the
> fix was done in manner that it was.
>
> - Don't start your commit log with "This patch..." -- we already know it is a patch.
>
> - Don't repeat your short log in the long log. If you really really don't have
> anything new and informational to add in as a long log, then don't put a long
> log at all. This should be uncommon -- i.e. the only acceptable cases for no
> long log would be something like "Documentation/README: Fix spelling mistakes".
>
> - Don't put absolute paths to source files that are specific to your site, i.e.
> if you get a compile error on "fs/exec.c" then tidy up the parts of the compile
> output to just show that portion. We don't need to see that it was
> /home/wally/src/git/oe-core/meta/classes/insane.bbclass or similar - that full
> path has no value to others. Always reduce the path to something more
> meaningful, such as oe-core/meta/classes/insane.bbclass.
>
> - Always use the most significant ramification of the change in the words of
> your subject/shortlog. For example, don't say "fix compile warning in foo" when
> the compiler warning was really telling us that we were dereferencing complete
> garbage off in the weeds that could in theory cause an OOPS under some
> circumstances. When people are choosing commits for backports to stable or
> distro kernels, the shortlog will be what they use for an initial sorting
> selection. If they see "Fix possible OOPS in...." then these people will look
> closer, whereas they most likely will skip over simple warning fixes.
>
> - Don't put in the full 20 or more lines of a backtrace when really it is just
> the last 5 or so function calls that are relevant to the crash/fix. If the entry
> point, or start of the trace is relevant (i.e. a syscall or similar), you can
> leave that, and then replace a chunk of the intermediate calls in the middle
> with a single [...]
>
> - Don't include timestamps or other unnecessary information, unless they are
> relevant to the situation (i.e. indicating an unacceptable delay in a driver
> initialization etc.)
>
> - Don't use links to temporary resources like pastebin and friends. The commit
> message may be read long after this resource timed out.
>
> - Don't reference mirrors, but instead always reference original authoritative
> sources.
>
> - Avoid punctuation in the short log.
Thanks,
--
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
More information about the poky
mailing list