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 */