Merge branch 'jk/setup-revisions-freefix'
There are double frees and leaks around setup_revisions() API used in "git stash show", which has been fixed, and setup_revisions() API gained a wrapper to make it more ergonomic when using it with strvec-manged argc/argv pairs. * jk/setup-revisions-freefix: revision: retain argv NULL invariant in setup_revisions() treewide: pass strvecs around for setup_revisions_from_strvec() treewide: use setup_revisions_from_strvec() when we have a strvec revision: add wrapper to setup_revisions() from a strvec revision: manage memory ownership of argv in setup_revisions() stash: tell setup_revisions() to free our allocated strings
This commit is contained in:
@@ -580,7 +580,8 @@ static void describe_blob(const struct object_id *oid, struct strbuf *dst)
|
||||
NULL);
|
||||
|
||||
repo_init_revisions(the_repository, &revs, NULL);
|
||||
if (setup_revisions(args.nr, args.v, &revs, NULL) > 1)
|
||||
setup_revisions_from_strvec(&args, &revs, NULL);
|
||||
if (args.nr > 1)
|
||||
BUG("setup_revisions could not handle all args?");
|
||||
|
||||
if (prepare_revision_walk(&revs))
|
||||
|
||||
@@ -4650,7 +4650,7 @@ static void get_object_list_path_walk(struct rev_info *revs)
|
||||
die(_("failed to pack objects via path-walk"));
|
||||
}
|
||||
|
||||
static void get_object_list(struct rev_info *revs, int ac, const char **av)
|
||||
static void get_object_list(struct rev_info *revs, struct strvec *argv)
|
||||
{
|
||||
struct setup_revision_opt s_r_opt = {
|
||||
.allow_exclude_promisor_objects = 1,
|
||||
@@ -4660,7 +4660,7 @@ static void get_object_list(struct rev_info *revs, int ac, const char **av)
|
||||
int save_warning;
|
||||
|
||||
save_commit_buffer = 0;
|
||||
setup_revisions(ac, av, revs, &s_r_opt);
|
||||
setup_revisions_from_strvec(argv, revs, &s_r_opt);
|
||||
|
||||
/* make sure shallows are read */
|
||||
is_repository_shallow(the_repository);
|
||||
@@ -5229,7 +5229,7 @@ int cmd_pack_objects(int argc,
|
||||
revs.include_check = is_not_in_promisor_pack;
|
||||
revs.include_check_obj = is_not_in_promisor_pack_obj;
|
||||
}
|
||||
get_object_list(&revs, rp.nr, rp.v);
|
||||
get_object_list(&revs, &rp);
|
||||
release_revisions(&revs);
|
||||
}
|
||||
cleanup_preferred_base();
|
||||
|
||||
@@ -299,8 +299,7 @@ static int do_interactive_rebase(struct rebase_options *opts, unsigned flags)
|
||||
oid_to_hex(&opts->restrict_revision->object.oid));
|
||||
|
||||
ret = sequencer_make_script(the_repository, &todo_list.buf,
|
||||
make_script_args.nr, make_script_args.v,
|
||||
flags);
|
||||
&make_script_args, flags);
|
||||
if (ret) {
|
||||
error(_("could not generate todo list"));
|
||||
goto cleanup;
|
||||
|
||||
@@ -1015,8 +1015,8 @@ static int show_stash(int argc, const char **argv, const char *prefix,
|
||||
}
|
||||
}
|
||||
|
||||
argc = setup_revisions(revision_args.nr, revision_args.v, &rev, NULL);
|
||||
if (argc > 1)
|
||||
setup_revisions_from_strvec(&revision_args, &rev, NULL);
|
||||
if (revision_args.nr > 1)
|
||||
goto usage;
|
||||
if (!rev.diffopt.output_format) {
|
||||
rev.diffopt.output_format = DIFF_FORMAT_PATCH;
|
||||
|
||||
@@ -616,9 +616,6 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
|
||||
struct rev_info rev = REV_INFO_INIT;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
const char *git_dir;
|
||||
struct setup_revision_opt opt = {
|
||||
.free_removed_argv_elements = 1,
|
||||
};
|
||||
|
||||
if (validate_submodule_path(path) < 0)
|
||||
die(NULL);
|
||||
@@ -655,7 +652,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
|
||||
|
||||
repo_init_revisions(the_repository, &rev, NULL);
|
||||
rev.abbrev = 0;
|
||||
setup_revisions(diff_files_args.nr, diff_files_args.v, &rev, &opt);
|
||||
setup_revisions_from_strvec(&diff_files_args, &rev, NULL);
|
||||
run_diff_files(&rev, 0);
|
||||
|
||||
if (!diff_result_code(&rev)) {
|
||||
@@ -1094,9 +1091,6 @@ static int compute_summary_module_list(struct object_id *head_oid,
|
||||
{
|
||||
struct strvec diff_args = STRVEC_INIT;
|
||||
struct rev_info rev;
|
||||
struct setup_revision_opt opt = {
|
||||
.free_removed_argv_elements = 1,
|
||||
};
|
||||
struct module_cb_list list = MODULE_CB_LIST_INIT;
|
||||
int ret = 0;
|
||||
|
||||
@@ -1114,7 +1108,7 @@ static int compute_summary_module_list(struct object_id *head_oid,
|
||||
repo_init_revisions(the_repository, &rev, info->prefix);
|
||||
rev.abbrev = 0;
|
||||
precompose_argv_prefix(diff_args.nr, diff_args.v, NULL);
|
||||
setup_revisions(diff_args.nr, diff_args.v, &rev, &opt);
|
||||
setup_revisions_from_strvec(&diff_args, &rev, NULL);
|
||||
rev.diffopt.output_format = DIFF_FORMAT_NO_OUTPUT | DIFF_FORMAT_CALLBACK;
|
||||
rev.diffopt.format_callback = submodule_summary_callback;
|
||||
rev.diffopt.format_callback_data = &list;
|
||||
|
||||
Reference in New Issue
Block a user