On Mon, 2009-04-06 at 11:29 +0200, Frank Lichtenheld wrote: > On Mon, Apr 06, 2009 at 11:46:15AM +1200, Sam Vilain wrote: > > + my ($fh, $c) = $git->command_output_pipe( > > + 'config', ( $which ? ("--$which") : () ), > > + '--list', > > + ); > Any reason why you don't use --null here? The output of --list without --null > is not reliably parsable, since people can put newlines in values. No particularly good reason :-) Subject: [PATCH] perl: make Git::Config use --null Use the form of 'git-config' designed for parsing by modules like this for safety with values containing embedded line feeds. Signed-off-by: Sam Vilain <sam.vilain@xxxxxxxxxxxxxxx> --- perl/Git/Config.pm | 6 ++++-- t/t9700/config.t | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/perl/Git/Config.pm b/perl/Git/Config.pm index a0a6a41..a35d9f3 100644 --- a/perl/Git/Config.pm +++ b/perl/Git/Config.pm @@ -179,12 +179,14 @@ sub read { my ($fh, $c) = $git->command_output_pipe( 'config', ( $which ? ("--$which") : () ), - '--list', + '--null', '--list', ); my $read_state = {}; + local($/)="\0"; while (<$fh>) { - my ($item, $value) = m{(.*?)=(.*)}; + my ($item, $value) = m{(.*?)\n((?s:.*))\0} + or die "failed to parse it; \$_='$_'"; my $sl = \( $read_state->{$item} ); if (!defined $$sl) { $$sl = $value; diff --git a/t/t9700/config.t b/t/t9700/config.t index 395a5c9..f0f7d2d 100644 --- a/t/t9700/config.t +++ b/t/t9700/config.t @@ -16,6 +16,7 @@ in_empty_repo sub { $git->command_oneline("config", "foo.intval", "12g"); $git->command_oneline("config", "foo.false.val", "false"); $git->command_oneline("config", "foo.true.val", "yes"); + $git->command_oneline("config", "multiline.val", "hello\nmultiline.val=world"); my $conf = Git::Config->new(); ok($conf, "constructed a new Git::Config"); @@ -92,6 +93,9 @@ in_empty_repo sub { is($unset, undef, "boolean thaw - not present"); + like($conf->config("multiline.val"), qr{\n}, + "parsing multi-line values"); + $git->command_oneline("config", "foo.intval", "12g"); $git->command_oneline("config", "foo.falseval", "false"); $git->command_oneline("config", "foo.trueval", "on"); -- debian.1.5.6.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html