Exemple #1
0
        public async Task <Dictionary <string, Commit> > Run(IEnumerable <string> commitsToRewrite)
        {
            _progress = new Progress();
            commitMap = commitsToRewrite
                        .ToDictionary(sha => sha, sha => Task.Factory.StartNew(() =>
            {
                var x = new CommitMetadata(repo.Lookup <Commit>(sha));
                System.Threading.Interlocked.Increment(ref _progress.Loaded);
                return(x);
            }, new System.Threading.CancellationToken(), TaskCreationOptions.LongRunning, ioScheduler));

            var rewriterTasks = commitMap.Keys
                                .ToDictionary(sha => sha, sha => new Task <Task <Commit> >(() => rewrite(sha)));

            rewrittenMap = rewriterTasks
                           .ToDictionary(e => e.Key, e => e.Value.Unwrap().ContinueWith(t =>
            {
                System.Threading.Interlocked.Increment(ref _progress.Done);
                return(t.Result);
            }));

            // Now start our tasks
            Parallel.ForEach(rewriterTasks.Values, t => t.Start());
            await Task.WhenAll(rewrittenMap.Values);

            return(rewrittenMap
                   .ToDictionary(e => e.Key, e => e.Value.Result));
        }
Exemple #2
0
        private async Task <IEnumerable <Commit> > GetOriginalParents(CommitMetadata commitMeta)
        {
            var parents = new List <Commit>();

            if (commitMeta.Original == null)
            {
                return(parents);
            }

            foreach (var parent in commitMeta.Original.Parents)
            {
                if (commitMap.ContainsKey(parent.Sha))
                {
                    var rewrittenParent = await Map(parent.Sha).ConfigureAwait(false);

                    if (rewrittenParent != null)
                    {
                        parents.AddRange(rewrittenParent);
                    }
                }
                else
                {
                    // Not being rewritten
                    parents.Add(parent);
                }
            }

            return(parents);
        }
Exemple #3
0
        public bool pruneEmptyFilter(CommitMetadata commit, Tree savedTree)
        {
            // Re-process merges to eliminate branches that don't contribute anything to the tree
            if (commit.Parents.Count > 1 && pruneMergesAggressive)
            {
                var treeSameTo = commit.Parents.Where(p => savedTree.Equals(p.Tree)).FirstOrDefault();

                if (treeSameTo != null)
                {
                    // eliminate the parents that are not treesame as they contribute nothing
                    commit.Parents = commit.Parents.Where(p => p.Tree.Equals(treeSameTo.Tree)).Distinct().ToList();

                    // If it's demoted from a merge, it's a pointless commit now
                    // as it's treesame to its only parent. So dump out early and drop it
                    if (commit.Parents.Count == 1)
                    {
                        return(false);
                    }
                }
            }

            if (commit.Parents.Count == 2 && pruneMerges)
            {
                // Heuristic to quickly eliminate the common case of a triangle
                var p1 = commit.Parents[0];
                var p2 = commit.Parents[1];

                if (p2.Parents.Contains(p1))
                {
                    // p1 is redundant as it's reachable from p2
                    commit.Parents.Remove(p1);
                }
                else if (p1.Parents.Contains(p2))
                {
                    // p2 is redundant since reachable from p1
                    commit.Parents.Remove(p2);
                }
            }

            if (commit.Parents.Count > 1 && pruneMerges)
            {
                commit.Parents = GetIndependent(commit.Parents.Distinct());
            }

            if (commit.Parents.Count == 0)
            {
                return(savedTree.Count != 0); // Don't include null trees if we're a root
            }

            if (commit.Parents.Count == 1 && savedTree.Equals(commit.Parents[0].Tree))
            {
                return(false); // Skip unchanged
            }

            return(true);
        }
Exemple #4
0
 private async Task <bool> runParentFilters(CommitMetadata meta)
 {
     foreach (var f in filters.ParentFilters)
     {
         if (await f.FilterParents(meta, parentCtx).ConfigureAwait(false) == false)
         {
             return(false); // drop!
         }
     }
     return(true);
 }
Exemple #5
0
        private bool runMetadataFilters(CommitMetadata meta)
        {
            foreach (var f in filters.MetadataFilters)
            {
                if (f.FilterCommit(meta, metaCtx) == false)
                {
                    return(false); // Drop
                }
            }

            return(true);
        }