On Wed, Oct 05, 2016 at 08:47:29PM +0200, René Scharfe wrote: > > Instead, let's provide a strbuf helper that does an in-place > > normalize, but restores the original contents on error. This > > uses a second buffer under the hood, which is slightly less > > efficient, but this is not a performance-critical code path. > > Hmm, in-place functions are quite rare in the strbuf collection. It looks > like a good fit for the two callers and makes sense in general, though. Yeah, I almost wrote "strbuf_add_normalized_path()" instead. But then the callers end up having to do the allocate-and-swap thing themselves. And I think we're still set in the future to add that if somebody wants it (and we can then implement the in-place version in terms of it). Another alternative is to observe that the strbuf is generally used in the first place to make the path absolute. So another interface is perhaps something like: strbuf_add_path(struct strbuf *sb, const char *path, const char *relative_base) { struct strbuf scratch = STRBUF_INIT; int ret; if (is_absolute_path(path)) strbuf_grow(sb, strlen(path)); else { if (relative_path) strbuf_addstr(&scratch, path); else { if (strbuf_getcwd(&scratch)) return -1; } strbuf_addch(&scratch, '/'); strbuf_addstr(&scratch, path); strbuf_grow(sb, scratch.len); path = scratch.buf; } ret = normalize_path_copy(sb.buf + sb.len, path); strbuf_release(&scratch); return ret; } I don't think its worth the complexity of interface for the spots in this series, but maybe there are other places that could use it. I'll leave that to somebody else to explore if the ywant to. -Peff