]> granicus.if.org Git - postgresql/commitdiff
pg_upgrade: error if run from top of new PGDATA on Windows
authorBruce Momjian <bruce@momjian.us>
Fri, 15 Aug 2014 16:03:49 +0000 (12:03 -0400)
committerBruce Momjian <bruce@momjian.us>
Fri, 15 Aug 2014 16:04:03 +0000 (12:04 -0400)
Print a clear error message in this case, rather than wait for initdb
--sync-only to generate a "Permission denied" error.

contrib/pg_upgrade/option.c

index e0a3c6d71146ca254454611346aacd2660ad8611..2e7c3479d685089c790d7d7972bf548040c26943 100644 (file)
@@ -229,6 +229,26 @@ parseCommandLine(int argc, char *argv[])
                                                         "PGDATAOLD", "-d", "old cluster data resides");
        check_required_directory(&new_cluster.pgdata, &new_cluster.pgconfig,
                                                         "PGDATANEW", "-D", "new cluster data resides");
+
+#ifndef WIN32
+       /*
+        * On Windows, initdb --sync-only will fail with a "Permission denied"
+        * error on file pg_upgrade_utility.log if pg_upgrade is run inside
+        * the new cluster directory, so we do a check here.
+        */
+       {
+               char    cwd[MAXPGPATH], new_cluster_pgdata[MAXPGPATH];
+
+               strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+               canonicalize_path(new_cluster_pgdata);
+               
+               if (!getcwd(cwd, MAXPGPATH))
+                       pg_fatal("cannot find current directory\n");
+               canonicalize_path(cwd);
+               if (path_is_prefix_of_path(new_cluster_pgdata, cwd))
+                       pg_fatal("cannot run pg_upgrade from inside the new cluster data directory on Windows\n");
+       }
+#endif
 }