private static void AddTreeNode(SourceControlDirectory root, string fullPath, IRepository repositoryOpt) { var segments = PathUtilities.Split(fullPath); var node = root; for (int i = 0; i < segments.Length; i++) { int index = node.FindChildIndex(segments[i]); if (index >= 0) { node = node.OrderedChildren[index]; } else { var newNode = new SourceControlDirectory(segments[i]); node.OrderedChildren.Insert(~index, newNode); node = newNode; } if (i == segments.Length - 1) { node.SetRepository(fullPath, repositoryOpt); } } }
// internal for testing internal static SourceControlDirectory GetContainingRepository(string fullPath, SourceControlDirectory root) { var segments = PathUtilities.Split(fullPath); Debug.Assert(segments.Length > 0); Debug.Assert(root.RepositoryFullPath == null); SourceControlDirectory containingRepositoryNode = null; var node = root; for (int i = 0; i < segments.Length - 1; i++) { int index = node.FindChildIndex(segments[i]); if (index < 0) { break; } node = node.OrderedChildren[index]; if (node.RepositoryFullPath != null) { containingRepositoryNode = node; } } return(containingRepositoryNode); }
internal static SourceControlDirectory BuildDirectoryTree(IRepository repository) { var repoRoot = Path.GetFullPath(repository.Info.WorkingDirectory); var treeRoot = new SourceControlDirectory(""); AddTreeNode(treeRoot, repoRoot, repository); foreach (var submodule in repository.Submodules) { string fullPath; try { fullPath = Path.GetFullPath(Path.Combine(repoRoot, submodule.Path)); } catch { // ignore submodules with bad paths continue; } AddTreeNode(treeRoot, fullPath, repositoryOpt: null); } return(treeRoot); }