Hi, On Fri, 27 Dec 2013, Jonathan Nieder wrote: > Johannes Schindelin wrote: > > [...] > > --- > > builtin/blame.c | 8 ++++---- > > commit.c | 10 +++++----- > > 2 files changed, 9 insertions(+), 9 deletions(-) > > Is this easy to reproduce so some interested but lazy person could > write a test? Yep. Make 25 orphan commits, add a graft line to make the first a merge of the rest. > > --- a/builtin/blame.c > > +++ b/builtin/blame.c > > @@ -1804,17 +1804,17 @@ static int prepare_lines(struct scoreboard *sb) > > static int read_ancestry(const char *graft_file) > > { > > FILE *fp = fopen(graft_file, "r"); > > - char buf[1024]; > > + struct strbuf buf = STRBUF_INIT; > > if (!fp) > > return -1; > > - while (fgets(buf, sizeof(buf), fp)) { > > + while (!strbuf_getwholeline(&buf, fp, '\n')) { > > If there is no newline at EOF, this will skip the last line, while the > old behavior was to pay attention to it. I haven't thought through > whether that's a good or bad change. Maybe it should just be > documented? The way I read int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term) { int ch; if (feof(fp)) return EOF; strbuf_reset(sb); while ((ch = fgetc(fp)) != EOF) { strbuf_grow(sb, 1); sb->buf[sb->len++] = ch; if (ch == term) break; } if (ch == EOF && sb->len == 0) return EOF; sb->buf[sb->len] = '\0'; return 0; } it returns EOF only if ch == EOF *and* sb->len == 0, i.e. if no characters have been read before hitting EOF. In other words, strbuf_getwholeline() -- despite requiring an explicit terminating character argument -- does not require the last line to end with that terminating character. A quick test (in my case, because I am lazy, modifying test-mergesort.c to output the lines that were read by strbuf_getwholeline()) also confirms my suspicion. Or maybe I missed something? Ciao, Dscho -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html