* Use a dedicated variable, ref, for referring to the current item rather than using the ref_map pointer for this purpose. * Use a (struct ref **) as iteration variable to avoid having to keep track of prev and next in addition to the pointer to the current item. Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- remote.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/remote.c b/remote.c index a44e897..5ade07f 100644 --- a/remote.c +++ b/remote.c @@ -748,29 +748,33 @@ int for_each_remote(each_remote_fn fn, void *priv) void ref_remove_duplicates(struct ref *ref_map) { struct string_list refs = STRING_LIST_INIT_NODUP; - struct string_list_item *item = NULL; - struct ref *prev = NULL, *next = NULL; + struct ref **p; - for (; ref_map; prev = ref_map, ref_map = next) { - next = ref_map->next; - if (!ref_map->peer_ref) + for (p = &ref_map; *p; ) { + struct ref *ref = *p; + struct string_list_item *item; + + if (!ref->peer_ref) { + p = &ref->next; continue; + } - item = string_list_insert(&refs, ref_map->peer_ref->name); + item = string_list_insert(&refs, ref->peer_ref->name); if (item->util) { /* Entry already existed */ if (strcmp(((struct ref *)item->util)->name, - ref_map->name)) + ref->name)) die("%s tracks both %s and %s", - ref_map->peer_ref->name, + ref->peer_ref->name, ((struct ref *)item->util)->name, - ref_map->name); - prev->next = ref_map->next; - free(ref_map->peer_ref); - free(ref_map); - ref_map = prev; /* skip this; we freed it */ + ref->name); + /* item is a duplicate; remove and free it */ + *p = ref->next; + free(ref->peer_ref); + free(ref); } else { - item->util = ref_map; + item->util = ref; + p = &ref->next; } } string_list_clear(&refs, 0); -- 1.8.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html