зеркало из https://github.com/microsoft/git.git
Merge branch 'sh/rebase-i-reread-todo-after-exec'
"git rebase -i" failed to re-read the todo list file when the command specified with the `exec` instruction updated it. * sh/rebase-i-reread-todo-after-exec: rebase -i: reread the todo list if `exec` touched it
This commit is contained in:
Коммит
0998b648d6
22
sequencer.c
22
sequencer.c
|
@ -1200,6 +1200,7 @@ struct todo_list {
|
|||
struct todo_item *items;
|
||||
int nr, alloc, current;
|
||||
int done_nr, total_nr;
|
||||
struct stat_data stat;
|
||||
};
|
||||
|
||||
#define TODO_LIST_INIT { STRBUF_INIT }
|
||||
|
@ -1330,6 +1331,7 @@ static int count_commands(struct todo_list *todo_list)
|
|||
static int read_populate_todo(struct todo_list *todo_list,
|
||||
struct replay_opts *opts)
|
||||
{
|
||||
struct stat st;
|
||||
const char *todo_file = get_todo_path(opts);
|
||||
int fd, res;
|
||||
|
||||
|
@ -1343,6 +1345,11 @@ static int read_populate_todo(struct todo_list *todo_list,
|
|||
}
|
||||
close(fd);
|
||||
|
||||
res = stat(todo_file, &st);
|
||||
if (res)
|
||||
return error(_("could not stat '%s'"), todo_file);
|
||||
fill_stat_data(&todo_list->stat, &st);
|
||||
|
||||
res = parse_insn_buffer(todo_list->buf.buf, todo_list);
|
||||
if (res) {
|
||||
if (is_rebase_i(opts))
|
||||
|
@ -2028,10 +2035,25 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
|
|||
} else if (item->command == TODO_EXEC) {
|
||||
char *end_of_arg = (char *)(item->arg + item->arg_len);
|
||||
int saved = *end_of_arg;
|
||||
struct stat st;
|
||||
|
||||
*end_of_arg = '\0';
|
||||
res = do_exec(item->arg);
|
||||
*end_of_arg = saved;
|
||||
|
||||
/* Reread the todo file if it has changed. */
|
||||
if (res)
|
||||
; /* fall through */
|
||||
else if (stat(get_todo_path(opts), &st))
|
||||
res = error_errno(_("could not stat '%s'"),
|
||||
get_todo_path(opts));
|
||||
else if (match_stat_data(&todo_list->stat, &st)) {
|
||||
todo_list_release(todo_list);
|
||||
if (read_populate_todo(todo_list, opts))
|
||||
res = -1; /* message was printed */
|
||||
/* `current` will be incremented below */
|
||||
todo_list->current = -1;
|
||||
}
|
||||
} else if (!is_noop(item->command))
|
||||
return error(_("unknown command %d"), item->command);
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/sh
|
||||
|
||||
test_description='rebase should reread the todo file if an exec modifies it'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'rebase exec modifies rebase-todo' '
|
||||
test_commit initial &&
|
||||
todo=.git/rebase-merge/git-rebase-todo &&
|
||||
git rebase HEAD -x "echo exec touch F >>$todo" &&
|
||||
test -e F
|
||||
'
|
||||
|
||||
test_done
|
Загрузка…
Ссылка в новой задаче