Blame


1 301e83b3 2022-10-16 stsp /*
2 301e83b3 2022-10-16 stsp * Copyright (c) 2020 Ori Bernstein
3 301e83b3 2022-10-16 stsp * Copyright (c) 2021, 2022 Stefan Sperling <stsp@openbsd.org>
4 301e83b3 2022-10-16 stsp *
5 301e83b3 2022-10-16 stsp * Permission to use, copy, modify, and distribute this software for any
6 301e83b3 2022-10-16 stsp * purpose with or without fee is hereby granted, provided that the above
7 301e83b3 2022-10-16 stsp * copyright notice and this permission notice appear in all copies.
8 301e83b3 2022-10-16 stsp *
9 301e83b3 2022-10-16 stsp * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 301e83b3 2022-10-16 stsp * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 301e83b3 2022-10-16 stsp * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 301e83b3 2022-10-16 stsp * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 301e83b3 2022-10-16 stsp * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 301e83b3 2022-10-16 stsp * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 301e83b3 2022-10-16 stsp * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 301e83b3 2022-10-16 stsp */
17 301e83b3 2022-10-16 stsp
18 301e83b3 2022-10-16 stsp #include <sys/types.h>
19 301e83b3 2022-10-16 stsp #include <sys/queue.h>
20 301e83b3 2022-10-16 stsp #include <sys/tree.h>
21 301e83b3 2022-10-16 stsp #include <sys/uio.h>
22 301e83b3 2022-10-16 stsp
23 301e83b3 2022-10-16 stsp #include <sha1.h>
24 301e83b3 2022-10-16 stsp #include <limits.h>
25 301e83b3 2022-10-16 stsp #include <stdio.h>
26 301e83b3 2022-10-16 stsp #include <stdint.h>
27 301e83b3 2022-10-16 stsp #include <stdlib.h>
28 301e83b3 2022-10-16 stsp #include <string.h>
29 cae60ab8 2022-10-18 stsp #include <time.h>
30 301e83b3 2022-10-16 stsp #include <imsg.h>
31 301e83b3 2022-10-16 stsp #include <inttypes.h>
32 301e83b3 2022-10-16 stsp #include <unistd.h>
33 301e83b3 2022-10-16 stsp
34 301e83b3 2022-10-16 stsp #include "got_error.h"
35 301e83b3 2022-10-16 stsp #include "got_cancel.h"
36 301e83b3 2022-10-16 stsp #include "got_object.h"
37 301e83b3 2022-10-16 stsp #include "got_reference.h"
38 301e83b3 2022-10-16 stsp #include "got_repository_admin.h"
39 301e83b3 2022-10-16 stsp #include "got_path.h"
40 301e83b3 2022-10-16 stsp
41 301e83b3 2022-10-16 stsp #include "got_lib_delta.h"
42 301e83b3 2022-10-16 stsp #include "got_lib_object.h"
43 301e83b3 2022-10-16 stsp #include "got_lib_object_cache.h"
44 301e83b3 2022-10-16 stsp #include "got_lib_object_idset.h"
45 301e83b3 2022-10-16 stsp #include "got_lib_privsep.h"
46 cae60ab8 2022-10-18 stsp #include "got_lib_ratelimit.h"
47 301e83b3 2022-10-16 stsp #include "got_lib_pack.h"
48 301e83b3 2022-10-16 stsp #include "got_lib_pack_create.h"
49 301e83b3 2022-10-16 stsp #include "got_lib_repository.h"
50 301e83b3 2022-10-16 stsp
51 301e83b3 2022-10-16 stsp struct send_id_arg {
52 301e83b3 2022-10-16 stsp struct imsgbuf *ibuf;
53 301e83b3 2022-10-16 stsp struct got_object_id *ids[GOT_IMSG_OBJ_ID_LIST_MAX_NIDS];
54 301e83b3 2022-10-16 stsp size_t nids;
55 301e83b3 2022-10-16 stsp };
56 301e83b3 2022-10-16 stsp
57 301e83b3 2022-10-16 stsp static const struct got_error *
58 301e83b3 2022-10-16 stsp send_id(struct got_object_id *id, void *data, void *arg)
59 301e83b3 2022-10-16 stsp {
60 301e83b3 2022-10-16 stsp const struct got_error *err = NULL;
61 301e83b3 2022-10-16 stsp struct send_id_arg *a = arg;
62 301e83b3 2022-10-16 stsp
63 301e83b3 2022-10-16 stsp a->ids[a->nids++] = id;
64 301e83b3 2022-10-16 stsp
65 301e83b3 2022-10-16 stsp if (a->nids >= GOT_IMSG_OBJ_ID_LIST_MAX_NIDS) {
66 301e83b3 2022-10-16 stsp err = got_privsep_send_object_idlist(a->ibuf, a->ids, a->nids);
67 301e83b3 2022-10-16 stsp if (err)
68 301e83b3 2022-10-16 stsp return err;
69 301e83b3 2022-10-16 stsp a->nids = 0;
70 301e83b3 2022-10-16 stsp }
71 301e83b3 2022-10-16 stsp
72 301e83b3 2022-10-16 stsp return NULL;
73 301e83b3 2022-10-16 stsp }
74 301e83b3 2022-10-16 stsp
75 301e83b3 2022-10-16 stsp static const struct got_error *
76 301e83b3 2022-10-16 stsp send_idset(struct imsgbuf *ibuf, struct got_object_idset *idset)
77 301e83b3 2022-10-16 stsp {
78 301e83b3 2022-10-16 stsp const struct got_error *err;
79 301e83b3 2022-10-16 stsp struct send_id_arg sia;
80 301e83b3 2022-10-16 stsp
81 301e83b3 2022-10-16 stsp memset(&sia, 0, sizeof(sia));
82 301e83b3 2022-10-16 stsp sia.ibuf = ibuf;
83 301e83b3 2022-10-16 stsp err = got_object_idset_for_each(idset, send_id, &sia);
84 301e83b3 2022-10-16 stsp if (err)
85 301e83b3 2022-10-16 stsp return err;
86 301e83b3 2022-10-16 stsp
87 301e83b3 2022-10-16 stsp if (sia.nids > 0) {
88 301e83b3 2022-10-16 stsp err = got_privsep_send_object_idlist(ibuf, sia.ids, sia.nids);
89 301e83b3 2022-10-16 stsp if (err)
90 301e83b3 2022-10-16 stsp return err;
91 301e83b3 2022-10-16 stsp }
92 301e83b3 2022-10-16 stsp
93 301e83b3 2022-10-16 stsp return got_privsep_send_object_idlist_done(ibuf);
94 301e83b3 2022-10-16 stsp }
95 301e83b3 2022-10-16 stsp
96 301e83b3 2022-10-16 stsp static const struct got_error *
97 301e83b3 2022-10-16 stsp recv_reused_delta(struct got_imsg_reused_delta *delta,
98 301e83b3 2022-10-16 stsp struct got_object_idset *idset, struct got_pack_metavec *v)
99 301e83b3 2022-10-16 stsp {
100 301e83b3 2022-10-16 stsp struct got_pack_meta *m, *base;
101 301e83b3 2022-10-16 stsp
102 301e83b3 2022-10-16 stsp if (delta->delta_offset + delta->delta_size < delta->delta_offset ||
103 301e83b3 2022-10-16 stsp delta->delta_offset +
104 301e83b3 2022-10-16 stsp delta->delta_compressed_size < delta->delta_offset)
105 301e83b3 2022-10-16 stsp return got_error(GOT_ERR_BAD_PACKFILE);
106 301e83b3 2022-10-16 stsp
107 301e83b3 2022-10-16 stsp m = got_object_idset_get(idset, &delta->id);
108 301e83b3 2022-10-16 stsp if (m == NULL)
109 301e83b3 2022-10-16 stsp return got_error(GOT_ERR_NO_OBJ);
110 301e83b3 2022-10-16 stsp
111 301e83b3 2022-10-16 stsp base = got_object_idset_get(idset, &delta->base_id);
112 301e83b3 2022-10-16 stsp if (base == NULL)
113 301e83b3 2022-10-16 stsp return got_error(GOT_ERR_NO_OBJ);
114 301e83b3 2022-10-16 stsp
115 301e83b3 2022-10-16 stsp m->delta_len = delta->delta_size;
116 301e83b3 2022-10-16 stsp m->delta_compressed_len = delta->delta_compressed_size;
117 301e83b3 2022-10-16 stsp m->delta_offset = delta->delta_out_offset;
118 301e83b3 2022-10-16 stsp m->prev = base;
119 301e83b3 2022-10-16 stsp m->size = delta->result_size;
120 301e83b3 2022-10-16 stsp m->reused_delta_offset = delta->delta_offset;
121 301e83b3 2022-10-16 stsp m->base_obj_id = got_object_id_dup(&delta->base_id);
122 301e83b3 2022-10-16 stsp if (m->base_obj_id == NULL)
123 301e83b3 2022-10-16 stsp return got_error_from_errno("got_object_id_dup");
124 301e83b3 2022-10-16 stsp
125 301e83b3 2022-10-16 stsp return got_pack_add_meta(m, v);
126 301e83b3 2022-10-16 stsp }
127 301e83b3 2022-10-16 stsp
128 301e83b3 2022-10-16 stsp static const struct got_error *
129 301e83b3 2022-10-16 stsp prepare_delta_reuse(struct got_pack *pack, struct got_packidx *packidx,
130 301e83b3 2022-10-16 stsp int delta_outfd, struct got_repository *repo)
131 301e83b3 2022-10-16 stsp {
132 301e83b3 2022-10-16 stsp const struct got_error *err = NULL;
133 301e83b3 2022-10-16 stsp
134 301e83b3 2022-10-16 stsp if (!pack->child_has_delta_outfd) {
135 301e83b3 2022-10-16 stsp int outfd_child;
136 301e83b3 2022-10-16 stsp outfd_child = dup(delta_outfd);
137 301e83b3 2022-10-16 stsp if (outfd_child == -1) {
138 301e83b3 2022-10-16 stsp err = got_error_from_errno("dup");
139 301e83b3 2022-10-16 stsp goto done;
140 301e83b3 2022-10-16 stsp }
141 301e83b3 2022-10-16 stsp err = got_privsep_send_raw_delta_outfd(
142 301e83b3 2022-10-16 stsp pack->privsep_child->ibuf, outfd_child);
143 301e83b3 2022-10-16 stsp if (err)
144 301e83b3 2022-10-16 stsp goto done;
145 301e83b3 2022-10-16 stsp pack->child_has_delta_outfd = 1;
146 301e83b3 2022-10-16 stsp }
147 301e83b3 2022-10-16 stsp
148 301e83b3 2022-10-16 stsp err = got_privsep_send_delta_reuse_req(pack->privsep_child->ibuf);
149 301e83b3 2022-10-16 stsp done:
150 301e83b3 2022-10-16 stsp return err;
151 301e83b3 2022-10-16 stsp }
152 301e83b3 2022-10-16 stsp
153 301e83b3 2022-10-16 stsp const struct got_error *
154 301e83b3 2022-10-16 stsp got_pack_search_deltas(struct got_pack_metavec *v,
155 301e83b3 2022-10-16 stsp struct got_object_idset *idset, int delta_cache_fd,
156 301e83b3 2022-10-16 stsp int ncolored, int nfound, int ntrees, int ncommits,
157 301e83b3 2022-10-16 stsp struct got_repository *repo,
158 301e83b3 2022-10-16 stsp got_pack_progress_cb progress_cb, void *progress_arg,
159 301e83b3 2022-10-16 stsp struct got_ratelimit *rl, got_cancel_cb cancel_cb, void *cancel_arg)
160 301e83b3 2022-10-16 stsp {
161 301e83b3 2022-10-16 stsp const struct got_error *err = NULL;
162 301e83b3 2022-10-16 stsp struct got_packidx *packidx;
163 301e83b3 2022-10-16 stsp struct got_pack *pack;
164 301e83b3 2022-10-16 stsp struct got_imsg_reused_delta deltas[GOT_IMSG_REUSED_DELTAS_MAX_NDELTAS];
165 301e83b3 2022-10-16 stsp size_t ndeltas, i;
166 301e83b3 2022-10-16 stsp
167 301e83b3 2022-10-16 stsp err = got_pack_find_pack_for_reuse(&packidx, repo);
168 301e83b3 2022-10-16 stsp if (err)
169 301e83b3 2022-10-16 stsp return err;
170 301e83b3 2022-10-16 stsp
171 301e83b3 2022-10-16 stsp if (packidx == NULL)
172 301e83b3 2022-10-16 stsp return NULL;
173 301e83b3 2022-10-16 stsp
174 301e83b3 2022-10-16 stsp err = got_pack_cache_pack_for_packidx(&pack, packidx, repo);
175 301e83b3 2022-10-16 stsp if (err)
176 301e83b3 2022-10-16 stsp return err;
177 301e83b3 2022-10-16 stsp
178 301e83b3 2022-10-16 stsp if (pack->privsep_child == NULL) {
179 301e83b3 2022-10-16 stsp err = got_pack_start_privsep_child(pack, packidx);
180 301e83b3 2022-10-16 stsp if (err)
181 301e83b3 2022-10-16 stsp return err;
182 301e83b3 2022-10-16 stsp }
183 301e83b3 2022-10-16 stsp
184 301e83b3 2022-10-16 stsp err = prepare_delta_reuse(pack, packidx, delta_cache_fd, repo);
185 301e83b3 2022-10-16 stsp if (err)
186 301e83b3 2022-10-16 stsp return err;
187 301e83b3 2022-10-16 stsp
188 301e83b3 2022-10-16 stsp err = send_idset(pack->privsep_child->ibuf, idset);
189 301e83b3 2022-10-16 stsp if (err)
190 301e83b3 2022-10-16 stsp return err;
191 301e83b3 2022-10-16 stsp
192 301e83b3 2022-10-16 stsp for (;;) {
193 301e83b3 2022-10-16 stsp int done = 0;
194 301e83b3 2022-10-16 stsp
195 301e83b3 2022-10-16 stsp if (cancel_cb) {
196 301e83b3 2022-10-16 stsp err = (*cancel_cb)(cancel_arg);
197 301e83b3 2022-10-16 stsp if (err)
198 301e83b3 2022-10-16 stsp break;
199 301e83b3 2022-10-16 stsp }
200 301e83b3 2022-10-16 stsp
201 301e83b3 2022-10-16 stsp err = got_privsep_recv_reused_deltas(&done, deltas, &ndeltas,
202 301e83b3 2022-10-16 stsp pack->privsep_child->ibuf);
203 301e83b3 2022-10-16 stsp if (err || done)
204 301e83b3 2022-10-16 stsp break;
205 301e83b3 2022-10-16 stsp
206 301e83b3 2022-10-16 stsp for (i = 0; i < ndeltas; i++) {
207 301e83b3 2022-10-16 stsp struct got_imsg_reused_delta *delta = &deltas[i];
208 301e83b3 2022-10-16 stsp err = recv_reused_delta(delta, idset, v);
209 301e83b3 2022-10-16 stsp if (err)
210 301e83b3 2022-10-16 stsp goto done;
211 301e83b3 2022-10-16 stsp }
212 301e83b3 2022-10-16 stsp
213 301e83b3 2022-10-16 stsp err = got_pack_report_progress(progress_cb, progress_arg, rl,
214 301e83b3 2022-10-16 stsp ncolored, nfound, ntrees, 0L, ncommits,
215 301e83b3 2022-10-16 stsp got_object_idset_num_elements(idset), v->nmeta, 0);
216 301e83b3 2022-10-16 stsp if (err)
217 301e83b3 2022-10-16 stsp break;
218 301e83b3 2022-10-16 stsp }
219 301e83b3 2022-10-16 stsp done:
220 301e83b3 2022-10-16 stsp return err;
221 301e83b3 2022-10-16 stsp }
222 301e83b3 2022-10-16 stsp
223 301e83b3 2022-10-16 stsp struct recv_painted_commit_arg {
224 301e83b3 2022-10-16 stsp int *ncolored;
225 301e83b3 2022-10-16 stsp int *nqueued;
226 301e83b3 2022-10-16 stsp int *nskip;
227 301e83b3 2022-10-16 stsp struct got_object_id_queue *ids;
228 301e83b3 2022-10-16 stsp struct got_object_idset *keep;
229 301e83b3 2022-10-16 stsp struct got_object_idset *drop;
230 301e83b3 2022-10-16 stsp struct got_object_idset *skip;
231 301e83b3 2022-10-16 stsp got_pack_progress_cb progress_cb;
232 301e83b3 2022-10-16 stsp void *progress_arg;
233 301e83b3 2022-10-16 stsp struct got_ratelimit *rl;
234 301e83b3 2022-10-16 stsp got_cancel_cb cancel_cb;
235 301e83b3 2022-10-16 stsp void *cancel_arg;
236 301e83b3 2022-10-16 stsp };
237 301e83b3 2022-10-16 stsp
238 301e83b3 2022-10-16 stsp static const struct got_error *
239 301e83b3 2022-10-16 stsp recv_painted_commit(void *arg, struct got_object_id *id, intptr_t color)
240 301e83b3 2022-10-16 stsp {
241 301e83b3 2022-10-16 stsp const struct got_error *err = NULL;
242 301e83b3 2022-10-16 stsp struct recv_painted_commit_arg *a = arg;
243 301e83b3 2022-10-16 stsp struct got_object_qid *qid, *tmp;
244 301e83b3 2022-10-16 stsp
245 301e83b3 2022-10-16 stsp if (a->cancel_cb) {
246 301e83b3 2022-10-16 stsp err = a->cancel_cb(a->cancel_arg);
247 301e83b3 2022-10-16 stsp if (err)
248 301e83b3 2022-10-16 stsp return err;
249 301e83b3 2022-10-16 stsp }
250 301e83b3 2022-10-16 stsp
251 301e83b3 2022-10-16 stsp switch (color) {
252 301e83b3 2022-10-16 stsp case COLOR_KEEP:
253 301e83b3 2022-10-16 stsp err = got_object_idset_add(a->keep, id, NULL);
254 301e83b3 2022-10-16 stsp if (err)
255 301e83b3 2022-10-16 stsp return err;
256 301e83b3 2022-10-16 stsp (*a->ncolored)++;
257 301e83b3 2022-10-16 stsp break;
258 301e83b3 2022-10-16 stsp case COLOR_DROP:
259 301e83b3 2022-10-16 stsp err = got_object_idset_add(a->drop, id, NULL);
260 301e83b3 2022-10-16 stsp if (err)
261 301e83b3 2022-10-16 stsp return err;
262 301e83b3 2022-10-16 stsp (*a->ncolored)++;
263 301e83b3 2022-10-16 stsp break;
264 301e83b3 2022-10-16 stsp case COLOR_SKIP:
265 301e83b3 2022-10-16 stsp err = got_object_idset_add(a->skip, id, NULL);
266 301e83b3 2022-10-16 stsp if (err)
267 301e83b3 2022-10-16 stsp return err;
268 301e83b3 2022-10-16 stsp break;
269 301e83b3 2022-10-16 stsp default:
270 301e83b3 2022-10-16 stsp /* should not happen */
271 301e83b3 2022-10-16 stsp return got_error_fmt(GOT_ERR_NOT_IMPL,
272 301e83b3 2022-10-16 stsp "%s invalid commit color %"PRIdPTR, __func__, color);
273 301e83b3 2022-10-16 stsp }
274 301e83b3 2022-10-16 stsp
275 301e83b3 2022-10-16 stsp STAILQ_FOREACH_SAFE(qid, a->ids, entry, tmp) {
276 301e83b3 2022-10-16 stsp if (got_object_id_cmp(&qid->id, id) != 0)
277 301e83b3 2022-10-16 stsp continue;
278 301e83b3 2022-10-16 stsp STAILQ_REMOVE(a->ids, qid, got_object_qid, entry);
279 301e83b3 2022-10-16 stsp color = (intptr_t)qid->data;
280 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
281 301e83b3 2022-10-16 stsp (*a->nqueued)--;
282 301e83b3 2022-10-16 stsp if (color == COLOR_SKIP)
283 301e83b3 2022-10-16 stsp (*a->nskip)--;
284 301e83b3 2022-10-16 stsp break;
285 301e83b3 2022-10-16 stsp }
286 301e83b3 2022-10-16 stsp
287 301e83b3 2022-10-16 stsp return got_pack_report_progress(a->progress_cb, a->progress_arg, a->rl,
288 301e83b3 2022-10-16 stsp *a->ncolored, 0, 0, 0L, 0, 0, 0, 0);
289 301e83b3 2022-10-16 stsp }
290 301e83b3 2022-10-16 stsp
291 301e83b3 2022-10-16 stsp static const struct got_error *
292 301e83b3 2022-10-16 stsp paint_packed_commits(struct got_pack *pack, struct got_object_id *id,
293 301e83b3 2022-10-16 stsp int idx, intptr_t color, int *ncolored, int *nqueued, int *nskip,
294 301e83b3 2022-10-16 stsp struct got_object_id_queue *ids,
295 301e83b3 2022-10-16 stsp struct got_object_idset *keep, struct got_object_idset *drop,
296 301e83b3 2022-10-16 stsp struct got_object_idset *skip, struct got_repository *repo,
297 301e83b3 2022-10-16 stsp got_pack_progress_cb progress_cb, void *progress_arg,
298 301e83b3 2022-10-16 stsp struct got_ratelimit *rl, got_cancel_cb cancel_cb, void *cancel_arg)
299 301e83b3 2022-10-16 stsp {
300 301e83b3 2022-10-16 stsp const struct got_error *err = NULL;
301 301e83b3 2022-10-16 stsp struct got_object_id_queue next_ids;
302 301e83b3 2022-10-16 stsp struct got_object_qid *qid, *tmp;
303 301e83b3 2022-10-16 stsp struct recv_painted_commit_arg arg;
304 301e83b3 2022-10-16 stsp
305 301e83b3 2022-10-16 stsp STAILQ_INIT(&next_ids);
306 301e83b3 2022-10-16 stsp
307 301e83b3 2022-10-16 stsp err = got_privsep_send_painting_request(pack->privsep_child->ibuf,
308 301e83b3 2022-10-16 stsp idx, id, color);
309 301e83b3 2022-10-16 stsp if (err)
310 301e83b3 2022-10-16 stsp return err;
311 301e83b3 2022-10-16 stsp
312 301e83b3 2022-10-16 stsp arg.ncolored = ncolored;
313 301e83b3 2022-10-16 stsp arg.nqueued = nqueued;
314 301e83b3 2022-10-16 stsp arg.nskip = nskip;
315 301e83b3 2022-10-16 stsp arg.ids = ids;
316 301e83b3 2022-10-16 stsp arg.keep = keep;
317 301e83b3 2022-10-16 stsp arg.drop = drop;
318 301e83b3 2022-10-16 stsp arg.skip = skip;
319 301e83b3 2022-10-16 stsp arg.progress_cb = progress_cb;
320 301e83b3 2022-10-16 stsp arg.progress_arg = progress_arg;
321 301e83b3 2022-10-16 stsp arg.rl = rl;
322 301e83b3 2022-10-16 stsp arg.cancel_cb = cancel_cb;
323 301e83b3 2022-10-16 stsp arg.cancel_arg = cancel_arg;
324 301e83b3 2022-10-16 stsp err = got_privsep_recv_painted_commits(&next_ids,
325 301e83b3 2022-10-16 stsp recv_painted_commit, &arg, pack->privsep_child->ibuf);
326 301e83b3 2022-10-16 stsp if (err)
327 301e83b3 2022-10-16 stsp return err;
328 301e83b3 2022-10-16 stsp
329 301e83b3 2022-10-16 stsp STAILQ_FOREACH_SAFE(qid, &next_ids, entry, tmp) {
330 301e83b3 2022-10-16 stsp struct got_object_qid *old_id;
331 301e83b3 2022-10-16 stsp intptr_t qcolor, ocolor;
332 301e83b3 2022-10-16 stsp STAILQ_FOREACH(old_id, ids, entry) {
333 301e83b3 2022-10-16 stsp if (got_object_id_cmp(&qid->id, &old_id->id))
334 301e83b3 2022-10-16 stsp continue;
335 301e83b3 2022-10-16 stsp qcolor = (intptr_t)qid->data;
336 301e83b3 2022-10-16 stsp ocolor = (intptr_t)old_id->data;
337 301e83b3 2022-10-16 stsp STAILQ_REMOVE(&next_ids, qid, got_object_qid, entry);
338 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
339 301e83b3 2022-10-16 stsp qid = NULL;
340 301e83b3 2022-10-16 stsp if (qcolor != ocolor) {
341 301e83b3 2022-10-16 stsp got_pack_paint_commit(old_id, qcolor);
342 301e83b3 2022-10-16 stsp if (ocolor == COLOR_SKIP)
343 301e83b3 2022-10-16 stsp (*nskip)--;
344 301e83b3 2022-10-16 stsp else if (qcolor == COLOR_SKIP)
345 301e83b3 2022-10-16 stsp (*nskip)++;
346 301e83b3 2022-10-16 stsp }
347 301e83b3 2022-10-16 stsp break;
348 301e83b3 2022-10-16 stsp }
349 301e83b3 2022-10-16 stsp }
350 301e83b3 2022-10-16 stsp while (!STAILQ_EMPTY(&next_ids)) {
351 301e83b3 2022-10-16 stsp qid = STAILQ_FIRST(&next_ids);
352 301e83b3 2022-10-16 stsp STAILQ_REMOVE_HEAD(&next_ids, entry);
353 301e83b3 2022-10-16 stsp got_pack_paint_commit(qid, color);
354 301e83b3 2022-10-16 stsp STAILQ_INSERT_TAIL(ids, qid, entry);
355 301e83b3 2022-10-16 stsp (*nqueued)++;
356 301e83b3 2022-10-16 stsp if (color == COLOR_SKIP)
357 301e83b3 2022-10-16 stsp (*nskip)++;
358 301e83b3 2022-10-16 stsp }
359 301e83b3 2022-10-16 stsp
360 301e83b3 2022-10-16 stsp return err;
361 301e83b3 2022-10-16 stsp }
362 301e83b3 2022-10-16 stsp
363 301e83b3 2022-10-16 stsp const struct got_error *
364 301e83b3 2022-10-16 stsp got_pack_paint_commits(int *ncolored, struct got_object_id_queue *ids, int nids,
365 301e83b3 2022-10-16 stsp struct got_object_idset *keep, struct got_object_idset *drop,
366 301e83b3 2022-10-16 stsp struct got_object_idset *skip, struct got_repository *repo,
367 301e83b3 2022-10-16 stsp got_pack_progress_cb progress_cb, void *progress_arg,
368 301e83b3 2022-10-16 stsp struct got_ratelimit *rl, got_cancel_cb cancel_cb, void *cancel_arg)
369 301e83b3 2022-10-16 stsp {
370 301e83b3 2022-10-16 stsp const struct got_error *err = NULL;
371 301e83b3 2022-10-16 stsp struct got_commit_object *commit = NULL;
372 301e83b3 2022-10-16 stsp struct got_packidx *packidx = NULL;
373 301e83b3 2022-10-16 stsp struct got_pack *pack = NULL;
374 301e83b3 2022-10-16 stsp const struct got_object_id_queue *parents;
375 301e83b3 2022-10-16 stsp struct got_object_qid *qid = NULL;
376 301e83b3 2022-10-16 stsp int nqueued = nids, nskip = 0;
377 301e83b3 2022-10-16 stsp int idx;
378 301e83b3 2022-10-16 stsp
379 301e83b3 2022-10-16 stsp while (!STAILQ_EMPTY(ids) && nskip != nqueued) {
380 301e83b3 2022-10-16 stsp intptr_t color;
381 301e83b3 2022-10-16 stsp
382 301e83b3 2022-10-16 stsp if (cancel_cb) {
383 301e83b3 2022-10-16 stsp err = cancel_cb(cancel_arg);
384 301e83b3 2022-10-16 stsp if (err)
385 301e83b3 2022-10-16 stsp break;
386 301e83b3 2022-10-16 stsp }
387 301e83b3 2022-10-16 stsp
388 301e83b3 2022-10-16 stsp qid = STAILQ_FIRST(ids);
389 301e83b3 2022-10-16 stsp STAILQ_REMOVE_HEAD(ids, entry);
390 301e83b3 2022-10-16 stsp nqueued--;
391 301e83b3 2022-10-16 stsp color = (intptr_t)qid->data;
392 301e83b3 2022-10-16 stsp if (color == COLOR_SKIP)
393 301e83b3 2022-10-16 stsp nskip--;
394 301e83b3 2022-10-16 stsp
395 301e83b3 2022-10-16 stsp if (got_object_idset_contains(skip, &qid->id)) {
396 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
397 301e83b3 2022-10-16 stsp qid = NULL;
398 301e83b3 2022-10-16 stsp continue;
399 301e83b3 2022-10-16 stsp }
400 301e83b3 2022-10-16 stsp if (color == COLOR_KEEP &&
401 301e83b3 2022-10-16 stsp got_object_idset_contains(keep, &qid->id)) {
402 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
403 301e83b3 2022-10-16 stsp qid = NULL;
404 301e83b3 2022-10-16 stsp continue;
405 301e83b3 2022-10-16 stsp }
406 301e83b3 2022-10-16 stsp if (color == COLOR_DROP &&
407 301e83b3 2022-10-16 stsp got_object_idset_contains(drop, &qid->id)) {
408 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
409 301e83b3 2022-10-16 stsp qid = NULL;
410 301e83b3 2022-10-16 stsp continue;
411 301e83b3 2022-10-16 stsp }
412 301e83b3 2022-10-16 stsp
413 301e83b3 2022-10-16 stsp /* Pinned pack may have moved to different cache slot. */
414 301e83b3 2022-10-16 stsp pack = got_repo_get_pinned_pack(repo);
415 301e83b3 2022-10-16 stsp
416 301e83b3 2022-10-16 stsp if (packidx && pack) {
417 301e83b3 2022-10-16 stsp idx = got_packidx_get_object_idx(packidx, &qid->id);
418 301e83b3 2022-10-16 stsp if (idx != -1) {
419 301e83b3 2022-10-16 stsp err = paint_packed_commits(pack, &qid->id,
420 301e83b3 2022-10-16 stsp idx, color, ncolored, &nqueued, &nskip,
421 301e83b3 2022-10-16 stsp ids, keep, drop, skip, repo,
422 301e83b3 2022-10-16 stsp progress_cb, progress_arg, rl,
423 301e83b3 2022-10-16 stsp cancel_cb, cancel_arg);
424 301e83b3 2022-10-16 stsp if (err)
425 301e83b3 2022-10-16 stsp break;
426 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
427 301e83b3 2022-10-16 stsp qid = NULL;
428 301e83b3 2022-10-16 stsp continue;
429 301e83b3 2022-10-16 stsp }
430 301e83b3 2022-10-16 stsp }
431 301e83b3 2022-10-16 stsp
432 301e83b3 2022-10-16 stsp switch (color) {
433 301e83b3 2022-10-16 stsp case COLOR_KEEP:
434 301e83b3 2022-10-16 stsp if (got_object_idset_contains(drop, &qid->id)) {
435 301e83b3 2022-10-16 stsp err = got_pack_paint_commit(qid, COLOR_SKIP);
436 301e83b3 2022-10-16 stsp if (err)
437 301e83b3 2022-10-16 stsp goto done;
438 301e83b3 2022-10-16 stsp } else
439 301e83b3 2022-10-16 stsp (*ncolored)++;
440 301e83b3 2022-10-16 stsp err = got_object_idset_add(keep, &qid->id, NULL);
441 301e83b3 2022-10-16 stsp if (err)
442 301e83b3 2022-10-16 stsp goto done;
443 301e83b3 2022-10-16 stsp break;
444 301e83b3 2022-10-16 stsp case COLOR_DROP:
445 301e83b3 2022-10-16 stsp if (got_object_idset_contains(keep, &qid->id)) {
446 301e83b3 2022-10-16 stsp err = got_pack_paint_commit(qid, COLOR_SKIP);
447 301e83b3 2022-10-16 stsp if (err)
448 301e83b3 2022-10-16 stsp goto done;
449 301e83b3 2022-10-16 stsp } else
450 301e83b3 2022-10-16 stsp (*ncolored)++;
451 301e83b3 2022-10-16 stsp err = got_object_idset_add(drop, &qid->id, NULL);
452 301e83b3 2022-10-16 stsp if (err)
453 301e83b3 2022-10-16 stsp goto done;
454 301e83b3 2022-10-16 stsp break;
455 301e83b3 2022-10-16 stsp case COLOR_SKIP:
456 301e83b3 2022-10-16 stsp if (!got_object_idset_contains(skip, &qid->id)) {
457 301e83b3 2022-10-16 stsp err = got_object_idset_add(skip, &qid->id,
458 301e83b3 2022-10-16 stsp NULL);
459 301e83b3 2022-10-16 stsp if (err)
460 301e83b3 2022-10-16 stsp goto done;
461 301e83b3 2022-10-16 stsp }
462 301e83b3 2022-10-16 stsp break;
463 301e83b3 2022-10-16 stsp default:
464 301e83b3 2022-10-16 stsp /* should not happen */
465 301e83b3 2022-10-16 stsp err = got_error_fmt(GOT_ERR_NOT_IMPL,
466 301e83b3 2022-10-16 stsp "%s invalid commit color %"PRIdPTR, __func__,
467 301e83b3 2022-10-16 stsp color);
468 301e83b3 2022-10-16 stsp goto done;
469 301e83b3 2022-10-16 stsp }
470 301e83b3 2022-10-16 stsp
471 301e83b3 2022-10-16 stsp err = got_pack_report_progress(progress_cb, progress_arg, rl,
472 301e83b3 2022-10-16 stsp *ncolored, 0, 0, 0L, 0, 0, 0, 0);
473 301e83b3 2022-10-16 stsp if (err)
474 301e83b3 2022-10-16 stsp break;
475 301e83b3 2022-10-16 stsp
476 301e83b3 2022-10-16 stsp err = got_object_open_as_commit(&commit, repo, &qid->id);
477 301e83b3 2022-10-16 stsp if (err)
478 301e83b3 2022-10-16 stsp break;
479 301e83b3 2022-10-16 stsp
480 301e83b3 2022-10-16 stsp parents = got_object_commit_get_parent_ids(commit);
481 301e83b3 2022-10-16 stsp if (parents) {
482 301e83b3 2022-10-16 stsp struct got_object_qid *pid;
483 301e83b3 2022-10-16 stsp color = (intptr_t)qid->data;
484 301e83b3 2022-10-16 stsp STAILQ_FOREACH(pid, parents, entry) {
485 301e83b3 2022-10-16 stsp err = got_pack_queue_commit_id(ids, &pid->id,
486 301e83b3 2022-10-16 stsp color, repo);
487 301e83b3 2022-10-16 stsp if (err)
488 301e83b3 2022-10-16 stsp break;
489 301e83b3 2022-10-16 stsp nqueued++;
490 301e83b3 2022-10-16 stsp if (color == COLOR_SKIP)
491 301e83b3 2022-10-16 stsp nskip++;
492 301e83b3 2022-10-16 stsp }
493 301e83b3 2022-10-16 stsp }
494 301e83b3 2022-10-16 stsp
495 301e83b3 2022-10-16 stsp if (pack == NULL && (commit->flags & GOT_COMMIT_FLAG_PACKED)) {
496 301e83b3 2022-10-16 stsp if (packidx == NULL) {
497 301e83b3 2022-10-16 stsp err = got_pack_find_pack_for_commit_painting(
498 301e83b3 2022-10-16 stsp &packidx, ids, nqueued, repo);
499 301e83b3 2022-10-16 stsp if (err)
500 301e83b3 2022-10-16 stsp goto done;
501 301e83b3 2022-10-16 stsp }
502 301e83b3 2022-10-16 stsp if (packidx != NULL) {
503 301e83b3 2022-10-16 stsp err = got_pack_cache_pack_for_packidx(&pack,
504 301e83b3 2022-10-16 stsp packidx, repo);
505 301e83b3 2022-10-16 stsp if (err)
506 301e83b3 2022-10-16 stsp goto done;
507 301e83b3 2022-10-16 stsp if (pack->privsep_child == NULL) {
508 301e83b3 2022-10-16 stsp err = got_pack_start_privsep_child(
509 301e83b3 2022-10-16 stsp pack, packidx);
510 301e83b3 2022-10-16 stsp if (err)
511 301e83b3 2022-10-16 stsp goto done;
512 301e83b3 2022-10-16 stsp }
513 301e83b3 2022-10-16 stsp err = got_privsep_init_commit_painting(
514 301e83b3 2022-10-16 stsp pack->privsep_child->ibuf);
515 301e83b3 2022-10-16 stsp if (err)
516 301e83b3 2022-10-16 stsp goto done;
517 301e83b3 2022-10-16 stsp err = send_idset(pack->privsep_child->ibuf,
518 301e83b3 2022-10-16 stsp keep);
519 301e83b3 2022-10-16 stsp if (err)
520 301e83b3 2022-10-16 stsp goto done;
521 301e83b3 2022-10-16 stsp err = send_idset(pack->privsep_child->ibuf, drop);
522 301e83b3 2022-10-16 stsp if (err)
523 301e83b3 2022-10-16 stsp goto done;
524 301e83b3 2022-10-16 stsp err = send_idset(pack->privsep_child->ibuf, skip);
525 301e83b3 2022-10-16 stsp if (err)
526 301e83b3 2022-10-16 stsp goto done;
527 301e83b3 2022-10-16 stsp err = got_repo_pin_pack(repo, packidx, pack);
528 301e83b3 2022-10-16 stsp if (err)
529 301e83b3 2022-10-16 stsp goto done;
530 301e83b3 2022-10-16 stsp }
531 301e83b3 2022-10-16 stsp }
532 301e83b3 2022-10-16 stsp
533 301e83b3 2022-10-16 stsp got_object_commit_close(commit);
534 301e83b3 2022-10-16 stsp commit = NULL;
535 301e83b3 2022-10-16 stsp
536 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
537 301e83b3 2022-10-16 stsp qid = NULL;
538 301e83b3 2022-10-16 stsp }
539 301e83b3 2022-10-16 stsp done:
540 301e83b3 2022-10-16 stsp if (pack) {
541 301e83b3 2022-10-16 stsp const struct got_error *pack_err;
542 301e83b3 2022-10-16 stsp pack_err = got_privsep_send_painting_commits_done(
543 301e83b3 2022-10-16 stsp pack->privsep_child->ibuf);
544 301e83b3 2022-10-16 stsp if (err == NULL)
545 301e83b3 2022-10-16 stsp err = pack_err;
546 301e83b3 2022-10-16 stsp }
547 301e83b3 2022-10-16 stsp if (commit)
548 301e83b3 2022-10-16 stsp got_object_commit_close(commit);
549 301e83b3 2022-10-16 stsp got_object_qid_free(qid);
550 301e83b3 2022-10-16 stsp got_repo_unpin_pack(repo);
551 301e83b3 2022-10-16 stsp return err;
552 301e83b3 2022-10-16 stsp }
553 301e83b3 2022-10-16 stsp
554 301e83b3 2022-10-16 stsp struct load_packed_obj_arg {
555 301e83b3 2022-10-16 stsp /* output parameters: */
556 301e83b3 2022-10-16 stsp struct got_object_id *id;
557 301e83b3 2022-10-16 stsp char *dpath;
558 301e83b3 2022-10-16 stsp time_t mtime;
559 301e83b3 2022-10-16 stsp
560 301e83b3 2022-10-16 stsp /* input parameters: */
561 301e83b3 2022-10-16 stsp uint32_t seed;
562 301e83b3 2022-10-16 stsp int want_meta;
563 301e83b3 2022-10-16 stsp struct got_object_idset *idset;
564 301e83b3 2022-10-16 stsp struct got_object_idset *idset_exclude;
565 301e83b3 2022-10-16 stsp int loose_obj_only;
566 301e83b3 2022-10-16 stsp int *ncolored;
567 301e83b3 2022-10-16 stsp int *nfound;
568 301e83b3 2022-10-16 stsp int *ntrees;
569 301e83b3 2022-10-16 stsp got_pack_progress_cb progress_cb;
570 301e83b3 2022-10-16 stsp void *progress_arg;
571 301e83b3 2022-10-16 stsp struct got_ratelimit *rl;
572 301e83b3 2022-10-16 stsp got_cancel_cb cancel_cb;
573 301e83b3 2022-10-16 stsp void *cancel_arg;
574 301e83b3 2022-10-16 stsp };
575 301e83b3 2022-10-16 stsp
576 301e83b3 2022-10-16 stsp static const struct got_error *
577 301e83b3 2022-10-16 stsp load_packed_commit_id(void *arg, time_t mtime, struct got_object_id *id,
578 301e83b3 2022-10-16 stsp struct got_repository *repo)
579 301e83b3 2022-10-16 stsp {
580 301e83b3 2022-10-16 stsp struct load_packed_obj_arg *a = arg;
581 301e83b3 2022-10-16 stsp
582 301e83b3 2022-10-16 stsp if (got_object_idset_contains(a->idset, id) ||
583 301e83b3 2022-10-16 stsp got_object_idset_contains(a->idset_exclude, id))
584 301e83b3 2022-10-16 stsp return NULL;
585 301e83b3 2022-10-16 stsp
586 301e83b3 2022-10-16 stsp return got_pack_add_object(a->want_meta,
587 301e83b3 2022-10-16 stsp a->want_meta ? a->idset : a->idset_exclude,
588 301e83b3 2022-10-16 stsp id, "", GOT_OBJ_TYPE_COMMIT, mtime, a->seed, a->loose_obj_only,
589 301e83b3 2022-10-16 stsp repo, a->ncolored, a->nfound, a->ntrees,
590 301e83b3 2022-10-16 stsp a->progress_cb, a->progress_arg, a->rl);
591 301e83b3 2022-10-16 stsp }
592 301e83b3 2022-10-16 stsp
593 301e83b3 2022-10-16 stsp static const struct got_error *
594 301e83b3 2022-10-16 stsp load_packed_tree_ids(void *arg, struct got_tree_object *tree, time_t mtime,
595 301e83b3 2022-10-16 stsp struct got_object_id *id, const char *dpath, struct got_repository *repo)
596 301e83b3 2022-10-16 stsp {
597 301e83b3 2022-10-16 stsp const struct got_error *err;
598 301e83b3 2022-10-16 stsp struct load_packed_obj_arg *a = arg;
599 301e83b3 2022-10-16 stsp const char *relpath;
600 301e83b3 2022-10-16 stsp
601 301e83b3 2022-10-16 stsp /*
602 301e83b3 2022-10-16 stsp * When we receive a tree's ID and path but not the tree itself,
603 301e83b3 2022-10-16 stsp * this tree object was not found in the pack file. This is the
604 301e83b3 2022-10-16 stsp * last time we are being called for this optimized traversal.
605 301e83b3 2022-10-16 stsp * Return from here and switch to loading objects the slow way.
606 301e83b3 2022-10-16 stsp */
607 301e83b3 2022-10-16 stsp if (tree == NULL) {
608 301e83b3 2022-10-16 stsp free(a->id);
609 301e83b3 2022-10-16 stsp a->id = got_object_id_dup(id);
610 301e83b3 2022-10-16 stsp if (a->id == NULL) {
611 301e83b3 2022-10-16 stsp err = got_error_from_errno("got_object_id_dup");
612 301e83b3 2022-10-16 stsp free(a->dpath);
613 301e83b3 2022-10-16 stsp a->dpath = NULL;
614 301e83b3 2022-10-16 stsp return err;
615 301e83b3 2022-10-16 stsp }
616 301e83b3 2022-10-16 stsp
617 301e83b3 2022-10-16 stsp free(a->dpath);
618 301e83b3 2022-10-16 stsp a->dpath = strdup(dpath);
619 301e83b3 2022-10-16 stsp if (a->dpath == NULL) {
620 301e83b3 2022-10-16 stsp err = got_error_from_errno("strdup");
621 301e83b3 2022-10-16 stsp free(a->id);
622 301e83b3 2022-10-16 stsp a->id = NULL;
623 301e83b3 2022-10-16 stsp return err;
624 301e83b3 2022-10-16 stsp }
625 301e83b3 2022-10-16 stsp
626 301e83b3 2022-10-16 stsp a->mtime = mtime;
627 301e83b3 2022-10-16 stsp return NULL;
628 301e83b3 2022-10-16 stsp }
629 301e83b3 2022-10-16 stsp
630 301e83b3 2022-10-16 stsp if (got_object_idset_contains(a->idset, id) ||
631 301e83b3 2022-10-16 stsp got_object_idset_contains(a->idset_exclude, id))
632 301e83b3 2022-10-16 stsp return NULL;
633 301e83b3 2022-10-16 stsp
634 301e83b3 2022-10-16 stsp relpath = dpath;
635 301e83b3 2022-10-16 stsp while (relpath[0] == '/')
636 301e83b3 2022-10-16 stsp relpath++;
637 301e83b3 2022-10-16 stsp
638 301e83b3 2022-10-16 stsp err = got_pack_add_object(a->want_meta,
639 301e83b3 2022-10-16 stsp a->want_meta ? a->idset : a->idset_exclude,
640 301e83b3 2022-10-16 stsp id, relpath, GOT_OBJ_TYPE_TREE, mtime, a->seed,
641 301e83b3 2022-10-16 stsp a->loose_obj_only, repo, a->ncolored, a->nfound, a->ntrees,
642 301e83b3 2022-10-16 stsp a->progress_cb, a->progress_arg, a->rl);
643 301e83b3 2022-10-16 stsp if (err)
644 301e83b3 2022-10-16 stsp return err;
645 301e83b3 2022-10-16 stsp
646 301e83b3 2022-10-16 stsp return got_pack_load_tree_entries(NULL, a->want_meta, a->idset,
647 301e83b3 2022-10-16 stsp a->idset_exclude, tree, dpath, mtime, a->seed, repo,
648 301e83b3 2022-10-16 stsp a->loose_obj_only, a->ncolored, a->nfound, a->ntrees,
649 301e83b3 2022-10-16 stsp a->progress_cb, a->progress_arg, a->rl,
650 301e83b3 2022-10-16 stsp a->cancel_cb, a->cancel_arg);
651 301e83b3 2022-10-16 stsp }
652 301e83b3 2022-10-16 stsp
653 301e83b3 2022-10-16 stsp const struct got_error *
654 301e83b3 2022-10-16 stsp got_pack_load_packed_object_ids(int *found_all_objects,
655 301e83b3 2022-10-16 stsp struct got_object_id **ours, int nours,
656 301e83b3 2022-10-16 stsp struct got_object_id **theirs, int ntheirs,
657 301e83b3 2022-10-16 stsp int want_meta, uint32_t seed, struct got_object_idset *idset,
658 301e83b3 2022-10-16 stsp struct got_object_idset *idset_exclude, int loose_obj_only,
659 301e83b3 2022-10-16 stsp struct got_repository *repo, struct got_packidx *packidx,
660 301e83b3 2022-10-16 stsp int *ncolored, int *nfound, int *ntrees,
661 301e83b3 2022-10-16 stsp got_pack_progress_cb progress_cb, void *progress_arg,
662 301e83b3 2022-10-16 stsp struct got_ratelimit *rl, got_cancel_cb cancel_cb, void *cancel_arg)
663 301e83b3 2022-10-16 stsp {
664 301e83b3 2022-10-16 stsp const struct got_error *err = NULL;
665 301e83b3 2022-10-16 stsp struct load_packed_obj_arg lpa;
666 301e83b3 2022-10-16 stsp
667 301e83b3 2022-10-16 stsp memset(&lpa, 0, sizeof(lpa));
668 301e83b3 2022-10-16 stsp lpa.seed = seed;
669 301e83b3 2022-10-16 stsp lpa.want_meta = want_meta;
670 301e83b3 2022-10-16 stsp lpa.idset = idset;
671 301e83b3 2022-10-16 stsp lpa.idset_exclude = idset_exclude;
672 301e83b3 2022-10-16 stsp lpa.loose_obj_only = loose_obj_only;
673 301e83b3 2022-10-16 stsp lpa.ncolored = ncolored;
674 301e83b3 2022-10-16 stsp lpa.nfound = nfound;
675 301e83b3 2022-10-16 stsp lpa.ntrees = ntrees;
676 301e83b3 2022-10-16 stsp lpa.progress_cb = progress_cb;
677 301e83b3 2022-10-16 stsp lpa.progress_arg = progress_arg;
678 301e83b3 2022-10-16 stsp lpa.rl = rl;
679 301e83b3 2022-10-16 stsp lpa.cancel_cb = cancel_cb;
680 301e83b3 2022-10-16 stsp lpa.cancel_arg = cancel_arg;
681 301e83b3 2022-10-16 stsp
682 301e83b3 2022-10-16 stsp /* Attempt to load objects via got-read-pack, as far as possible. */
683 301e83b3 2022-10-16 stsp err = got_object_enumerate(found_all_objects, load_packed_commit_id,
684 301e83b3 2022-10-16 stsp load_packed_tree_ids, &lpa, ours, nours, theirs, ntheirs,
685 301e83b3 2022-10-16 stsp packidx, repo);
686 301e83b3 2022-10-16 stsp if (err)
687 301e83b3 2022-10-16 stsp return err;
688 301e83b3 2022-10-16 stsp
689 301e83b3 2022-10-16 stsp if (lpa.id == NULL)
690 301e83b3 2022-10-16 stsp return NULL;
691 301e83b3 2022-10-16 stsp
692 301e83b3 2022-10-16 stsp /*
693 301e83b3 2022-10-16 stsp * An incomplete tree hierarchy was present in the pack file
694 301e83b3 2022-10-16 stsp * and caused loading to be aborted.
695 301e83b3 2022-10-16 stsp * Continue loading trees the slow way.
696 301e83b3 2022-10-16 stsp */
697 301e83b3 2022-10-16 stsp err = got_pack_load_tree(want_meta, idset, idset_exclude,
698 301e83b3 2022-10-16 stsp lpa.id, lpa.dpath, lpa.mtime, seed, repo, loose_obj_only,
699 301e83b3 2022-10-16 stsp ncolored, nfound, ntrees, progress_cb, progress_arg, rl,
700 301e83b3 2022-10-16 stsp cancel_cb, cancel_arg);
701 301e83b3 2022-10-16 stsp free(lpa.id);
702 301e83b3 2022-10-16 stsp free(lpa.dpath);
703 301e83b3 2022-10-16 stsp return err;
704 301e83b3 2022-10-16 stsp }