mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-09 07:30:02 +00:00
Merged fix-1007938-mysqlconfig-eol-comments
This commit is contained in:
@@ -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,
|
||||||
|
@@ -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 = (
|
||||||
|
@@ -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;
|
||||||
|
9
t/lib/samples/configs/mycnf-kc-001.txt
Normal file
9
t/lib/samples/configs/mycnf-kc-001.txt
Normal 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
|
Reference in New Issue
Block a user