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"
15 #include "git2/sys/commit_graph.h"
18 #include "commit_graph.h"
23 #define GIT_OBJECTS_DIR "objects/"
24 #define GIT_OBJECT_DIR_MODE 0777
25 #define GIT_OBJECT_FILE_MODE 0444
27 #define GIT_ODB_DEFAULT_LOOSE_PRIORITY 1
28 #define GIT_ODB_DEFAULT_PACKED_PRIORITY 2
30 extern bool git_odb__strict_hash_verification
;
34 void *data
; /**< Raw, decompressed object data. */
35 size_t len
; /**< Total number of bytes in data. */
36 git_object_t type
; /**< Type of this object. */
40 struct git_odb_object
{
41 git_cached_obj cached
;
48 git_mutex lock
; /* protects backends */
51 git_commit_graph
*cgraph
;
52 unsigned int do_fsync
:1;
56 GIT_ODB_CAP_FROM_OWNER
= -1
60 * Set the capabilities for the object database.
62 int git_odb__set_caps(git_odb
*odb
, int caps
);
65 * Add the default loose and packed backends for a database.
67 int git_odb__add_default_backends(
68 git_odb
*db
, const char *objects_dir
,
69 bool as_alternates
, int alternate_depth
);
72 * Hash a git_rawobj internally.
73 * The `git_rawobj` is supposed to be previously initialized
75 int git_odb__hashobj(git_oid
*id
, git_rawobj
*obj
);
78 * Format the object header such as it would appear in the on-disk object
80 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
);
83 * Hash an open file descriptor.
84 * This is a performance call when the contents of a fd need to be hashed,
85 * but the fd is already open and we have the size of the contents.
87 * Saves us some `stat` calls.
89 * The fd is never closed, not even on error. It must be opened and closed
92 int git_odb__hashfd(git_oid
*out
, git_file fd
, size_t size
, git_object_t type
);
95 * Hash an open file descriptor applying an array of filters
96 * Acts just like git_odb__hashfd with the addition of filters...
98 int git_odb__hashfd_filtered(
99 git_oid
*out
, git_file fd
, size_t len
, git_object_t type
, git_filter_list
*fl
);
102 * Hash a `path`, assuming it could be a POSIX symlink: if the path is a
103 * symlink, then the raw contents of the symlink will be hashed. Otherwise,
104 * this will fallback to `git_odb__hashfd`.
106 * The hash type for this call is always `GIT_OBJECT_BLOB` because
107 * symlinks may only point to blobs.
109 int git_odb__hashlink(git_oid
*out
, const char *path
);
112 * Generate a GIT_EMISMATCH error for the ODB.
114 int git_odb__error_mismatch(
115 const git_oid
*expected
, const git_oid
*actual
);
118 * Generate a GIT_ENOTFOUND error for the ODB.
120 int git_odb__error_notfound(
121 const char *message
, const git_oid
*oid
, size_t oid_len
);
124 * Generate a GIT_EAMBIGUOUS error for the ODB.
126 int git_odb__error_ambiguous(const char *message
);
129 * Attempt to read object header or just return whole object if it could
132 int git_odb__read_header_or_object(
133 git_odb_object
**out
, size_t *len_p
, git_object_t
*type_p
,
134 git_odb
*db
, const git_oid
*id
);
137 * Attempt to get the ODB's commit-graph file. This object is still owned by
138 * the ODB. If the repository does not contain a commit-graph, it will return
141 int git_odb__get_commit_graph_file(git_commit_graph_file
**out
, git_odb
*odb
);
143 /* freshen an entry in the object database */
144 int git_odb__freshen(git_odb
*db
, const git_oid
*id
);
146 /* fully free the object; internal method, DO NOT EXPORT */
147 void git_odb_object__free(void *object
);