Merge branch 'ps/leakfixes-more'
More memory leaks have been plugged. * ps/leakfixes-more: (29 commits) builtin/blame: fix leaking ignore revs files builtin/blame: fix leaking prefixed paths blame: fix leaking data for blame scoreboards line-range: plug leaking find functions merge: fix leaking merge bases builtin/merge: fix leaking `struct cmdnames` in `get_strategy()` sequencer: fix memory leaks in `make_script_with_merges()` builtin/clone: plug leaking HEAD ref in `wanted_peer_refs()` apply: fix leaking string in `match_fragment()` sequencer: fix leaking string buffer in `commit_staged_changes()` commit: fix leaking parents when calling `commit_tree_extended()` config: fix leaking "core.notesref" variable rerere: fix various trivial leaks builtin/stash: fix leak in `show_stash()` revision: free diff options builtin/log: fix leaking commit list in git-cherry(1) merge-recursive: fix memory leak when finalizing merge builtin/merge-recursive: fix leaking object ID bases builtin/difftool: plug memory leaks in `run_dir_diff()` object-name: free leaking object contexts ...
This commit is contained in:
116
sequencer.c
116
sequencer.c
@ -1713,6 +1713,7 @@ static int try_to_commit(struct repository *r,
|
||||
|
||||
out:
|
||||
free_commit_extra_headers(extra);
|
||||
free_commit_list(parents);
|
||||
strbuf_release(&err);
|
||||
strbuf_release(&commit_msg);
|
||||
free(amend_author);
|
||||
@ -4376,6 +4377,7 @@ leave_merge:
|
||||
strbuf_release(&ref_name);
|
||||
rollback_lock_file(&lock);
|
||||
free_commit_list(to_merge);
|
||||
free_commit_list(bases);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -5207,33 +5209,47 @@ static int commit_staged_changes(struct repository *r,
|
||||
struct replay_ctx *ctx = opts->ctx;
|
||||
unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
|
||||
unsigned int final_fixup = 0, is_clean;
|
||||
struct strbuf rev = STRBUF_INIT;
|
||||
int ret;
|
||||
|
||||
if (has_unstaged_changes(r, 1))
|
||||
return error(_("cannot rebase: You have unstaged changes."));
|
||||
if (has_unstaged_changes(r, 1)) {
|
||||
ret = error(_("cannot rebase: You have unstaged changes."));
|
||||
goto out;
|
||||
}
|
||||
|
||||
is_clean = !has_uncommitted_changes(r, 0);
|
||||
|
||||
if (!is_clean && !file_exists(rebase_path_message())) {
|
||||
const char *gpg_opt = gpg_sign_opt_quoted(opts);
|
||||
|
||||
return error(_(staged_changes_advice), gpg_opt, gpg_opt);
|
||||
ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (file_exists(rebase_path_amend())) {
|
||||
struct strbuf rev = STRBUF_INIT;
|
||||
struct object_id head, to_amend;
|
||||
|
||||
if (repo_get_oid(r, "HEAD", &head))
|
||||
return error(_("cannot amend non-existing commit"));
|
||||
if (!read_oneliner(&rev, rebase_path_amend(), 0))
|
||||
return error(_("invalid file: '%s'"), rebase_path_amend());
|
||||
if (get_oid_hex(rev.buf, &to_amend))
|
||||
return error(_("invalid contents: '%s'"),
|
||||
rebase_path_amend());
|
||||
if (!is_clean && !oideq(&head, &to_amend))
|
||||
return error(_("\nYou have uncommitted changes in your "
|
||||
"working tree. Please, commit them\n"
|
||||
"first and then run 'git rebase "
|
||||
"--continue' again."));
|
||||
if (repo_get_oid(r, "HEAD", &head)) {
|
||||
ret = error(_("cannot amend non-existing commit"));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!read_oneliner(&rev, rebase_path_amend(), 0)) {
|
||||
ret = error(_("invalid file: '%s'"), rebase_path_amend());
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (get_oid_hex(rev.buf, &to_amend)) {
|
||||
ret = error(_("invalid contents: '%s'"),
|
||||
rebase_path_amend());
|
||||
goto out;
|
||||
}
|
||||
if (!is_clean && !oideq(&head, &to_amend)) {
|
||||
ret = error(_("\nYou have uncommitted changes in your "
|
||||
"working tree. Please, commit them\n"
|
||||
"first and then run 'git rebase "
|
||||
"--continue' again."));
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* When skipping a failed fixup/squash, we need to edit the
|
||||
* commit message, the current fixup list and count, and if it
|
||||
@ -5265,9 +5281,11 @@ static int commit_staged_changes(struct repository *r,
|
||||
len--;
|
||||
strbuf_setlen(&ctx->current_fixups, len);
|
||||
if (write_message(p, len, rebase_path_current_fixups(),
|
||||
0) < 0)
|
||||
return error(_("could not write file: '%s'"),
|
||||
rebase_path_current_fixups());
|
||||
0) < 0) {
|
||||
ret = error(_("could not write file: '%s'"),
|
||||
rebase_path_current_fixups());
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* If a fixup/squash in a fixup/squash chain failed, the
|
||||
@ -5297,35 +5315,38 @@ static int commit_staged_changes(struct repository *r,
|
||||
* We need to update the squash message to skip
|
||||
* the latest commit message.
|
||||
*/
|
||||
int res = 0;
|
||||
struct commit *commit;
|
||||
const char *msg;
|
||||
const char *path = rebase_path_squash_msg();
|
||||
const char *encoding = get_commit_output_encoding();
|
||||
|
||||
if (parse_head(r, &commit))
|
||||
return error(_("could not parse HEAD"));
|
||||
if (parse_head(r, &commit)) {
|
||||
ret = error(_("could not parse HEAD"));
|
||||
goto out;
|
||||
}
|
||||
|
||||
p = repo_logmsg_reencode(r, commit, NULL, encoding);
|
||||
if (!p) {
|
||||
res = error(_("could not parse commit %s"),
|
||||
ret = error(_("could not parse commit %s"),
|
||||
oid_to_hex(&commit->object.oid));
|
||||
goto unuse_commit_buffer;
|
||||
}
|
||||
find_commit_subject(p, &msg);
|
||||
if (write_message(msg, strlen(msg), path, 0)) {
|
||||
res = error(_("could not write file: "
|
||||
ret = error(_("could not write file: "
|
||||
"'%s'"), path);
|
||||
goto unuse_commit_buffer;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
unuse_commit_buffer:
|
||||
repo_unuse_commit_buffer(r, commit, p);
|
||||
if (res)
|
||||
return res;
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
strbuf_release(&rev);
|
||||
flags |= AMEND_MSG;
|
||||
}
|
||||
|
||||
@ -5333,18 +5354,29 @@ static int commit_staged_changes(struct repository *r,
|
||||
if (refs_ref_exists(get_main_ref_store(r),
|
||||
"CHERRY_PICK_HEAD") &&
|
||||
refs_delete_ref(get_main_ref_store(r), "",
|
||||
"CHERRY_PICK_HEAD", NULL, REF_NO_DEREF))
|
||||
return error(_("could not remove CHERRY_PICK_HEAD"));
|
||||
if (unlink(git_path_merge_msg(r)) && errno != ENOENT)
|
||||
return error_errno(_("could not remove '%s'"),
|
||||
git_path_merge_msg(r));
|
||||
if (!final_fixup)
|
||||
return 0;
|
||||
"CHERRY_PICK_HEAD", NULL, REF_NO_DEREF)) {
|
||||
ret = error(_("could not remove CHERRY_PICK_HEAD"));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlink(git_path_merge_msg(r)) && errno != ENOENT) {
|
||||
ret = error_errno(_("could not remove '%s'"),
|
||||
git_path_merge_msg(r));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!final_fixup) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (run_git_commit(final_fixup ? NULL : rebase_path_message(),
|
||||
opts, flags))
|
||||
return error(_("could not commit staged changes."));
|
||||
opts, flags)) {
|
||||
ret = error(_("could not commit staged changes."));
|
||||
goto out;
|
||||
}
|
||||
|
||||
unlink(rebase_path_amend());
|
||||
unlink(git_path_merge_head(r));
|
||||
refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
|
||||
@ -5362,7 +5394,12 @@ static int commit_staged_changes(struct repository *r,
|
||||
strbuf_reset(&ctx->current_fixups);
|
||||
ctx->current_fixup_count = 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
strbuf_release(&rev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int sequencer_continue(struct repository *r, struct replay_opts *opts)
|
||||
@ -5978,6 +6015,9 @@ static int make_script_with_merges(struct pretty_print_context *pp,
|
||||
strbuf_release(&oneline);
|
||||
strbuf_release(&buf);
|
||||
|
||||
oidset_clear(&interesting);
|
||||
oidset_clear(&child_seen);
|
||||
oidset_clear(&shown);
|
||||
oidmap_free(&commit2todo, 1);
|
||||
oidmap_free(&state.commit2label, 1);
|
||||
hashmap_clear_and_free(&state.labels, struct labels_entry, entry);
|
||||
|
Reference in New Issue
Block a user