Skip to content

Commit

Permalink
Initial draft of libgit2
Browse files Browse the repository at this point in the history
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
spearce committed Oct 31, 2008
0 parents commit c15648c
Show file tree
Hide file tree
Showing 9 changed files with 503 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
@@ -0,0 +1,3 @@
/apidocs
*.o
*.a
34 changes: 34 additions & 0 deletions LICENSE
@@ -0,0 +1,34 @@
/*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Git Development Community nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
38 changes: 38 additions & 0 deletions Makefile
@@ -0,0 +1,38 @@
all::

DOXYGEN = doxygen

CFLAGS = -g -O2
BASIC_CFLAGS = -Isrc

OBJS = \
src/git_odb.o \
src/git_oid.o \
#end OBJS

HDRS = \
src/git_oid.h \
src/git_common.h \
#end HDRS


all:: libgit2.a

clean:
rm -f libgit2.a src/*.o
rm -rf apidocs

apidocs:
$(DOXYGEN) api.doxygen

.c.o:
$(CC) $(BASIC_CFLAGS) $(CFLAGS) -c $< -o $@

src/%.o: src/%.c $(HDRS)
libgit2.a: $(OBJS)
rm -f libgit2.a
$(AR) cr libgit2.a $(OBJS)

.PHONY: all
.PHONY: clean
.PHONY: apidocs
20 changes: 20 additions & 0 deletions api.doxygen
@@ -0,0 +1,20 @@
PROJECT_NAME = libgit2

INPUT = src
QUIET = YES
RECURSIVE = YES
FILE_PATTERNS = *.h
OUTPUT_DIRECTORY = apidocs
GENERATE_TAGFILE = apidocs/libgit2.tag

JAVADOC_AUTOBRIEF = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
OPTIMIZE_OUTPUT_FOR_C = YES
STRIP_CODE_COMMENTS = NO
FULL_PATH_NAMES = NO
CASE_SENSE_NAMES = NO

PREDEFINED = \
"GIT_EXTERN(x)=x" \
DOXYGEN=
83 changes: 83 additions & 0 deletions src/git_common.h
@@ -0,0 +1,83 @@
/*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Git Development Community nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef INCLUDE_git_common_h__
#define INCLUDE_git_common_h__

#ifdef __cplusplus
# define GIT_BEGIN_DECL extern "C" {
# define GIT_END_DECL }
#else
/** Start declarations in C mode */
# define GIT_BEGIN_DECL /* empty */
/** End declarations in C mode */
# define GIT_END_DECL /* empty */
#endif

/**
* @file git_common.h
* @brief Git common platform definitions
* @defgroup git_common Git common platform definitions
* @ingroup Git
* @{
*/
GIT_BEGIN_DECL

/** Declare a public function exported for application use. */
#define GIT_EXTERN(type) type

/** Generic result code for any API call. */
typedef int git_result;

/** Operation completed successfully. */
#define GIT_SUCCESS 0

/**
* Operation failed, with unspecified reason.
* This value also serves as the base error code; all other
* error codes are subtracted from it such that all errors
* are < 0, in typical POSIX C tradition.
*/
#define GIT_ERROR -1

/** Input was not a properly formatted Git object id. */
#define GIT_ENOTOID (GIT_ERROR - 1)

/** Input does not exist in the scope searched. */
#define GIT_ENOTFOUND (GIT_ERROR - 2)

/** @} */
GIT_END_DECL
#endif
43 changes: 43 additions & 0 deletions src/git_odb.c
@@ -0,0 +1,43 @@
/*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Git Development Community nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "git_odb.h"

git_result git_odb_sread(git_sobj *out, git_odb *db, git_oid *id)
{
if (!git_odb__sread_packed(out, db, id))
return GIT_SUCCESS;
return git_odb__sread_loose(out, db, id);
}
133 changes: 133 additions & 0 deletions src/git_odb.h
@@ -0,0 +1,133 @@
/*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Git Development Community nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef INCLUDE_git_odb_h__
#define INCLUDE_git_odb_h__

#include "git_common.h"
#include "git_oid.h"
#include <unistd.h>

/**
* @file git_odb.h
* @brief Git object database routines
* @defgroup git_odb Git object database routines
* @ingroup Git
* @{
*/
GIT_BEGIN_DECL

/** An open object database handle. */
typedef struct git_odb {
/** Path to the "objects" directory. */
const char *path;

/** Alternate databases to search. */
struct git_odb **alternates;

/** Number of alternates available. */
unsigned n_alternates;
} git_odb;

/**
* Open an object database for read/write access.
* @param out location to store the database pointer, if opened.
* Set to NULL if the open failed.
* @param objects_dir path of the database's "objects" directory.
* @return GIT_SUCCESS if the database opened; otherwise an error
* code describing why the open was not possible.
*/
GIT_EXTERN(git_result) git_odb_open(git_odb **out, const char *objects_dir);

/**
* Close an open object database.
* @param db database pointer to close. If NULL no action is taken.
* The pointer is set to NULL when the close is completed.
*/
GIT_EXTERN(void) git_odb_close(git_odb** db);

/** Basic type (loose or packed) of any Git object. */
typedef enum {
OBJ_BAD = -1, /**< Object is invalid. */
OBJ__EXT1 = 0, /**< Reserved for future use. */
OBJ_COMMIT = 1, /**< A commit object. */
OBJ_TREE = 2, /**< A tree (directory listing) object. */
OBJ_BLOB = 3, /**< A file revision object. */
OBJ_TAG = 4, /**< An annotated tag object. */
OBJ__EXT2 = 5, /**< Reserved for future use. */
OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */
OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */
} git_otype;

/** A small object read from the database. */
typedef struct {
void *data; /**< Raw, decompressed object data. */
size_t len; /**< Total number of bytes in data. */
git_otype type; /**< Type of this object. */
} git_sobj;

/**
* Read a small object from the database.
* @param out object descriptor to populate upon reading.
* @param db database to search for the object in.
* @param id identity of the object to read.
* @return GIT_SUCCESS if the object was read;
* GIT_ENOTFOUND if the object is not in the database.
*/
GIT_EXTERN(git_result) git_odb_sread(git_sobj *out, git_odb *db, git_oid *id);

/**
* Read a small object from the database using only pack files.
* @param out object descriptor to populate upon reading.
* @param db database to search for the object in.
* @param id identity of the object to read.
* @return GIT_SUCCESS if the object was read;
* GIT_ENOTFOUND if the object is not in the database.
*/
GIT_EXTERN(git_result) git_odb__sread_packed(git_sobj *out, git_odb *db, git_oid *id);

/**
* Read a small object from the database using only loose object files.
* @param out object descriptor to populate upon reading.
* @param db database to search for the object in.
* @param id identity of the object to read.
* @return GIT_SUCCESS if the object was read;
* GIT_ENOTFOUND if the object is not in the database.
*/
GIT_EXTERN(git_result) git_odb__sread_loose(git_sobj *out, git_odb *db, git_oid *id);

/** @} */
GIT_END_DECL
#endif

0 comments on commit c15648c

Please sign in to comment.