promisor-remote: implement promisor_remote_get_direct()

This is implemented for now by calling fetch_objects(). It fetches from all the promisor remotes. Helped-by: Ramsay Jones <ramsay@ramsayjones.plus.com> Helped-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Christian Couder committed Jun 25, 2019 at 15:40 UTC 9e27beaa2344dc6dd422d7711a666c082785118f
2 files changed +72
promisor-remote.c
+67
@@ -1,6 +1,8 @@
1 #include "cache.h"
2 +#include "object-store.h"
3 #include "promisor-remote.h"
4 #include "config.h"
5 +#include "fetch-object.h"
6
7 static struct promisor_remote *promisors;
8 static struct promisor_remote **promisors_tail = &promisors;
@@ -90,3 +92,68 @@ int has_promisor_remote(void)
92 {
93 return !!promisor_remote_find(NULL);
94 }
95 +
96 +static int remove_fetched_oids(struct repository *repo,
97 + struct object_id **oids,
98 + int oid_nr, int to_free)
99 +{
100 + int i, remaining_nr = 0;
101 + int *remaining = xcalloc(oid_nr, sizeof(*remaining));
102 + struct object_id *old_oids = *oids;
103 + struct object_id *new_oids;
104 +
105 + for (i = 0; i < oid_nr; i++)
106 + if (oid_object_info_extended(repo, &old_oids[i], NULL,
107 + OBJECT_INFO_SKIP_FETCH_OBJECT)) {
108 + remaining[i] = 1;
109 + remaining_nr++;
110 + }
111 +
112 + if (remaining_nr) {
113 + int j = 0;
114 + new_oids = xcalloc(remaining_nr, sizeof(*new_oids));
115 + for (i = 0; i < oid_nr; i++)
116 + if (remaining[i])
117 + oidcpy(&new_oids[j++], &old_oids[i]);
118 + *oids = new_oids;
119 + if (to_free)
120 + free(old_oids);
121 + }
122 +
123 + free(remaining);
124 +
125 + return remaining_nr;
126 +}
127 +
128 +int promisor_remote_get_direct(struct repository *repo,
129 + const struct object_id *oids,
130 + int oid_nr)
131 +{
132 + struct promisor_remote *r;
133 + struct object_id *remaining_oids = (struct object_id *)oids;
134 + int remaining_nr = oid_nr;
135 + int to_free = 0;
136 + int res = -1;
137 +
138 + promisor_remote_init();
139 +
140 + for (r = promisors; r; r = r->next) {
141 + if (fetch_objects(r->name, remaining_oids, remaining_nr) < 0) {
142 + if (remaining_nr == 1)
143 + continue;
144 + remaining_nr = remove_fetched_oids(repo, &remaining_oids,
145 + remaining_nr, to_free);
146 + if (remaining_nr) {
147 + to_free = 1;
148 + continue;
149 + }
150 + }
151 + res = 0;
152 + break;
153 + }
154 +
155 + if (to_free)
156 + free(remaining_oids);
157 +
158 + return res;
159 +}
promisor-remote.h
+5
@@ -1,6 +1,8 @@
1 #ifndef PROMISOR_REMOTE_H
2 #define PROMISOR_REMOTE_H
3
4 +struct object_id;
5 +
6 /*
7 * Promisor remote linked list
8 * Its information come from remote.XXX config entries.
@@ -12,5 +14,8 @@ struct promisor_remote {
14
15 extern struct promisor_remote *promisor_remote_find(const char *remote_name);
16 extern int has_promisor_remote(void);
17 +extern int promisor_remote_get_direct(struct repository *repo,
18 + const struct object_id *oids,
19 + int oid_nr);
20
21 #endif /* PROMISOR_REMOTE_H */