public bool PushDir(DirectoryInfo localDir, List <FileInfoWithPatchOptions> patchFiles, string remotePath, string linkPath, bool isDMFR)
        {
            VSSItem remoteDir   = VSSDB.get_VSSItem(remotePath);
            VSSItem linkRootDir = VSSDB.get_VSSItem(linkPath);

            foreach (VSSItem item in linkRootDir.Items)
            {
                if (item.Type == 0 && item.Name.Equals(localDir.Name, StringComparison.InvariantCultureIgnoreCase))
                {
                    item.Destroy();
                    sender($"{item.Spec} найдена в {linkRootDir.Spec} и удалена!");
                    break;
                }
            }
            VSSItem linkDir = linkRootDir.NewSubproject(localDir.Name);

            sender($"{linkDir.Spec} создана в {linkRootDir.Spec}");

            string dbScriptsRep = Properties.Settings.Default.ScriptsSubdir;
            string infaRep      = Properties.Settings.Default.InfaSubdir;
            string repDir       = Properties.Settings.Default.RemoteRoot;


            string mask;

            string[]      patchRootDirs;
            List <string> patchesToFindObject = new List <string>();

            bool patchSearchCompleted = false;

            foreach (FileInfoWithPatchOptions fi in patchFiles)
            {
                string   fromPatchPath = fi.FileInfo.Directory.FullName.Substring(localDir.FullName.Length);
                string[] dirs          = fromPatchPath.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);

                sender($"Создаем папки, если их нет: { string.Join(",", dirs) }");

                bool     found;
                IVSSItem currDir = linkDir;

                if (fi.AddToPatch)
                {
                    foreach (string dir in dirs)
                    {
                        found = false;
                        foreach (VSSItem currSubDir in currDir.Items)
                        {
                            if (currSubDir.Type == 0 && currSubDir.Name.Equals(dir, StringComparison.InvariantCultureIgnoreCase))
                            {
                                found = true;
                                sender($"{currSubDir.Spec} найдена в {currDir.Spec}");
                                break;
                            }
                        }

                        if (!found)
                        {
                            string prevDir = currDir.Spec;
                            currDir = currDir.NewSubproject(dir);
                            sender($"{currDir.Spec} создана в {prevDir}");
                        }
                    }
                }

                if (fi.AddInRepDir)
                {
                    string sourceFolder;
                    string repsubdir;
                    //если это скрипт
                    if (fi.FileInfo.Extension.Equals(".sql", StringComparison.InvariantCultureIgnoreCase))
                    {
                        sender($"Ищем в {fi.FileInfo.FullName} по шаблону {dbScriptsRep}\\\\([^\\\\]+)");
                        sourceFolder = Regex.Match(fi.FileInfo.FullName, $"{dbScriptsRep}\\\\([^\\\\]+)").Groups[1].Value;
                        repsubdir    = dbScriptsRep;
                    }
                    else
                    {
                        sender($"Ищем в {fi.FileInfo.FullName} по шаблону {infaRep}\\\\([^\\\\]+)");
                        sourceFolder = Regex.Match(fi.FileInfo.FullName, $"{infaRep}\\\\([^\\\\]+)").Groups[1].Value;
                        repsubdir    = infaRep;
                    }
                    sender($"Ищем в папке {sourceFolder}");

                    if (FirstInEntireBase($"{repDir}/{repsubdir}/{sourceFolder}", fi.FileInfo.Name, -1, false, out string match))
                    {
                        IVSSItem repItem = VSSDB.get_VSSItem(match);
                        CreateLink(repItem, currDir);
                    }
                    else
                    {
                        if (!patchSearchCompleted)
                        {
                            if (isDMFR)
                            {
                                mask          = Properties.Settings.Default.DMFRSubstring;
                                patchRootDirs = Properties.Settings.Default.PatchesRootDirDMFR.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                            }
                            else
                            {
                                mask          = Properties.Settings.Default.DWH4DMSubstring;
                                patchRootDirs = Properties.Settings.Default.PatchesRootDirDWH4DM.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                            }

                            sender($"Ищем {mask} в { string.Join(",", patchRootDirs) }");

                            foreach (string root in patchRootDirs)
                            {
                                try
                                {
                                    foreach (string patch in AllInEntireBase(root, mask, true, -1))
                                    {
                                        patchesToFindObject.Add(patch);
                                    }
                                }
                                catch { }
                            }

                            patchSearchCompleted = true;
                        }

                        sender($"Ищем {fi.FileInfo.Name} в патчах");
                        foreach (string root in patchesToFindObject)
                        {
                            if (FirstInEntireBase(root, fi.FileInfo.Name, -1, false, out string prevVersion))
                            {
                                IVSSItem prevItem = VSSDB.get_VSSItem(prevVersion);
                                CreateLink(prevItem, currDir);
                                break;
                            }
                        }
                    }
                }

                PushFile(currDir.Spec, fi.FileInfo.Directory.FullName, fi.FileInfo.Name, localDir.Name, out VSSItem item);
            }

            return(true);
        }
