convert: update generic functions to only use generic data structures

Update all functions that are going to be moved into a reusable module
so that they only work with the reusable data structures.  Move code
that is specific to the filter out into the filter specific functions.

Signed-off-by: Ben Peart <benpeart@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ben Peart 2017-05-05 11:27:59 -04:00 коммит произвёл Junio C Hamano
Родитель 1b0b46ee3b
Коммит 7ddb9b2ca9
1 изменённых файлов: 23 добавлений и 18 удалений

Просмотреть файл

@ -556,7 +556,6 @@ static void kill_multi_file_filter(struct hashmap *hashmap, struct subprocess_en
finish_command(&entry->process);
hashmap_remove(hashmap, entry, NULL);
free(entry);
}
static void stop_multi_file_filter(struct child_process *process)
@ -570,14 +569,15 @@ static void stop_multi_file_filter(struct child_process *process)
finish_command(process);
}
static int start_multi_file_filter_fn(struct cmd2process *entry)
static int start_multi_file_filter_fn(struct subprocess_entry *subprocess)
{
int err;
struct cmd2process *entry = (struct cmd2process *)subprocess;
struct string_list cap_list = STRING_LIST_INIT_NODUP;
char *cap_buf;
const char *cap_name;
struct child_process *process = &entry->subprocess.process;
const char *cmd = entry->subprocess.cmd;
struct child_process *process = &subprocess->process;
const char *cmd = subprocess->cmd;
sigchain_push(SIGPIPE, SIG_IGN);
@ -629,17 +629,16 @@ done:
return err;
}
static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, const char *cmd)
typedef int(*subprocess_start_fn)(struct subprocess_entry *entry);
int start_multi_file_filter(struct hashmap *hashmap, struct subprocess_entry *entry, const char *cmd,
subprocess_start_fn startfn)
{
int err;
struct cmd2process *entry;
struct child_process *process;
const char *argv[] = { cmd, NULL };
entry = xmalloc(sizeof(*entry));
entry->subprocess.cmd = cmd;
entry->supported_capabilities = 0;
process = &entry->subprocess.process;
entry->cmd = cmd;
process = &entry->process;
child_process_init(process);
process->argv = argv;
@ -649,22 +648,23 @@ static struct cmd2process *start_multi_file_filter(struct hashmap *hashmap, cons
process->clean_on_exit = 1;
process->clean_on_exit_handler = stop_multi_file_filter;
if (start_command(process)) {
err = start_command(process);
if (err) {
error("cannot fork to run external filter '%s'", cmd);
return NULL;
return err;
}
hashmap_entry_init(entry, strhash(cmd));
err = start_multi_file_filter_fn(entry);
err = startfn(entry);
if (err) {
error("initialization for external filter '%s' failed", cmd);
kill_multi_file_filter(hashmap, &entry->subprocess);
return NULL;
kill_multi_file_filter(hashmap, entry);
return err;
}
hashmap_add(hashmap, entry);
return entry;
return 0;
}
static int apply_multi_file_filter(const char *path, const char *src, size_t len,
@ -689,9 +689,13 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len
fflush(NULL);
if (!entry) {
entry = start_multi_file_filter(&cmd_process_map, cmd);
if (!entry)
entry = xmalloc(sizeof(*entry));
entry->supported_capabilities = 0;
if (start_multi_file_filter(&cmd_process_map, &entry->subprocess, cmd, start_multi_file_filter_fn)) {
free(entry);
return 0;
}
}
process = &entry->subprocess.process;
@ -765,6 +769,7 @@ done:
*/
error("external filter '%s' failed", cmd);
kill_multi_file_filter(&cmd_process_map, &entry->subprocess);
free(entry);
}
} else {
strbuf_swap(dst, &nbuf);