Hi Junio, On Wed, 26 Apr 2017, Junio C Hamano wrote: > Johannes Schindelin <johannes.schindelin@xxxxxx> writes: > > > diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh > > index 214af0372ba..52a19e0bdb3 100644 > > --- a/git-rebase--interactive.sh > > +++ b/git-rebase--interactive.sh > > @@ -774,11 +774,11 @@ transform_todo_ids () { > > } > > > > expand_todo_ids() { > > - transform_todo_ids > > + git rebase--helper --expand-sha1s > > } > > > > collapse_todo_ids() { > > - transform_todo_ids --short > > + git rebase--helper --shorten-sha1s > > } > > Obviously correct ;-) But doesn't this make transform_todo_ids () > helper unused and removable? But of course it is now unused! Will fix. > > +int transform_todo_ids(int shorten_sha1s) > > +{ > > + const char *todo_file = rebase_path_todo(); > > + struct todo_list todo_list = TODO_LIST_INIT; > > + int fd, res, i; > > + FILE *out; > > + > > + strbuf_reset(&todo_list.buf); > > + fd = open(todo_file, O_RDONLY); > > + if (fd < 0) > > + return error_errno(_("could not open '%s'"), todo_file); > > + if (strbuf_read(&todo_list.buf, fd, 0) < 0) { > > + close(fd); > > + return error(_("could not read '%s'."), todo_file); > > + } > > + close(fd); > > + > > + res = parse_insn_buffer(todo_list.buf.buf, &todo_list); > > + if (res) { > > + todo_list_release(&todo_list); > > + return error(_("unusable instruction sheet: '%s'"), todo_file); > > + } > > + > > + out = fopen(todo_file, "w"); > > The usual "open lockfile, write to it and then rename" dance is not > necessary for the purpose of preventing other people from reading > this file while we are writing to it. But if we fail inside this > function before we fclose(3) "out", the user will lose the todo > list. It probably is not a big deal, though. I guess you're right. It is bug-for-bug equivalent to the previous shell function, though. > > + if (!out) { > > + todo_list_release(&todo_list); > > + return error(_("unable to open '%s' for writing"), todo_file); > > + } > > + for (i = 0; i < todo_list.nr; i++) { > > + struct todo_item *item = todo_list.items + i; > > + int bol = item->offset_in_buf; > > + const char *p = todo_list.buf.buf + bol; > > + int eol = i + 1 < todo_list.nr ? > > + todo_list.items[i + 1].offset_in_buf : > > + todo_list.buf.len; > > + > > + if (item->command >= TODO_EXEC && item->command != TODO_DROP) > > + fwrite(p, eol - bol, 1, out); > > + else { > > + int eoc = strcspn(p, " \t"); > > + const char *sha1 = shorten_sha1s ? > > + short_commit_name(item->commit) : > > + oid_to_hex(&item->commit->object.oid); > > + > > + if (!eoc) { > > + p += strspn(p, " \t"); > > + eoc = strcspn(p, " \t"); > > + } > > It would be much easier to follow the logic if "int eoc" above were > a mere declaration without initialization and "skip to the > whitespaces" is done immediately before this if() statement. It's > not like the initialized value of eoc is needed there because it > participates in the computation of sha1, and also having the > assignment followed by "oops, the line begins with a whitespace" > recovery that is done here. > > Wouldn't it be simpler to do: > > else { > int eoc; > const char *sha1 = ... > p += strspn(p, " \t"); /* skip optional indent */ > eoc = strcspn(p, " \t"); /* grab the command word */ > > without conditional? Sure, will fix. Ciao, Dscho