]> git.proxmox.com Git - libgit2.git/blob - src/odb.h
New upstream version 1.4.3+dfsg.1
[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 #include "git2/sys/commit_graph.h"
16
17 #include "cache.h"
18 #include "commit_graph.h"
19 #include "filter.h"
20 #include "posix.h"
21 #include "vector.h"
22
23 #define GIT_OBJECTS_DIR "objects/"
24 #define GIT_OBJECT_DIR_MODE 0777
25 #define GIT_OBJECT_FILE_MODE 0444
26
27 #define GIT_ODB_DEFAULT_LOOSE_PRIORITY 1
28 #define GIT_ODB_DEFAULT_PACKED_PRIORITY 2
29
30 extern bool git_odb__strict_hash_verification;
31
32 /* DO NOT EXPORT */
33 typedef struct {
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. */
37 } git_rawobj;
38
39 /* EXPORT */
40 struct git_odb_object {
41 git_cached_obj cached;
42 void *buffer;
43 };
44
45 /* EXPORT */
46 struct git_odb {
47 git_refcount rc;
48 git_mutex lock; /* protects backends */
49 git_vector backends;
50 git_cache own_cache;
51 git_commit_graph *cgraph;
52 unsigned int do_fsync :1;
53 };
54
55 typedef enum {
56 GIT_ODB_CAP_FROM_OWNER = -1
57 } git_odb_cap_t;
58
59 /*
60 * Set the capabilities for the object database.
61 */
62 int git_odb__set_caps(git_odb *odb, int caps);
63
64 /*
65 * Add the default loose and packed backends for a database.
66 */
67 int git_odb__add_default_backends(
68 git_odb *db, const char *objects_dir,
69 bool as_alternates, int alternate_depth);
70
71 /*
72 * Hash a git_rawobj internally.
73 * The `git_rawobj` is supposed to be previously initialized
74 */
75 int git_odb__hashobj(git_oid *id, git_rawobj *obj);
76
77 /*
78 * Format the object header such as it would appear in the on-disk object
79 */
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);
81
82 /*
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.
86 *
87 * Saves us some `stat` calls.
88 *
89 * The fd is never closed, not even on error. It must be opened and closed
90 * by the caller
91 */
92 int git_odb__hashfd(git_oid *out, git_file fd, size_t size, git_object_t type);
93
94 /*
95 * Hash an open file descriptor applying an array of filters
96 * Acts just like git_odb__hashfd with the addition of filters...
97 */
98 int git_odb__hashfd_filtered(
99 git_oid *out, git_file fd, size_t len, git_object_t type, git_filter_list *fl);
100
101 /*
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`.
105 *
106 * The hash type for this call is always `GIT_OBJECT_BLOB` because
107 * symlinks may only point to blobs.
108 */
109 int git_odb__hashlink(git_oid *out, const char *path);
110
111 /**
112 * Generate a GIT_EMISMATCH error for the ODB.
113 */
114 int git_odb__error_mismatch(
115 const git_oid *expected, const git_oid *actual);
116
117 /*
118 * Generate a GIT_ENOTFOUND error for the ODB.
119 */
120 int git_odb__error_notfound(
121 const char *message, const git_oid *oid, size_t oid_len);
122
123 /*
124 * Generate a GIT_EAMBIGUOUS error for the ODB.
125 */
126 int git_odb__error_ambiguous(const char *message);
127
128 /*
129 * Attempt to read object header or just return whole object if it could
130 * not be read.
131 */
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);
135
136 /*
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
139 * GIT_ENOTFOUND.
140 */
141 int git_odb__get_commit_graph_file(git_commit_graph_file **out, git_odb *odb);
142
143 /* freshen an entry in the object database */
144 int git_odb__freshen(git_odb *db, const git_oid *id);
145
146 /* fully free the object; internal method, DO NOT EXPORT */
147 void git_odb_object__free(void *object);
148
149 #endif