2 * Copyright (C) the libgit2 contributors. All rights reserved.
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
7 #ifndef INCLUDE_odb_h__
8 #define INCLUDE_odb_h__
14 #include "git2/types.h"
21 #define GIT_OBJECTS_DIR "objects/"
22 #define GIT_OBJECT_DIR_MODE 0777
23 #define GIT_OBJECT_FILE_MODE 0444
25 extern bool git_odb__strict_hash_verification
;
29 void *data
; /**< Raw, decompressed object data. */
30 size_t len
; /**< Total number of bytes in data. */
31 git_object_t type
; /**< Type of this object. */
35 struct git_odb_object
{
36 git_cached_obj cached
;
45 unsigned int do_fsync
:1;
49 GIT_ODB_CAP_FROM_OWNER
= -1,
53 * Set the capabilities for the object database.
55 int git_odb__set_caps(git_odb
*odb
, int caps
);
58 * Add the default loose and packed backends for a database.
60 int git_odb__add_default_backends(
61 git_odb
*db
, const char *objects_dir
,
62 bool as_alternates
, int alternate_depth
);
65 * Hash a git_rawobj internally.
66 * The `git_rawobj` is supposed to be previously initialized
68 int git_odb__hashobj(git_oid
*id
, git_rawobj
*obj
);
71 * Format the object header such as it would appear in the on-disk object
73 int git_odb__format_object_header(size_t *out_len
, char *hdr
, size_t hdr_size
, git_object_size_t obj_len
, git_object_t obj_type
);
76 * Hash an open file descriptor.
77 * This is a performance call when the contents of a fd need to be hashed,
78 * but the fd is already open and we have the size of the contents.
80 * Saves us some `stat` calls.
82 * The fd is never closed, not even on error. It must be opened and closed
85 int git_odb__hashfd(git_oid
*out
, git_file fd
, size_t size
, git_object_t type
);
88 * Hash an open file descriptor applying an array of filters
89 * Acts just like git_odb__hashfd with the addition of filters...
91 int git_odb__hashfd_filtered(
92 git_oid
*out
, git_file fd
, size_t len
, git_object_t type
, git_filter_list
*fl
);
95 * Hash a `path`, assuming it could be a POSIX symlink: if the path is a
96 * symlink, then the raw contents of the symlink will be hashed. Otherwise,
97 * this will fallback to `git_odb__hashfd`.
99 * The hash type for this call is always `GIT_OBJECT_BLOB` because
100 * symlinks may only point to blobs.
102 int git_odb__hashlink(git_oid
*out
, const char *path
);
105 * Generate a GIT_EMISMATCH error for the ODB.
107 int git_odb__error_mismatch(
108 const git_oid
*expected
, const git_oid
*actual
);
111 * Generate a GIT_ENOTFOUND error for the ODB.
113 int git_odb__error_notfound(
114 const char *message
, const git_oid
*oid
, size_t oid_len
);
117 * Generate a GIT_EAMBIGUOUS error for the ODB.
119 int git_odb__error_ambiguous(const char *message
);
122 * Attempt to read object header or just return whole object if it could
125 int git_odb__read_header_or_object(
126 git_odb_object
**out
, size_t *len_p
, git_object_t
*type_p
,
127 git_odb
*db
, const git_oid
*id
);
129 /* freshen an entry in the object database */
130 int git_odb__freshen(git_odb
*db
, const git_oid
*id
);
132 /* fully free the object; internal method, DO NOT EXPORT */
133 void git_odb_object__free(void *object
);