From: Bruce Momjian Date: Fri, 15 Aug 2014 16:03:49 +0000 (-0400) Subject: pg_upgrade: error if run from top of new PGDATA on Windows X-Git-Tag: REL9_5_ALPHA1~1620 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e4c3c99ac3d4777458ef3e94b037438b244b72b6;p=postgresql pg_upgrade: error if run from top of new PGDATA on Windows Print a clear error message in this case, rather than wait for initdb --sync-only to generate a "Permission denied" error. --- diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c index e0a3c6d711..2e7c3479d6 100644 --- a/contrib/pg_upgrade/option.c +++ b/contrib/pg_upgrade/option.c @@ -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 }