Track the names of the refs we are deleting in the ref_transaction structure instead of building an array of names during _commit. Signed-off-by: Ronnie Sahlberg <sahlberg@xxxxxxxxxx> --- refs.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/refs.c b/refs.c index 58bbf1b..cc31efe 100644 --- a/refs.c +++ b/refs.c @@ -3299,6 +3299,8 @@ struct ref_transaction { size_t alloc; size_t nr; enum ref_transaction_status status; + const char **delnames; + int delnum; }; struct ref_transaction *transaction_begin(void) @@ -3306,6 +3308,15 @@ struct ref_transaction *transaction_begin(void) return xcalloc(1, sizeof(struct ref_transaction)); } +static void add_delname(struct ref_transaction *transaction, + const char *refname) +{ + transaction->delnames = xrealloc(transaction->delnames, + ++transaction->delnum * + sizeof(const char *)); + transaction->delnames[transaction->delnum - 1] = xstrdup(refname); +} + void transaction_free(struct ref_transaction *transaction) { int i; @@ -3319,6 +3330,9 @@ void transaction_free(struct ref_transaction *transaction) free(transaction->updates[i]); } free(transaction->updates); + for (i = 0; i < transaction->delnum; i++) + free((char *)transaction->delnames[i]); + free((char *)transaction->delnames); free(transaction); } @@ -3518,8 +3532,7 @@ static int ref_update_reject_duplicates(struct ref_update **updates, int n, int transaction_commit(struct ref_transaction *transaction, struct strbuf *err) { - int ret = 0, delnum = 0, i; - const char **delnames; + int ret = 0, i; int n = transaction->nr; struct ref_update **updates = transaction->updates; @@ -3531,9 +3544,6 @@ int transaction_commit(struct ref_transaction *transaction, return 0; } - /* Allocate work space */ - delnames = xmalloc(sizeof(*delnames) * n); - /* Copy, sort, and reject duplicate refs */ qsort(updates, n, sizeof(*updates), ref_update_compare); ret = ref_update_reject_duplicates(updates, n, err); @@ -3546,7 +3556,7 @@ int transaction_commit(struct ref_transaction *transaction, if (update->update_type != UPDATE_SHA1) continue; if (update->flags & REF_ISPACKONLY) - delnames[delnum++] = update->refname; + add_delname(transaction, update->refname); } /* Acquire all ref locks while verifying old values */ @@ -3564,7 +3574,8 @@ int transaction_commit(struct ref_transaction *transaction, NULL), update->flags, &update->type, - delnames, delnum); + transaction->delnames, + transaction->delnum); if (!update->lock) { if (err) strbuf_addf(err, "Cannot lock the ref '%s'.", @@ -3631,7 +3642,8 @@ int transaction_commit(struct ref_transaction *transaction, if (update->lock) { ret |= delete_ref_loose(update->lock, update->type); if (!(update->flags & REF_ISPRUNING)) - delnames[delnum++] = update->lock->ref_name; + add_delname(transaction, + update->lock->ref_name); } } @@ -3677,9 +3689,9 @@ int transaction_commit(struct ref_transaction *transaction, } } - ret |= repack_without_refs(delnames, delnum); - for (i = 0; i < delnum; i++) - unlink_or_warn(git_path("logs/%s", delnames[i])); + ret |= repack_without_refs(transaction->delnames, transaction->delnum); + for (i = 0; i < transaction->delnum; i++) + unlink_or_warn(git_path("logs/%s", transaction->delnames[i])); clear_loose_ref_cache(&ref_cache); cleanup: @@ -3701,7 +3713,6 @@ cleanup: for (i = 0; i < n; i++) if (updates[i]->lock) unlock_ref(updates[i]->lock); - free(delnames); return ret; } -- 2.0.0.rc3.506.g3739a35 -- 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