libgit2 conventions
===================

Namespace Prefixes
------------------

All types and functions start with 'git_'.

All #define macros start with 'GIT_'.


Type Definitions
----------------

Most types should be opaque, e.g.:

----
	typedef struct git_odb git_odb;
----

with allocation functions returning an "instance" created within
the library, and not within the application.  This allows the type
to grow (or shrink) in size without rebuilding client code.


Public Exported Function Definitions
------------------------------------

All exported functions must be declared as:

----
	GIT_EXTERN(result_type) git_modulename_functionname(arg_list);
----


Semi-Private Exported Functions
-------------------------------

Functions whose modulename is followed by two underscores,
for example 'git_odb__read_packed', are semi-private functions.
They are primarily intended for use within the library itself,
and may disappear or change their signature in a future release.


Calling Conventions
-------------------

Functions should prefer to return a 'int' to indicate success or
failure and supply any output through the first argument (or first
few arguments if multiple outputs are supplied).

int status codes are 0 for GIT_OK and < 0 for an error.
This permits common POSIX result testing:

----
	if (git_odb_open(&odb, path))
		abort("odb open failed");
----

Functions returning a pointer may return NULL instead of an int
if there is only one type of failure (GIT_ENOMEM).

Functions returning a pointer may also return NULL if the common
case needed by the application is strictly success/failure and a
(possibly slower) function exists that the caller can use to get
more detailed information.  Parsing common data structures from
on-disk formats is a good example of this pattern; in general a
"corrupt" entity can be treated as though it does not exist but
a more sophisticated "fsck" support function can report how the
entity is malformed.


Documentation Fomatting
-----------------------

All comments should conform to Doxygen "javadoc" style conventions
for formatting the public API documentation.


Public Header Format
--------------------

All public headers defining types, functions or macros must use
the following form, where ${filename} is the name of the file,
after replacing non-identifier characters with '_'.

----
	#ifndef INCLUDE_git_${filename}_h__
	#define INCLUDE_git_${filename}_h__

	#include "git/common.h"

	/**
	 * @file git/${filename}.h
	 * @brief Git some description
	 * @defgroup git_${filename} some description routines
	 * @ingroup Git
	 * @{
	 */
	GIT_BEGIN_DECL

	... definitions ...

	/** @} */
	GIT_END_DECL
	#endif
----
