convert: split start_multi_file_filter() into two separate functions
To enable future reuse of the filter.<driver>.process infrastructure, split start_multi_file_filter() into two separate parts. start_multi_file_filter() will now only contain the generic logic to manage the creation and tracking of the child process in a hashmap. start_multi_file_filter_fn() is a protocol specific initialization function that will negotiate the multi-file-filter interface version and capabilities. Signed-off-by: Ben Peart <benpeart@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
7e936842f5
commit
a810ea9945
58
convert.c
58
convert.c
@ -565,35 +565,14 @@ static void stop_multi_file_filter(struct child_process *process)
|
|||||||
finish_command(process);
|
finish_command(process);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd)
|
static int start_multi_file_filter_fn(struct cmd2process *entry)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
struct cmd2process *entry;
|
|
||||||
struct child_process *process;
|
|
||||||
const char *argv[] = { cmd, NULL };
|
|
||||||
struct string_list cap_list = STRING_LIST_INIT_NODUP;
|
struct string_list cap_list = STRING_LIST_INIT_NODUP;
|
||||||
char *cap_buf;
|
char *cap_buf;
|
||||||
const char *cap_name;
|
const char *cap_name;
|
||||||
|
struct child_process *process = &entry->process;
|
||||||
entry = xmalloc(sizeof(*entry));
|
const char *cmd = entry->cmd;
|
||||||
entry->cmd = cmd;
|
|
||||||
entry->supported_capabilities = 0;
|
|
||||||
process = &entry->process;
|
|
||||||
|
|
||||||
child_process_init(process);
|
|
||||||
process->argv = argv;
|
|
||||||
process->use_shell = 1;
|
|
||||||
process->in = -1;
|
|
||||||
process->out = -1;
|
|
||||||
process->clean_on_exit = 1;
|
|
||||||
process->clean_on_exit_handler = stop_multi_file_filter;
|
|
||||||
|
|
||||||
if (start_command(process)) {
|
|
||||||
error("cannot fork to run external filter '%s'", cmd);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
hashmap_entry_init(entry, strhash(cmd));
|
|
||||||
|
|
||||||
sigchain_push(SIGPIPE, SIG_IGN);
|
sigchain_push(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
@ -642,6 +621,37 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons
|
|||||||
done:
|
done:
|
||||||
sigchain_pop(SIGPIPE);
|
sigchain_pop(SIGPIPE);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
struct cmd2process *entry;
|
||||||
|
struct child_process *process;
|
||||||
|
const char *argv[] = { cmd, NULL };
|
||||||
|
|
||||||
|
entry = xmalloc(sizeof(*entry));
|
||||||
|
entry->cmd = cmd;
|
||||||
|
entry->supported_capabilities = 0;
|
||||||
|
process = &entry->process;
|
||||||
|
|
||||||
|
child_process_init(process);
|
||||||
|
process->argv = argv;
|
||||||
|
process->use_shell = 1;
|
||||||
|
process->in = -1;
|
||||||
|
process->out = -1;
|
||||||
|
process->clean_on_exit = 1;
|
||||||
|
process->clean_on_exit_handler = stop_multi_file_filter;
|
||||||
|
|
||||||
|
if (start_command(process)) {
|
||||||
|
error("cannot fork to run external filter '%s'", cmd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hashmap_entry_init(entry, strhash(cmd));
|
||||||
|
|
||||||
|
err = start_multi_file_filter_fn(entry);
|
||||||
if (err) {
|
if (err) {
|
||||||
error("initialization for external filter '%s' failed", cmd);
|
error("initialization for external filter '%s' failed", cmd);
|
||||||
kill_multi_file_filter(hashmap, entry);
|
kill_multi_file_filter(hashmap, entry);
|
||||||
|
Reference in New Issue
Block a user