зеркало из https://github.com/microsoft/git.git
sequencer: make the todo_list structure public
This makes the structures todo_list and todo_item, and the functions todo_list_release() and parse_insn_buffer(), accessible outside of sequencer.c. Signed-off-by: Alban Gruin <alban.gruin@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
2b71595d47
Коммит
5d94d54564
69
sequencer.c
69
sequencer.c
|
@ -1510,32 +1510,6 @@ static int allow_empty(struct repository *r,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that ordering matters in this enum. Not only must it match the mapping
|
||||
* below, it is also divided into several sections that matter. When adding
|
||||
* new commands, make sure you add it in the right section.
|
||||
*/
|
||||
enum todo_command {
|
||||
/* commands that handle commits */
|
||||
TODO_PICK = 0,
|
||||
TODO_REVERT,
|
||||
TODO_EDIT,
|
||||
TODO_REWORD,
|
||||
TODO_FIXUP,
|
||||
TODO_SQUASH,
|
||||
/* commands that do something else than handling a single commit */
|
||||
TODO_EXEC,
|
||||
TODO_BREAK,
|
||||
TODO_LABEL,
|
||||
TODO_RESET,
|
||||
TODO_MERGE,
|
||||
/* commands that do nothing but are counted for reporting progress */
|
||||
TODO_NOOP,
|
||||
TODO_DROP,
|
||||
/* comments (not counted for reporting progress) */
|
||||
TODO_COMMENT
|
||||
};
|
||||
|
||||
static struct {
|
||||
char c;
|
||||
const char *str;
|
||||
|
@ -2012,26 +1986,7 @@ enum todo_item_flags {
|
|||
TODO_EDIT_MERGE_MSG = 1
|
||||
};
|
||||
|
||||
struct todo_item {
|
||||
enum todo_command command;
|
||||
struct commit *commit;
|
||||
unsigned int flags;
|
||||
const char *arg;
|
||||
int arg_len;
|
||||
size_t offset_in_buf;
|
||||
};
|
||||
|
||||
struct todo_list {
|
||||
struct strbuf buf;
|
||||
struct todo_item *items;
|
||||
int nr, alloc, current;
|
||||
int done_nr, total_nr;
|
||||
struct stat_data stat;
|
||||
};
|
||||
|
||||
#define TODO_LIST_INIT { STRBUF_INIT }
|
||||
|
||||
static void todo_list_release(struct todo_list *todo_list)
|
||||
void todo_list_release(struct todo_list *todo_list)
|
||||
{
|
||||
strbuf_release(&todo_list->buf);
|
||||
FREE_AND_NULL(todo_list->items);
|
||||
|
@ -2134,8 +2089,8 @@ static int parse_insn_line(struct repository *r, struct todo_item *item,
|
|||
return !item->commit;
|
||||
}
|
||||
|
||||
static int parse_insn_buffer(struct repository *r, char *buf,
|
||||
struct todo_list *todo_list)
|
||||
int todo_list_parse_insn_buffer(struct repository *r, char *buf,
|
||||
struct todo_list *todo_list)
|
||||
{
|
||||
struct todo_item *item;
|
||||
char *p = buf, *next_p;
|
||||
|
@ -2234,7 +2189,7 @@ static int read_populate_todo(struct repository *r,
|
|||
return error(_("could not stat '%s'"), todo_file);
|
||||
fill_stat_data(&todo_list->stat, &st);
|
||||
|
||||
res = parse_insn_buffer(r, todo_list->buf.buf, todo_list);
|
||||
res = todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
|
||||
if (res) {
|
||||
if (is_rebase_i(opts))
|
||||
return error(_("please fix this using "
|
||||
|
@ -2265,7 +2220,7 @@ static int read_populate_todo(struct repository *r,
|
|||
FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
|
||||
|
||||
if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
|
||||
!parse_insn_buffer(r, done.buf.buf, &done))
|
||||
!todo_list_parse_insn_buffer(r, done.buf.buf, &done))
|
||||
todo_list->done_nr = count_commands(&done);
|
||||
else
|
||||
todo_list->done_nr = 0;
|
||||
|
@ -4556,7 +4511,7 @@ int sequencer_add_exec_commands(struct repository *r,
|
|||
if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
|
||||
return error(_("could not read '%s'."), todo_file);
|
||||
|
||||
if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
|
||||
if (todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
|
||||
todo_list_release(&todo_list);
|
||||
return error(_("unusable todo list: '%s'"), todo_file);
|
||||
}
|
||||
|
@ -4612,7 +4567,7 @@ int transform_todos(struct repository *r, unsigned flags)
|
|||
if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
|
||||
return error(_("could not read '%s'."), todo_file);
|
||||
|
||||
if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
|
||||
if (todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
|
||||
todo_list_release(&todo_list);
|
||||
return error(_("unusable todo list: '%s'"), todo_file);
|
||||
}
|
||||
|
@ -4698,7 +4653,7 @@ int check_todo_list(struct repository *r)
|
|||
goto leave_check;
|
||||
}
|
||||
advise_to_edit_todo = res =
|
||||
parse_insn_buffer(r, todo_list.buf.buf, &todo_list);
|
||||
todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list);
|
||||
|
||||
if (res || check_level == MISSING_COMMIT_CHECK_IGNORE)
|
||||
goto leave_check;
|
||||
|
@ -4717,7 +4672,7 @@ int check_todo_list(struct repository *r)
|
|||
goto leave_check;
|
||||
}
|
||||
strbuf_release(&todo_file);
|
||||
res = !!parse_insn_buffer(r, todo_list.buf.buf, &todo_list);
|
||||
res = !!todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list);
|
||||
|
||||
/* Find commits in git-rebase-todo.backup yet unseen */
|
||||
for (i = todo_list.nr - 1; i >= 0; i--) {
|
||||
|
@ -4799,7 +4754,7 @@ static int skip_unnecessary_picks(struct repository *r, struct object_id *output
|
|||
|
||||
if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
|
||||
return -1;
|
||||
if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list) < 0) {
|
||||
if (todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list) < 0) {
|
||||
todo_list_release(&todo_list);
|
||||
return -1;
|
||||
}
|
||||
|
@ -4887,7 +4842,7 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla
|
|||
if (strbuf_read_file(buf, todo_file, 0) < 0)
|
||||
return error_errno(_("could not read '%s'."), todo_file);
|
||||
|
||||
if (parse_insn_buffer(r, buf->buf, &todo_list)) {
|
||||
if (todo_list_parse_insn_buffer(r, buf->buf, &todo_list)) {
|
||||
todo_list_release(&todo_list);
|
||||
return error(_("unusable todo list: '%s'"), todo_file);
|
||||
}
|
||||
|
@ -4995,7 +4950,7 @@ int rearrange_squash(struct repository *r)
|
|||
|
||||
if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
|
||||
return -1;
|
||||
if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list) < 0) {
|
||||
if (todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list) < 0) {
|
||||
todo_list_release(&todo_list);
|
||||
return -1;
|
||||
}
|
||||
|
|
50
sequencer.h
50
sequencer.h
|
@ -73,6 +73,56 @@ enum missing_commit_check_level {
|
|||
int write_message(const void *buf, size_t len, const char *filename,
|
||||
int append_eol);
|
||||
|
||||
/*
|
||||
* Note that ordering matters in this enum. Not only must it match the mapping
|
||||
* of todo_command_info (in sequencer.c), it is also divided into several
|
||||
* sections that matter. When adding new commands, make sure you add it in the
|
||||
* right section.
|
||||
*/
|
||||
enum todo_command {
|
||||
/* commands that handle commits */
|
||||
TODO_PICK = 0,
|
||||
TODO_REVERT,
|
||||
TODO_EDIT,
|
||||
TODO_REWORD,
|
||||
TODO_FIXUP,
|
||||
TODO_SQUASH,
|
||||
/* commands that do something else than handling a single commit */
|
||||
TODO_EXEC,
|
||||
TODO_BREAK,
|
||||
TODO_LABEL,
|
||||
TODO_RESET,
|
||||
TODO_MERGE,
|
||||
/* commands that do nothing but are counted for reporting progress */
|
||||
TODO_NOOP,
|
||||
TODO_DROP,
|
||||
/* comments (not counted for reporting progress) */
|
||||
TODO_COMMENT
|
||||
};
|
||||
|
||||
struct todo_item {
|
||||
enum todo_command command;
|
||||
struct commit *commit;
|
||||
unsigned int flags;
|
||||
const char *arg;
|
||||
int arg_len;
|
||||
size_t offset_in_buf;
|
||||
};
|
||||
|
||||
struct todo_list {
|
||||
struct strbuf buf;
|
||||
struct todo_item *items;
|
||||
int nr, alloc, current;
|
||||
int done_nr, total_nr;
|
||||
struct stat_data stat;
|
||||
};
|
||||
|
||||
#define TODO_LIST_INIT { STRBUF_INIT }
|
||||
|
||||
int todo_list_parse_insn_buffer(struct repository *r, char *buf,
|
||||
struct todo_list *todo_list);
|
||||
void todo_list_release(struct todo_list *todo_list);
|
||||
|
||||
/* Call this to setup defaults before parsing command line options */
|
||||
void sequencer_init_config(struct replay_opts *opts);
|
||||
int sequencer_pick_revisions(struct repository *repo,
|
||||
|
|
Загрузка…
Ссылка в новой задаче