%% -*- mode: text; -*-
%% $QuaggaId: Format:%an, %ai, %h$ $

\documentclass[oneside]{article}
\usepackage{parskip}
\usepackage[bookmarks,colorlinks=true]{hyperref}

\title{Conventions for working on Quagga}

\begin{document}
\maketitle

This is a living document. Suggestions for updates, via the
\href{http://lists.quagga.net/mailman/listinfo/quagga-dev}{quagga-dev list},
are welcome.

\tableofcontents

\section{GUIDELINES FOR HACKING ON QUAGGA}
\label{sec:guidelines}


GNU coding standards apply.  Indentation follows the result of
invoking GNU indent (as of 2.2.8a) with no arguments.  Note that this
uses tabs instead of spaces where possible for leading whitespace, and
assumes that tabs are every 8 columns.  Do not attempt to redefine the
location of tab stops.  Note also that some indentation does not
follow GNU style.  This is a historical accident, and we generally
only clean up whitespace when code is unmaintainable due to whitespace
issues, to minimise merging conflicts.

For GNU emacs, use indentation style ``gnu''.

For Vim, use the following lines (note that tabs are at 8, and that
softtabstop sets the indentation level):

set tabstop=8
set softtabstop=2
set shiftwidth=2
set noexpandtab

Be particularly careful not to break platforms/protocols that you
cannot test.

New code should have good comments, which explain why the code is correct.
Changes to existing code should in many cases upgrade the comments when
necessary for a reviewer to conclude that the change has no unintended
consequences.

Each file in the Git repository should have a git format-placeholder (like
an RCS Id keyword), somewhere very near the top, commented out appropriately
for the file type. The placeholder used for Quagga (replacing <dollar> with
\$) is:

	\verb|$QuaggaId: <dollar>Format:%an, %ai, %h<dollar> $|

See line 2 of HACKING.tex, the source for this document, for an example.

This placeholder string will be expanded out by the `git archive' commands,
which is used to generate the tar archives for snapshots and releases.

Please document fully the proper use of a new function in the header file
in which it is declared.  And please consult existing headers for
documentation on how to use existing functions.  In particular, please consult
these header files:

\begin{description}
  \item{lib/log.h}	logging levels and usage guidance
  \item{[more to be added]}
\end{description}

If changing an exported interface, please try to deprecate the interface in
an orderly manner. If at all possible, try to retain the old deprecated
interface as is, or functionally equivalent. Make a note of when the
interface was deprecated and guard the deprecated interface definitions in
the header file, i.e.:

\begin{verbatim}
/* Deprecated: 20050406 */
#if !defined(QUAGGA_NO_DEPRECATED_INTERFACES)
#warning "Using deprecated <libname> (interface(s)|function(s))"
...
#endif /* QUAGGA_NO_DEPRECATED_INTERFACES */
\end{verbatim}

This is to ensure that the core Quagga sources do not use the deprecated
interfaces (you should update Quagga sources to use new interfaces, if
applicable), while allowing external sources to continue to build. 
Deprecated interfaces should be excised in the next unstable cycle.

Note: If you wish, you can test for GCC and use a function
marked with the 'deprecated' attribute. However, you must provide the
warning for other compilers.

If changing or removing a command definition, \emph{ensure} that you
properly deprecate it - use the \_DEPRECATED form of the appropriate DEFUN
macro.  This is \emph{critical}.  Even if the command can no longer
function, you \emph{MUST} still implement it as a do-nothing stub. 

Failure to follow this causes grief for systems administrators, as an
upgrade may cause daemons to fail to start because of unrecognised commands. 
Deprecated commands should be excised in the next unstable cycle.  A list of
deprecated commands should be collated for each release.

See also section~\ref{sec:dll-versioning} below regarding SHARED LIBRARY
VERSIONING.

\section{YOUR FIRST CONTRIBUTIONS}

Routing protocols can be very complex sometimes. Then, working with an
Opensource community can be complex too, but usually friendly with
anyone who is ready to be willing to do it properly.

\begin{itemize}

  \item First, start doing simple tasks. Quagga's patchwork is a good place
        to start with. Pickup some patches, apply them on your git trie,
        review them and send your ack't or review comments. Then, a
        maintainer will apply the patch if ack't or the author will
        have to provide a new update. It help a lot to drain the
        patchwork queues.
        See \url{http://patchwork.quagga.net/project/quagga/list/}

  \item The more you'll review patches from patchwork, the more the
        Quagga's maintainers will be willing to consider some patches you will
        be sending.

  \item start using git clone, pwclient \url{http://patchwork.quagga.net/help/pwclient/}

\begin{verbatim}
$ pwclient list -s new
ID    State        Name
--    -----        ----
179   New          [quagga-dev,6648] Re: quagga on FreeBSD 4.11 (gcc-2.95)
181   New          [quagga-dev,6660] proxy-arp patch
[...]

$ pwclient git-am 1046
\end{verbatim}

\end{itemize}

\section{HANDY GUIDELINES FOR MAINTAINERS}

Get your cloned trie:
\begin{verbatim}
  git clone vjardin@git.sv.gnu.org:/srv/git/quagga.git
\end{verbatim}

Apply some ack't patches:
\begin{verbatim}
  pwclient git-am 1046
    Applying patch #1046 using 'git am'
    Description: [quagga-dev,11595] zebra: route_unlock_node is missing in "show ip[v6] route <prefix>" commands
    Applying: zebra: route_unlock_node is missing in "show ip[v6] route <prefix>" commands
\end{verbatim}

Run a quick review. If the ack't was not done properly, you know who you have
to blame.

Push the patches:
\begin{verbatim}
  git push
\end{verbatim}

Set the patch to accepted on patchwork
\begin{verbatim}
  pwclient update -s Accepted 1046
\end{verbatim}

\section{COMPILE-TIME CONDITIONAL CODE}

Please think very carefully before making code conditional at compile time,
as it increases maintenance burdens and user confusion. In particular,
please avoid gratuitous --enable-\ldots switches to the configure script -
typically code should be good enough to be in Quagga, or it shouldn't be
there at all. 

When code must be compile-time conditional, try have the compiler make it
conditional rather than the C pre-processor - so that it will still be
checked by the compiler, even if disabled. I.e.  this:

\begin{verbatim}
    if (SOME_SYMBOL)
      frobnicate();
\end{verbatim}

rather than:

\begin{verbatim}
  #ifdef SOME_SYMBOL
  frobnicate ();
  #endif /* SOME_SYMBOL */
\end{verbatim}

Note that the former approach requires ensuring that SOME\_SYMBOL will be
defined (watch your AC\_DEFINEs).


\section{COMMIT MESSAGES}

The commit message requirements are:

\begin{itemize}

\item The message \emph{MUST} provide a suitable one-line summary followed
      by a blank line as the very first line of the message, in the form:

  \verb|topic: high-level, one line summary|

  Where topic would tend to be name of a subdirectory, and/or daemon, unless
  there's a more suitable topic (e.g.  'build').  This topic is used to
  organise change summaries in release announcements.

\item It should have a suitable "body", which tries  to address the
      following areas, so as to help reviewers and future browsers of the
      code-base understand why the change is correct (note also the code
      comment requirements):

  \begin{itemize}
  
  \item The motivation for the change (does it fix a bug, if so which? 
        add a feature?)
  
  \item The general approach taken, and trade-offs versus any other
        approaches.
  
  \item Any testing undertaken or other information affecting the confidence
        that can be had in the change.
  
  \item Information to allow reviewers to be able to tell which specific
        changes to the code are intended (and hence be able to spot any accidental
        unintended changes).

  \end{itemize}
\end{itemize}

The one-line summary must be limited to 54 characters, and all other
lines to 72 characters.

Commit message bodies in the Quagga project have typically taken the
following form:

\begin{itemize}
\item An optional introduction, describing the change generally.
\item A short description of each specific change made, preferably:
  \begin{itemize} \item file by file
    \begin{itemize} \item function by function (use of "ditto", or globs is
                          allowed)
    \end{itemize}
  \end{itemize}
\end{itemize}

Contributors are strongly encouraged to follow this form.

This itemised commit messages allows reviewers to have confidence that the
author has self-reviewed every line of the patch, as well as providing
reviewers a clear index of which changes are intended, and descriptions for
them (C-to-english descriptions are not desirable - some discretion is
useful).  For short patches, a per-function/file break-down may be
redundant.  For longer patches, such a break-down may be essential.  A
contrived example (where the general discussion is obviously somewhat
redundant, given the one-line summary):

\begin{quote}\begin{verbatim}
zebra: Enhance frob FSM to detect loss of frob

Add a new DOWN state to the frob state machine to allow the barinator to
detect loss of frob.

* frob.h: (struct frob) Add DOWN state flag.
* frob.c: (frob_change) set/clear DOWN appropriately on state change.
* bar.c: (barinate) Check frob for DOWN state.
\end{verbatim}\end{quote}

Please have a look at the git commit logs to get a feel for what the norms
are.

Note that the commit message format follows git norms, so that ``git
log --oneline'' will have useful output.

\section{HACKING THE BUILD SYSTEM}

If you change or add to the build system (configure.ac, any Makefile.am,
etc.), try to check that the following things still work:

\begin{itemize}
\item make dist
\item resulting dist tarball builds
\item out-of-tree builds
\end{itemize}

The quagga.net site relies on make dist to work to generate snapshots. It
must work. Common problems are to forget to have some additional file
included in the dist, or to have a make rule refer to a source file without
using the srcdir variable.


\section{RELEASE PROCEDURE}

\begin{itemize}
\item Tag the appropriate commit with a release tag (follow existing
  conventions).
  
  [This enables recreating the release, and is just good CM practice.]

\item Create a fresh tar archive of the quagga.net repository, and do a test
  build:

  \begin{verbatim}
    vim configure.ac
    git commit -m "release: 0.99.99.99"
    git tag -u 54CD2E60 quagga-0.99.99.99
    git push savannah tag quagga-0.99.99.99

    git archive --prefix=quagga-release/ quagga-0.99.99.99 | tar xC /tmp
    git log quagga-0.99.99.98..quagga-0.99.99.99 > \
       /tmp/quagga-release/quagga-0.99.99.99.changelog.txt
    cd /tmp/quagga-release

    autoreconf -i
    ./configure
    make
    make dist-gzip

    gunzip < quagga-0.99.99.99.tar.gz > quagga-0.99.99.99.tar
    xz -6e < quagga-0.99.99.99.tar > quagga-0.99.99.99.tar.xz
    gpg -u 54CD2E60 -a --detach-sign quagga-0.99.99.99.tar

    scp quagga-0.99.99.99.* username@dl.sv.nongnu.org:/releases/quagga
  \end{verbatim}

  Do NOT do this in a subdirectory of the Quagga sources, autoconf will think
  it's a sub-package and fail to include neccessary files.

\item Add the version number on https://bugzilla.quagga.net/, under
  Administration, Products, "Quagga", Edit versions, Add a version.
\item Edit the wiki on https://wiki.quagga.net/wiki/index.php/Release\_status
\item Post a news entry on Savannah
\item Send a mail to quagga-dev and quagga-users
\end{itemize}

The tarball which `make dist' creates is the tarball to be released! The
git-archive step ensures you're working with code corresponding to that in
the official repository, and also carries out keyword expansion. If any
errors occur, move tags as needed and start over from the fresh checkouts.
Do not append to tarballs, as this has produced non-standards-conforming
tarballs in the past.

See also: \url{http://wiki.quagga.net/index.php/Main/Processes}

[TODO: collation of a list of deprecated commands. Possibly can be scripted
to extract from vtysh/vtysh\_cmd.c]


\section{TOOL VERSIONS}

Require versions of support tools are listed in INSTALL.quagga.txt.
Required versions should only be done with due deliberation, as it can
cause environments to no longer be able to compile quagga.


\section{SHARED LIBRARY VERSIONING}
\label{sec:dll-versioning}

[this section is at the moment just gdt's opinion]

Quagga builds several shared libaries (lib/libzebra, ospfd/libospf, 
ospfclient/libsopfapiclient).  These may be used by external programs,
e.g. a new routing protocol that works with the zebra daemon, or
ospfapi clients.  The libtool info pages (node Versioning) explain
when major and minor version numbers should be changed.  These values
are set in Makefile.am near the definition of the library.  If you
make a change that requires changing the shared library version,
please update Makefile.am.

libospf exports far more than it should, and is needed by ospfapi
clients.  Only bump libospf for changes to functions for which it is
reasonable for a user of ospfapi to call, and please err on the side
of not bumping.

There is no support intended for installing part of zebra.  The core
library libzebra and the included daemons should always be built and
installed together.


\section{GIT COMMIT SUBMISSION}
\label{sec:git-submission}

The preferred method for submitting changes is to provide git commits via a
publicly-accessible git repository, which the maintainers can easily pull.

The commits should be in a branch based off the Quagga.net master - a
"feature branch".  Ideally there should be no commits to this branch other
than those in master, and those intended to be submitted.  However, merge
commits to this branch from the Quagga master are permitted, though strongly
discouraged - use another (potentially local and throw-away) branch to test
merge with the latest Quagga master.

Recommended practice is to keep different logical sets of changes on
separate branches - "topic" or "feature" branches.  This allows you to still
merge them together to one branch (potentially local and/or "throw-away")
for testing or use, while retaining smaller, independent branches that are
easier to merge.

All content guidelines in section \ref{sec:patch-submission}, PATCH
SUBMISSION apply.


\section{PATCH SUBMISSION}
\label{sec:patch-submission}

\begin{itemize}

\item For complex changes, contributors are strongly encouraged to first
      start a design discussion on the quagga-dev list \emph{before}
      starting any coding.

\item Send a clean diff against the 'master' branch of the quagga.git
      repository, in unified diff format, preferably with the '-p' argument to
      show C function affected by any chunk, and with the -w and -b arguments to
      minimise changes. E.g:

     git diff -up mybranch..remotes/quagga.net/master

     It is preferable to use git format-patch, and even more preferred to
     publish a git repository (see GIT COMMIT SUBMISSION, section
     \ref{sec:git-submission}).

     If not using git format-patch, Include the commit message in the email.

\item After a commit, code should have comments explaining to the reviewer
      why it is correct, without reference to history.  The commit message
      should explain why the change is correct.

\item Include NEWS entries as appropriate.

\item Include only one semantic change or group of changes per patch.

\item Do not make gratuitous changes to whitespace. See the w and b arguments
      to diff.

\item Changes should be arranged so that the least controversial and most
      trivial are first, and the most complex or more controversial are
      last.  This will maximise how many the Quagga maintainers can merge,
      even if some other commits need further work.

\item Providing a unit-test is strongly encouraged. Doing so will make it
      much easier for maintainers to have confidence that they will be able
      to support your change.

\item New code should be arranged so that it easy to verify and test. E.g. 
      stateful logic should be separated out from functional logic as much as
      possible: wherever possible, move complex logic out to smaller helper
      functions which access no state other than their arguments.

\item State on which platforms and with what daemons the patch has been
      tested.  Understand that if the set of testing locations is small,
      and the patch might have unforeseen or hard to fix consequences that
      there may be a call for testers on quagga-dev, and that the patch
      may be blocked until test results appear.

      If there are no users for a platform on quagga-dev who are able and
      willing to verify -current occasionally, that platform may be
      dropped from the "should be checked" list.

\end{itemize}

\section{PATCH APPLICATION}

\begin{itemize}

\item Only apply patches that meet the submission guidelines.

\item If the patch might break something, issue a call for testing on the
      mailing-list.

\item Give an appropriate commit message (see above), and use the --author
      argument to git-commit, if required, to ensure proper attribution (you
      should still be listed as committer)

\item Immediately after commiting, double-check (with git-log and/or gitk).
      If there's a small mistake you can easily fix it with `git commit
      --amend ..'

\item When merging a branch, always use an explicit merge commit. Giving
      --no-ff ensures a merge commit is created which documents ``this human
      decided to merge this branch at this time''.
\end{itemize}

\section{STABLE PLATFORMS AND DAEMONS}

The list of platforms that should be tested follow.  This is a list
derived from what quagga is thought to run on and for which
maintainers can test or there are people on quagga-dev who are able
and willing to verify that -current does or does not work correctly.

\begin{itemize}
  \item BSD (Free, Net or Open, any platform)
  \item GNU/Linux (any distribution, i386)
  \item Solaris (strict alignment, any platform)
  \item future: NetBSD/sparc64
\end{itemize}

The list of daemons that are thought to be stable and that should be
tested are:

\begin{itemize}
  \item zebra
  \item bgpd
  \item ripd
  \item ospfd
  \item ripngd
\end{itemize}
Daemons which are in a testing phase are

\begin{itemize}
  \item ospf6d
  \item isisd
  \item watchquagga
\end{itemize}

\section{IMPORT OR UPDATE VENDOR SPECIFIC ROUTING PROTOCOLS}

The source code of Quagga is based on two vendors:

   \verb|zebra_org| (\url{http://www.zebra.org/})
   \verb|isisd_sf| (\url{http://isisd.sf.net/})

To import code from further sources, e.g. for archival purposes without
necessarily having to review and/or fix some changeset, create a branch from
`master':

\begin{verbatim}
	git checkout -b archive/foo master
	<apply changes>
	git commit -a "Joe Bar <joe@example.com>"
	git push quagga archive/foo
\end{verbatim}

presuming `quagga' corresponds to a file in your .git/remotes with
configuration for the appropriate Quagga.net repository.

\end{document}
