304 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			304 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|                                   _   _ ____  _
 | |
|                               ___| | | |  _ \| |
 | |
|                              / __| | | | |_) | |
 | |
|                             | (__| |_| |  _ <| |___
 | |
|                              \___|\___/|_| \_\_____|
 | |
| 
 | |
|                         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.
 | 
