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:
commit
0998b648d6
22
sequencer.c
22
sequencer.c
@ -1200,6 +1200,7 @@ struct todo_list {
|
|||||||
struct todo_item *items;
|
struct todo_item *items;
|
||||||
int nr, alloc, current;
|
int nr, alloc, current;
|
||||||
int done_nr, total_nr;
|
int done_nr, total_nr;
|
||||||
|
struct stat_data stat;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TODO_LIST_INIT { STRBUF_INIT }
|
#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,
|
static int read_populate_todo(struct todo_list *todo_list,
|
||||||
struct replay_opts *opts)
|
struct replay_opts *opts)
|
||||||
{
|
{
|
||||||
|
struct stat st;
|
||||||
const char *todo_file = get_todo_path(opts);
|
const char *todo_file = get_todo_path(opts);
|
||||||
int fd, res;
|
int fd, res;
|
||||||
|
|
||||||
@ -1343,6 +1345,11 @@ static int read_populate_todo(struct todo_list *todo_list,
|
|||||||
}
|
}
|
||||||
close(fd);
|
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);
|
res = parse_insn_buffer(todo_list->buf.buf, todo_list);
|
||||||
if (res) {
|
if (res) {
|
||||||
if (is_rebase_i(opts))
|
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) {
|
} else if (item->command == TODO_EXEC) {
|
||||||
char *end_of_arg = (char *)(item->arg + item->arg_len);
|
char *end_of_arg = (char *)(item->arg + item->arg_len);
|
||||||
int saved = *end_of_arg;
|
int saved = *end_of_arg;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
*end_of_arg = '\0';
|
*end_of_arg = '\0';
|
||||||
res = do_exec(item->arg);
|
res = do_exec(item->arg);
|
||||||
*end_of_arg = saved;
|
*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))
|
} else if (!is_noop(item->command))
|
||||||
return error(_("unknown command %d"), item->command);
|
return error(_("unknown command %d"), item->command);
|
||||||
|
|
||||||
|
14
t/t3429-rebase-edit-todo.sh
Executable file
14
t/t3429-rebase-edit-todo.sh
Executable file
@ -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
|
Loading…
Reference in New Issue
Block a user