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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html