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
 }