On Fri, Aug 09, 2019 at 11:25:52AM +0000, brian m. carlson wrote: > > > + if (!flush_attributes && patch->new_name) { > > > + char *dummy = strip_path_suffix(patch->new_name, GITATTRIBUTES_FILE); > > > > It's a shame that 'strip_path_suffix' doesn't take a 'char *out', and > > accept NULL for that (which would save us the assignment and subsequent > > 'free'). In either case, this is certainly the appropriate function. > > Yeah, I felt the same way. We could refactor this out into two separate > functions, one which returns an ssize_t and one which actually > allocates, but I'm not sure it makes a huge amount of sense with just > one caller. The allocation is relatively small, and I've tried to make > sure it's called exactly once per patch so as not to be wasteful and > inefficient. I think you could do this with: size_t len; if (strip_suffix(patch->new_name, GITATTRIBUTES_FILE, &len) && len > 0 && is_dir_sep(patch->new_name[len-1])) flush_attributes = 1; Not sure if that is better or worse. It avoids the extra memory boilerplate, but the logic is a slightly more subtle. -Peff