]> granicus.if.org Git - postgresql/commitdiff
Provide for testing on python3 modules when under MSVC
authorAndrew Dunstan <andrew@dunslane.net>
Fri, 4 May 2018 19:22:48 +0000 (15:22 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Fri, 4 May 2018 19:32:31 +0000 (15:32 -0400)
This should have been done some years ago as promised in commit
c4dcdd0c2. However, better late than never.

Along the way do a little housekeeping, including using a simpler test
for the python version being tested, and removing a redundant subroutine
parameter. These changes only apply back to release 9.5.

Backpatch to all live releases.

src/tools/msvc/Install.pm
src/tools/msvc/vcregress.pl

index d8ef98e4f7afd633e0bbe9a5c9f601272d55de12..53cd5e9c45f51a4b641339db86355443f18868dd 100644 (file)
@@ -458,14 +458,12 @@ sub CopyContribFiles
                opendir($D, $subdir) || croak "Could not opendir on $subdir!\n";
                while (my $d = readdir($D))
                {
-
                        # These configuration-based exclusions must match vcregress.pl
                        next if ($d eq "uuid-ossp"       && !defined($config->{uuid}));
                        next if ($d eq "sslinfo"         && !defined($config->{openssl}));
                        next if ($d eq "xml2"            && !defined($config->{xml}));
-                       next if ($d eq "hstore_plperl"   && !defined($config->{perl}));
-                       next if ($d eq "hstore_plpython" && !defined($config->{python}));
-                       next if ($d eq "ltree_plpython"  && !defined($config->{python}));
+                       next if ($d =~ /_plperl$/        && !defined($config->{perl}));
+                       next if ($d =~ /_plpython$/      && !defined($config->{python}));
                        next if ($d eq "sepgsql");
 
                        CopySubdirFiles($subdir, $d, $config, $target);
index 290467911482fdeaf799745a282ad14c6d554fe3..d60655a52127184f2774482ff1fcf516f1f6d17c 100644 (file)
@@ -244,6 +244,51 @@ sub taptest
        exit $status if $status;
 }
 
+sub mangle_plpython3
+{
+       my $tests = shift;
+       mkdir "results" unless -d "results";
+       mkdir "sql/python3";
+       mkdir "results/python3";
+       mkdir "expected/python3";
+
+       foreach my $test (@$tests)
+       {
+               local $/ = undef;
+               foreach my $dir ('sql','expected')
+               {
+                       my $extension = ($dir eq 'sql' ? 'sql' : 'out');
+
+                       my @files = glob("$dir/$test.$extension $dir/${test}_[0-9].$extension");
+                       foreach my $file (@files)
+                       {
+                               open(my $handle, "$file") || die "test file $file not found";
+                               my $contents = <$handle>;
+                               close($handle);
+                               map
+                               {
+                                       s/except ([[:alpha:]][[:alpha:].]*), *([[:alpha:]][[:alpha:]]*):/except $1 as $2:/g;
+                                       s/<type 'exceptions\.([[:alpha:]]*)'>/<class '$1'>/g;
+                                       s/<type 'long'>/<class 'int'>/g;
+                                       s/([0-9][0-9]*)L/$1/g;
+                                       s/([ [{])u"/$1"/g;
+                                       s/([ [{])u'/$1'/g;
+                                       s/def next/def __next__/g;
+                                       s/LANGUAGE plpython2?u/LANGUAGE plpython3u/g;
+                                       s/EXTENSION ([^ ]*_)*plpython2?u/EXTENSION $1plpython3u/g;
+                                       s/installing required extension "plpython2u"/installing required extension "plpython3u"/g;
+                               } $contents;
+                               my $base = basename $file;
+                               open($handle, ">$dir/python3/$base") || die "opening python 3 file for $file";
+                               print $handle $contents;
+                               close($handle);
+                       }
+               }
+       }
+       map { $_ =~ s!^!python3/!; } @$tests;
+       return @$tests;
+}
+
 sub plcheck
 {
        chdir "../../pl";
@@ -254,7 +299,8 @@ sub plcheck
                my $lang = $pl eq 'tcl' ? 'pltcl' : $pl;
                if ($lang eq 'plpython')
                {
-                       next unless -d "../../$Config/plpython2";
+                       next unless -d "$topdir/$Config/plpython2" ||
+                               -d "$topdir/$Config/plpython3";
                        $lang = 'plpythonu';
                }
                else
@@ -264,6 +310,8 @@ sub plcheck
                my @lang_args = ("--load-extension=$lang");
                chdir $pl;
                my @tests = fetchTests();
+               @tests = mangle_plpython3(\@tests)
+                       if $lang eq 'plpythonu' && -d "$topdir/$Config/plpython3";
                if ($lang eq 'plperl')
                {
 
@@ -279,6 +327,10 @@ sub plcheck
                                push(@tests, 'plperl_plperlu');
                        }
                }
+               elsif ($lang eq 'plpythonu' && -d "$topdir/$Config/plpython3")
+               {
+                       @lang_args = ();
+               }
                print
                  "============================================================\n";
                print "Checking $lang\n";
@@ -297,7 +349,6 @@ sub plcheck
 
 sub subdircheck
 {
-       my $subdir = shift;
        my $module = shift;
 
        if (   !-d "$module/sql"
@@ -311,43 +362,35 @@ sub subdircheck
        my @tests = fetchTests();
        my @opts  = fetchRegressOpts();
 
-       # Add some options for transform modules, see their respective
-       # Makefile for more details regarding Python-version specific
+       # Special processing for python transform modules, see their respective
+       # Makefiles for more details regarding Python-version specific
        # dependencies.
-       if (   $module eq "hstore_plpython"
-               || $module eq "ltree_plpython")
+       if ( $module =~ /_plpython$/ )
        {
                die "Python not enabled in configuration"
                  if !defined($config->{python});
 
-               # Attempt to get python version and location.
-               # Assume python.exe in specified dir.
-               my $pythonprog = "import sys;" . "print(str(sys.version_info[0]))";
-               my $prefixcmd  = $config->{python} . "\\python -c \"$pythonprog\"";
-               my $pyver      = `$prefixcmd`;
-               die "Could not query for python version!\n" if $?;
-               chomp($pyver);
-               if ($pyver eq "2")
+               @opts = grep { $_ !~ /plpythonu/ } @opts;
+
+               if (-d "$topdir/$Config/plpython2")
                {
                        push @opts, "--load-extension=plpythonu";
                        push @opts, '--load-extension=' . $module . 'u';
                }
                else
                {
-
-                       # disable tests on python3 for now.
-                       chdir "..";
-                       return;
+                       # must be python 3
+                       @tests = mangle_plpython3(\@tests);
                }
        }
 
-
        print "============================================================\n";
        print "Checking $module\n";
        my @args = (
                "$topdir/$Config/pg_regress/pg_regress",
                "--bindir=${topdir}/${Config}/psql",
                "--dbname=contrib_regression", @opts, @tests);
+       print join(' ',@args),"\n";
        system(@args);
        chdir "..";
 }
@@ -358,17 +401,15 @@ sub contribcheck
        my $mstat = 0;
        foreach my $module (glob("*"))
        {
-
                # these configuration-based exclusions must match Install.pm
                next if ($module eq "uuid-ossp"     && !defined($config->{uuid}));
                next if ($module eq "sslinfo"       && !defined($config->{openssl}));
                next if ($module eq "xml2"          && !defined($config->{xml}));
-               next if ($module eq "hstore_plperl" && !defined($config->{perl}));
-               next if ($module eq "hstore_plpython" && !defined($config->{python}));
-               next if ($module eq "ltree_plpython"  && !defined($config->{python}));
+               next if ($module =~ /_plperl$/      && !defined($config->{perl}));
+               next if ($module =~ /_plpython$/    && !defined($config->{python}));
                next if ($module eq "sepgsql");
 
-               subdircheck("$topdir/contrib", $module);
+               subdircheck($module);
                my $status = $? >> 8;
                $mstat ||= $status;
        }
@@ -381,7 +422,7 @@ sub modulescheck
        my $mstat = 0;
        foreach my $module (glob("*"))
        {
-               subdircheck("$topdir/src/test/modules", $module);
+               subdircheck($module);
                my $status = $? >> 8;
                $mstat ||= $status;
        }