+Your patch (or commit) should be a "good patch": focus it on a single
+issue, and make it easily reviewable. Don't make
+it so large that it's hard to review; split large
+patches into smaller ones (this will also help
+to track down bugs later). All patches should
+be "clean", which includes preserving the existing
+coding style and updating documentation as needed. When adding a new
+command, the corresponding documentation should be added to
+@c doc/openocd.texi in the same commit. OpenOCD runs on both Little
+Endian and Big Endian hosts so the code can't count on specific byte
+ordering (in other words, must be endian-clean).
+
+There are several additional methods of improving the quality of your
+patch:
+
+- Runtime testing with Valgrind Memcheck
+
+ This helps to spot memory leaks, undefined behaviour due to
+ uninitialized data or wrong indexing, memory corruption, etc.
+
+- Clang Static Analyzer
+
+ Using this tool uncovers many different kinds of bugs in C code,
+ with problematic execution paths fully explained. It is a part of
+ standard Clang installation.
+
+ To generate a report, run this in the OpenOCD source directory:
+ @code
+ mkdir build-scanbuild; cd build-scanbuild
+ scan-build ../configure
+ scan-build make CFLAGS="-std=gnu99 -I. -I../../jimtcl"
+ @endcode
+
+- Runtime testing with sanitizers
+
+ Both GCC and LLVM/Clang include advanced instrumentation options to
+ detect undefined behaviour and many kinds of memory
+ errors. Available with @c -fsanitize=* command arguments.
+
+ Example usage:
+ @code
+ mkdir build-sanitizers; cd build-sanitizers
+ ../configure CC=clang CFLAGS="-fno-omit-frame-pointer \
+ -fsanitize=address -fsanitize=undefined -ggdb3"
+ make
+ export ASAN_OPTIONS=detect_stack_use_after_return=1
+ src/openocd -s ../tcl -f /path/to/openocd.cfg
+ @endcode
+
+Please consider performing these additonal checks where appropriate
+(especially Clang Static Analyzer for big portions of new code) and
+mention the results (e.g. "Valgrind-clean, no new Clang analyzer
+warnings") in the commit message.
+
+Say in the commit message if it's a bugfix (describe the bug) or a new
+feature. Don't expect patches to merge immediately
+for the next release. Be ready to rework patches
+in response to feedback.
+
+Add yourself to the GPL copyright for non-trivial changes.
+
+@section stepbystep Step by step procedure
+
+-# Create a Gerrit account at: http://openocd.zylin.com
+ - On subsequent sign ins, use the full URL prefaced with 'http://'
+ For example: http://user_identifier.open_id_provider.com
+ -# Add a username to your profile.
+ After creating the Gerrit account and signing in, you will need to
+ add a username to your profile. To do this, go to 'Settings', and
+ add a username of your choice.
+ Your username will be required in step 3 and substituted wherever
+ the string 'USERNAME' is found.
+ -# Create an SSH public key following the directions on github:
+ https://help.github.com/articles/generating-ssh-keys . You can skip step 3
+ (adding key to Github account) and 4 (testing) - these are useful only if
+ you actually use Github or want to test whether the new key works fine.
+ -# Add this new SSH key to your Gerrit account:
+ go to 'Settings' > 'SSH Public Keys', paste the contents of
+ ~/.ssh/id_rsa.pub into the text field (if it's not visible click on
+ 'Add Key ...' button) and confirm by clicking 'Add' button.
+-# Clone the git repository, rather than just download the source:
+ @code
+ git clone git://git.code.sf.net/p/openocd/code openocd
+ @endcode
+ or if you have problems with the "git:" protocol, use
+ the slower http protocol:
+ @code
+ git clone http://git.code.sf.net/p/openocd/code openocd
+ @endcode
+-# Set up Gerrit with your local repository. All this does it