Re: [PATCH v3 2/4] cat-file: introduce the --filters option
From: Junio C Hamano <hidden>
Date: 2016-09-09 17:16:49
Junio C Hamano [off-list ref] writes:
Johannes Schindelin [off-list ref] writes:quoted
quoted
quoted
+ if (type != OBJ_BLOB) { + free(*buf); + return error(_("blob expected for %s '%s'"), + sha1_to_hex(sha1), path); + } + if (S_ISREG(mode)) { + struct strbuf strbuf = STRBUF_INIT; + if (convert_to_working_tree(path, *buf, *size, &strbuf)) { + free(*buf); + *size = strbuf.len; + *buf = strbuf_detach(&strbuf, NULL); + } + }This needs to error out when mode is not ISREG just like it errors out when type is not BLOB.Are you sure that this is desirable in batch mode?I do not quite see a reason why we should not diagnose a bad input that does not produce a filtered result. In batch mode or not, it diagnoses when the user feeds it a non-blob, and I think it should do so for non-regular, too. Both are "you asked me to filter, but you shouldn't have".
Stepping back a bit, I can also see a use case that would be helped if this filter_object() function by default gives the contents of the requested object as-is, unless the object is a regular blob with a path for which filtering is defined. Driving such a mechanism via the batch interface will allow you to first ask about the top-level tree object (given back to you as-is), and you can iterate over its entries recursively and get the blobs to be placed in a new working directory (i.e. "git archive" piped to "tar xf" but regular files are passed thru convert_to_working_tree()). In such an application, after you learn the mode from the containing tree object and know that RelNotes is a symbolic link blob, you still would want the contents out of the pipe going to the same batch interface process that is not filtered. So I would not mind if we define the semantics of "--filters" as such (as long as it is clearly documented, of course). AFAICS, the batch interface does not call filter_object() for non-blobs, and by returning successfully without doing anything special for a symbolic link from filter_object() automatically gives us the "by default return as-is, but give processed output only for regular file blobs" semantics to the batch mode. But for a non-batch mode, it feels somewhat funny to be giving the as-is output without saying anything to symbolic links; we can argue that it is being consistent with what we do in the batch mode, though. Thanks.