/// <summary> /// Adds or replaces a <see cref="TreeEntryDefinition"/> at the specified <paramref name="targetTreeEntryPath"/> location. /// </summary> /// <param name="targetTreeEntryPath">The path within this <see cref="TreeDefinition"/>.</param> /// <param name="treeEntryDefinition">The <see cref="TreeEntryDefinition"/> to be stored at the described location.</param> /// <returns>The current <see cref="TreeDefinition"/>.</returns> public virtual TreeDefinition Add(string targetTreeEntryPath, TreeEntryDefinition treeEntryDefinition) { Ensure.ArgumentNotNullOrEmptyString(targetTreeEntryPath, "targetTreeEntryPath"); Ensure.ArgumentNotNull(treeEntryDefinition, "treeEntryDefinition"); if (treeEntryDefinition is TransientTreeTreeEntryDefinition) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "The {0} references a target which hasn't been created in the {1} yet. " + "This situation can occur when the target is a whole new {2} being created, " + "or when an existing {2} is being updated because some of its children were added/removed.", typeof(TreeEntryDefinition).Name, typeof(ObjectDatabase).Name, typeof(Tree).Name)); } Tuple <string, string> segments = ExtractPosixLeadingSegment(targetTreeEntryPath); if (segments.Item2 != null) { TreeDefinition td = RetrieveOrBuildTreeDefinition(segments.Item1, true); td.Add(segments.Item2, treeEntryDefinition); } else { AddEntry(segments.Item1, treeEntryDefinition); } return(this); }
/// <summary> /// Builds a <see cref="TreeDefinition"/> from an existing <see cref="Tree"/>. /// </summary> /// <param name="tree">The <see cref="Tree"/> to be processed.</param> /// <returns>A new <see cref="TreeDefinition"/> holding the meta data of the <paramref name="tree"/>.</returns> public static TreeDefinition From(Tree tree) { Ensure.ArgumentNotNull(tree, "tree"); var td = new TreeDefinition(); foreach (TreeEntry treeEntry in tree) { td.Add(treeEntry.Name, treeEntry); } return(td); }
private TreeDefinition RetrieveOrBuildTreeDefinition(string treeName, bool shouldOverWrite) { TreeDefinition td; if (unwrappedTrees.TryGetValue(treeName, out td)) { return(td); } TreeEntryDefinition treeEntryDefinition; bool hasAnEntryBeenFound = entries.TryGetValue(treeName, out treeEntryDefinition); if (hasAnEntryBeenFound) { switch (treeEntryDefinition.TargetType) { case TreeEntryTargetType.Tree: td = From(treeEntryDefinition.Target as Tree); break; case TreeEntryTargetType.Blob: case TreeEntryTargetType.GitLink: if (shouldOverWrite) { td = new TreeDefinition(); break; } return(null); default: throw new NotImplementedException(); } } else { if (!shouldOverWrite) { return(null); } td = new TreeDefinition(); } entries[treeName] = new TransientTreeTreeEntryDefinition(); unwrappedTrees.Add(treeName, td); return(td); }
/// <summary> /// Retrieves the <see cref="TreeEntryDefinition"/> located the specified <paramref name="treeEntryPath"/> path. /// </summary> /// <param name="treeEntryPath">The path within this <see cref="TreeDefinition"/>.</param> /// <returns>The found <see cref="TreeEntryDefinition"/> if any; null otherwise.</returns> public virtual TreeEntryDefinition this[string treeEntryPath] { get { Ensure.ArgumentNotNullOrEmptyString(treeEntryPath, "treeEntryPath"); Tuple <string, string> segments = ExtractPosixLeadingSegment(treeEntryPath); if (segments.Item2 != null) { TreeDefinition td = RetrieveOrBuildTreeDefinition(segments.Item1, false); return(td == null ? null : td[segments.Item2]); } TreeEntryDefinition treeEntryDefinition; return(!entries.TryGetValue(segments.Item1, out treeEntryDefinition) ? null : treeEntryDefinition); } }
/// <summary> /// Inserts a <see cref="Tree"/> into the object database, created from a <see cref="TreeDefinition"/>. /// </summary> /// <param name="treeDefinition">The <see cref="TreeDefinition"/>.</param> /// <returns>The created <see cref="Tree"/>.</returns> public virtual Tree CreateTree(TreeDefinition treeDefinition) { Ensure.ArgumentNotNull(treeDefinition, "treeDefinition"); return(treeDefinition.Build(repo)); }