Re: [PATCH v1 3/3] convert: add filter.<driver>.useProtocol option
- From
Lars Schneider <larsxschneider@gmail.com>
- Date
- Jul 24, 2016, 19:11 UTC
- Message-ID
- <121F8453-3A12-47AE-AE10-021EADC4D995@gmail.com>
- In-Reply-To
- <20160723081447.GA24318@starla>
On 23 Jul 2016, at 10:14, Eric Wong <e@80x24.org> wrote:
Show 7 quoted lines
> larsxschneider@gmail.com wrote: >> Please note that the protocol filters do not support stream processing >> with this implemenatation because the filter needs to know the length of >> the result in advance. A protocol version 2 could address this in a >> future patch. > > Would it be prudent to reuse pkt-line for this?
Peff suggested that, too, in $gmane/299902. However, this would make the protocol a bit more complicated and it wouldn't buy us anything for Git large file processing filters (my main motivation for this patch) as these filters can't leverage streaming anyways.
Show 21 quoted lines
>> +static void stop_protocol_filter(struct cmd2process *entry) {
>> + if (!entry)
>> + return;
>> + sigchain_push(SIGPIPE, SIG_IGN);
>> + close(entry->process.in);
>> + close(entry->process.out);
>> + sigchain_pop(SIGPIPE);
>> + finish_command(&entry->process);
>> + child_process_clear(&entry->process);
>> + hashmap_remove(&cmd_process_map, entry, NULL);
>> + free(entry);
>> +}
>> +
>> +static struct cmd2process *start_protocol_filter(const char *cmd)
>> +{
>> + int ret = 1;
>> + struct cmd2process *entry = NULL;
>> + struct child_process *process = NULL;
>
> These are unconditionally set below, so initializing to NULL
> may hide future bugs.OK. I thought it is generally a good thing to initialize a pointer with NULL. Can you explain to me how this might hide future bugs? I will remove the initialization.
Show 9 quoted lines
>> + struct strbuf nbuf = STRBUF_INIT;
>> + struct string_list split = STRING_LIST_INIT_NODUP;
>> + const char *argv[] = { NULL, NULL };
>> + const char *header = "git-filter-protocol\nversion";
>
> static const char header[] = "git-filter-protocol\nversion";
>
> ...might be smaller by avoiding the extra pointer
> (but compilers ought to be able to optimize it)Agreed!
Show 10 quoted lines
>> + entry = xmalloc(sizeof(*entry)); >> + hashmap_entry_init(entry, strhash(cmd)); >> + entry->cmd = cmd; >> + process = &entry->process; > > <snip> > >> + ret &= strncmp(header, split.items[0].string, strlen(header)) == 0; > > starts_with() is probably more readable, here.
OK, will fix.
Show 10 quoted lines
>> +static int apply_protocol_filter(const char *path, const char *src, size_t len,
>> + int fd, struct strbuf *dst, const char *cmd,
>> + const char *filter_type)
>> +{
>> + int ret = 1;
>> + struct cmd2process *entry = NULL;
>> + struct child_process *process = NULL;
>
> I would leave process initialized, here, since it should
> always be set below:OK, will fix.
Show 25 quoted lines
>> + struct stat fileStat;
>> + struct strbuf nbuf = STRBUF_INIT;
>> + size_t nbuf_len;
>> + char *strtol_end;
>> + char c;
>> +
>> + if (!cmd || !*cmd)
>> + return 0;
>> +
>> + if (!dst)
>> + return 1;
>> +
>> + if (!cmd_process_map_init) {
>> + cmd_process_map_init = 1;
>> + hashmap_init(&cmd_process_map, (hashmap_cmp_fn) cmd2process_cmp, 0);
>> + } else {
>> + entry = find_protocol_filter_entry(cmd);
>> + }
>> +
>> + if (!entry){
>> + entry = start_protocol_filter(cmd);
>> + if (!entry) {
>> + stop_protocol_filter(entry);
>
> stop_protocol_filter is a no-op, here, since entry is NULLOops - a result of my own refactoring :-) Thank you!
Show 13 quoted lines
>> + return 0;
>> + }
>> + }
>> + process = &entry->process;
>> +
>> + sigchain_push(SIGPIPE, SIG_IGN);
>> + switch (entry->protocol) {
>> + case 1:
>> + if (fd >= 0 && !src) {
>> + ret &= fstat(fd, &fileStat) != -1;
>> + len = fileStat.st_size;
>
> There's a truncation bug when sizeof(size_t) < sizeof(off_t)OK. What would you suggest to do in that case? Should we just let the filter fail? Is there anything else we could do?
> (and mixedCase is inconsistent with our style)
OK, will fix.
Show 10 quoted lines
>> + my $filelen = <STDIN>; >> + chomp $filelen; >> + print $debug " $filelen"; >> + >> + $filelen = int($filelen); > > Calling int() here is unnecessary and may hide bugs if you > forget to check $debug. Perhaps a regexp check is safer: > > $filelen =~ /\A\d+\z/ or die "bad filelen: $filelen\n";
OK, will fix!
Thanks for your review, Lars