| _ _ ____ _ | |
| ___| | | | _ \| | | |
| / __| | | | |_) | | | |
| | (__| |_| | _ <| |___ | |
| \___|\___/|_| \_\_____| | |
| When Contributing Source Code | |
| This document is intended to offer guidelines that can be useful to keep in | |
| mind when you decide to contribute to the project. This concerns new features | |
| as well as corrections to existing flaws or bugs. | |
| 1. Learning cURL | |
| 1.1 Join the Community | |
| 1.2 License | |
| 1.3 What To Read | |
| 2. cURL Coding Standards | |
| 2.1 Naming | |
| 2.2 Indenting | |
| 2.3 Commenting | |
| 2.4 Line Lengths | |
| 2.5 General Style | |
| 2.6 Non-clobbering All Over | |
| 2.7 Platform Dependent Code | |
| 2.8 Write Separate Patches | |
| 2.9 Patch Against Recent Sources | |
| 2.10 Document | |
| 2.11 Test Cases | |
| 3. Pushing Out Your Changes | |
| 3.1 Write Access to git Repository | |
| 3.2 How To Make a Patch with git | |
| 3.3 How To Make a Patch without git | |
| 3.4 How to get your changes into the main sources | |
| 3.5 Write good commit messages | |
| 3.6 Please don't send pull requests | |
| ============================================================================== | |
| 1. Learning cURL | |
| 1.1 Join the Community | |
| Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing | |
| list(s). Read up on details before you post questions. Read this file before | |
| you start sending patches! We prefer patches and discussions being held on | |
| the mailing list(s), not sent to individuals. | |
| Before posting to one of the curl mailing lists, please read up on the mailing | |
| list etiquette: http://curl.haxx.se/mail/etiquette.html | |
| We also hang out on IRC in #curl on irc.freenode.net | |
| 1.2. License | |
| When contributing with code, you agree to put your changes and new code under | |
| the same license curl and libcurl is already using unless stated and agreed | |
| otherwise. | |
| If you add a larger piece of code, you can opt to make that file or set of | |
| files to use a different license as long as they don't enforce any changes to | |
| the rest of the package and they make sense. Such "separate parts" can not be | |
| GPL licensed (as we don't want copyleft to affect users of libcurl) but they | |
| must use "GPL compatible" licenses (as we want to allow users to use libcurl | |
| properly in GPL licensed environments). | |
| When changing existing source code, you do not alter the copyright of the | |
| original file(s). The copyright will still be owned by the original | |
| creator(s) or those who have been assigned copyright by the original | |
| author(s). | |
| By submitting a patch to the curl project, you are assumed to have the right | |
| to the code and to be allowed by your employer or whatever to hand over that | |
| patch/code to us. We will credit you for your changes as far as possible, to | |
| give credit but also to keep a trace back to who made what changes. Please | |
| always provide us with your full real name when contributing! | |
| 1.3 What To Read | |
| Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the | |
| most recent CHANGES. Just lurking on the libcurl mailing list is gonna give | |
| you a lot of insights on what's going on right now. Asking there is a good | |
| idea too. | |
| 2. cURL Coding Standards | |
| 2.1 Naming | |
| Try using a non-confusing naming scheme for your new functions and variable | |
| names. It doesn't necessarily have to mean that you should use the same as in | |
| other places of the code, just that the names should be logical, | |
| understandable and be named according to what they're used for. File-local | |
| functions should be made static. We like lower case names. | |
| See the INTERNALS document on how we name non-exported library-global | |
| symbols. | |
| 2.2 Indenting | |
| Please try using the same indenting levels and bracing method as all the | |
| other code already does. It makes the source code a lot easier to follow if | |
| all of it is written using the same style. We don't ask you to like it, we | |
| just ask you to follow the tradition! ;-) This mainly means: 2-level indents, | |
| using spaces only (no tabs) and having the opening brace ({) on the same line | |
| as the if() or while(). | |
| Also note that we use if() and while() with no space before the parenthesis. | |
| 2.3 Commenting | |
| Comment your source code extensively using C comments (/* comment */), DO NOT | |
| use C++ comments (// this style). Commented code is quality code and enables | |
| future modifications much more. Uncommented code risk having to be completely | |
| replaced when someone wants to extend things, since other persons' source | |
| code can get quite hard to read. | |
| 2.4 Line Lengths | |
| We write source lines shorter than 80 columns. | |
| 2.5 General Style | |
| Keep your functions small. If they're small you avoid a lot of mistakes and | |
| you don't accidentally mix up variables etc. | |
| 2.6 Non-clobbering All Over | |
| When you write new functionality or fix bugs, it is important that you don't | |
| fiddle all over the source files and functions. Remember that it is likely | |
| that other people have done changes in the same source files as you have and | |
| possibly even in the same functions. If you bring completely new | |
| functionality, try writing it in a new source file. If you fix bugs, try to | |
| fix one bug at a time and send them as separate patches. | |
| 2.7 Platform Dependent Code | |
| Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for | |
| particular operating systems or hardware in the #ifdef lines. The | |
| HAVE_FEATURE shall be generated by the configure script for unix-like systems | |
| and they are hard-coded in the config-[system].h files for the others. | |
| 2.8 Write Separate Patches | |
| It is annoying when you get a huge patch from someone that is said to fix 511 | |
| odd problems, but discussions and opinions don't agree with 510 of them - or | |
| 509 of them were already fixed in a different way. Then the patcher needs to | |
| extract the single interesting patch from somewhere within the huge pile of | |
| source, and that gives a lot of extra work. Preferably, all fixes that | |
| correct different problems should be in their own patch with an attached | |
| description exactly what they correct so that all patches can be selectively | |
| applied by the maintainer or other interested parties. | |
| 2.9 Patch Against Recent Sources | |
| Please try to get the latest available sources to make your patches | |
| against. It makes the life of the developers so much easier. The very best is | |
| if you get the most up-to-date sources from the git repository, but the | |
| latest release archive is quite OK as well! | |
| 2.10 Document | |
| Writing docs is dead boring and one of the big problems with many open source | |
| projects. Someone's gotta do it. It makes it a lot easier if you submit a | |
| small description of your fix or your new features with every contribution so | |
| that it can be swiftly added to the package documentation. | |
| The documentation is always made in man pages (nroff formatted) or plain | |
| ASCII files. All HTML files on the web site and in the release archives are | |
| generated from the nroff/ASCII versions. | |
| 2.11 Test Cases | |
| Since the introduction of the test suite, we can quickly verify that the main | |
| features are working as they're supposed to. To maintain this situation and | |
| improve it, all new features and functions that are added need to be tested | |
| in the test suite. Every feature that is added should get at least one valid | |
| test case that verifies that it works as documented. If every submitter also | |
| posts a few test cases, it won't end up as a heavy burden on a single person! | |
| 3. Pushing Out Your Changes | |
| 3.1 Write Access to git Repository | |
| If you are a frequent contributor, or have another good reason, you can of | |
| course get write access to the git repository and then you'll be able to push | |
| your changes straight into the git repo instead of sending changes by mail as | |
| patches. Just ask if this is what you'd want. You will be required to have | |
| posted a few quality patches first, before you can be granted push access. | |
| 3.2 How To Make a Patch with git | |
| You need to first checkout the repository: | |
| git clone git://github.com/bagder/curl.git | |
| You then proceed and edit all the files you like and you commit them to your | |
| local repository: | |
| git commit [file] | |
| As usual, group your commits so that you commit all changes that at once that | |
| constitutes a logical change. See also section "3.5 Write good commit | |
| messages". | |
| Once you have done all your commits and you're happy with what you see, you | |
| can make patches out of your changes that are suitable for mailing: | |
| git format-patch remotes/origin/master | |
| This creates files in your local directory named NNNN-[name].patch for each | |
| commit. | |
| Now send those patches off to the curl-library list. You can of course opt to | |
| do that with the 'get send-email' command. | |
| 3.3 How To Make a Patch without git | |
| Keep a copy of the unmodified curl sources. Make your changes in a separate | |
| source tree. When you think you have something that you want to offer the | |
| curl community, use GNU diff to generate patches. | |
| If you have modified a single file, try something like: | |
| diff -u unmodified-file.c my-changed-one.c > my-fixes.diff | |
| If you have modified several files, possibly in different directories, you | |
| can use diff recursively: | |
| diff -ur curl-original-dir curl-modified-sources-dir > my-fixes.diff | |
| The GNU diff and GNU patch tools exist for virtually all platforms, including | |
| all kinds of Unixes and Windows: | |
| For unix-like operating systems: | |
| http://www.gnu.org/software/patch/patch.html | |
| http://www.gnu.org/directory/diffutils.html | |
| For Windows: | |
| http://gnuwin32.sourceforge.net/packages/patch.htm | |
| http://gnuwin32.sourceforge.net/packages/diffutils.htm | |
| 3.4 How to get your changes into the main sources | |
| Submit your patch to the curl-library mailing list. | |
| Make the patch against as recent sources as possible. | |
| Make sure your patch adheres to the source indent and coding style of already | |
| existing source code. Failing to do so just adds more work for me. | |
| Respond to replies on the list about the patch and answer questions and/or | |
| fix nits/flaws. This is very important. I will take lack of replies as a sign | |
| that you're not very anxious to get your patch accepted and I tend to simply | |
| drop such patches from my TODO list. | |
| If you've followed the above paragraphs and your patch still hasn't been | |
| incorporated after some weeks, consider resubmitting it to the list. | |
| 3.5 Write good commit messages | |
| A short guide to how to do fine commit messages in the curl project. | |
| ---- start ---- | |
| [area]: [short line describing the main effect] | |
| [separate the above single line from the rest with an empty line] | |
| [full description, no wider than 72 columns that describe as much as | |
| possible as to why this change is made, and possibly what things | |
| it fixes and everything else that is related] | |
| ---- stop ---- | |
| Don't forget to use commit --author="" if you commit someone else's work, | |
| and make sure that you have your own user and email setup correctly in git | |
| before you commit | |
| 3.6 Please don't send pull requests | |
| With git (and expecially github) it is easy and tempting to send a pull | |
| request to one or more people in the curl project to have changes merged this | |
| way instead of mailing patches to the curl-library mailing list. | |
| We don't like that. We want them mailed for these reasons: | |
| - Peer review. Anyone and everyone on the list can review, comment and | |
| improve on the patch. Pull requests limit this ability. | |
| - Anyone can merge the patch into their own trees for testing and those who | |
| have push rights can push it to the main repo. It doesn't have to be anyone | |
| the patch author knows beforehand. | |
| - Commit messages can be tweaked and changed if merged locally instead of | |
| using github. Merges directly on github requires the changes to be perfect | |
| already, which they seldomly are. | |
| - Merges on github prevents rebases and even enforces --no-ff which is a git | |
| style we don't otherwise use in the project | |
| However: once patches have been reviewed and deemed fine on list they are | |
| perfectly OK to be pulled from a published git tree. |