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); }
// 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); }
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); }
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}"); } } } }
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); } }