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_sys_git_odb_mempack_h__
8 #define INCLUDE_sys_git_odb_mempack_h__
9 
10 #include "git2/common.h"
11 #include "git2/types.h"
12 #include "git2/oid.h"
13 #include "git2/odb.h"
14 #include "git2/buffer.h"
15 
16 /**
17  * @file git2/sys/mempack.h
18  * @brief Custom ODB backend that permits packing objects in-memory
19  * @defgroup git_backend Git custom backend APIs
20  * @ingroup Git
21  * @{
22  */
23 GIT_BEGIN_DECL
24 
25 /**
26  * Instantiate a new mempack backend.
27  *
28  * The backend must be added to an existing ODB with the highest
29  * priority.
30  *
31  *     git_mempack_new(&mempacker);
32  *     git_repository_odb(&odb, repository);
33  *     git_odb_add_backend(odb, mempacker, 999);
34  *
35  * Once the backend has been loaded, all writes to the ODB will
36  * instead be queued in memory, and can be finalized with
37  * `git_mempack_dump`.
38  *
39  * Subsequent reads will also be served from the in-memory store
40  * to ensure consistency, until the memory store is dumped.
41  *
42  * @param out Pointer where to store the ODB backend
43  * @return 0 on success; error code otherwise
44  */
45 GIT_EXTERN(int) git_mempack_new(git_odb_backend **out);
46 
47 /**
48  * Dump all the queued in-memory writes to a packfile.
49  *
50  * The contents of the packfile will be stored in the given buffer.
51  * It is the caller's responsibility to ensure that the generated
52  * packfile is available to the repository (e.g. by writing it
53  * to disk, or doing something crazy like distributing it across
54  * several copies of the repository over a network).
55  *
56  * Once the generated packfile is available to the repository,
57  * call `git_mempack_reset` to cleanup the memory store.
58  *
59  * Calling `git_mempack_reset` before the packfile has been
60  * written to disk will result in an inconsistent repository
61  * (the objects in the memory store won't be accessible).
62  *
63  * @param pack Buffer where to store the raw packfile
64  * @param repo The active repository where the backend is loaded
65  * @param backend The mempack backend
66  * @return 0 on success; error code otherwise
67  */
68 GIT_EXTERN(int) git_mempack_dump(git_buf *pack, git_repository *repo, git_odb_backend *backend);
69 
70 /**
71  * Reset the memory packer by clearing all the queued objects.
72  *
73  * This assumes that `git_mempack_dump` has been called before to
74  * store all the queued objects into a single packfile.
75  *
76  * Alternatively, call `reset` without a previous dump to "undo"
77  * all the recently written objects, giving transaction-like
78  * semantics to the Git repository.
79  *
80  * @param backend The mempack backend
81  * @return 0 on success; error code otherwise
82  */
83 GIT_EXTERN(int) git_mempack_reset(git_odb_backend *backend);
84 
85 GIT_END_DECL
86 
87 #endif
88