/** @page primerpatches Patch Primer This page provides an introduction to patching that may be useful for OpenOCD contributors who are unfamiliar with the process. @section primerpatchintro Introduction to Patching The standard method for creating patches requires developers to: - checkout the git repository (or bring a copy up-to-date), - make the necessary modifications to a working copy, - check with 'git status' to see which files will be modified/added, and - use 'git diff' to review the changes and produce a patch. It is important to minimize the changes to only those lines that contain important differences; do not allow stray whitespace changes into your patches, and keep the focus to a single logical change. @section primerpatchcreate Creating Patches You can create a patch (from the root of your working copy) with a command like the following example: @par @verbatim git diff > patch-name.patch @endverbatim where @a patch-name should be something that is descriptive and unique. The above command will create a patch containing all of the changes in the working copy; if you want to obtain a subset, simply provide the list of files to the command: @par @verbatim git diff doc > -doc.patch git diff src > -src.patch @endverbatim This will create two patches, each containing only those changes present in the subdirectory specified. @subsection primerpatchcreate Naming Patches One developer has evolved an informal standard for naming his patches: @par @verbatim ---.patch @endverbatim where @a project is @c openocd, @a lod (line-of-development) could be a subsystem (e.g. @c jtag, @c jlink, etc.) or other group identifier, @a action is @c add, @c change, @c fix, @c update, etc., and @a task is whatever the patch will accomplish (in 2-4 words). This scheme does not need to be followed, but it is helpful for maintainers that receive many patches. You do not want your own @c openocd.patch file to be accidentally overwritten by another submission, sending your patch to the bit bucket on accident. @section primerpatchpreflight Developer Review Before sending in patches, please make sure you have updated to the latest version of the trunk (using git pull) before creating your patch. This helps to increase the chances that it will apply cleanly to the trunk. However, the content matters most. When creating a patch using "git diff", git will produce a patch that contains all of the changes in your working copy. To manage multiple changes at once, you either need one working copy per patch, or you can specified specific files and directories when using git diff. Overlapping patches will be discussed in the next section. @todo Does git's treatment of line-endings behave sanely? Basically, the repository should use newlines internally, and convert to/from CRLF on Windows etc. @section primerpatchseries Patch Series As was mentioned above, each patch should contain one logical @c task, and multiple logical tasks should be split into a series of patches. There are no hard guidelines for how that is to be done; it's an art form. Many simple changes should not have to worry about being split, as they will naturally represent a single task. When working on several different non-intersecting lines of development, a combination of multiple working copies and patch series management techniques can become critical to efficiently managing change. This again is an area where developers have favorite methodologies that are simply a matter of taste or familiarity; your mileage may vary. Packages such as @c patchutils, @c diffutils, and @c quilt are among those that have proved themselves invaluable for these type of tasks. Others take their patch management a step further, using stkgit or some other framework on top of git. @subsection primerpatchseriesinterdiff Using @c interdiff The @c patchutils package includes the @c interdiff command, which produces a patch that contains the changes made between two other patches. This command can be used to manage the creation of trivial patch series. For example, the following sequence of commands will produce three patches: @par @verbatim $ cd openocd/ $ git pull ... $ <<>> ... $ <<>> $ git diff > series-1.patch # patch #1 is easy $ <<>> ... $ <<>> $ git diff > series-1+2.patch # create patch 1+2 $ interdiff series-1{,+2}.patch > series-2.patch # 1 ~ 1+2 => #2 $ <<>> ... $ <<>> $ git diff > series-1+2+3.patch # create patch 1+2+3 $ interdiff series-1+2{,+3}.patch > series-3.patch # 1+2 ~ 1+2+3 => 3 @endverbatim This technique falls apart when the repository changes, but this may be suitable for small series of patches. @subsection primerpatchseriesquilt Using @c quilt The @c quilt package provides scripts to manage series of patches more efficiently than can be managed by hand. For out-of-tree work projects that require such patch management, @c quilt provides an indispensable tool for solving the problem. @section primerpatchsubmit Submitting Patches Write access to the OpenOCD git repository is limited to contributors that have demonstrated the ability to produce clear, consistent, and frequent patches. These individuals are responsible for maintaining the integrity of the repository for the community. Thus, commits to the git repository must be handled by one of these maintainers. Patches must be sent to the OpenOCD developer mailing list: @par openocd-development@lists.berlios.de They will be reviewed and committed if the changes are found to be acceptable. If there are problems, you will receive feedback via the mailing list; in general, the maintainers prefer all communication to go through the list, as the entire community needs to judge contributions for possible merits and mistakes. Contributors may be asked to address certain issues and submit a new patch. In the event that it gets overlooked, you may need to resubmit it or prompt for feedback. Please have patience, as many maintainers work on the project voluntarily and without compensation for the time that they spend doing these tasks. @section primerpatchguide Guidelines for Submitting Patches - Each patch file should contain: - A commit description that describes all of the changes. - A separator line that contains three hyphens: --- - A summary of the changes produced by diffstat (optional) - Another separator line (optional) - The actual patch contents, containing a single change. - Each patch series should include: - A summary of the patches in the series. - Logically-related patches that contain incremental changes. */ /** @file This file contains the @ref primerpatches page. */