static void PerformRenumberOnPartsFile(RMGenPart part, ref List <ComparedPath> comparedPaths, string rootPath, string _namespace)
        {
            Exception outEx;

            if (part.Files == null)
            {
                return;
            }
            foreach (RMGenFile file in part.Files)
            {
                if (string.IsNullOrWhiteSpace(file.Path))
                {
                    continue;
                }
                ComparedPath comparedPath = new ComparedPath();
                comparedPath.Old = file.Path;
                string newPath = string.Empty;

                try
                {
                    newPath = Path.GetDirectoryName(file.Path);
                }
                catch (Exception ex)
                {
                    Logger.WriteErrorLog(LoggerMessages.GeneratorPartsManager.RenumberParts.Error.InvalidPath(file.Path), _namespace, ex, BasicDebugLogger.DebugErrorType.CriticalError);
                    throw;
                }
                try
                {
                    newPath += "\\" + file.RetrieveInstallFileName(part.implicitID);
                }
                catch (Exception ex)
                {
                    Logger.WriteErrorLog(LoggerMessages.GeneratorPartsManager.RenumberParts.Error.InvalidPart(comparedPath.Old), _namespace, ex, BasicDebugLogger.DebugErrorType.CriticalError);
                    throw;
                }


                comparedPath.New = newPath;
                string completeOldPath  = rootPath + "\\" + comparedPath.Old;
                string completeTempPath = PMFileSystem.PackMan_TempRenumberDir + "\\" + comparedPath.New;

                string dirPath = null;
                try
                {
                    dirPath = Path.GetDirectoryName(completeTempPath);
                }
                catch (Exception ex)
                {
                    Logger.WriteErrorLog(LoggerMessages.GeneratorPartsManager.RenumberParts.Error.InvalidTempPath(file.Path), _namespace, ex, BasicDebugLogger.DebugErrorType.CriticalError);
                    throw;
                }

                if (!Directory.Exists(dirPath) && Helper.CreateFolderSafely(dirPath, _namespace, out outEx, LoggerMessages.GeneralError.CREATE_REQUIRED_DIR_FAILED_ARG) == CreateFolderResult.UserCancelled)
                {
                    throw outEx;
                }

                MoveFileResult moveRes = Helper.MoveFileSafely(completeOldPath, completeTempPath, true, _namespace, out outEx
                                                               , new MoveFileLogMessages(sourceFileNotFound: LoggerMessages.GeneratorPartsManager.RenumberParts.Error.UnableMoveToTempSrcNotFound
                                                                                         , moveFileFailed: LoggerMessages.GeneratorPartsManager.RenumberParts.Error.UnableMoveToTemp));
                if (moveRes == MoveFileResult.UserCancelled || moveRes == MoveFileResult.SourceFileNotFound)
                {
                    throw outEx;
                }

                comparedPaths.Add(comparedPath);
            }
        }
        public static void RenumberParts(string parentFolderPath, string _namespace, out LogDataList log, bool relinkGlobalPackages = false)
        {
            log = new LogDataList();
            log.WriteInformationLog(LoggerMessages.GeneratorPartsManager.RenumberParts.Info.RENUMBER_START + parentFolderPath + ".", _namespace);
            Exception outEx;

            if (!Directory.Exists(parentFolderPath))
            {
                return;
            }


            if (Helper.DeleteFolderSafely(PMFileSystem.PackMan_TempRenumberDir, _namespace, out outEx, LoggerMessages.GeneralError.UNABLE_DELETE_TEMP_DIR_ARG) == DeleteFolderResult.UserCancelled)
            {
                throw outEx;
            }

            if (Helper.CreateFolderSafely(PMFileSystem.PackMan_TempRenumberDir, _namespace, out outEx, LoggerMessages.GeneralError.UNABLE_CREATE_TEMP_DIR_ARG) == CreateFolderResult.UserCancelled)
            {
                throw outEx;
            }

            RMPackage tempGenPack = new RMPackage();

            tempGenPack.Name = "Generator Parts Renumber Class";
            LogDataList outLog;

            RMImplicit.RetrievePackFromDir(parentFolderPath, _namespace, true, out outLog, ref tempGenPack);
            log.AppendLogs(outLog);

            if (tempGenPack.Collections == null || tempGenPack.Collections.Count == 0)
            {
                return;
            }

            List <ComparedPath> comparedPaths = null;

            foreach (RMCollection collection in tempGenPack.Collections)
            {
                if (collection is RMGeneratorCollection)
                {
                    RMGeneratorCollection genCollection = collection as RMGeneratorCollection;
                    try
                    {
                        if (genCollection.Parts != null)
                        {
                            comparedPaths = PerformRenumber(genCollection, parentFolderPath, _namespace);
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.WriteErrorLog(LoggerMessages.GeneratorPartsManager.RenumberParts.Error.RENUMBER_ABORT_GENERAL, _namespace, ex, BasicDebugLogger.DebugErrorType.CriticalError);
                        throw;
                    }
                }
            }



            if (comparedPaths != null && comparedPaths.Count > 0)
            {
                foreach (ComparedPath comparedPath in comparedPaths)
                {
                    string completeTempPath  = PMFileSystem.PackMan_TempRenumberDir + "\\" + comparedPath.New;
                    string completeFinalPath = parentFolderPath + "\\" + comparedPath.New;

                    MoveFileResult moveResult = Helper.MoveFileSafely(completeTempPath, completeFinalPath, true, _namespace, out outEx,
                                                                      new MoveFileLogMessages(sourceFileNotFound: LoggerMessages.GeneratorPartsManager.RenumberParts.Error.UnableMoveFinalSrcNotFound
                                                                                              , moveFileFailed: LoggerMessages.GeneratorPartsManager.RenumberParts.Error.UnableMoveFinal));
                    if (moveResult == MoveFileResult.UserCancelled || moveResult == MoveFileResult.SourceFileNotFound)
                    {
                        throw outEx;
                    }

                    if (relinkGlobalPackages && PackageManagement.GlobalPackages != null)
                    {
                        foreach (InstalledPackage package in PackageManagement.GlobalPackages)
                        {
                            if (package.Package != null)
                            {
                                RMGenFile foundFile = package.Package.FindGenFileWithPath(comparedPath.Old);
                                if (foundFile != null)
                                {
                                    foundFile.Path      = comparedPath.New;
                                    package.ChangesMade = true;
                                    goto continuehere;
                                }
                            }
                        }
                    }
                    continuehere :;
                }
                if (relinkGlobalPackages && PackageManagement.GlobalPackages != null)
                {
                    foreach (InstalledPackage package in PackageManagement.GlobalPackages)
                    {
                        if (package.ChangesMade && package.Package != null)
                        {
                            package.Package.SaveToFile(package.XMLPath, _namespace, logMessage : new WriteAllTextLogMessages(writeFailed : LoggerMessages.GeneratorPartsManager.RenumberParts.Error.FailedSaveXML));
                            package.ChangesMade = false;
                        }
                    }
                }
            }

            Helper.DeleteFolderSafely(PMFileSystem.PackMan_TempRenumberDir, _namespace, out outEx, LoggerMessages.GeneralError.UNABLE_DELETE_TEMP_DIR_ARG);
            log.WriteInformationLog(LoggerMessages.GeneratorPartsManager.RenumberParts.Info.RENUMBER_END + parentFolderPath + ".", _namespace);
        }