private static ConcurrentStack <Commit> ReadCommitsFromRefs(string vcsPath) { var refs = Refs.ReadAll(vcsPath); var addedCommits = new ConcurrentDictionary <ObjectHash, bool>(); var result = new ConcurrentStack <Commit>(); Parallel.ForEach(refs, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, @ref => { var gitObject = @ref is TagRef tag ? GitObjectFactory.ReadGitObject(vcsPath, new ObjectHash(tag.CommitHash)) : GitObjectFactory.ReadGitObject(vcsPath, new ObjectHash(@ref.Hash)); while (gitObject is Tag tagObject) { gitObject = GitObjectFactory.ReadGitObject(vcsPath, new ObjectHash(tagObject.Object)); } // Tags pointing to trees are ignored if (gitObject.Type == GitObjectType.Commit && addedCommits.TryAdd(gitObject.Hash, true)) { result.Push((Commit)gitObject); } }); return(result); }
private static ObjectHash RewriteRef(string vcsPath, string hash, string refName, Dictionary <ObjectHash, ObjectHash> rewrittenCommits) { var gitObject = GitObjectFactory.ReadGitObject(vcsPath, new ObjectHash(hash)); if (gitObject.Type == GitObjectType.Commit) { var path = Path.Combine(vcsPath, refName); var correctedHash = GetRewrittenCommitHash(new ObjectHash(hash), rewrittenCommits); Directory.CreateDirectory(Path.GetDirectoryName(path)); File.WriteAllText(path, correctedHash.ToString()); return(correctedHash); } if (gitObject.Type == GitObjectType.Tag) { var tag = (Tag)gitObject; if (tag.PointsToTree) { // Do not touch tags pointing to trees right now as this is not properly implemented yet return(tag.Hash); } var rewrittenObjectHash = tag.PointsToTag ? RewriteRef(vcsPath, tag.Object, "", rewrittenCommits) : GetRewrittenCommitHash(new ObjectHash(tag.Object), rewrittenCommits); // points to commit var rewrittenTag = tag.WithNewObject(rewrittenObjectHash.ToString()); HashContent.WriteObject(vcsPath, rewrittenTag); var path = Path.Combine(vcsPath, "refs/tags", rewrittenTag.TagName); File.WriteAllText(path, rewrittenTag.Hash.ToString()); return(rewrittenTag.Hash); } throw new NotImplementedException(); }
public static bool IsDefectiveTree(string vcsPath, Tree tree) { if (SeenTrees.TryGetValue(tree.Hash, out bool isDefective)) { return(isDefective); } if (Tree.HasDuplicateLines(tree.Lines)) { SeenTrees.TryAdd(tree.Hash, true); return(true); } var childTrees = tree.GetDirectories(); foreach (var childTree in childTrees) { if (SeenTrees.TryGetValue(childTree.Hash, out isDefective)) { if (isDefective) { return(true); } continue; } var childTreeObject = (Tree)GitObjectFactory.ReadGitObject(vcsPath, childTree.Hash); if (IsDefectiveTree(vcsPath, childTreeObject)) { return(true); } } SeenTrees.TryAdd(tree.Hash, false); return(false); }