mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
replace strbuf_expand_dict_cb() with strbuf_expand_step()
Avoid the overhead of setting up a dictionary and passing it via strbuf_expand() to strbuf_expand_dict_cb() by using strbuf_expand_step() in a loop instead. It requires explicit handling of %% and unrecognized placeholders, but is more direct and simpler overall, and expands only on demand. Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
44ccb337f1
commit
39dbd49b41
22
convert.c
22
convert.c
@@ -633,23 +633,21 @@ static int filter_buffer_or_fd(int in UNUSED, int out, void *data)
|
||||
*/
|
||||
struct child_process child_process = CHILD_PROCESS_INIT;
|
||||
struct filter_params *params = (struct filter_params *)data;
|
||||
const char *format = params->cmd;
|
||||
int write_err, status;
|
||||
|
||||
/* apply % substitution to cmd */
|
||||
struct strbuf cmd = STRBUF_INIT;
|
||||
struct strbuf path = STRBUF_INIT;
|
||||
struct strbuf_expand_dict_entry dict[] = {
|
||||
{ "f", NULL, },
|
||||
{ NULL, NULL, },
|
||||
};
|
||||
|
||||
/* quote the path to preserve spaces, etc. */
|
||||
sq_quote_buf(&path, params->path);
|
||||
dict[0].value = path.buf;
|
||||
|
||||
/* expand all %f with the quoted path */
|
||||
strbuf_expand(&cmd, params->cmd, strbuf_expand_dict_cb, &dict);
|
||||
strbuf_release(&path);
|
||||
/* expand all %f with the quoted path; quote to preserve space, etc. */
|
||||
while (strbuf_expand_step(&cmd, &format)) {
|
||||
if (skip_prefix(format, "%", &format))
|
||||
strbuf_addch(&cmd, '%');
|
||||
else if (skip_prefix(format, "f", &format))
|
||||
sq_quote_buf(&cmd, params->path);
|
||||
else
|
||||
strbuf_addch(&cmd, '%');
|
||||
}
|
||||
|
||||
strvec_push(&child_process.args, cmd.buf);
|
||||
child_process.use_shell = 1;
|
||||
|
||||
Reference in New Issue
Block a user