зеркало из https://github.com/microsoft/git.git
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:
Родитель
1b0b46ee3b
Коммит
7ddb9b2ca9
41
convert.c
41
convert.c
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче