Thread (64 messages) flat view 64 messages, 2 authors, 2016-06-15

Re: [PATCH 5/6] revert: report fine-grained error messages from insn parser

From: Ramkumar Ramachandra <hidden>
Date: 2016-06-15 22:52:44

Hi,

Jonathan Nieder wrote:
Ramkumar Ramachandra wrote:
quoted
Three kinds of errors can arise from parsing '.git/sequencer/todo':
1. Unrecognized action
2. Malformed object name
3. Object name does not refer to a valid commit

Since we would like to make the instruction sheet user-editable in the
future (much like the 'rebase -i' sheet), report more fine-grained
parse errors prefixed with the filename and line number.
Seems like a sensible idea.  In other words,
[...]
Thanks for the new wording.
[...]
quoted
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -714,26 +714,29 @@ static int format_todo(struct strbuf *buf, struct replay_insn_list *todo_list)
      return 0;
 }

-static int parse_insn_line(char *bol, char *eol, struct replay_insn_list *item)
+static int parse_insn_line(char *bol, char *eol,
+                     struct replay_insn_list *item, int lineno)
 {
+     const char *todo_file = git_path(SEQ_TODO_FILE);
This idiom is _still_ scary.  I don't want to have to shout about
this, but why didn't the commit message at least acknowledge it to put
the reader's mind at ease when this has come up again and again?
Carried over from the previous re-roll; sorry I didn't pay enough attention.
[...]
quoted
+             bol += strlen("revert ");
+     } else {
+             error_len = eol - bol > 255 ? 255 : eol - bol;
+             return error(_("%s:%d: Unrecognized action: %.*s"),
+                     todo_file, lineno, (int)error_len, bol);
Ah, so my example above was wrong: the actual message is

       error: .git/sequencer/todo:5: Unrecognized action: the quick bro
       wn fox jumps over the lazy dog

I guess that's fine.  Is it intended?
quoted
+     }

      /* Eat up extra spaces/ tabs before object name */
-     padding = strspn(bol, " \t");
-     if (!padding)
-             return -1;
-     bol += padding;
+     bol += strspn(bol, " \t");
What does this have to do with the stated goal of the patch?  It seems
to me that an unrelated and unadvertised bugfix snuck in.
Not a bugfix: since I have to report sensible error messages now, I
changed the "pick" and "revert" checks to "pick " || "pick\t" and
"revert " || "revert\t" -- then, I can report "invalid action" if it
doesn't match instead of a useless "missing space after action".
[...]
By the way, this is gross.  Probably get_sha1 should grow a variant
that takes a buffer and a length.
Yes; will do.
[...]
quoted
      item->operand = lookup_commit_reference(commit_sha1);
-     if (!item->operand)
-             return -1;
+     if (!item->operand) {
+             error_len = eol - bol > 255 ? 255 : eol - bol;
+             return error(_("%s:%d: Not a valid commit: %.*s"),
+                     todo_file, lineno, (int)error_len, bol);
+     }
Hmm, this one can be emitted even when there was no corruption or
internal error, because the user removed a commit she was
cherry-picking and the gc-ed before a "git cherry-pick --continue".
Alternatively, it can happen because the repository has grown very
crowded and what used to be an unambiguous commit name no longer is
one (not enough digits).  Will the error message be intuitive in these
situations?
Something like "Unable to look up commit: %s" perhaps?
[...]
quoted
@@ -761,8 +770,8 @@ static int parse_insn_buffer(char *buf, struct replay_insn_list **todo_list)
      for (i = 1; *p; i++) {
              char *eol = strchrnul(p, '\n');
-             if (parse_insn_line(p, eol, &item) < 0)
-                     return error(_("Could not parse line %d."), i);
+             if (parse_insn_line(p, eol, &item, i) < 0)
+                     return -1;
Not related to this patch, but why the "< 0" test?  It makes this
reader worry that there is some unusual return value convention that
he should be taking into account.
Right.  Will fix.

Thanks.

-- Ram
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help