return 0;
}
+bool sequencer_parse_todo_command(const char **p, enum todo_command *cmd)
+{
+ const char *s = *p;
+
+ for (int i = 0; i < TODO_COMMENT; i++)
+ if (is_command(i, p)) {
+ *cmd = i;
+ return true;
+ }
+
+ if (starts_with(s, comment_line_str)) {
+ *cmd = TODO_COMMENT;
+ return true;
+ } else if (s[0] == '\n' || (s[0] == '\r' && s[1] == '\n') || !s[0]) {
+ *cmd = TODO_COMMENT;
+ return true;
+ }
+
+ return false;
+}
+
static int check_label_or_ref_arg(enum todo_command command, const char *arg)
{
switch (command) {
{
struct object_id commit_oid;
char *end_of_object_name;
- int i, saved, status, padding;
+ int saved, status, padding;
item->flags = 0;
/* left-trim */
bol += strspn(bol, " \t");
- if (bol == eol || *bol == '\r' || starts_with_mem(bol, eol - bol, comment_line_str)) {
- item->command = TODO_COMMENT;
+ if (!sequencer_parse_todo_command(&bol, &item->command))
+ return error(_("invalid command '%.*s'"),
+ (int)strcspn(bol, " \t\r\n"), bol);
+
+ if (item->command == TODO_COMMENT) {
item->commit = NULL;
item->arg_offset = bol - buf;
item->arg_len = eol - bol;
return 0;
}
- for (i = 0; i < TODO_COMMENT; i++)
- if (is_command(i, &bol)) {
- item->command = i;
- break;
- }
- if (i >= TODO_COMMENT)
- return error(_("invalid command '%.*s'"),
- (int)strcspn(bol, " \t\r\n"), bol);
-
/* Eat up extra spaces/ tabs before object name */
padding = strspn(bol, " \t");
bol += padding;
int write_basic_state(struct replay_opts *opts, const char *head_name,
struct commit *onto, const struct object_id *orig_head);
void sequencer_post_commit_cleanup(struct repository *r, int verbose);
+
+/*
+ * Try to parse the todo command pointed to by *p. On success sets cmd,
+ * advances p and returns true. On failure returns false, leaves p and
+ * cmd unchanged.
+ */
+bool sequencer_parse_todo_command(const char **p, enum todo_command *cmd);
+
int sequencer_get_last_command(struct repository* r,
enum replay_action *action);
int sequencer_determine_whence(struct repository *r, enum commit_whence *whence);