From e4c3c99ac3d4777458ef3e94b037438b244b72b6 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 15 Aug 2014 12:03:49 -0400 Subject: [PATCH] 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. --- contrib/pg_upgrade/option.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) 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 } -- 2.40.0