convert: update subprocess_read_status() to not die on EOF
Enable sub-processes to gracefully handle when the process dies by updating subprocess_read_status to return an error on EOF instead of dying. Update apply_multi_file_filter to take advantage of the revised subprocess_read_status. Signed-off-by: Ben Peart <benpeart@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
99605d62e8
commit
4f2a2e9f0e
10
convert.c
10
convert.c
@ -635,7 +635,10 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len
|
|||||||
if (err)
|
if (err)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
subprocess_read_status(process->out, &filter_status);
|
err = subprocess_read_status(process->out, &filter_status);
|
||||||
|
if (err)
|
||||||
|
goto done;
|
||||||
|
|
||||||
err = strcmp(filter_status.buf, "success");
|
err = strcmp(filter_status.buf, "success");
|
||||||
if (err)
|
if (err)
|
||||||
goto done;
|
goto done;
|
||||||
@ -644,7 +647,10 @@ static int apply_multi_file_filter(const char *path, const char *src, size_t len
|
|||||||
if (err)
|
if (err)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
subprocess_read_status(process->out, &filter_status);
|
err = subprocess_read_status(process->out, &filter_status);
|
||||||
|
if (err)
|
||||||
|
goto done;
|
||||||
|
|
||||||
err = strcmp(filter_status.buf, "success");
|
err = strcmp(filter_status.buf, "success");
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -21,13 +21,15 @@ struct subprocess_entry *subprocess_find_entry(struct hashmap *hashmap, const ch
|
|||||||
return hashmap_get(hashmap, &key, NULL);
|
return hashmap_get(hashmap, &key, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void subprocess_read_status(int fd, struct strbuf *status)
|
int subprocess_read_status(int fd, struct strbuf *status)
|
||||||
{
|
{
|
||||||
struct strbuf **pair;
|
struct strbuf **pair;
|
||||||
char *line;
|
char *line;
|
||||||
|
int len;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
line = packet_read_line(fd, NULL);
|
len = packet_read_line_gently(fd, NULL, &line);
|
||||||
if (!line)
|
if ((len < 0) || !line)
|
||||||
break;
|
break;
|
||||||
pair = strbuf_split_str(line, '=', 2);
|
pair = strbuf_split_str(line, '=', 2);
|
||||||
if (pair[0] && pair[0]->len && pair[1]) {
|
if (pair[0] && pair[0]->len && pair[1]) {
|
||||||
@ -39,6 +41,8 @@ void subprocess_read_status(int fd, struct strbuf *status)
|
|||||||
}
|
}
|
||||||
strbuf_list_free(pair);
|
strbuf_list_free(pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (len < 0) ? len : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void subprocess_stop(struct hashmap *hashmap, struct subprocess_entry *entry)
|
void subprocess_stop(struct hashmap *hashmap, struct subprocess_entry *entry)
|
||||||
|
@ -44,6 +44,6 @@ static inline struct child_process *subprocess_get_child_process(
|
|||||||
* key/value pairs and return the value from the last "status" packet
|
* key/value pairs and return the value from the last "status" packet
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void subprocess_read_status(int fd, struct strbuf *status);
|
int subprocess_read_status(int fd, struct strbuf *status);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user