On Tue, Oct 24, 2017 at 2:53 PM, Jeff Hostetler <git@xxxxxxxxxxxxxxxxx> wrote: > Refactor add_excludes() to separate the reading of the > exclude file into a buffer and the parsing of the buffer > into exclude_list items. > > Add add_excludes_from_blob_to_list() to allow an exclude > file be specified with an OID. > > Signed-off-by: Jeff Hostetler <jeffhost@xxxxxxxxxxxxx> > --- > diff --git a/dir.c b/dir.c > @@ -841,6 +856,38 @@ int add_excludes_from_file_to_list(const char *fname, const char *base, > +int add_excludes_from_blob_to_list( > + struct object_id *oid, > + const char *base, int baselen, > + struct exclude_list *el) > +{ > + char *buf; > + unsigned long size; > + enum object_type type; > + > + buf = read_sha1_file(oid->hash, &type, &size); > + if (!buf) > + return -1; > + > + if (type != OBJ_BLOB) { > + free(buf); > + return -1; > + } > + > + if (size == 0) { > + free(buf); > + return 0; > + } > + > + if (buf[size - 1] != '\n') { > + buf = xrealloc(buf, st_add(size, 1)); > + buf[size++] = '\n'; > + } > + > + add_excludes_from_buffer(buf, size, base, baselen, el); Seeing all the free()'s above, at first glance, one wonders why 'buf' isn't freed here after add_excludes_from_buffer(), however an examination of that function shows that 'buf' is assigned to el->filebuf and later freed by clear_exclude_list(). Okay. > + return 0; Should this be returning the result of add_excludes_from_buffer() rather than unconditionally returning 0? > +}