From 18874f001a53d9fd2c801c568491e982bbad16a3 Mon Sep 17 00:00:00 2001
From: Henry Weller <http://openfoam.org>
Date: Fri, 11 Aug 2017 00:07:48 +0100
Subject: [PATCH] fileOperation: Corrected processor counting for moving mesh
 cases

---
 .../decomposePar/decomposePar.C               |  6 +++++
 src/OSspecific/POSIX/POSIX.C                  | 26 +++++++++++++++++++
 .../fileOperation/fileOperation.C             |  9 +------
 3 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
index c545815932..8a2c513fa0 100644
--- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
+++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C
@@ -392,6 +392,12 @@ int main(int argc, char *argv[])
                 Info<< "Using existing processor directories" << nl;
             }
 
+            if (args.optionFound("region"))
+            {
+                procDirsProblem = false;
+                forceOverwrite = false;
+            }
+
             if (forceOverwrite)
             {
                 Info<< "Removing " << nProcs
diff --git a/src/OSspecific/POSIX/POSIX.C b/src/OSspecific/POSIX/POSIX.C
index 9fa15a2e52..708375bfad 100644
--- a/src/OSspecific/POSIX/POSIX.C
+++ b/src/OSspecific/POSIX/POSIX.C
@@ -884,6 +884,32 @@ bool Foam::cp(const fileName& src, const fileName& dest, const bool followLink)
             return false;
         }
 
+        char* realSrcPath = realpath(src.c_str(), nullptr);
+        char* realDestPath = realpath(destFile.c_str(), nullptr);
+        const bool samePath = strcmp(realSrcPath, realDestPath) == 0;
+
+        if (POSIX::debug && samePath)
+        {
+            InfoInFunction
+                << "Attempt to copy " << realSrcPath << " to itself" << endl;
+        }
+
+        if (realSrcPath)
+        {
+            free(realSrcPath);
+        }
+
+        if (realDestPath)
+        {
+            free(realDestPath);
+        }
+
+        // Do not copy over self when src is actually a link to dest
+        if (samePath)
+        {
+            return false;
+        }
+
         // Copy files
         fileNameList contents = readDir(src, fileName::FILE, false, followLink);
         forAll(contents, i)
diff --git a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C
index 5949754fe7..110849d575 100644
--- a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C
+++ b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C
@@ -591,14 +591,7 @@ Foam::label Foam::fileOperation::nProcs
     label nProcs = 0;
     while
     (
-        isDir
-        (
-            dir
-           /(word("processor") + name(nProcs))
-           /"constant"
-           /local
-           /polyMesh::meshSubDir
-        )
+        isDir(dir/(word("processor") + name(nProcs)))
     )
     {
         ++nProcs;
-- 
GitLab