mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-04 07:15:20 +00:00
Change include structure for the project
The maze with include dependencies has been fixed. There is now a global include: #include <git.h> The git_odb_backend API has been exposed. Signed-off-by: Vicent Marti <tanoku@gmail.com>
This commit is contained in:
parent
7d7cd8857a
commit
d12299fe22
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
#include "git/common.h"
|
||||
#include "git/odb.h"
|
||||
#include "git/object.h"
|
||||
#include "git/repository.h"
|
||||
|
||||
#include "common.h"
|
||||
|
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
#include "git/common.h"
|
||||
#include "git/odb.h"
|
||||
#include "git/object.h"
|
||||
#include "git/repository.h"
|
||||
|
||||
#include "common.h"
|
||||
|
49
src/git.h
Normal file
49
src/git.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This file is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License, version 2,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* In addition to the permissions in the GNU General Public License,
|
||||
* the authors give you unlimited permission to link the compiled
|
||||
* version of this file into combinations with other programs,
|
||||
* and to distribute those combinations without any restriction
|
||||
* coming from the use of this file. (The General Public License
|
||||
* restrictions do apply in other respects; for example, they cover
|
||||
* modification of the file, and distribution when not linked into
|
||||
* a combined executable.)
|
||||
*
|
||||
* This file is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef INCLUDE_git_git_h__
|
||||
#define INCLUDE_git_git_h__
|
||||
|
||||
#include "git/common.h"
|
||||
#include "git/errors.h"
|
||||
#include "git/zlib.h"
|
||||
|
||||
#include "git/types.h"
|
||||
|
||||
#include "git/oid.h"
|
||||
#include "git/odb.h"
|
||||
|
||||
#include "git/repository.h"
|
||||
#include "git/revwalk.h"
|
||||
|
||||
#include "git/object.h"
|
||||
#include "git/blob.h"
|
||||
#include "git/commit.h"
|
||||
#include "git/tag.h"
|
||||
#include "git/tree.h"
|
||||
|
||||
#include "git/index.h"
|
||||
|
||||
#endif
|
@ -2,6 +2,7 @@
|
||||
#define INCLUDE_git_blob_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
|
||||
/**
|
||||
@ -13,9 +14,6 @@
|
||||
*/
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/** In-memory representation of a blob object. */
|
||||
typedef struct git_blob git_blob;
|
||||
|
||||
/**
|
||||
* Lookup a blob object from a repository.
|
||||
* The generated blob object is owned by the revision
|
||||
|
@ -2,9 +2,8 @@
|
||||
#define INCLUDE_git_commit_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
#include "tree.h"
|
||||
#include "repository.h"
|
||||
|
||||
/**
|
||||
* @file git/commit.h
|
||||
@ -15,9 +14,6 @@
|
||||
*/
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/** Parsed representation of a commit object. */
|
||||
typedef struct git_commit git_commit;
|
||||
|
||||
/**
|
||||
* Lookup a commit object from a repository.
|
||||
* The generated commit object is owned by the revision
|
||||
|
@ -113,16 +113,6 @@
|
||||
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* Representation of an existing git repository,
|
||||
* including all its object contents
|
||||
*/
|
||||
typedef struct git_repository git_repository;
|
||||
|
||||
/** Representation of a generic object in a repository */
|
||||
typedef struct git_object git_object;
|
||||
|
||||
|
||||
/** Parsed representation of a person */
|
||||
typedef struct git_person git_person;
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
#ifndef INCLUDE_git_errors_h__
|
||||
#define INCLUDE_git_errors_h__
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/**
|
||||
* @file git/errors.h
|
||||
* @brief Git error handling routines and variables
|
||||
|
@ -2,7 +2,7 @@
|
||||
#define INCLUDE_git_index_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "oid.h"
|
||||
#include "types.h"
|
||||
|
||||
/**
|
||||
* @file git/index.h
|
||||
@ -19,10 +19,6 @@ GIT_BEGIN_DECL
|
||||
#define GIT_IDXENTRY_VALID (0x8000)
|
||||
#define GIT_IDXENTRY_STAGESHIFT 12
|
||||
|
||||
/** Memory representation of an index file. */
|
||||
typedef struct git_index git_index;
|
||||
|
||||
|
||||
/** Time used in a git index entry */
|
||||
typedef struct {
|
||||
unsigned int seconds;
|
||||
|
108
src/git/object.h
Normal file
108
src/git/object.h
Normal file
@ -0,0 +1,108 @@
|
||||
#ifndef INCLUDE_git_object_h__
|
||||
#define INCLUDE_git_object_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
|
||||
/**
|
||||
* @file git/object.h
|
||||
* @brief Git revision object management routines
|
||||
* @defgroup git_object Git revision object management routines
|
||||
* @ingroup Git
|
||||
* @{
|
||||
*/
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/**
|
||||
* Write back an object to disk.
|
||||
*
|
||||
* The object will be written to its corresponding
|
||||
* repository.
|
||||
*
|
||||
* If the object has no changes since it was first
|
||||
* read from the repository, no actions will take place.
|
||||
*
|
||||
* If the object has been modified since it was read from
|
||||
* the repository, or it has been created from scratch
|
||||
* in memory, it will be written to the repository and
|
||||
* its SHA1 ID will be updated accordingly.
|
||||
*
|
||||
* @param object Git object to write back
|
||||
* @return 0 on success; otherwise an error code
|
||||
*/
|
||||
GIT_EXTERN(int) git_object_write(git_object *object);
|
||||
|
||||
/**
|
||||
* Get the id (SHA1) of a repository object
|
||||
*
|
||||
* In-memory objects created by git_object_new() do not
|
||||
* have a SHA1 ID until they are written on a repository.
|
||||
*
|
||||
* @param obj the repository object
|
||||
* @return the SHA1 id
|
||||
*/
|
||||
GIT_EXTERN(const git_oid *) git_object_id(git_object *obj);
|
||||
|
||||
/**
|
||||
* Get the object type of an object
|
||||
*
|
||||
* @param obj the repository object
|
||||
* @return the object's type
|
||||
*/
|
||||
GIT_EXTERN(git_otype) git_object_type(git_object *obj);
|
||||
|
||||
/**
|
||||
* Get the repository that owns this object
|
||||
*
|
||||
* @param obj the object
|
||||
* @return the repository who owns this object
|
||||
*/
|
||||
GIT_EXTERN(git_repository *) git_object_owner(git_object *obj);
|
||||
|
||||
/**
|
||||
* Free a reference to one of the objects in the repository.
|
||||
*
|
||||
* Repository objects are managed automatically by the library,
|
||||
* but this method can be used to force freeing one of the
|
||||
* objects.
|
||||
*
|
||||
* Careful: freeing objects in the middle of a repository
|
||||
* traversal will most likely cause errors.
|
||||
*
|
||||
* @param object the object to free
|
||||
*/
|
||||
GIT_EXTERN(void) git_object_free(git_object *object);
|
||||
|
||||
/**
|
||||
* Convert an object type to it's string representation.
|
||||
*
|
||||
* The result is a pointer to a string in static memory and
|
||||
* should not be free()'ed.
|
||||
*
|
||||
* @param type object type to convert.
|
||||
* @return the corresponding string representation.
|
||||
*/
|
||||
GIT_EXTERN(const char *) git_object_type2string(git_otype type);
|
||||
|
||||
/**
|
||||
* Convert a string object type representation to it's git_otype.
|
||||
*
|
||||
* @param str the string to convert.
|
||||
* @return the corresponding git_otype.
|
||||
*/
|
||||
GIT_EXTERN(git_otype) git_object_string2type(const char *str);
|
||||
|
||||
/**
|
||||
* Determine if the given git_otype is a valid loose object type.
|
||||
*
|
||||
* @param type object type to test.
|
||||
* @return true if the type represents a valid loose object type,
|
||||
* false otherwise.
|
||||
*/
|
||||
GIT_EXTERN(int) git_object_typeisloose(git_otype type);
|
||||
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
|
||||
#endif
|
@ -2,8 +2,8 @@
|
||||
#define INCLUDE_git_odb_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* @file git/odb.h
|
||||
@ -14,12 +14,6 @@
|
||||
*/
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/** An open object database handle. */
|
||||
typedef struct git_odb git_odb;
|
||||
|
||||
/** A custom backend in an ODB */
|
||||
typedef struct git_odb_backend git_odb_backend;
|
||||
|
||||
/**
|
||||
* Create a new object database with no backends.
|
||||
*
|
||||
@ -69,20 +63,6 @@ GIT_EXTERN(int) git_odb_add_backend(git_odb *odb, git_odb_backend *backend);
|
||||
*/
|
||||
GIT_EXTERN(void) git_odb_close(git_odb *db);
|
||||
|
||||
/** Basic type (loose or packed) of any Git object. */
|
||||
typedef enum {
|
||||
GIT_OBJ_ANY = -2, /**< Object can be any of the following */
|
||||
GIT_OBJ_BAD = -1, /**< Object is invalid. */
|
||||
GIT_OBJ__EXT1 = 0, /**< Reserved for future use. */
|
||||
GIT_OBJ_COMMIT = 1, /**< A commit object. */
|
||||
GIT_OBJ_TREE = 2, /**< A tree (directory listing) object. */
|
||||
GIT_OBJ_BLOB = 3, /**< A file revision object. */
|
||||
GIT_OBJ_TAG = 4, /**< An annotated tag object. */
|
||||
GIT_OBJ__EXT2 = 5, /**< Reserved for future use. */
|
||||
GIT_OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */
|
||||
GIT_OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */
|
||||
} git_otype;
|
||||
|
||||
/** An object read from the database. */
|
||||
typedef struct {
|
||||
void *data; /**< Raw, decompressed object data. */
|
||||
@ -173,42 +153,7 @@ GIT_EXTERN(int) git_rawobj_hash(git_oid *id, git_rawobj *obj);
|
||||
*
|
||||
* @param obj object descriptor to free.
|
||||
*/
|
||||
GIT_INLINE(void) git_rawobj_close(git_rawobj *obj)
|
||||
{
|
||||
free(obj->data);
|
||||
obj->data = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Convert an object type to it's string representation.
|
||||
*
|
||||
* The result is a pointer to a string in static memory and
|
||||
* should not be free()'ed.
|
||||
*
|
||||
* @param type object type to convert.
|
||||
* @return the corresponding string representation.
|
||||
*/
|
||||
GIT_EXTERN(const char *) git_otype_tostring(git_otype type);
|
||||
|
||||
/**
|
||||
* Convert a string object type representation to it's git_otype.
|
||||
*
|
||||
* @param str the string to convert.
|
||||
* @return the corresponding git_otype.
|
||||
*/
|
||||
GIT_EXTERN(git_otype) git_otype_fromstring(const char *str);
|
||||
|
||||
/**
|
||||
* Determine if the given git_otype is a valid loose object type.
|
||||
*
|
||||
* @param type object type to test.
|
||||
* @return true if the type represents a valid loose object type,
|
||||
* false otherwise.
|
||||
*/
|
||||
GIT_EXTERN(int) git_otype_is_loose(git_otype type);
|
||||
GIT_EXTERN(void) git_rawobj_close(git_rawobj *obj);
|
||||
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
|
40
src/git/odb_backend.h
Normal file
40
src/git/odb_backend.h
Normal file
@ -0,0 +1,40 @@
|
||||
#ifndef INCLUDE_git_odb_backend_h__
|
||||
#define INCLUDE_git_odb_backend_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
struct git_odb_backend {
|
||||
git_odb *odb;
|
||||
|
||||
int priority;
|
||||
|
||||
int (* read)(
|
||||
git_rawobj *,
|
||||
struct git_odb_backend *,
|
||||
const git_oid *);
|
||||
|
||||
int (* read_header)(
|
||||
git_rawobj *,
|
||||
struct git_odb_backend *,
|
||||
const git_oid *);
|
||||
|
||||
int (* write)(
|
||||
git_oid *id,
|
||||
struct git_odb_backend *,
|
||||
git_rawobj *obj);
|
||||
|
||||
int (* exists)(
|
||||
struct git_odb_backend *,
|
||||
const git_oid *);
|
||||
|
||||
void (* free)(struct git_odb_backend *);
|
||||
|
||||
};
|
||||
|
||||
GIT_END_DECL
|
||||
|
||||
#endif
|
@ -1,9 +1,6 @@
|
||||
#ifndef INCLUDE_git_oid_h__
|
||||
#define INCLUDE_git_oid_h__
|
||||
|
||||
#include "common.h"
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* @file git/oid.h
|
||||
* @brief Git object id routines
|
||||
@ -40,10 +37,7 @@ GIT_EXTERN(int) git_oid_mkstr(git_oid *out, const char *str);
|
||||
* @param out oid structure the result is written into.
|
||||
* @param raw the raw input bytes to be copied.
|
||||
*/
|
||||
GIT_INLINE(void) git_oid_mkraw(git_oid *out, const unsigned char *raw)
|
||||
{
|
||||
memcpy(out->id, raw, sizeof(out->id));
|
||||
}
|
||||
GIT_EXTERN(void) git_oid_mkraw(git_oid *out, const unsigned char *raw);
|
||||
|
||||
/**
|
||||
* Format a git_oid into a hex string.
|
||||
@ -101,10 +95,7 @@ GIT_EXTERN(char *) git_oid_to_string(char *out, size_t n, const git_oid *oid);
|
||||
* @param out oid structure the result is written into.
|
||||
* @param src oid structure to copy from.
|
||||
*/
|
||||
GIT_INLINE(void) git_oid_cpy(git_oid *out, const git_oid *src)
|
||||
{
|
||||
memcpy(out->id, src->id, sizeof(out->id));
|
||||
}
|
||||
GIT_EXTERN(void) git_oid_cpy(git_oid *out, const git_oid *src);
|
||||
|
||||
/**
|
||||
* Compare two oid structures.
|
||||
@ -112,10 +103,7 @@ GIT_INLINE(void) git_oid_cpy(git_oid *out, const git_oid *src)
|
||||
* @param b second oid structure.
|
||||
* @return <0, 0, >0 if a < b, a == b, a > b.
|
||||
*/
|
||||
GIT_INLINE(int) git_oid_cmp(const git_oid *a, const git_oid *b)
|
||||
{
|
||||
return memcmp(a->id, b->id, sizeof(a->id));
|
||||
}
|
||||
GIT_EXTERN(int) git_oid_cmp(const git_oid *a, const git_oid *b);
|
||||
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
|
@ -2,14 +2,13 @@
|
||||
#define INCLUDE_git_repository_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "odb.h"
|
||||
#include "commit.h"
|
||||
#include "index.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
|
||||
/**
|
||||
* @file git/repository.h
|
||||
* @brief Git revision object management routines
|
||||
* @defgroup git_repository Git revision object management routines
|
||||
* @brief Git repository management routines
|
||||
* @defgroup git_repository Git repository management routines
|
||||
* @ingroup Git
|
||||
* @{
|
||||
*/
|
||||
@ -133,66 +132,6 @@ GIT_EXTERN(git_index *) git_repository_index(git_repository *rpeo);
|
||||
*/
|
||||
GIT_EXTERN(int) git_repository_newobject(git_object **object, git_repository *repo, git_otype type);
|
||||
|
||||
/**
|
||||
* Write back an object to disk.
|
||||
*
|
||||
* The object will be written to its corresponding
|
||||
* repository.
|
||||
*
|
||||
* If the object has no changes since it was first
|
||||
* read from the repository, no actions will take place.
|
||||
*
|
||||
* If the object has been modified since it was read from
|
||||
* the repository, or it has been created from scratch
|
||||
* in memory, it will be written to the repository and
|
||||
* its SHA1 ID will be updated accordingly.
|
||||
*
|
||||
* @param object Git object to write back
|
||||
* @return 0 on success; otherwise an error code
|
||||
*/
|
||||
GIT_EXTERN(int) git_object_write(git_object *object);
|
||||
|
||||
/**
|
||||
* Get the id (SHA1) of a repository object
|
||||
*
|
||||
* In-memory objects created by git_object_new() do not
|
||||
* have a SHA1 ID until they are written on a repository.
|
||||
*
|
||||
* @param obj the repository object
|
||||
* @return the SHA1 id
|
||||
*/
|
||||
GIT_EXTERN(const git_oid *) git_object_id(git_object *obj);
|
||||
|
||||
/**
|
||||
* Get the object type of an object
|
||||
*
|
||||
* @param obj the repository object
|
||||
* @return the object's type
|
||||
*/
|
||||
GIT_EXTERN(git_otype) git_object_type(git_object *obj);
|
||||
|
||||
/**
|
||||
* Get the repository that owns this object
|
||||
*
|
||||
* @param obj the object
|
||||
* @return the repository who owns this object
|
||||
*/
|
||||
GIT_EXTERN(git_repository *) git_object_owner(git_object *obj);
|
||||
|
||||
/**
|
||||
* Free a reference to one of the objects in the repository.
|
||||
*
|
||||
* Repository objects are managed automatically by the library,
|
||||
* but this method can be used to force freeing one of the
|
||||
* objects.
|
||||
*
|
||||
* Careful: freeing objects in the middle of a repository
|
||||
* traversal will most likely cause errors.
|
||||
*
|
||||
* @param object the object to free
|
||||
*/
|
||||
GIT_EXTERN(void) git_object_free(git_object *object);
|
||||
|
||||
/**
|
||||
* Free a previously allocated repository
|
||||
* @param repo repository handle to close. If NULL nothing occurs.
|
||||
|
@ -2,8 +2,7 @@
|
||||
#define INCLUDE_git_revwalk_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "odb.h"
|
||||
#include "commit.h"
|
||||
#include "types.h"
|
||||
|
||||
/**
|
||||
* @file git/revwalk.h
|
||||
@ -43,8 +42,6 @@ GIT_BEGIN_DECL
|
||||
*/
|
||||
#define GIT_SORT_REVERSE (1 << 2)
|
||||
|
||||
typedef struct git_revwalk git_revwalk;
|
||||
|
||||
/**
|
||||
* Allocate a new revision walker to iterate through a repo.
|
||||
*
|
||||
|
@ -2,9 +2,8 @@
|
||||
#define INCLUDE_git_tag_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
#include "tree.h"
|
||||
#include "repository.h"
|
||||
|
||||
/**
|
||||
* @file git/tag.h
|
||||
@ -15,9 +14,6 @@
|
||||
*/
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/** Parsed representation of a tag object. */
|
||||
typedef struct git_tag git_tag;
|
||||
|
||||
/**
|
||||
* Lookup a tag object from the repository.
|
||||
* The generated tag object is owned by the revision
|
||||
|
@ -2,8 +2,8 @@
|
||||
#define INCLUDE_git_tree_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
#include "repository.h"
|
||||
|
||||
/**
|
||||
* @file git/tree.h
|
||||
@ -14,13 +14,6 @@
|
||||
*/
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
|
||||
/** Representation of each one of the entries in a tree object. */
|
||||
typedef struct git_tree_entry git_tree_entry;
|
||||
|
||||
/** Representation of a tree object. */
|
||||
typedef struct git_tree git_tree;
|
||||
|
||||
/**
|
||||
* Lookup a tree object from the repository.
|
||||
* The generated tree object is owned by the revision
|
||||
|
64
src/git/types.h
Normal file
64
src/git/types.h
Normal file
@ -0,0 +1,64 @@
|
||||
#ifndef INCLUDE_git_types_h__
|
||||
#define INCLUDE_git_types_h__
|
||||
|
||||
/**
|
||||
* @file git/types.h
|
||||
* @brief libgit2 base types
|
||||
* @ingroup Git
|
||||
* @{
|
||||
*/
|
||||
GIT_BEGIN_DECL
|
||||
|
||||
/** Basic type (loose or packed) of any Git object. */
|
||||
typedef enum {
|
||||
GIT_OBJ_ANY = -2, /**< Object can be any of the following */
|
||||
GIT_OBJ_BAD = -1, /**< Object is invalid. */
|
||||
GIT_OBJ__EXT1 = 0, /**< Reserved for future use. */
|
||||
GIT_OBJ_COMMIT = 1, /**< A commit object. */
|
||||
GIT_OBJ_TREE = 2, /**< A tree (directory listing) object. */
|
||||
GIT_OBJ_BLOB = 3, /**< A file revision object. */
|
||||
GIT_OBJ_TAG = 4, /**< An annotated tag object. */
|
||||
GIT_OBJ__EXT2 = 5, /**< Reserved for future use. */
|
||||
GIT_OBJ_OFS_DELTA = 6, /**< A delta, base is given by an offset. */
|
||||
GIT_OBJ_REF_DELTA = 7, /**< A delta, base is given by object id. */
|
||||
} git_otype;
|
||||
|
||||
/** An open object database handle. */
|
||||
typedef struct git_odb git_odb;
|
||||
|
||||
/** A custom backend in an ODB */
|
||||
typedef struct git_odb_backend git_odb_backend;
|
||||
|
||||
/**
|
||||
* Representation of an existing git repository,
|
||||
* including all its object contents
|
||||
*/
|
||||
typedef struct git_repository git_repository;
|
||||
|
||||
/** Representation of a generic object in a repository */
|
||||
typedef struct git_object git_object;
|
||||
|
||||
typedef struct git_revwalk git_revwalk;
|
||||
|
||||
/** Parsed representation of a tag object. */
|
||||
typedef struct git_tag git_tag;
|
||||
|
||||
/** In-memory representation of a blob object. */
|
||||
typedef struct git_blob git_blob;
|
||||
|
||||
/** Parsed representation of a commit object. */
|
||||
typedef struct git_commit git_commit;
|
||||
|
||||
/** Representation of each one of the entries in a tree object. */
|
||||
typedef struct git_tree_entry git_tree_entry;
|
||||
|
||||
/** Representation of a tree object. */
|
||||
typedef struct git_tree git_tree;
|
||||
|
||||
/** Memory representation of an index file. */
|
||||
typedef struct git_index git_index;
|
||||
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
|
||||
#endif
|
@ -1,7 +1,6 @@
|
||||
#ifndef INCLUDE_git_zlib_h__
|
||||
#define INCLUDE_git_zlib_h__
|
||||
|
||||
#include "common.h"
|
||||
#include <zlib.h>
|
||||
|
||||
/**
|
||||
|
59
src/odb.c
59
src/odb.c
@ -25,62 +25,17 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "git/zlib.h"
|
||||
#include "git/object.h"
|
||||
#include "fileops.h"
|
||||
#include "hash.h"
|
||||
#include "odb.h"
|
||||
#include "delta-apply.h"
|
||||
|
||||
static struct {
|
||||
const char *str; /* type name string */
|
||||
int loose; /* valid loose object type flag */
|
||||
} obj_type_table[] = {
|
||||
{ "", 0 }, /* 0 = GIT_OBJ__EXT1 */
|
||||
{ "commit", 1 }, /* 1 = GIT_OBJ_COMMIT */
|
||||
{ "tree", 1 }, /* 2 = GIT_OBJ_TREE */
|
||||
{ "blob", 1 }, /* 3 = GIT_OBJ_BLOB */
|
||||
{ "tag", 1 }, /* 4 = GIT_OBJ_TAG */
|
||||
{ "", 0 }, /* 5 = GIT_OBJ__EXT2 */
|
||||
{ "OFS_DELTA", 0 }, /* 6 = GIT_OBJ_OFS_DELTA */
|
||||
{ "REF_DELTA", 0 } /* 7 = GIT_OBJ_REF_DELTA */
|
||||
};
|
||||
|
||||
/***********************************************************
|
||||
*
|
||||
* MISCELANEOUS HELPER FUNCTIONS
|
||||
*
|
||||
***********************************************************/
|
||||
|
||||
const char *git_otype_tostring(git_otype type)
|
||||
{
|
||||
if (type < 0 || ((size_t) type) >= ARRAY_SIZE(obj_type_table))
|
||||
return "";
|
||||
return obj_type_table[type].str;
|
||||
}
|
||||
|
||||
git_otype git_otype_fromstring(const char *str)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!str || !*str)
|
||||
return GIT_OBJ_BAD;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(obj_type_table); i++)
|
||||
if (!strcmp(str, obj_type_table[i].str))
|
||||
return (git_otype) i;
|
||||
|
||||
return GIT_OBJ_BAD;
|
||||
}
|
||||
|
||||
int git_otype_is_loose(git_otype type)
|
||||
{
|
||||
if (type < 0 || ((size_t) type) >= ARRAY_SIZE(obj_type_table))
|
||||
return 0;
|
||||
return obj_type_table[type].loose;
|
||||
}
|
||||
#include "git/odb_backend.h"
|
||||
|
||||
static int format_object_header(char *hdr, size_t n, git_rawobj *obj)
|
||||
{
|
||||
const char *type_str = git_otype_tostring(obj->type);
|
||||
const char *type_str = git_object_type2string(obj->type);
|
||||
int len = snprintf(hdr, n, "%s %"PRIuZ, type_str, obj->len);
|
||||
|
||||
assert(len > 0); /* otherwise snprintf() is broken */
|
||||
@ -98,7 +53,7 @@ int git_odb__hash_obj(git_oid *id, char *hdr, size_t n, int *len, git_rawobj *ob
|
||||
|
||||
assert(id && hdr && len && obj);
|
||||
|
||||
if (!git_otype_is_loose(obj->type))
|
||||
if (!git_object_typeisloose(obj->type))
|
||||
return GIT_ERROR;
|
||||
|
||||
if (!obj->data && obj->len != 0)
|
||||
@ -119,6 +74,12 @@ int git_odb__hash_obj(git_oid *id, char *hdr, size_t n, int *len, git_rawobj *ob
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
void git_rawobj_close(git_rawobj *obj)
|
||||
{
|
||||
free(obj->data);
|
||||
obj->data = NULL;
|
||||
}
|
||||
|
||||
int git_rawobj_hash(git_oid *id, git_rawobj *obj)
|
||||
{
|
||||
char hdr[64];
|
||||
|
28
src/odb.h
28
src/odb.h
@ -11,34 +11,6 @@ struct git_odb {
|
||||
git_vector backends;
|
||||
};
|
||||
|
||||
struct git_odb_backend {
|
||||
git_odb *odb;
|
||||
|
||||
int priority;
|
||||
|
||||
int (* read)(
|
||||
git_rawobj *,
|
||||
struct git_odb_backend *,
|
||||
const git_oid *);
|
||||
|
||||
int (* read_header)(
|
||||
git_rawobj *,
|
||||
struct git_odb_backend *,
|
||||
const git_oid *);
|
||||
|
||||
int (* write)(
|
||||
git_oid *id,
|
||||
struct git_odb_backend *,
|
||||
git_rawobj *obj);
|
||||
|
||||
int (* exists)(
|
||||
struct git_odb_backend *,
|
||||
const git_oid *);
|
||||
|
||||
void (* free)(struct git_odb_backend *);
|
||||
|
||||
};
|
||||
|
||||
int git_odb__hash_obj(git_oid *id, char *hdr, size_t n, int *len, git_rawobj *obj);
|
||||
int git_odb__inflate_buffer(void *in, size_t inlen, void *out, size_t outlen);
|
||||
|
||||
|
@ -25,11 +25,13 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "git/zlib.h"
|
||||
#include "git/object.h"
|
||||
#include "fileops.h"
|
||||
#include "hash.h"
|
||||
#include "odb.h"
|
||||
#include "delta-apply.h"
|
||||
|
||||
#include "git/odb_backend.h"
|
||||
|
||||
typedef struct { /* object header data */
|
||||
git_otype type; /* object type */
|
||||
@ -148,7 +150,7 @@ static size_t get_object_header(obj_hdr *hdr, unsigned char *data)
|
||||
typename[used] = 0;
|
||||
if (used == 0)
|
||||
return 0;
|
||||
hdr->type = git_otype_fromstring(typename);
|
||||
hdr->type = git_object_string2type(typename);
|
||||
used++; /* consume the space */
|
||||
|
||||
/*
|
||||
@ -357,7 +359,7 @@ static int inflate_packlike_loose_disk_obj(git_rawobj *out, gitfo_buf *obj)
|
||||
if ((used = get_binary_object_header(&hdr, obj)) == 0)
|
||||
return GIT_ERROR;
|
||||
|
||||
if (!git_otype_is_loose(hdr.type))
|
||||
if (!git_object_typeisloose(hdr.type))
|
||||
return GIT_ERROR;
|
||||
|
||||
/*
|
||||
@ -406,7 +408,7 @@ static int inflate_disk_obj(git_rawobj *out, gitfo_buf *obj)
|
||||
if ((used = get_object_header(&hdr, head)) == 0)
|
||||
return GIT_ERROR;
|
||||
|
||||
if (!git_otype_is_loose(hdr.type))
|
||||
if (!git_object_typeisloose(hdr.type))
|
||||
return GIT_ERROR;
|
||||
|
||||
/*
|
||||
@ -489,7 +491,7 @@ static int read_header_loose(git_rawobj *out, const char *loc)
|
||||
|
||||
if ((z_return != Z_STREAM_END && z_return != Z_BUF_ERROR)
|
||||
|| get_object_header(&header_obj, inflated_buffer) == 0
|
||||
|| git_otype_is_loose(header_obj.type) == 0) {
|
||||
|| git_object_typeisloose(header_obj.type) == 0) {
|
||||
error = GIT_EOBJCORRUPTED;
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -25,11 +25,14 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "git/zlib.h"
|
||||
#include "git/repository.h"
|
||||
#include "fileops.h"
|
||||
#include "hash.h"
|
||||
#include "odb.h"
|
||||
#include "delta-apply.h"
|
||||
|
||||
#include "git/odb_backend.h"
|
||||
|
||||
/** First 4 bytes of a pack-*.idx file header.
|
||||
*
|
||||
* Note this header exists only in idx v2 and later. The idx v1
|
||||
|
15
src/oid.c
15
src/oid.c
@ -151,3 +151,18 @@ int git__write_oid(git_odb_source *src, const char *header, const git_oid *oid)
|
||||
|
||||
return git__source_printf(src, "%s %s\n", header, hex_oid);
|
||||
}
|
||||
|
||||
void git_oid_mkraw(git_oid *out, const unsigned char *raw)
|
||||
{
|
||||
memcpy(out->id, raw, sizeof(out->id));
|
||||
}
|
||||
|
||||
void git_oid_cpy(git_oid *out, const git_oid *src)
|
||||
{
|
||||
memcpy(out->id, src->id, sizeof(out->id));
|
||||
}
|
||||
|
||||
int git_oid_cmp(const git_oid *a, const git_oid *b)
|
||||
{
|
||||
return memcmp(a->id, b->id, sizeof(a->id));
|
||||
}
|
||||
|
@ -24,6 +24,8 @@
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "git/object.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "repository.h"
|
||||
#include "commit.h"
|
||||
@ -41,14 +43,28 @@ static const double max_load_factor = 0.65;
|
||||
|
||||
static const int OBJECT_BASE_SIZE = 4096;
|
||||
|
||||
static const size_t object_sizes[] = {
|
||||
0,
|
||||
sizeof(git_commit),
|
||||
sizeof(git_tree),
|
||||
sizeof(git_blob),
|
||||
sizeof(git_tag)
|
||||
static struct {
|
||||
const char *str; /* type name string */
|
||||
int loose; /* valid loose object type flag */
|
||||
size_t size; /* size in bytes of the object structure */
|
||||
} git_objects_table[] = {
|
||||
{ "", 0, 0 }, /* 0 = GIT_OBJ__EXT1 */
|
||||
{ "commit", 1, sizeof(git_commit)}, /* 1 = GIT_OBJ_COMMIT */
|
||||
{ "tree", 1, sizeof(git_tree) }, /* 2 = GIT_OBJ_TREE */
|
||||
{ "blob", 1, sizeof(git_blob) }, /* 3 = GIT_OBJ_BLOB */
|
||||
{ "tag", 1, sizeof(git_tag) }, /* 4 = GIT_OBJ_TAG */
|
||||
{ "", 0, 0 }, /* 5 = GIT_OBJ__EXT2 */
|
||||
{ "OFS_DELTA", 0, 0 }, /* 6 = GIT_OBJ_OFS_DELTA */
|
||||
{ "REF_DELTA", 0, 0 } /* 7 = GIT_OBJ_REF_DELTA */
|
||||
};
|
||||
|
||||
/***********************************************************
|
||||
*
|
||||
* MISCELANEOUS HELPER FUNCTIONS
|
||||
*
|
||||
***********************************************************/
|
||||
|
||||
|
||||
|
||||
uint32_t git__objtable_hash(const void *key)
|
||||
{
|
||||
@ -570,12 +586,12 @@ int git_repository_newobject(git_object **object_out, git_repository *repo, git_
|
||||
return GIT_EINVALIDTYPE;
|
||||
}
|
||||
|
||||
object = git__malloc(object_sizes[type]);
|
||||
object = git__malloc(git_objects_table[type].size);
|
||||
|
||||
if (object == NULL)
|
||||
return GIT_ENOMEM;
|
||||
|
||||
memset(object, 0x0, object_sizes[type]);
|
||||
memset(object, 0x0, git_objects_table[type].size);
|
||||
object->repo = repo;
|
||||
object->in_memory = 1;
|
||||
object->modified = 1;
|
||||
@ -609,12 +625,12 @@ int git_repository_lookup(git_object **object_out, git_repository *repo, const g
|
||||
|
||||
type = obj_file.type;
|
||||
|
||||
object = git__malloc(object_sizes[type]);
|
||||
object = git__malloc(git_objects_table[type].size);
|
||||
|
||||
if (object == NULL)
|
||||
return GIT_ENOMEM;
|
||||
|
||||
memset(object, 0x0, object_sizes[type]);
|
||||
memset(object, 0x0, git_objects_table[type].size);
|
||||
|
||||
/* Initialize parent object */
|
||||
git_oid_cpy(&object->id, id);
|
||||
@ -668,3 +684,32 @@ GIT_NEWOBJECT_TEMPLATE(tree, TREE)
|
||||
GIT_NEWOBJECT_TEMPLATE(blob, BLOB)
|
||||
|
||||
|
||||
const char *git_object_type2string(git_otype type)
|
||||
{
|
||||
if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table))
|
||||
return "";
|
||||
|
||||
return git_objects_table[type].str;
|
||||
}
|
||||
|
||||
git_otype git_object_string2type(const char *str)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!str || !*str)
|
||||
return GIT_OBJ_BAD;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(git_objects_table); i++)
|
||||
if (!strcmp(str, git_objects_table[i].str))
|
||||
return (git_otype)i;
|
||||
|
||||
return GIT_OBJ_BAD;
|
||||
}
|
||||
|
||||
int git_object_typeisloose(git_otype type)
|
||||
{
|
||||
if (type < 0 || ((size_t) type) >= ARRAY_SIZE(git_objects_table))
|
||||
return 0;
|
||||
|
||||
return git_objects_table[type].loose;
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "tag.h"
|
||||
#include "person.h"
|
||||
#include "revwalk.h"
|
||||
#include "git/odb.h"
|
||||
#include "git/object.h"
|
||||
#include "git/repository.h"
|
||||
|
||||
void git_tag__free(git_tag *tag)
|
||||
@ -215,7 +215,7 @@ int git_tag__writeback(git_tag *tag, git_odb_source *src)
|
||||
return GIT_EMISSINGOBJDATA;
|
||||
|
||||
git__write_oid(src, "object", git_object_id(tag->target));
|
||||
git__source_printf(src, "type %s\n", git_otype_tostring(tag->type));
|
||||
git__source_printf(src, "type %s\n", git_object_type2string(tag->type));
|
||||
git__source_printf(src, "tag %s\n", tag->tag_name);
|
||||
git_person__write(src, "tagger", tag->tagger);
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "revwalk.h"
|
||||
#include "tree.h"
|
||||
#include "git/repository.h"
|
||||
#include "git/object.h"
|
||||
|
||||
int entry_search_cmp(const void *key, const void *array_member)
|
||||
{
|
||||
|
@ -1,50 +1,51 @@
|
||||
|
||||
#include "test_lib.h"
|
||||
#include <git/odb.h>
|
||||
#include <git/object.h>
|
||||
|
||||
BEGIN_TEST(type_to_string)
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ_BAD), ""));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ__EXT1), ""));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ_COMMIT), "commit"));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ_TREE), "tree"));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ_BLOB), "blob"));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ_TAG), "tag"));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ__EXT2), ""));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ_OFS_DELTA), "OFS_DELTA"));
|
||||
must_be_true(!strcmp(git_otype_tostring(GIT_OBJ_REF_DELTA), "REF_DELTA"));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ_BAD), ""));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ__EXT1), ""));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ_COMMIT), "commit"));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ_TREE), "tree"));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ_BLOB), "blob"));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ_TAG), "tag"));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ__EXT2), ""));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ_OFS_DELTA), "OFS_DELTA"));
|
||||
must_be_true(!strcmp(git_object_type2string(GIT_OBJ_REF_DELTA), "REF_DELTA"));
|
||||
|
||||
must_be_true(!strcmp(git_otype_tostring(-2), ""));
|
||||
must_be_true(!strcmp(git_otype_tostring(8), ""));
|
||||
must_be_true(!strcmp(git_otype_tostring(1234), ""));
|
||||
must_be_true(!strcmp(git_object_type2string(-2), ""));
|
||||
must_be_true(!strcmp(git_object_type2string(8), ""));
|
||||
must_be_true(!strcmp(git_object_type2string(1234), ""));
|
||||
END_TEST
|
||||
|
||||
BEGIN_TEST(string_to_type)
|
||||
must_be_true(git_otype_fromstring(NULL) == GIT_OBJ_BAD);
|
||||
must_be_true(git_otype_fromstring("") == GIT_OBJ_BAD);
|
||||
must_be_true(git_otype_fromstring("commit") == GIT_OBJ_COMMIT);
|
||||
must_be_true(git_otype_fromstring("tree") == GIT_OBJ_TREE);
|
||||
must_be_true(git_otype_fromstring("blob") == GIT_OBJ_BLOB);
|
||||
must_be_true(git_otype_fromstring("tag") == GIT_OBJ_TAG);
|
||||
must_be_true(git_otype_fromstring("OFS_DELTA") == GIT_OBJ_OFS_DELTA);
|
||||
must_be_true(git_otype_fromstring("REF_DELTA") == GIT_OBJ_REF_DELTA);
|
||||
must_be_true(git_object_string2type(NULL) == GIT_OBJ_BAD);
|
||||
must_be_true(git_object_string2type("") == GIT_OBJ_BAD);
|
||||
must_be_true(git_object_string2type("commit") == GIT_OBJ_COMMIT);
|
||||
must_be_true(git_object_string2type("tree") == GIT_OBJ_TREE);
|
||||
must_be_true(git_object_string2type("blob") == GIT_OBJ_BLOB);
|
||||
must_be_true(git_object_string2type("tag") == GIT_OBJ_TAG);
|
||||
must_be_true(git_object_string2type("OFS_DELTA") == GIT_OBJ_OFS_DELTA);
|
||||
must_be_true(git_object_string2type("REF_DELTA") == GIT_OBJ_REF_DELTA);
|
||||
|
||||
must_be_true(git_otype_fromstring("CoMmIt") == GIT_OBJ_BAD);
|
||||
must_be_true(git_otype_fromstring("hohoho") == GIT_OBJ_BAD);
|
||||
must_be_true(git_object_string2type("CoMmIt") == GIT_OBJ_BAD);
|
||||
must_be_true(git_object_string2type("hohoho") == GIT_OBJ_BAD);
|
||||
END_TEST
|
||||
|
||||
BEGIN_TEST(loose_object)
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ_BAD) == 0);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ__EXT1) == 0);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ_COMMIT) == 1);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ_TREE) == 1);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ_BLOB) == 1);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ_TAG) == 1);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ__EXT2) == 0);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ_OFS_DELTA) == 0);
|
||||
must_be_true(git_otype_is_loose(GIT_OBJ_REF_DELTA) == 0);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ_BAD) == 0);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ__EXT1) == 0);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ_COMMIT) == 1);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ_TREE) == 1);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ_BLOB) == 1);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ_TAG) == 1);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ__EXT2) == 0);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ_OFS_DELTA) == 0);
|
||||
must_be_true(git_object_typeisloose(GIT_OBJ_REF_DELTA) == 0);
|
||||
|
||||
must_be_true(git_otype_is_loose(-2) == 0);
|
||||
must_be_true(git_otype_is_loose(8) == 0);
|
||||
must_be_true(git_otype_is_loose(1234) == 0);
|
||||
must_be_true(git_object_typeisloose(-2) == 0);
|
||||
must_be_true(git_object_typeisloose(8) == 0);
|
||||
must_be_true(git_object_typeisloose(1234) == 0);
|
||||
END_TEST
|
||||
|
||||
|
@ -26,8 +26,6 @@
|
||||
#include "common.h"
|
||||
#include "test_helpers.h"
|
||||
#include "fileops.h"
|
||||
#include "git/oid.h"
|
||||
#include "git/repository.h"
|
||||
|
||||
int write_object_data(char *file, void *data, size_t len)
|
||||
{
|
||||
@ -125,7 +123,7 @@ int remove_loose_object(const char *repository_folder, git_object *object)
|
||||
|
||||
int cmp_objects(git_rawobj *o, object_data *d)
|
||||
{
|
||||
if (o->type != git_otype_fromstring(d->type))
|
||||
if (o->type != git_object_string2type(d->type))
|
||||
return -1;
|
||||
if (o->len != d->dlen)
|
||||
return -1;
|
||||
|
@ -27,7 +27,7 @@
|
||||
#define INCLUDE_test_helpers_h__
|
||||
|
||||
#include "test_lib.h"
|
||||
#include <git/odb.h>
|
||||
#include <git.h>
|
||||
|
||||
#define ODB_FOLDER "../resources/testrepo.git/objects/"
|
||||
#define REPOSITORY_FOLDER "../resources/testrepo.git/"
|
||||
|
Loading…
Reference in New Issue
Block a user