Browse Source

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
Alban Gruin 6 years ago committed by Junio C Hamano
parent
commit
d358fc286d
  1. 13
      builtin/rebase--interactive.c
  2. 41
      sequencer.c
  3. 5
      sequencer.h

13
builtin/rebase--interactive.c

@ -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;

41
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,8 +4385,8 @@ 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,12 +4399,12 @@ 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,11 +4413,11 @@ 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;
} }



5
sequencer.h

@ -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…
Cancel
Save