Deal with paths containing \ and spaces in basebackup_to_shell tests
authorAndres Freund <[email protected]>
Mon, 18 Jul 2022 17:14:43 +0000 (10:14 -0700)
committerAndres Freund <[email protected]>
Mon, 18 Jul 2022 17:32:15 +0000 (10:32 -0700)
As $gzip is embedded in postgresql.conf \ needs to be escaped, otherwise guc.c
will take it as a string escape. Similarly, if "$gzip" contains spaces, the
prior incantation will fail. Both of these are common on windows.

Reviewed-by: Peter Eisentraut <[email protected]>
Discussion: https://postgr.es/m/ce1b6eb3-5736-6f38-9775-b7020128b8d8@enterprisedb.com
Backpatch: 15-, where the test was added in 027fa0fd726

contrib/basebackup_to_shell/t/001_basic.pl

index acb66eb9a84034a0cb00a97bb3f26c19f040d97b..5eb96090a8ac98178ad0e51b1a3b56ca7f2a8aba 100644 (file)
@@ -16,6 +16,9 @@ if (!defined $gzip || $gzip eq '')
    plan skip_all => 'gzip not available';
 }
 
+# to ensure path can be embedded in postgresql.conf
+$gzip =~ s{\\}{/}g if ($PostgreSQL::Test::Utils::windows_os);
+
 my $node = PostgreSQL::Test::Cluster->new('primary');
 
 # Make sure pg_hba.conf is set up to allow connections from backupuser.
@@ -53,8 +56,8 @@ $escaped_backup_path =~ s{\\}{\\\\}g
   if ($PostgreSQL::Test::Utils::windows_os);
 my $shell_command =
   $PostgreSQL::Test::Utils::windows_os
-  ? qq{$gzip --fast > "$escaped_backup_path\\\\%f.gz"}
-  : qq{$gzip --fast > "$escaped_backup_path/%f.gz"};
+  ? qq{"$gzip" --fast > "$escaped_backup_path\\\\%f.gz"}
+  : qq{"$gzip" --fast > "$escaped_backup_path/%f.gz"};
 $node->append_conf('postgresql.conf',
    "basebackup_to_shell.command='$shell_command'");
 $node->reload();
@@ -74,8 +77,8 @@ $node->command_fails_like(
 # Reconfigure to restrict access and require a detail.
 $shell_command =
   $PostgreSQL::Test::Utils::windows_os
-  ? qq{$gzip --fast > "$escaped_backup_path\\\\%d.%f.gz"}
-  : qq{$gzip --fast > "$escaped_backup_path/%d.%f.gz"};
+  ? qq{"$gzip" --fast > "$escaped_backup_path\\\\%d.%f.gz"}
+  : qq{"$gzip" --fast > "$escaped_backup_path/%d.%f.gz"};
 $node->append_conf('postgresql.conf',
    "basebackup_to_shell.command='$shell_command'");
 $node->append_conf('postgresql.conf',