Merged fix-1007938-mysqlconfig-eol-comments

This commit is contained in:
Brian Fraser fraserb@gmail.com
2012-12-05 20:43:40 -03:00
4 changed files with 93 additions and 19 deletions

View File

@@ -844,7 +844,7 @@ sub print_usage {
$desc .= ". Optional suffix s=seconds, m=minutes, h=hours, " $desc .= ". Optional suffix s=seconds, m=minutes, h=hours, "
. "d=days; if no suffix, $s is used."; . "d=days; if no suffix, $s is used.";
} }
$desc = join("\n$rpad", grep { $_ } $desc =~ m/(.{0,$rcol})(?:\s+|$)/g); $desc = join("\n$rpad", grep { $_ } $desc =~ m/(.{0,$rcol}(?!\W))(?:\s+|(?<=\W)|$)/g);
$desc =~ s/ +$//mg; $desc =~ s/ +$//mg;
if ( $short ) { if ( $short ) {
$usage .= sprintf(" --%-${maxs}s -%s %s\n", $long, $short, $desc); $usage .= sprintf(" --%-${maxs}s -%s %s\n", $long, $short, $desc);
@@ -2201,8 +2201,8 @@ sub _preprocess_varvals {
my %vars; my %vars;
LINE: LINE:
foreach my $line ( split /\n/, $to_parse ) { foreach my $line ( split /\n/, $to_parse ) {
next LINE if $line =~ m/^\s*$/; # no empty lines next LINE if $line =~ m/^\s*$/; # no empty lines
next LINE if $line =~ m/^\s*#/; # no # comment lines next LINE if $line =~ /^\s*[#;]/; # no # or ; comment lines
if ( $line !~ $re ) { if ( $line !~ $re ) {
PTDEBUG && _d("Line <", $line, "> didn't match $re"); PTDEBUG && _d("Line <", $line, "> didn't match $re");
@@ -2213,6 +2213,8 @@ sub _preprocess_varvals {
$var =~ tr/-/_/; $var =~ tr/-/_/;
$var =~ s/\s*#.*$//;
if ( !defined $val ) { if ( !defined $val ) {
$val = ''; $val = '';
} }
@@ -2252,15 +2254,24 @@ sub _parse_varvals {
return \%config, \%duplicates; return \%config, \%duplicates;
} }
my $quote_re = qr/
\A # Start of value
(['"]) # Opening quote
(.*) # Value
\1 # Closing quote
\s*(?:\#.*)? # End of line comment
[\n\r]*\z # End of value
/x;
sub _process_val { sub _process_val {
my ($val) = @_; my ($val) = @_;
$val =~ s/
\A # Start of value if ( $val =~ $quote_re ) {
(['"]) # Opening quote $val = $2;
(.*) # Value }
\1 # Closing quote else {
[\n\r]*\z # End of value $val =~ s/\s*#.*//;
/$2/x; }
if ( my ($num, $factor) = $val =~ m/(\d+)([KMGT])b?$/i ) { if ( my ($num, $factor) = $val =~ m/(\d+)([KMGT])b?$/i ) {
my %factor_for = ( my %factor_for = (
k => 1_024, k => 1_024,

View File

@@ -340,8 +340,8 @@ sub _preprocess_varvals {
my %vars; my %vars;
LINE: LINE:
foreach my $line ( split /\n/, $to_parse ) { foreach my $line ( split /\n/, $to_parse ) {
next LINE if $line =~ m/^\s*$/; # no empty lines next LINE if $line =~ m/^\s*$/; # no empty lines
next LINE if $line =~ m/^\s*#/; # no # comment lines next LINE if $line =~ /^\s*[#;]/; # no # or ; comment lines
if ( $line !~ $re ) { if ( $line !~ $re ) {
PTDEBUG && _d("Line <", $line, "> didn't match $re"); PTDEBUG && _d("Line <", $line, "> didn't match $re");
@@ -354,6 +354,9 @@ sub _preprocess_varvals {
# but in SHOW VARIABLES they're all like "log_bin". # but in SHOW VARIABLES they're all like "log_bin".
$var =~ tr/-/_/; $var =~ tr/-/_/;
# Remove trailing comments
$var =~ s/\s*#.*$//;
if ( !defined $val ) { if ( !defined $val ) {
$val = ''; $val = '';
} }
@@ -405,15 +408,26 @@ sub _parse_varvals {
return \%config, \%duplicates; return \%config, \%duplicates;
} }
my $quote_re = qr/
\A # Start of value
(['"]) # Opening quote
(.*) # Value
\1 # Closing quote
\s*(?:\#.*)? # End of line comment
[\n\r]*\z # End of value
/x;
sub _process_val { sub _process_val {
my ($val) = @_; my ($val) = @_;
$val =~ s/
\A # Start of value if ( $val =~ $quote_re ) {
(['"]) # Opening quote # If it matches the quote re, then $2 holds the value
(.*) # Value $val = $2;
\1 # Closing quote }
[\n\r]*\z # End of value else {
/$2/x; # Otherwise, remove possible trailing comments
$val =~ s/\s*#.*//;
}
if ( my ($num, $factor) = $val =~ m/(\d+)([KMGT])b?$/i ) { if ( my ($num, $factor) = $val =~ m/(\d+)([KMGT])b?$/i ) {
# value is a size like 1k, 16M, etc. # value is a size like 1k, 16M, etc.
my %factor_for = ( my %factor_for = (

View File

@@ -827,6 +827,45 @@ SKIP: {
); );
} }
$config = new MySQLConfig(
file => "$trunk/t/lib/samples/configs/mycnf-kc-001.txt",
TextResultSetParser => $trp,
);
is(
$config->value_of('user'),
'mysql',
'end of line comment in option file'
);
is(
$config->value_of('password'),
'password # still part of it!',
'end of line comments respect quoted values'
);
is(
$config->value_of('something'),
'something ; or # another',
"..and removing comments doesn't leave trailing whitespace"
);
ok(
defined $config->value_of('log_bin'),
"bools with comments in the end are found"
);
is(
$config->value_of('log_bin'),
"ON",
"And the comment is correctly stripped out"
);
is_deeply(
[ sort keys %{$config->variables} ],
[ sort qw( password something user log_bin )],
"start of line comments with # or ; are ignored"
);
# ############################################################################# # #############################################################################
# Use of uninitialized value in substitution (s///) at pt-config-diff line 1996 # Use of uninitialized value in substitution (s///) at pt-config-diff line 1996
# https://bugs.launchpad.net/percona-toolkit/+bug/917770 # https://bugs.launchpad.net/percona-toolkit/+bug/917770
@@ -865,5 +904,6 @@ like(
'_d() works' '_d() works'
); );
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
done_testing; done_testing;
exit; exit;

View File

@@ -0,0 +1,9 @@
[mysqld]
user=mysql # comment
password="password # still part of it!"# comment
something='something ; or # another' # comment
;semicolon="start of line comment with ;"
#pound="start of line comment with #"
;spacecolon
#spacepound
log_bin # bool with comment