Example #2
0
        // try to get the path and if not create it
        private VSSItem GetVssItem(string path, VSSItemType type, string ParentName, string dbname)
        {
            VSSItem item = null;

            try {
                item = m_vssDatabase.get_VSSItem(path + ParentName + "/" + dbname, false);
            } catch (Exception ex1) {
                Console.Out.WriteLine(ex1.Message);
                try {
                    // See if the parent exists
                    try {
                        item = m_vssDatabase.get_VSSItem(path + ParentName, false);
                    } catch {
                        m_vssRoot.NewSubproject(ParentName, "Created by ScriptManager");
                    }

                    if (type == VSSItemType.VSSITEM_PROJECT)
                    {
                        item = m_vssRoot.NewSubproject(ParentName + "/" + dbname, "Created by ScriptManager");
                    }
                } catch (Exception ex2) {
                    Console.Out.WriteLine("Caught in GetVssItem method. " + ex2.Message);
                }
            }
            return(item);
        }
Example #3
0
        public bool PushDir(DirectoryInfo localDir, List <FileInfoWithPatchOptions> patchFiles, string remotePath, string linkPath, out List <string> vssPathCheckedOutToAnotherUser)
        {
            VSSItem remoteDir   = VSSDB.get_VSSItem(remotePath);
            VSSItem linkRootDir = VSSDB.get_VSSItem(linkPath);

            foreach (VSSItem item in linkRootDir.Items)
            {
                if (item.Type == 0 && item.Name.Equals(localDir.Name, StringComparison.InvariantCultureIgnoreCase))
                {
                    item.Destroy();
                    sender($"{item.Spec} найдена в {linkRootDir.Spec} и удалена!");
                    break;
                }
            }
            VSSItem linkDir = linkRootDir.NewSubproject(localDir.Name);

            sender($"{linkDir.Spec} создана в {linkRootDir.Spec}");

            vssPathCheckedOutToAnotherUser = new List <string>();

            PushDirRec(localDir, localDir, patchFiles, remoteDir, linkDir, vssPathCheckedOutToAnotherUser);

            if (vssPathCheckedOutToAnotherUser.Count > 0)
            {
                return(false);
            }

            return(true);
        }
Example #4
0
        public void CreateStructure(string dirName, string remoteRoot, string subdir, List <string> repStructure)
        {
            VSSItem repDir    = VSSDB.get_VSSItem(remoteRoot);
            VSSItem repSubdir = repDir.Child[subdir];

            bool found = false;

            foreach (VSSItem currRemoteSubDir in repSubdir.Items)
            {
                if (currRemoteSubDir.Type == 0 && currRemoteSubDir.Name.Equals(dirName, StringComparison.InvariantCultureIgnoreCase))
                {
                    found = true;
                    sender($"{currRemoteSubDir.Spec} найдена в {repSubdir.Spec}");
                    break;
                }
            }

            VSSItem newDir;

            if (found)
            {
                newDir = repSubdir.Child[dirName];
            }
            else
            {
                newDir = repSubdir.NewSubproject(dirName);
                sender($"{newDir.Spec} создана в {repSubdir.Spec}");
            }

            foreach (string path in repStructure)
            {
                string[] dirs = path.Split('/');

                VSSItem currDir = newDir;

                foreach (string dir in dirs)
                {
                    found = false;
                    foreach (VSSItem currSubDir in currDir.Items)
                    {
                        if (currSubDir.Type == 0 && currSubDir.Name.Equals(dir, StringComparison.InvariantCultureIgnoreCase))
                        {
                            found = true;
                            sender($"{currSubDir.Spec} найдена в {currDir.Spec}");
                            break;
                        }
                    }

                    if (!found)
                    {
                        currDir = currDir.NewSubproject(dir);
                        sender($"{currDir.Spec} создана в {currDir.Spec}");
                    }
                }
            }
        }
