git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: Jeff King <peff@peff.net>
Cc: "Junio C Hamano" <gitster@pobox.com>,
	git@vger.kernel.org, "Gregory Anders" <greg@gpanders.com>,
	"Đoàn Trần Công Danh" <congdanhqx@gmail.com>,
	"Eric Sunshine" <sunshine@sunshineco.com>,
	"Eric Wong" <e@80x24.org>
Subject: Re: [PATCH v2 00/10] send-email: various optimizations to speed up by >2x
Date: Fri, 21 May 2021 11:24:00 +0200	[thread overview]
Message-ID: <8735ugphge.fsf@evledraar.gmail.com> (raw)
In-Reply-To: <YKd5xSw1bZbQXaAe@coredump.intra.peff.net>


On Fri, May 21 2021, Jeff King wrote:

> On Fri, May 21, 2021 at 08:23:15AM +0200, Ævar Arnfjörð Bjarmason wrote:
>
>> The "performant" really doesn't matter here, we're comparing shelling
>> out to getting a small number of config keys back. So I wasn't trying to
>> optimize this.
>> 
>> Returning a flattened list is idiomatic in Perl, it means that a caller
>> can do any of:
>> 
>>     # I only care about the last value for a key, or only about
>>     # existence checks
>>     my %hash = func();
>> 
>> Or:
>> 
>>     # I want all key-values to iterate over
>>     my @kv = func();
>> 
>> Returning touples like this makes that less convenient for both, who'll
>> need to do more work to unpack them.
>> 
>> For what it's worth In Perl "return a list" means "flattened list", the
>> term "flattened list" I think comes from other languages. You'd call
>> what you're suggesting a list of arrays, or (if a top-level reference)
>> an array of arrays, AoA for short, AoH for array (ref) of hashes etc.
>
> Yeah, I think that is reasonable. But it made me wonder how we handle
> value-less booleans, and I think there's indeed a bug.
>
> Try a config like this:
>
>   $ cat >foo <<\EOF
>   [foo]
>   key-with-value = string
>   key-with-empty =
>   just-bool
>   another-key-with-value = another
>   EOF
>
> A regular config --list looks like:
>
>   $ git config --file=foo --list
>   foo.key-with-value=string
>   foo.key-with-empty=
>   foo.just-bool
>   foo.another-key-with-value=another
>
> Note how "just-bool" drops the "=" to distinguish it from the empty
> string. With "-z", it looks like this:
>
>   $ git config --file=foo --list -z
>   foo.key-with-value
>   string^@foo.key-with-empty
>   ^@foo.just-bool^@foo.another-key-with-value
>   another^@
>
> The NULs separate keys, but keys are separated from their values by a
> newline. And again, just-bool omits the newline.
>
> Your parser splits on newline, so for that entry we'll get only one
> string returned in the list (the key), rather than two (the key and
> value). In a flattened list, that becomes ambiguous. E.g., adapting your
> parser into a stand-alone script:
>
>   $ git config --file=foo --list -z |
>     perl -e '
>       local $/;
>       my $data = <STDIN>;
>       my (@kv) = map { split /\n/, $_, 2 } split /\0/, $data;
>
>       while (@kv) {
>         my $k = shift @kv;
> 	print "key: $k\n";
> 	my $v = shift @kv;
> 	print "  value: ", (defined $v ? $v : "undef"), "\n";
>       }
>     '
>   key: foo.key-with-value
>     value: string
>   key: foo.key-with-empty
>     value: 
>   key: foo.just-bool
>     value: foo.another-key-with-value
>   key: another
>     value: undef
>
> We end up misinterpreting a key as a value, and vice versa.
>
> Using a non-flattened structure would have prevented this (we'd sensibly
> get undef when trying to access the missing second element of the
> array). But I do agree the flattened structure is more perl-ish.
> Probably you'd want to insert an explicit "undef" into the list. The
> most perl-ish I could come up with is:
>
>   my (@kv) = map { my ($k, $v) = split /\n/, $_, 2;
>                    ($k, $v)
>                  } split /\0/, $data;
>
> I notice that $known_keys then becomes a non-flat representation. You'd
> either want to turn that back into a zero-length array there, or store
> the "undef" and handle it appropriately (it can be a synonym for "true",
> though that is just an optimization at this point).
>
> -Peff

Ah yes, that's indeed a bug. I'd forgetten about the empty value case.

For what it's worth you can slightly golf that as (split /\n/, $_,
2)[0,1], but I think in this case your version is better than that, it's
more obvious what we're trying to do in always returning the $v.

  reply	other threads:[~2021-05-21  9:26 UTC|newest]

