2 #include "object-store.h"
3 #include "promisor-remote.h"
5 #include "fetch-object.h"
7 static struct promisor_remote
*promisors
;
8 static struct promisor_remote
**promisors_tail
= &promisors
;
10 static struct promisor_remote
*promisor_remote_new(const char *remote_name
)
12 struct promisor_remote
*r
;
14 if (*remote_name
== '/') {
15 warning(_("promisor remote name cannot begin with '/': %s"),
20 FLEX_ALLOC_STR(r
, name
, remote_name
);
23 promisors_tail
= &r
->next
;
28 static struct promisor_remote
*promisor_remote_lookup(const char *remote_name
,
29 struct promisor_remote
**previous
)
31 struct promisor_remote
*r
, *p
;
33 for (p
= NULL
, r
= promisors
; r
; p
= r
, r
= r
->next
)
34 if (!strcmp(r
->name
, remote_name
)) {
43 static int promisor_remote_config(const char *var
, const char *value
, void *data
)
49 if (parse_config_key(var
, "remote", &name
, &namelen
, &subkey
) < 0)
52 if (!strcmp(subkey
, "promisor")) {
55 if (!git_config_bool(var
, value
))
58 remote_name
= xmemdupz(name
, namelen
);
60 if (!promisor_remote_lookup(remote_name
, NULL
))
61 promisor_remote_new(remote_name
);
70 static int initialized
;
72 static void promisor_remote_init(void)
78 git_config(promisor_remote_config
, NULL
);
81 static void promisor_remote_clear(void)
84 struct promisor_remote
*r
= promisors
;
85 promisors
= promisors
->next
;
89 promisors_tail
= &promisors
;
92 void promisor_remote_reinit(void)
95 promisor_remote_clear();
96 promisor_remote_init();
99 struct promisor_remote
*promisor_remote_find(const char *remote_name
)
101 promisor_remote_init();
106 return promisor_remote_lookup(remote_name
, NULL
);
109 int has_promisor_remote(void)
111 return !!promisor_remote_find(NULL
);
114 static int remove_fetched_oids(struct repository
*repo
,
115 struct object_id
**oids
,
116 int oid_nr
, int to_free
)
118 int i
, remaining_nr
= 0;
119 int *remaining
= xcalloc(oid_nr
, sizeof(*remaining
));
120 struct object_id
*old_oids
= *oids
;
121 struct object_id
*new_oids
;
123 for (i
= 0; i
< oid_nr
; i
++)
124 if (oid_object_info_extended(repo
, &old_oids
[i
], NULL
,
125 OBJECT_INFO_SKIP_FETCH_OBJECT
)) {
132 new_oids
= xcalloc(remaining_nr
, sizeof(*new_oids
));
133 for (i
= 0; i
< oid_nr
; i
++)
135 oidcpy(&new_oids
[j
++], &old_oids
[i
]);
146 int promisor_remote_get_direct(struct repository
*repo
,
147 const struct object_id
*oids
,
150 struct promisor_remote
*r
;
151 struct object_id
*remaining_oids
= (struct object_id
*)oids
;
152 int remaining_nr
= oid_nr
;
156 promisor_remote_init();
158 for (r
= promisors
; r
; r
= r
->next
) {
159 if (fetch_objects(r
->name
, remaining_oids
, remaining_nr
) < 0) {
160 if (remaining_nr
== 1)
162 remaining_nr
= remove_fetched_oids(repo
, &remaining_oids
,
163 remaining_nr
, to_free
);
174 free(remaining_oids
);