Example #5
0
        public void PushDirRec
        (
            DirectoryInfo localDir,
            DirectoryInfo patchDir,
            List <FileInfoWithPatchOptions> patchFiles,
            VSSItem remoteDir,
            VSSItem linkDir,
            List <string> vssPathCheckedOutToAnotherUser
        )
        {
            foreach (FileInfoWithPatchOptions fi in patchFiles)
            {
                //определяем, что мы находимся на нужном уровне
                if (fi.FileInfo.Directory.FullName.Equals(localDir.FullName, StringComparison.InvariantCultureIgnoreCase))
                {
                    if (fi.AddInRepDir)
                    {
                        sender($"{fi.FileInfo.Name} добавляется в {remoteDir.Spec}...");
                        if (/*remoteDir != null && */ PushFile(remoteDir.Spec, localDir.FullName, fi.FileInfo.Name, patchDir.Name, out VSSItem item))
                        {
                            CreateLink(item, linkDir);
                        }
                        else
                        {
                            vssPathCheckedOutToAnotherUser.Add($"{remoteDir.Spec}/{fi.FileInfo.Name}");
                        }
                    }
                    else if (fi.AddToPatch)
                    {
                        sender($"{fi.FileInfo.Name} добавляется в {linkDir.Spec}...");
                        if (/*linkDir != null && */ !PushFile(linkDir.Spec, localDir.FullName, fi.FileInfo.Name, patchDir.Name, out VSSItem item))
                        {
                            vssPathCheckedOutToAnotherUser.Add($"{linkDir.Spec}/{fi.FileInfo.Name}");
                        }
                    }
                }
            }

            foreach (DirectoryInfo localSubDir in localDir.EnumerateDirectories("*", SearchOption.TopDirectoryOnly))
            {
                VSSItem remoteSubDir = null;
                VSSItem linkSubDir   = null;

                //проверяем только те папки, для который добавляются файлы в репозитории
                //если там не было папки, добавляем ее
                if (patchFiles.Where(x => x.AddInRepDir)
                    .Select(x => x.FileInfo.Directory)
                    .Where(x => (x.FullName + "\\").StartsWith(localSubDir.FullName + "\\", StringComparison.InvariantCultureIgnoreCase))
                    .Count() > 0)
                {
                    bool found = false;

                    foreach (VSSItem currRemoteSubDir in remoteDir.Items)
                    {
                        if (currRemoteSubDir.Type == 0 && currRemoteSubDir.Name.Equals(localSubDir.Name, StringComparison.InvariantCultureIgnoreCase))
                        {
                            found = true;
                            sender($"{currRemoteSubDir.Spec} найдена в {remoteDir.Spec}");
                            remoteSubDir = currRemoteSubDir;
                        }
                    }

                    //все проверки адекватности пути должны быть перенесены на класс формы
                    if (!found)
                    {
                        remoteSubDir = remoteDir.NewSubproject(localSubDir.Name);
                        sender($"{remoteSubDir.Spec} создана в {remoteDir.Spec}");
                    }
                }

                //проверяем только те папки, для которых добавляются файлы в патчи
                //создаем подпапку
                if (patchFiles.Where(x => x.AddToPatch)
                    .Select(x => x.FileInfo.Directory)
                    .Where(x => (x.FullName + "\\").StartsWith((localSubDir.FullName + "\\"), StringComparison.InvariantCultureIgnoreCase))
                    .Count() > 0)
                {
                    linkSubDir = linkDir.NewSubproject(localSubDir.Name);
                    sender($"{linkSubDir.Spec} создана в {linkDir.Spec}");
                }

                PushDirRec(localSubDir, patchDir, patchFiles, remoteSubDir, linkSubDir, vssPathCheckedOutToAnotherUser);
            }
        }