On 17/06/2021 13:21, Ævar Arnfjörð Bjarmason wrote:
---
builtin/bundle.c | 12 ++++-----
bundle.c | 64 ++++++++++++++++++++++++------------------------
bundle.h | 20 +++++++--------
transport.c | 10 +++++---
4 files changed, 55 insertions(+), 51 deletions(-)
[snip]
diff --git a/bundle.c b/bundle.c
index 621708f40e..d36eeee1a5 100644
--- a/bundle.c
+++ b/bundle.c
@@ -162,14 +156,14 @@ static int list_refs(struct ref_list *r, int argc, const char **argv)
if (argc > 1) {
int j;
for (j = 1; j < argc; j++)
- if (!strcmp(r->list[i].name, argv[j]))
+ if (!strcmp(r->items[i].string, argv[j]))
break;
if (j == argc)
continue;
}
- oid = &r->list[i].oid;
- name = r->list[i].name;
+ oid = r->items[i].util;
+ name = r->items[i].string;
printf("%s %s\n", oid_to_hex(oid), name);
In function `list_refs` variable `name` that is used in a call to printf
has been extracted by the previous patch.
}
return 0;
@@ -186,7 +180,7 @@ int verify_bundle(struct repository *r,
* Do fast check, then if any prereqs are missing then go line by line
* to be verbose about the errors
*/
- struct ref_list *p = &header->prerequisites;
+ struct string_list *p = &header->prerequisites;
struct rev_info revs;
const char *argv[] = {NULL, "--all", NULL};
struct commit *commit;
@@ -198,17 +192,17 @@ int verify_bundle(struct repository *r,
repo_init_revisions(r, &revs, NULL);
for (i = 0; i < p->nr; i++) {
- struct ref_list_entry *e = p->list + i;
- struct object_id *oid = &e->oid;
+ struct string_list_item *e = p->items + i;
+ struct object_id *oid = e->util;
struct object *o = parse_object(r, oid);
if (o) {
o->flags |= PREREQ_MARK;
- add_pending_object(&revs, o, e->name);
+ add_pending_object(&revs, o, e->string);
continue;
}
if (++ret == 1)
error("%s", message);
- error("%s %s", oid_to_hex(oid), e->name);
+ error("%s %s", oid_to_hex(oid), e->string);
}
if (revs.pending.nr != p->nr)
return ret;
@@ -224,28 +218,28 @@ int verify_bundle(struct repository *r,
i--;
for (i = 0; i < p->nr; i++) {
- struct ref_list_entry *e = p->list + i;
- struct object_id *oid = &e->oid;
+ struct string_list_item *e = p->items + i;
+ const struct object_id *oid = e->util;
struct object *o = parse_object(r, oid);
assert(o); /* otherwise we'd have returned early */
if (o->flags & SHOWN)
continue;
if (++ret == 1)
error("%s", message);
- error("%s %s", oid_to_hex(oid), e->name);
+ error("%s %s", oid_to_hex(oid), e->string);
However, `e->name` in three places in function `verify_bundle` for two
different instances of `struct ref_list_entry *` wasn't extracted into
a variable by the previous patch. Could you please clarify this
discrepancy?
[snip]
diff --git a/transport.c b/transport.c
index 9d601c8c95..667c4e0cc6 100644
--- a/transport.c
+++ b/transport.c
@@ -147,13 +147,14 @@ static struct ref *get_refs_from_bundle(struct transport *transport,
transport->hash_algo = data->header.hash_algo;
for (i = 0; i < data->header.references.nr; i++) {
- struct ref_list_entry *e = data->header.references.list + i;
- struct ref *ref = alloc_ref(e->name);
- struct object_id *oid = &e->oid;
+ struct string_list_item *e = data->header.references.items + i;
+ struct ref *ref = alloc_ref(e->string);
Similar question for `e->name` here.
+ const struct object_id *oid = e->util;
oidcpy(&ref->old_oid, oid);
ref->next = result;
result = ref;
}
+ string_list_clear(&data->header.references, 1);
return result;
}
@@ -176,6 +177,7 @@ static int close_bundle(struct transport *transport)
struct bundle_transport_data *data = transport->data;
if (data->fd > 0)
close(data->fd);
+ bundle_header_release(&data->header);
free(data);
return 0;
}
@@ -1082,6 +1084,8 @@ struct transport *transport_get(struct remote *remote, const char *url)
die(_("git-over-rsync is no longer supported"));
} else if (url_is_local_not_ssh(url) && is_file(url) && is_bundle(url, 1)) {
struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
+ string_list_init(&data->header.prerequisites, 1);
+ string_list_init(&data->header.references, 1);
transport_check_allowed("file");
ret->data = data;
ret->vtable = &bundle_vtable;