Thread overview: 108+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-12 13:48 [PATCH 0/9] send-email: various optimizations to speed up by >2x Ævar Arnfjörð Bjarmason
2021-05-12 13:48 ` [PATCH 1/9] send-email: remove non-working support for "sendemail.smtpssl" Ævar Arnfjörð Bjarmason
2021-05-12 15:46   ` Đoàn Trần Công Danh
2021-05-12 13:48 ` [PATCH 2/9] send-email: refactor sendemail.smtpencryption config parsing Ævar Arnfjörð Bjarmason
2021-05-12 13:48 ` [PATCH 3/9] send-email: lazily load config for a big speedup Ævar Arnfjörð Bjarmason
2021-05-12 13:48 ` [PATCH 4/9] send-email: lazily shell out to "git var" Ævar Arnfjörð Bjarmason
2021-05-12 13:48 ` [PATCH 5/9] send-email: use function syntax instead of barewords Ævar Arnfjörð Bjarmason
2021-05-12 23:11   ` Jeff King
2021-05-12 13:48 ` [PATCH 6/9] send-email: get rid of indirect object syntax Ævar Arnfjörð Bjarmason
2021-05-12 13:48 ` [PATCH 7/9] send-email: lazily load modules for a big speedup Ævar Arnfjörð Bjarmason
2021-05-12 13:48 ` [PATCH 8/9] perl: lazily load some common Git.pm setup code Ævar Arnfjörð Bjarmason
2021-05-12 18:05   ` Eric Wong
2021-05-12 13:48 ` [PATCH 9/9] send-email: move trivial config handling to Perl Ævar Arnfjörð Bjarmason
2021-05-12 19:52   ` Eric Sunshine
2021-05-12 23:08   ` Jeff King
2021-05-13  7:04     ` Felipe Contreras
2021-05-13  7:07       ` Ævar Arnfjörð Bjarmason
2021-05-13  7:26       ` Jeff King
2021-05-13  8:15         ` Felipe Contreras
2021-05-13 11:45           ` Ævar Arnfjörð Bjarmason
2021-05-12 18:04 ` [PATCH 0/9] send-email: various optimizations to speed up by >2x Eric Wong
2021-05-12 23:34 ` Jeff King
2021-05-12 23:36 ` Jeff King
2021-05-13  7:37   ` Ævar Arnfjörð Bjarmason
2021-05-13  7:49     ` Jeff King
2021-05-20  8:18 ` [PATCH v2 00/10] " Ævar Arnfjörð Bjarmason
2021-05-20  8:18   ` [PATCH v2 01/10] send-email: remove non-working support for "sendemail.smtpssl" Ævar Arnfjörð Bjarmason
2021-05-20  8:18   ` [PATCH v2 02/10] send-email: refactor sendemail.smtpencryption config parsing Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 03/10] send-email: lazily load config for a big speedup Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 04/10] send-email: lazily shell out to "git var" Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 05/10] send-email: use function syntax instead of barewords Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 06/10] send-email: get rid of indirect object syntax Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 07/10] send-email: lazily load modules for a big speedup Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 08/10] perl: lazily load some common Git.pm setup code Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 09/10] send-email: move trivial config handling to Perl Ævar Arnfjörð Bjarmason
2021-05-20  8:19   ` [PATCH v2 10/10] perl: nano-optimize by replacing Cwd::cwd() with Cwd::getcwd() Ævar Arnfjörð Bjarmason
2021-05-20  8:27   ` [PATCH v2 00/10] send-email: various optimizations to speed up by >2x Jeff King
2021-05-20 23:53     ` Junio C Hamano
2021-05-21  6:23       ` Ævar Arnfjörð Bjarmason
2021-05-21  7:07         ` Junio C Hamano
2021-05-21  9:13         ` Jeff King
2021-05-21  9:24           ` Ævar Arnfjörð Bjarmason [this message]
2021-05-21  9:37             ` Jeff King
2021-05-28 15:49         ` Felipe Contreras
2021-05-29  8:19           ` Ævar Arnfjörð Bjarmason
2021-05-29 14:53             ` Felipe Contreras
2021-05-30 11:33               ` Ævar Arnfjörð Bjarmason
2021-05-30 16:07                 ` Felipe Contreras
2021-05-28 15:12     ` Felipe Contreras
2021-05-23  8:56   ` [PATCH v3 00/13] " Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 01/13] send-email tests: support GIT_TEST_PERL_FATAL_WARNINGS=true Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 02/13] send-email tests: test for boolean variables without a value Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 03/13] send-email: remove non-working support for "sendemail.smtpssl" Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 04/13] send-email: refactor sendemail.smtpencryption config parsing Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 05/13] send-email: copy "config_regxp" into git-send-email.perl Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 06/13] send-email: lazily load config for a big speedup Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 07/13] send-email: lazily shell out to "git var" Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 08/13] send-email: use function syntax instead of barewords Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 09/13] send-email: get rid of indirect object syntax Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 10/13] send-email: lazily load modules for a big speedup Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 11/13] perl: lazily load some common Git.pm setup code Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 12/13] send-email: move trivial config handling to Perl Ævar Arnfjörð Bjarmason
2021-05-23  8:56     ` [PATCH v3 13/13] perl: nano-optimize by replacing Cwd::cwd() with Cwd::getcwd() Ævar Arnfjörð Bjarmason
2021-05-24  1:15     ` [PATCH v3 00/13] send-email: various optimizations to speed up by >2x Junio C Hamano
2021-05-24  7:52     ` [PATCH v4 " Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 01/13] send-email tests: support GIT_TEST_PERL_FATAL_WARNINGS=true Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 02/13] send-email tests: test for boolean variables without a value Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 03/13] send-email: remove non-working support for "sendemail.smtpssl" Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 04/13] send-email: refactor sendemail.smtpencryption config parsing Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 05/13] send-email: copy "config_regxp" into git-send-email.perl Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 06/13] send-email: lazily load config for a big speedup Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 07/13] send-email: lazily shell out to "git var" Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 08/13] send-email: use function syntax instead of barewords Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 09/13] send-email: get rid of indirect object syntax Ævar Arnfjörð Bjarmason
2021-05-24  7:52       ` [PATCH v4 10/13] send-email: lazily load modules for a big speedup Ævar Arnfjörð Bjarmason
2021-05-27  1:11         ` Junio C Hamano
2021-05-27 11:36           ` Ævar Arnfjörð Bjarmason
2021-05-24  7:53       ` [PATCH v4 11/13] perl: lazily load some common Git.pm setup code Ævar Arnfjörð Bjarmason
2021-05-24  7:53       ` [PATCH v4 12/13] send-email: move trivial config handling to Perl Ævar Arnfjörð Bjarmason
2021-05-27 15:57         ` Jeff King
2021-05-24  7:53       ` [PATCH v4 13/13] perl: nano-optimize by replacing Cwd::cwd() with Cwd::getcwd() Ævar Arnfjörð Bjarmason
2021-05-27 16:00       ` [PATCH v4 00/13] send-email: various optimizations to speed up by >2x Jeff King
2021-05-28  9:23       ` [PATCH v5 " Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 01/13] send-email tests: support GIT_TEST_PERL_FATAL_WARNINGS=true Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 02/13] send-email tests: test for boolean variables without a value Ævar Arnfjörð Bjarmason
2021-07-10 23:23           ` Jeff King
2021-05-28  9:23         ` [PATCH v5 03/13] send-email: remove non-working support for "sendemail.smtpssl" Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 04/13] send-email: refactor sendemail.smtpencryption config parsing Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 05/13] send-email: copy "config_regxp" into git-send-email.perl Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 06/13] send-email: lazily load config for a big speedup Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 07/13] send-email: lazily shell out to "git var" Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 08/13] send-email: use function syntax instead of barewords Ævar Arnfjörð Bjarmason
2021-05-28 16:10           ` Felipe Contreras
2021-05-29  8:17             ` Ævar Arnfjörð Bjarmason
2021-05-29 14:25               ` Felipe Contreras
2021-05-28  9:23         ` [PATCH v5 09/13] send-email: get rid of indirect object syntax Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 10/13] send-email: lazily load modules for a big speedup Ævar Arnfjörð Bjarmason
2021-05-28 15:55           ` Felipe Contreras
2021-05-29  8:12             ` Ævar Arnfjörð Bjarmason
2021-05-29 14:24               ` Felipe Contreras
2021-05-28  9:23         ` [PATCH v5 11/13] perl: lazily load some common Git.pm setup code Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 12/13] send-email: move trivial config handling to Perl Ævar Arnfjörð Bjarmason
2021-05-28  9:23         ` [PATCH v5 13/13] perl: nano-optimize by replacing Cwd::cwd() with Cwd::getcwd() Ævar Arnfjörð Bjarmason
2021-05-28 16:13         ` [PATCH v5 00/13] send-email: various optimizations to speed up by >2x Felipe Contreras
2021-05-31  5:48         ` Jeff King
2021-05-31  9:53           ` Ævar Arnfjörð Bjarmason
2021-05-31 14:38             ` Jeff King
2021-05-27  7:21 ` [PATCH 0/9] " Elijah Newren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8735ugphge.fsf@evledraar.gmail.com \
    --to=avarab@gmail.com \
    --cc=congdanhqx@gmail.com \
    --cc=e@80x24.org \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=greg@gpanders.com \
    --cc=peff@peff.net \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).