* 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 <mhag...@alum.mit.edu>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to