Browse Source

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>
maint
Ben Peart 8 years ago committed by Junio C Hamano
parent
commit
a810ea9945
  1. 58
      convert.c

58
convert.c

@ -565,35 +565,14 @@ static void stop_multi_file_filter(struct child_process *process) @@ -565,35 +565,14 @@ static void stop_multi_file_filter(struct child_process *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;
struct cmd2process *entry;
struct child_process *process;
const char *argv[] = { cmd, NULL };
struct string_list cap_list = STRING_LIST_INIT_NODUP;
char *cap_buf;
const char *cap_name;

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));
struct child_process *process = &entry->process;
const char *cmd = entry->cmd;

sigchain_push(SIGPIPE, SIG_IGN);

@ -642,6 +621,37 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons @@ -642,6 +621,37 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons
done:
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) {
error("initialization for external filter '%s' failed", cmd);
kill_multi_file_filter(hashmap, entry);

Loading…
Cancel
Save