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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to