> On 27 Jun 2017, at 22:34, Lars Schneider <[email protected]> wrote:
>
>
>> On 27 Jun 2017, at 21:00, Junio C Hamano <[email protected]> wrote:
>>
>> Lars Schneider <[email protected]> writes:
>>
>>> @@ -533,7 +534,8 @@ static int start_multi_file_filter_fn(struct
>>> subprocess_entry *subprocess)
>>> if (err)
>>> goto done;
>>>
>>> - err = packet_writel(process->in, "capability=clean",
>>> "capability=smudge", NULL);
>>> + err = packet_writel(process->in,
>>> + "capability=clean", "capability=smudge", "capability=delay",
>>> NULL);
>>>
>>> for (;;) {
>>> cap_buf = packet_read_line(process->out, NULL);
>>> @@ -549,6 +551,8 @@ static int start_multi_file_filter_fn(struct
>>> subprocess_entry *subprocess)
>>> entry->supported_capabilities |= CAP_CLEAN;
>>> } else if (!strcmp(cap_name, "smudge")) {
>>> entry->supported_capabilities |= CAP_SMUDGE;
>>> + } else if (!strcmp(cap_name, "delay")) {
>>> + entry->supported_capabilities |= CAP_DELAY;
>>> } else {
>>> warning(
>>> "external filter '%s' requested unsupported
>>> filter capability '%s'",
>>
>> I thought you said something about attempting to make this more
>> table-driven; did the attempt produce a better result? Just being
>> curious.
>
> I treated that as low-prio as I got the impression that you are generally OK
> with
> the current implementation. I promise to send a patch with this change.
> Either as part of this series or as a follow up patch.
How about this?
static int start_multi_file_filter_fn(struct subprocess_entry *subprocess)
{
- int err;
+ int err, i;
struct cmd2process *entry = (struct cmd2process *)subprocess;
struct string_list cap_list = STRING_LIST_INIT_NODUP;
char *cap_buf;
@@ -516,6 +516,15 @@ static int start_multi_file_filter_fn(struct
subprocess_entry *subprocess)
struct child_process *process = &subprocess->process;
const char *cmd = subprocess->cmd;
+ static const struct {
+ const char *name;
+ unsigned int cap;
+ } known_caps[] = {
+ { "clean", CAP_CLEAN },
+ { "smudge", CAP_SMUDGE },
+ { "delay", CAP_DELAY },
+ };
+
sigchain_push(SIGPIPE, SIG_IGN);
err = packet_writel(process->in, "git-filter-client", "version=2",
NULL);
@@ -534,8 +543,15 @@ static int start_multi_file_filter_fn(struct
subprocess_entry *subprocess)
if (err)
goto done;
- err = packet_writel(process->in,
- "capability=clean", "capability=smudge", "capability=delay",
NULL);
+ for (i = 0; i < ARRAY_SIZE(known_caps); ++i) {
+ err = packet_write_fmt_gently(
+ process->in, "capability=%s\n", known_caps[i].name);
+ if (err)
+ goto done;
+ }
+ err = packet_flush_gently(process->in);
+ if (err)
+ goto done;
for (;;) {
cap_buf = packet_read_line(process->out, NULL);
@@ -547,18 +563,15 @@ static int start_multi_file_filter_fn(struct
subprocess_entry *subprocess)
continue;
cap_name = cap_list.items[1].string;
- if (!strcmp(cap_name, "clean")) {
- entry->supported_capabilities |= CAP_CLEAN;
- } else if (!strcmp(cap_name, "smudge")) {
- entry->supported_capabilities |= CAP_SMUDGE;
- } else if (!strcmp(cap_name, "delay")) {
- entry->supported_capabilities |= CAP_DELAY;
- } else {
- warning(
- "external filter '%s' requested unsupported
filter capability '%s'",
- cmd, cap_name
- );
- }
+ i = ARRAY_SIZE(known_caps) - 1;
+ while (i >= 0 && strcmp(cap_name, known_caps[i].name))
+ i--;
+
+ if (i >= 0)
+ entry->supported_capabilities |= known_caps[i].cap;
+ else
+ warning("external filter '%s' requested unsupported
filter capability '%s'",
+ cmd, cap_name);
string_list_clear(&cap_list, 0);