sequencer: make sequencer_make_script() write its script to a strbuf
This makes sequencer_make_script() write its script to a strbuf (ie. the buffer of a todo_list) instead of a FILE. This reduce the amount of read/write made by rebase interactive. Signed-off-by: Alban Gruin <alban.gruin@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
f2a04904be
commit
d358fc286d
|
@ -71,7 +71,8 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags,
|
||||||
const char *head_hash = NULL;
|
const char *head_hash = NULL;
|
||||||
char *revisions = NULL, *shortrevisions = NULL;
|
char *revisions = NULL, *shortrevisions = NULL;
|
||||||
struct argv_array make_script_args = ARGV_ARRAY_INIT;
|
struct argv_array make_script_args = ARGV_ARRAY_INIT;
|
||||||
FILE *todo_list;
|
FILE *todo_list_file;
|
||||||
|
struct todo_list todo_list = TODO_LIST_INIT;
|
||||||
|
|
||||||
if (prepare_branch_to_be_rebased(opts, switch_to))
|
if (prepare_branch_to_be_rebased(opts, switch_to))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -93,8 +94,8 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags,
|
||||||
if (!upstream && squash_onto)
|
if (!upstream && squash_onto)
|
||||||
write_file(path_squash_onto(), "%s\n", squash_onto);
|
write_file(path_squash_onto(), "%s\n", squash_onto);
|
||||||
|
|
||||||
todo_list = fopen(rebase_path_todo(), "w");
|
todo_list_file = fopen(rebase_path_todo(), "w");
|
||||||
if (!todo_list) {
|
if (!todo_list_file) {
|
||||||
free(revisions);
|
free(revisions);
|
||||||
free(shortrevisions);
|
free(shortrevisions);
|
||||||
|
|
||||||
|
@ -105,10 +106,11 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags,
|
||||||
if (restrict_revision)
|
if (restrict_revision)
|
||||||
argv_array_push(&make_script_args, restrict_revision);
|
argv_array_push(&make_script_args, restrict_revision);
|
||||||
|
|
||||||
ret = sequencer_make_script(the_repository, todo_list,
|
ret = sequencer_make_script(the_repository, &todo_list.buf,
|
||||||
make_script_args.argc, make_script_args.argv,
|
make_script_args.argc, make_script_args.argv,
|
||||||
flags);
|
flags);
|
||||||
fclose(todo_list);
|
fputs(todo_list.buf.buf, todo_list_file);
|
||||||
|
fclose(todo_list_file);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
error(_("could not generate todo list"));
|
error(_("could not generate todo list"));
|
||||||
|
@ -121,6 +123,7 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags,
|
||||||
|
|
||||||
free(revisions);
|
free(revisions);
|
||||||
free(shortrevisions);
|
free(shortrevisions);
|
||||||
|
todo_list_release(&todo_list);
|
||||||
argv_array_clear(&make_script_args);
|
argv_array_clear(&make_script_args);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
35
sequencer.c
35
sequencer.c
|
@ -4215,7 +4215,7 @@ static const char *label_oid(struct object_id *oid, const char *label,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int make_script_with_merges(struct pretty_print_context *pp,
|
static int make_script_with_merges(struct pretty_print_context *pp,
|
||||||
struct rev_info *revs, FILE *out,
|
struct rev_info *revs, struct strbuf *out,
|
||||||
unsigned flags)
|
unsigned flags)
|
||||||
{
|
{
|
||||||
int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
|
int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
|
||||||
|
@ -4360,7 +4360,7 @@ static int make_script_with_merges(struct pretty_print_context *pp,
|
||||||
* gathering commits not yet shown, reversing the list on the fly,
|
* gathering commits not yet shown, reversing the list on the fly,
|
||||||
* then outputting that list (labeling revisions as needed).
|
* then outputting that list (labeling revisions as needed).
|
||||||
*/
|
*/
|
||||||
fprintf(out, "%s onto\n", cmd_label);
|
strbuf_addf(out, "%s onto\n", cmd_label);
|
||||||
for (iter = tips; iter; iter = iter->next) {
|
for (iter = tips; iter; iter = iter->next) {
|
||||||
struct commit_list *list = NULL, *iter2;
|
struct commit_list *list = NULL, *iter2;
|
||||||
|
|
||||||
|
@ -4370,9 +4370,9 @@ static int make_script_with_merges(struct pretty_print_context *pp,
|
||||||
entry = oidmap_get(&state.commit2label, &commit->object.oid);
|
entry = oidmap_get(&state.commit2label, &commit->object.oid);
|
||||||
|
|
||||||
if (entry)
|
if (entry)
|
||||||
fprintf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
|
strbuf_addf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
|
||||||
else
|
else
|
||||||
fprintf(out, "\n");
|
strbuf_addch(out, '\n');
|
||||||
|
|
||||||
while (oidset_contains(&interesting, &commit->object.oid) &&
|
while (oidset_contains(&interesting, &commit->object.oid) &&
|
||||||
!oidset_contains(&shown, &commit->object.oid)) {
|
!oidset_contains(&shown, &commit->object.oid)) {
|
||||||
|
@ -4385,7 +4385,7 @@ static int make_script_with_merges(struct pretty_print_context *pp,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!commit)
|
if (!commit)
|
||||||
fprintf(out, "%s %s\n", cmd_reset,
|
strbuf_addf(out, "%s %s\n", cmd_reset,
|
||||||
rebase_cousins ? "onto" : "[new root]");
|
rebase_cousins ? "onto" : "[new root]");
|
||||||
else {
|
else {
|
||||||
const char *to = NULL;
|
const char *to = NULL;
|
||||||
|
@ -4399,11 +4399,11 @@ static int make_script_with_merges(struct pretty_print_context *pp,
|
||||||
&state);
|
&state);
|
||||||
|
|
||||||
if (!to || !strcmp(to, "onto"))
|
if (!to || !strcmp(to, "onto"))
|
||||||
fprintf(out, "%s onto\n", cmd_reset);
|
strbuf_addf(out, "%s onto\n", cmd_reset);
|
||||||
else {
|
else {
|
||||||
strbuf_reset(&oneline);
|
strbuf_reset(&oneline);
|
||||||
pretty_print_commit(pp, commit, &oneline);
|
pretty_print_commit(pp, commit, &oneline);
|
||||||
fprintf(out, "%s %s # %s\n",
|
strbuf_addf(out, "%s %s # %s\n",
|
||||||
cmd_reset, to, oneline.buf);
|
cmd_reset, to, oneline.buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4413,10 +4413,10 @@ static int make_script_with_merges(struct pretty_print_context *pp,
|
||||||
entry = oidmap_get(&commit2todo, oid);
|
entry = oidmap_get(&commit2todo, oid);
|
||||||
/* only show if not already upstream */
|
/* only show if not already upstream */
|
||||||
if (entry)
|
if (entry)
|
||||||
fprintf(out, "%s\n", entry->string);
|
strbuf_addf(out, "%s\n", entry->string);
|
||||||
entry = oidmap_get(&state.commit2label, oid);
|
entry = oidmap_get(&state.commit2label, oid);
|
||||||
if (entry)
|
if (entry)
|
||||||
fprintf(out, "%s %s\n",
|
strbuf_addf(out, "%s %s\n",
|
||||||
cmd_label, entry->string);
|
cmd_label, entry->string);
|
||||||
oidset_insert(&shown, oid);
|
oidset_insert(&shown, oid);
|
||||||
}
|
}
|
||||||
|
@ -4439,13 +4439,11 @@ static int make_script_with_merges(struct pretty_print_context *pp,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sequencer_make_script(struct repository *r, FILE *out,
|
int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
|
||||||
int argc, const char **argv,
|
const char **argv, unsigned flags)
|
||||||
unsigned flags)
|
|
||||||
{
|
{
|
||||||
char *format = NULL;
|
char *format = NULL;
|
||||||
struct pretty_print_context pp = {0};
|
struct pretty_print_context pp = {0};
|
||||||
struct strbuf buf = STRBUF_INIT;
|
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
|
int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
|
||||||
|
@ -4488,16 +4486,13 @@ int sequencer_make_script(struct repository *r, FILE *out,
|
||||||
|
|
||||||
if (!is_empty && (commit->object.flags & PATCHSAME))
|
if (!is_empty && (commit->object.flags & PATCHSAME))
|
||||||
continue;
|
continue;
|
||||||
strbuf_reset(&buf);
|
|
||||||
if (!keep_empty && is_empty)
|
if (!keep_empty && is_empty)
|
||||||
strbuf_addf(&buf, "%c ", comment_line_char);
|
strbuf_addf(out, "%c ", comment_line_char);
|
||||||
strbuf_addf(&buf, "%s %s ", insn,
|
strbuf_addf(out, "%s %s ", insn,
|
||||||
oid_to_hex(&commit->object.oid));
|
oid_to_hex(&commit->object.oid));
|
||||||
pretty_print_commit(&pp, commit, &buf);
|
pretty_print_commit(&pp, commit, out);
|
||||||
strbuf_addch(&buf, '\n');
|
strbuf_addch(out, '\n');
|
||||||
fputs(buf.buf, out);
|
|
||||||
}
|
}
|
||||||
strbuf_release(&buf);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,9 +142,8 @@ int sequencer_remove_state(struct replay_opts *opts);
|
||||||
#define TODO_LIST_REBASE_COUSINS (1U << 4)
|
#define TODO_LIST_REBASE_COUSINS (1U << 4)
|
||||||
#define TODO_LIST_APPEND_TODO_HELP (1U << 5)
|
#define TODO_LIST_APPEND_TODO_HELP (1U << 5)
|
||||||
|
|
||||||
int sequencer_make_script(struct repository *r, FILE *out, int argc,
|
int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
|
||||||
const char **argv,
|
const char **argv, unsigned flags);
|
||||||
unsigned flags);
|
|
||||||
|
|
||||||
int sequencer_add_exec_commands(struct repository *r,
|
int sequencer_add_exec_commands(struct repository *r,
|
||||||
struct string_list *commands);
|
struct string_list *commands);
|
||||||
|
|
Loading…
Reference in New Issue