http-walker: use object_id instead of bare hash
We long ago switched most code to using object_id structs instead of bare "unsigned char *" hashes. This gives us more type safety from the compiler, and generally makes it easier to understand what we expect in each parameter. But the dumb-http code has lagged behind. And indeed, the whole "walker" subsystem interface has the same problem, though http-walker is the only user left. So let's update the walker interface to pass object_id structs (which we already have anyway at all call sites!), and likewise use those within the http-walker methods that it calls. This cleans up the dumb-http code a bit, but will also let us fix a few more commonly used helper functions. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Taylor Blau <me@ttaylorr.com>maint
parent
6b2fc22050
commit
0af861e0c8
|
@ -147,14 +147,14 @@ static int fill_active_slot(void *data UNUSED)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prefetch(struct walker *walker, unsigned char *sha1)
|
static void prefetch(struct walker *walker, const struct object_id *oid)
|
||||||
{
|
{
|
||||||
struct object_request *newreq;
|
struct object_request *newreq;
|
||||||
struct walker_data *data = walker->data;
|
struct walker_data *data = walker->data;
|
||||||
|
|
||||||
newreq = xmalloc(sizeof(*newreq));
|
newreq = xmalloc(sizeof(*newreq));
|
||||||
newreq->walker = walker;
|
newreq->walker = walker;
|
||||||
oidread(&newreq->oid, sha1, the_repository->hash_algo);
|
oidcpy(&newreq->oid, oid);
|
||||||
newreq->repo = data->alt;
|
newreq->repo = data->alt;
|
||||||
newreq->state = WAITING;
|
newreq->state = WAITING;
|
||||||
newreq->req = NULL;
|
newreq->req = NULL;
|
||||||
|
@ -422,7 +422,8 @@ static int fetch_indices(struct walker *walker, struct alt_base *repo)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
|
static int http_fetch_pack(struct walker *walker, struct alt_base *repo,
|
||||||
|
const struct object_id *oid)
|
||||||
{
|
{
|
||||||
struct packed_git *target;
|
struct packed_git *target;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -431,7 +432,7 @@ static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigne
|
||||||
|
|
||||||
if (fetch_indices(walker, repo))
|
if (fetch_indices(walker, repo))
|
||||||
return -1;
|
return -1;
|
||||||
target = find_sha1_pack(sha1, repo->packs);
|
target = find_sha1_pack(oid->hash, repo->packs);
|
||||||
if (!target)
|
if (!target)
|
||||||
return -1;
|
return -1;
|
||||||
close_pack_index(target);
|
close_pack_index(target);
|
||||||
|
@ -440,7 +441,7 @@ static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigne
|
||||||
fprintf(stderr, "Getting pack %s\n",
|
fprintf(stderr, "Getting pack %s\n",
|
||||||
hash_to_hex(target->hash));
|
hash_to_hex(target->hash));
|
||||||
fprintf(stderr, " which contains %s\n",
|
fprintf(stderr, " which contains %s\n",
|
||||||
hash_to_hex(sha1));
|
oid_to_hex(oid));
|
||||||
}
|
}
|
||||||
|
|
||||||
preq = new_http_pack_request(target->hash, repo->base);
|
preq = new_http_pack_request(target->hash, repo->base);
|
||||||
|
@ -477,9 +478,9 @@ static void abort_object_request(struct object_request *obj_req)
|
||||||
release_object_request(obj_req);
|
release_object_request(obj_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fetch_object(struct walker *walker, unsigned char *hash)
|
static int fetch_object(struct walker *walker, const struct object_id *oid)
|
||||||
{
|
{
|
||||||
char *hex = hash_to_hex(hash);
|
char *hex = oid_to_hex(oid);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct object_request *obj_req = NULL;
|
struct object_request *obj_req = NULL;
|
||||||
struct http_object_request *req;
|
struct http_object_request *req;
|
||||||
|
@ -487,7 +488,7 @@ static int fetch_object(struct walker *walker, unsigned char *hash)
|
||||||
|
|
||||||
list_for_each(pos, head) {
|
list_for_each(pos, head) {
|
||||||
obj_req = list_entry(pos, struct object_request, node);
|
obj_req = list_entry(pos, struct object_request, node);
|
||||||
if (hasheq(obj_req->oid.hash, hash, the_repository->hash_algo))
|
if (oideq(&obj_req->oid, oid))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!obj_req)
|
if (!obj_req)
|
||||||
|
@ -548,20 +549,20 @@ static int fetch_object(struct walker *walker, unsigned char *hash)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fetch(struct walker *walker, unsigned char *hash)
|
static int fetch(struct walker *walker, const struct object_id *oid)
|
||||||
{
|
{
|
||||||
struct walker_data *data = walker->data;
|
struct walker_data *data = walker->data;
|
||||||
struct alt_base *altbase = data->alt;
|
struct alt_base *altbase = data->alt;
|
||||||
|
|
||||||
if (!fetch_object(walker, hash))
|
if (!fetch_object(walker, oid))
|
||||||
return 0;
|
return 0;
|
||||||
while (altbase) {
|
while (altbase) {
|
||||||
if (!http_fetch_pack(walker, altbase, hash))
|
if (!http_fetch_pack(walker, altbase, oid))
|
||||||
return 0;
|
return 0;
|
||||||
fetch_alternates(walker, data->alt->base);
|
fetch_alternates(walker, data->alt->base);
|
||||||
altbase = altbase->next;
|
altbase = altbase->next;
|
||||||
}
|
}
|
||||||
return error("Unable to find %s under %s", hash_to_hex(hash),
|
return error("Unable to find %s under %s", oid_to_hex(oid),
|
||||||
data->alt->base);
|
data->alt->base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
walker.c
4
walker.c
|
@ -157,7 +157,7 @@ static int process(struct walker *walker, struct object *obj)
|
||||||
else {
|
else {
|
||||||
if (obj->flags & COMPLETE)
|
if (obj->flags & COMPLETE)
|
||||||
return 0;
|
return 0;
|
||||||
walker->prefetch(walker, obj->oid.hash);
|
walker->prefetch(walker, &obj->oid);
|
||||||
}
|
}
|
||||||
|
|
||||||
object_list_insert(obj, process_queue_end);
|
object_list_insert(obj, process_queue_end);
|
||||||
|
@ -186,7 +186,7 @@ static int loop(struct walker *walker)
|
||||||
* the queue because we needed to fetch it first.
|
* the queue because we needed to fetch it first.
|
||||||
*/
|
*/
|
||||||
if (! (obj->flags & TO_SCAN)) {
|
if (! (obj->flags & TO_SCAN)) {
|
||||||
if (walker->fetch(walker, obj->oid.hash)) {
|
if (walker->fetch(walker, &obj->oid)) {
|
||||||
stop_progress(&progress);
|
stop_progress(&progress);
|
||||||
report_missing(obj);
|
report_missing(obj);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
4
walker.h
4
walker.h
|
@ -6,8 +6,8 @@
|
||||||
struct walker {
|
struct walker {
|
||||||
void *data;
|
void *data;
|
||||||
int (*fetch_ref)(struct walker *, struct ref *ref);
|
int (*fetch_ref)(struct walker *, struct ref *ref);
|
||||||
void (*prefetch)(struct walker *, unsigned char *sha1);
|
void (*prefetch)(struct walker *, const struct object_id *oid);
|
||||||
int (*fetch)(struct walker *, unsigned char *sha1);
|
int (*fetch)(struct walker *, const struct object_id *oid);
|
||||||
void (*cleanup)(struct walker *);
|
void (*cleanup)(struct walker *);
|
||||||
int get_verbosely;
|
int get_verbosely;
|
||||||
int get_progress;
|
int get_progress;
|
||||||
|
|
Loading…
Reference in New Issue