]> git.proxmox.com Git - libgit2.git/blob - src/odb.h
8dd4efd64f34266d21dc43d757529f6ee3250e79
[libgit2.git] / src / odb.h
1 /*
2 * Copyright (C) the libgit2 contributors. All rights reserved.
3 *
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.
6 */
7 #ifndef INCLUDE_odb_h__
8 #define INCLUDE_odb_h__
9
10 #include "common.h"
11
12 #include "git2/odb.h"
13 #include "git2/oid.h"
14 #include "git2/types.h"
15
16 #include "vector.h"
17 #include "cache.h"
18 #include "posix.h"
19 #include "filter.h"
20
21 #define GIT_OBJECTS_DIR "objects/"
22 #define GIT_OBJECT_DIR_MODE 0777
23 #define GIT_OBJECT_FILE_MODE 0444
24
25 extern bool git_odb__strict_hash_verification;
26
27 /* DO NOT EXPORT */
28 typedef struct {
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. */
32 } git_rawobj;
33
34 /* EXPORT */
35 struct git_odb_object {
36 git_cached_obj cached;
37 void *buffer;
38 };
39
40 /* EXPORT */
41 struct git_odb {
42 git_refcount rc;
43 git_vector backends;
44 git_cache own_cache;
45 unsigned int do_fsync :1;
46 };
47
48 typedef enum {
49 GIT_ODB_CAP_FROM_OWNER = -1,
50 } git_odb_cap_t;
51
52 /*
53 * Set the capabilities for the object database.
54 */
55 int git_odb__set_caps(git_odb *odb, int caps);
56
57 /*
58 * Add the default loose and packed backends for a database.
59 */
60 int git_odb__add_default_backends(
61 git_odb *db, const char *objects_dir,
62 bool as_alternates, int alternate_depth);
63
64 /*
65 * Hash a git_rawobj internally.
66 * The `git_rawobj` is supposed to be previously initialized
67 */
68 int git_odb__hashobj(git_oid *id, git_rawobj *obj);
69
70 /*
71 * Format the object header such as it would appear in the on-disk object
72 */
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);
74
75 /*
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.
79 *
80 * Saves us some `stat` calls.
81 *
82 * The fd is never closed, not even on error. It must be opened and closed
83 * by the caller
84 */
85 int git_odb__hashfd(git_oid *out, git_file fd, size_t size, git_object_t type);
86
87 /*
88 * Hash an open file descriptor applying an array of filters
89 * Acts just like git_odb__hashfd with the addition of filters...
90 */
91 int git_odb__hashfd_filtered(
92 git_oid *out, git_file fd, size_t len, git_object_t type, git_filter_list *fl);
93
94 /*
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`.
98 *
99 * The hash type for this call is always `GIT_OBJECT_BLOB` because
100 * symlinks may only point to blobs.
101 */
102 int git_odb__hashlink(git_oid *out, const char *path);
103
104 /**
105 * Generate a GIT_EMISMATCH error for the ODB.
106 */
107 int git_odb__error_mismatch(
108 const git_oid *expected, const git_oid *actual);
109
110 /*
111 * Generate a GIT_ENOTFOUND error for the ODB.
112 */
113 int git_odb__error_notfound(
114 const char *message, const git_oid *oid, size_t oid_len);
115
116 /*
117 * Generate a GIT_EAMBIGUOUS error for the ODB.
118 */
119 int git_odb__error_ambiguous(const char *message);
120
121 /*
122 * Attempt to read object header or just return whole object if it could
123 * not be read.
124 */
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);
128
129 /* freshen an entry in the object database */
130 int git_odb__freshen(git_odb *db, const git_oid *id);
131
132 /* fully free the object; internal method, DO NOT EXPORT */
133 void git_odb_object__free(void *object);
134
135 #endif