try_remove_empty_parents(): don't trash argument contents

It's bad manners and surprising and therefore error-prone. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Reviewed-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Michael Haggerty committed Jan 6, 2017 at 17:22 UTC 8bdaecb402cc024ff1ce7fc8856e4ee87f9102f1
1 file changed +9 -7
refs/files-backend.c
+9 -7
@@ -2282,13 +2282,15 @@ static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
2282
2283 /*
2284 * Remove empty parents, but spare refs/ and immediate subdirs.
2285 - * Note: munges *refname.
2285 */
2287 -static void try_remove_empty_parents(char *refname)
2286 +static void try_remove_empty_parents(const char *refname)
2287 {
2288 + struct strbuf buf = STRBUF_INIT;
2289 char *p, *q;
2290 int i;
2291 - p = refname;
2291 +
2292 + strbuf_addstr(&buf, refname);
2293 + p = buf.buf;
2294 for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
2295 while (*p && *p != '/')
2296 p++;
@@ -2296,8 +2298,7 @@ static void try_remove_empty_parents(char *refname)
2298 while (*p == '/')
2299 p++;
2300 }
2299 - for (q = p; *q; q++)
2300 - ;
2301 + q = buf.buf + buf.len;
2302 while (1) {
2303 while (q > p && *q != '/')
2304 q--;
@@ -2305,10 +2306,11 @@ static void try_remove_empty_parents(char *refname)
2306 q--;
2307 if (q == p)
2308 break;
2308 - *q = '\0';
2309 - if (rmdir(git_path("%s", refname)))
2309 + strbuf_setlen(&buf, q - buf.buf);
2310 + if (rmdir(git_path("%s", buf.buf)))
2311 break;
2312 }
2313 + strbuf_release(&buf);
2314 }
2315
2316 /* make sure nobody touched the ref, and unlink */