/src/git/odb/transaction.h
Line | Count | Source |
1 | | #ifndef ODB_TRANSACTION_H |
2 | | #define ODB_TRANSACTION_H |
3 | | |
4 | | #include "gettext.h" |
5 | | #include "odb.h" |
6 | | |
7 | | /* |
8 | | * Options controlling how odb_transaction_write_pack() ingests a packfile. |
9 | | */ |
10 | | struct odb_transaction_write_pack_opts { |
11 | | /* |
12 | | * Optional fsck severity configuration to apply when incoming objects |
13 | | * are verified. |
14 | | */ |
15 | | const char *fsck_msg_types; |
16 | | |
17 | | /* |
18 | | * Path to an alternative shallow file describing the shallow boundaries |
19 | | * to honor while ingesting the pack. |
20 | | */ |
21 | | const char *shallow_file; |
22 | | |
23 | | /* |
24 | | * The max size in bytes of the incoming packfile allowed. No limit is |
25 | | * enforced when set to 0. |
26 | | */ |
27 | | off_t max_input_size; |
28 | | |
29 | | /* |
30 | | * Whether the validity of incoming objects should be verified. |
31 | | */ |
32 | | int fsck_objects; |
33 | | |
34 | | /* |
35 | | * Whether to reject an incoming packfile if it is "thin". |
36 | | */ |
37 | | int reject_thin; |
38 | | |
39 | | /* |
40 | | * Optional file descriptor for reporting progress and errors. Set to 0 |
41 | | * for none. |
42 | | */ |
43 | | int err_fd; |
44 | | |
45 | | /* |
46 | | * Suppresses progress reporting. |
47 | | */ |
48 | | int quiet; |
49 | | }; |
50 | | |
51 | | /* |
52 | | * A transaction may be started for an object database prior to writing new |
53 | | * objects via odb_transaction_begin(). These objects are not committed until |
54 | | * odb_transaction_commit() is invoked. Only a single transaction may be pending |
55 | | * at a time. |
56 | | * |
57 | | * Each ODB source is expected to implement its own transaction handling. |
58 | | */ |
59 | | struct odb_transaction { |
60 | | /* The ODB source the transaction is opened against. */ |
61 | | struct odb_source *source; |
62 | | |
63 | | /* |
64 | | * The ODB source specific callback invoked to commit a transaction. |
65 | | * Returns 0 on success, a negative error code otherwise. |
66 | | */ |
67 | | int (*commit)(struct odb_transaction *transaction); |
68 | | |
69 | | /* |
70 | | * Optional ODB source specific callback invoked when the transaction |
71 | | * needs to perform any deferred cleanup after objects have been |
72 | | * committed. Returns 0 on success, a negative error code otherwise. |
73 | | */ |
74 | | int (*finalize)(struct odb_transaction *transaction); |
75 | | |
76 | | /* |
77 | | * This callback is expected to write the given object stream into |
78 | | * the ODB transaction. |
79 | | * |
80 | | * The resulting object ID shall be written into the out pointer. The |
81 | | * callback is expected to return 0 on success, a negative error code |
82 | | * otherwise. |
83 | | */ |
84 | | int (*write_object_stream)(struct odb_transaction *transaction, |
85 | | struct odb_stream *stream, |
86 | | struct object_id *oid); |
87 | | /* |
88 | | * This callback is expected to ingest the packfile readable via |
89 | | * `pack_fd` into the transaction. Returns 0 on success, a negative |
90 | | * error code otherwise. On failure, a human-readable description is |
91 | | * appended to `err_msg`. |
92 | | */ |
93 | | int (*write_pack)(struct odb_transaction *transaction, int pack_fd, |
94 | | struct strbuf *err_msg, |
95 | | const struct odb_transaction_write_pack_opts *opts); |
96 | | |
97 | | /* |
98 | | * This callback is expected to populate the provided strvec with the |
99 | | * environment variables that a child process should inherit so that its |
100 | | * object writes participate in the transaction. Returns 0 on success, a |
101 | | * negative error code otherwise. |
102 | | */ |
103 | | int (*env)(struct odb_transaction *transaction, struct strvec *env); |
104 | | }; |
105 | | |
106 | | /* Flags used to configure an ODB transaction. */ |
107 | | enum odb_transaction_flags { |
108 | | /* Configures the transaction for use with git-receive-pack(1). */ |
109 | | ODB_TRANSACTION_RECEIVE = (1 << 0), |
110 | | }; |
111 | | |
112 | | /* |
113 | | * Starts an ODB transaction and returns it via `out`. Subsequent objects are |
114 | | * written to the transaction and not committed until odb_transaction_commit() |
115 | | * is invoked on the transaction. Returns 0 on success and a negative value on |
116 | | * error. Note that it is considered an error to start a new transaction if the |
117 | | * ODB already has an inflight transaction pending. |
118 | | */ |
119 | | int odb_transaction_begin(struct object_database *odb, |
120 | | struct odb_transaction **out, |
121 | | enum odb_transaction_flags flags); |
122 | | |
123 | | static inline void odb_transaction_begin_or_die(struct object_database *odb, |
124 | | struct odb_transaction **out, |
125 | | enum odb_transaction_flags flags) |
126 | 0 | { |
127 | 0 | if (odb_transaction_begin(odb, out, flags)) |
128 | 0 | die(_("failed to start ODB transaction")); |
129 | 0 | } Unexecuted instantiation: repository.c:odb_transaction_begin_or_die Unexecuted instantiation: run-command.c:odb_transaction_begin_or_die Unexecuted instantiation: setup.c:odb_transaction_begin_or_die Unexecuted instantiation: submodule-config.c:odb_transaction_begin_or_die Unexecuted instantiation: submodule.c:odb_transaction_begin_or_die Unexecuted instantiation: tag.c:odb_transaction_begin_or_die Unexecuted instantiation: tree-walk.c:odb_transaction_begin_or_die Unexecuted instantiation: cache-tree.c:odb_transaction_begin_or_die Unexecuted instantiation: commit.c:odb_transaction_begin_or_die Unexecuted instantiation: convert.c:odb_transaction_begin_or_die Unexecuted instantiation: diff.c:odb_transaction_begin_or_die Unexecuted instantiation: diffcore-rename.c:odb_transaction_begin_or_die Unexecuted instantiation: dir.c:odb_transaction_begin_or_die Unexecuted instantiation: list-objects.c:odb_transaction_begin_or_die Unexecuted instantiation: log-tree.c:odb_transaction_begin_or_die Unexecuted instantiation: merge-ort.c:odb_transaction_begin_or_die Unexecuted instantiation: notes-cache.c:odb_transaction_begin_or_die Unexecuted instantiation: notes.c:odb_transaction_begin_or_die Unexecuted instantiation: object-file.c:odb_transaction_begin_or_die Unexecuted instantiation: object.c:odb_transaction_begin_or_die Unexecuted instantiation: odb.c:odb_transaction_begin_or_die Unexecuted instantiation: source.c:odb_transaction_begin_or_die Unexecuted instantiation: source-files.c:odb_transaction_begin_or_die Unexecuted instantiation: source-inmemory.c:odb_transaction_begin_or_die Unexecuted instantiation: source-loose.c:odb_transaction_begin_or_die Unexecuted instantiation: source-packed.c:odb_transaction_begin_or_die Unexecuted instantiation: streaming.c:odb_transaction_begin_or_die Unexecuted instantiation: transaction.c:odb_transaction_begin_or_die Unexecuted instantiation: pack-bitmap.c:odb_transaction_begin_or_die Unexecuted instantiation: pack-check.c:odb_transaction_begin_or_die Unexecuted instantiation: pack-objects.c:odb_transaction_begin_or_die Unexecuted instantiation: pack-revindex.c:odb_transaction_begin_or_die Unexecuted instantiation: pack-write.c:odb_transaction_begin_or_die Unexecuted instantiation: packfile.c:odb_transaction_begin_or_die Unexecuted instantiation: packfile-list.c:odb_transaction_begin_or_die Unexecuted instantiation: path.c:odb_transaction_begin_or_die Unexecuted instantiation: promisor-remote.c:odb_transaction_begin_or_die Unexecuted instantiation: pseudo-merge.c:odb_transaction_begin_or_die Unexecuted instantiation: read-cache.c:odb_transaction_begin_or_die Unexecuted instantiation: repack.c:odb_transaction_begin_or_die Unexecuted instantiation: repack-geometry.c:odb_transaction_begin_or_die Unexecuted instantiation: repo-settings.c:odb_transaction_begin_or_die Unexecuted instantiation: revision.c:odb_transaction_begin_or_die Unexecuted instantiation: sequencer.c:odb_transaction_begin_or_die Unexecuted instantiation: tmp-objdir.c:odb_transaction_begin_or_die Unexecuted instantiation: apply.c:odb_transaction_begin_or_die Unexecuted instantiation: commit-graph.c:odb_transaction_begin_or_die Unexecuted instantiation: connected.c:odb_transaction_begin_or_die Unexecuted instantiation: fetch-pack.c:odb_transaction_begin_or_die Unexecuted instantiation: fsck.c:odb_transaction_begin_or_die Unexecuted instantiation: loose.c:odb_transaction_begin_or_die Unexecuted instantiation: match-trees.c:odb_transaction_begin_or_die Unexecuted instantiation: midx.c:odb_transaction_begin_or_die Unexecuted instantiation: pack-bitmap-write.c:odb_transaction_begin_or_die Unexecuted instantiation: pack-mtimes.c:odb_transaction_begin_or_die Unexecuted instantiation: rerere.c:odb_transaction_begin_or_die Unexecuted instantiation: transport-helper.c:odb_transaction_begin_or_die Unexecuted instantiation: fuzz-pack-headers.c:odb_transaction_begin_or_die Unexecuted instantiation: fuzz-pack-idx.c:odb_transaction_begin_or_die |
130 | | |
131 | | /* |
132 | | * Commits an ODB transaction making the written objects visible. Returns 0 on |
133 | | * success, a negative error code otherwise. Note that, if the specified |
134 | | * transaction is NULL, the function is a no-op and no error is returned. |
135 | | */ |
136 | | int odb_transaction_commit(struct odb_transaction *transaction); |
137 | | |
138 | | /* |
139 | | * Finalizes an ODB transaction, performing any deferred cleanup and freeing it. |
140 | | * Must be called for every successfully started transaction. Note that, if the |
141 | | * specified transaction is NULL, the function is a no-op. Returns 0 on success, |
142 | | * a negative error code otherwise. |
143 | | */ |
144 | | int odb_transaction_finalize(struct odb_transaction *transaction); |
145 | | |
146 | | static inline void odb_transaction_commit_and_finalize_or_die(struct odb_transaction *transaction) |
147 | 0 | { |
148 | 0 | if (odb_transaction_commit(transaction)) |
149 | 0 | die(_("failed to commit ODB transaction")); |
150 | 0 | if (odb_transaction_finalize(transaction)) |
151 | 0 | die(_("failed to finalize ODB transaction")); |
152 | 0 | } Unexecuted instantiation: repository.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: run-command.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: setup.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: submodule-config.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: submodule.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: tag.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: tree-walk.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: cache-tree.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: commit.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: convert.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: diff.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: diffcore-rename.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: dir.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: list-objects.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: log-tree.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: merge-ort.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: notes-cache.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: notes.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: object-file.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: object.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: odb.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: source.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: source-files.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: source-inmemory.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: source-loose.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: source-packed.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: streaming.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: transaction.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pack-bitmap.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pack-check.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pack-objects.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pack-revindex.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pack-write.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: packfile.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: packfile-list.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: path.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: promisor-remote.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pseudo-merge.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: read-cache.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: repack.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: repack-geometry.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: repo-settings.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: revision.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: sequencer.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: tmp-objdir.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: apply.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: commit-graph.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: connected.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: fetch-pack.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: fsck.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: loose.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: match-trees.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: midx.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pack-bitmap-write.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: pack-mtimes.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: rerere.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: transport-helper.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: fuzz-pack-headers.c:odb_transaction_commit_and_finalize_or_die Unexecuted instantiation: fuzz-pack-idx.c:odb_transaction_commit_and_finalize_or_die |
153 | | |
154 | | /* |
155 | | * Writes the object in the provided stream into the transaction. The resulting |
156 | | * object ID is written into the out pointer. Returns 0 on success, a negative |
157 | | * error code otherwise. |
158 | | */ |
159 | | int odb_transaction_write_object_stream(struct odb_transaction *transaction, |
160 | | struct odb_stream *stream, |
161 | | struct object_id *oid); |
162 | | |
163 | | /* |
164 | | * Ingests the packfile readable via `pack_fd` into the transaction. Returns 0 |
165 | | * on success, a negative error code otherwise. On failure, a human-readable |
166 | | * description is appended to `err_msg`. |
167 | | */ |
168 | | int odb_transaction_write_pack(struct odb_transaction *transaction, int pack_fd, |
169 | | struct strbuf *err_msg, |
170 | | const struct odb_transaction_write_pack_opts *opts); |
171 | | |
172 | | /* |
173 | | * Populates the provided strvec with the environment variables that a child |
174 | | * process should inherit so that its object writes participate in the |
175 | | * transaction, suitable for using via child_process.env. Returns 0 on success, |
176 | | * a negative error code otherwise. Note that, if the specified transaction is |
177 | | * NULL, the function is a no-op and no error is returned. |
178 | | */ |
179 | | int odb_transaction_env(struct odb_transaction *transaction, struct strvec *env); |
180 | | |
181 | | #endif |