Thread (15 messages) flat view 15 messages, 3 authors, 2016-06-15

Re: [PATCH 3/3] fetch: treat --tags like refs/tags/*:refs/tags/* when pruning

From: Jeff King <hidden>
Date: 2016-06-15 22:52:12

On Thu, Oct 06, 2011 at 11:21:47PM +0200, Carlos Martín Nieto wrote:
quoted hunk ↗ jump to hunk
diff --git a/builtin/fetch.c b/builtin/fetch.c
index b937d71..94b2bd3 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -699,8 +699,17 @@ static int do_fetch(struct transport *transport,
 		free_refs(ref_map);
 		return 1;
 	}
-	if (prune)
+	if (prune) {
+		/* If --tags was specified, we need to tell prune_refs
+		 * that we're filtering the refs from the remote */
+		if (tags == TAGS_SET) {
+			const char * tags_refspec = "refs/tags/*:refs/tags/*";
+			refs = xrealloc(refs, (ref_count + 1) * sizeof(struct refspec));
+			refs[ref_count] = *parse_fetch_refspec(1, &tags_refspec);
+			ref_count++;
+		}
 		prune_refs(transport, refs, ref_count, ref_map);
+	}
I don't think we can realloc refs here. It's passed into do_fetch. When
we realloc it, the old pointer value will be invalid. But when we return
from do_fetch, the caller (fetch_one) will still have that old value,
and will call free() on it.

Instead, you have to make a whole new list, copy the old values in, add
your new one, and then free the result.

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help