protected override double GetFileEstimation(ProjectFile file)
 {
     return repository.SelectionDSL()
         .Commits().TillRevision(PredictionRelease)
         .Files().IdIs(file.ID)
         .Modifications().InCommits().InFiles()
         .CodeBlocks().InModifications().CalculateLOC();
 }
Ejemplo n.º 2
0
        private bool CheckLinesContent(IRepository repository, IScmData scmData, string testRevision, ProjectFile file, bool resultOnly)
        {
            IBlame fileBlame = null;
            try
            {
                fileBlame = scmData.Blame(testRevision, file.Path);
            }
            catch
            {
            }
            if (fileBlame == null)
            {
                if (! resultOnly)
                {
                    Console.WriteLine("File {0} does not exist.", file.Path);
                }
                return false;
            }

            double currentLOC = repository.SelectionDSL()
                    .Commits().TillRevision(testRevision)
                    .Files().IdIs(file.ID)
                    .Modifications().InCommits().InFiles()
                    .CodeBlocks().InModifications()
                    .CalculateLOC();

            bool correct = currentLOC == fileBlame.Count;

            if (! correct)
            {
                if (! resultOnly)
                {
                    Console.WriteLine("Incorrect number of lines in file {0}. {1} should be {2}",
                        file.Path, currentLOC, fileBlame.Count
                    );
                }
                else
                {
                    return false;
                }
            }

            SmartDictionary<string, int> linesByRevision = new SmartDictionary<string, int>(x => 0);
            foreach (var line in fileBlame)
            {
                linesByRevision[line.Value]++;
            }

            var codeBySourceRevision =
            (
                from f in repository.Queryable<ProjectFile>()
                join m in repository.Queryable<Modification>() on f.ID equals m.FileID
                join cb in repository.Queryable<CodeBlock>() on m.ID equals cb.ModificationID
                join c in repository.Queryable<Commit>() on m.CommitID equals c.ID
                let addedCodeBlock = repository.Queryable<CodeBlock>()
                    .Single(x => x.ID == (cb.Size < 0 ? cb.TargetCodeBlockID : cb.ID))
                let codeAddedInitiallyInRevision = repository.Queryable<Commit>()
                    .Single(x => x.ID == addedCodeBlock.AddedInitiallyInCommitID)
                    .Revision
                let testRevisionNumber = repository.Queryable<Commit>()
                    .Single(x => x.Revision == testRevision)
                    .OrderedNumber
                where
                    f.ID == file.ID
                    &&
                    c.OrderedNumber <= testRevisionNumber
                group cb.Size by codeAddedInitiallyInRevision into g
                select new
                {
                    FromRevision = g.Key,
                    CodeSize = g.Sum()
                }
            ).Where(x => x.CodeSize != 0).ToList();

            var errorCode =
                (
                    from codeFromRevision in codeBySourceRevision
                    where
                        codeFromRevision.CodeSize != linesByRevision[codeFromRevision.FromRevision]
                    select new
                    {
                        SourceRevision = codeFromRevision.FromRevision,
                        CodeSize = codeFromRevision.CodeSize,
                        RealCodeSize = linesByRevision[codeFromRevision.FromRevision]
                    }
                ).ToList();

            correct =
                correct
                &&
                codeBySourceRevision.Count() == linesByRevision.Count
                &&
                errorCode.Count == 0;

            if (! resultOnly)
            {
                if (codeBySourceRevision.Count() != linesByRevision.Count)
                {
                    Console.WriteLine("Number of revisions file {0} contains code from is incorrect. {1} should be {2}",
                        file.Path, codeBySourceRevision.Count(), linesByRevision.Count
                    );
                }
                foreach (var error in errorCode)
                {
                    Console.WriteLine("Incorrect number of lines in file {0} from revision {1}. {2} should be {3}",
                        file.Path,
                        error.SourceRevision,
                        error.CodeSize,
                        error.RealCodeSize
                    );
                }
                if ((! correct) && (errorCode.Count > 0))
                {
                    string latestCodeRevision = repository.LastRevision(errorCode.Select(x => x.SourceRevision));

                    var commitsFileTouchedIn = repository.SelectionDSL()
                        .Files().IdIs(file.ID)
                        .Commits().FromRevision(latestCodeRevision).TouchFiles()
                        .OrderBy(c => c.OrderedNumber);

                    foreach (var commit in commitsFileTouchedIn)
                    {
                        if (!CheckLinesContent(repository, scmData, commit.Revision, file, true))
                        {
                            Console.WriteLine("{0} - incorrectly mapped commit.", commit.Revision);
                            if ((automaticallyFixDiffErrors) && (errorCode.Sum(x => x.CodeSize - x.RealCodeSize) == 0))
                            {
                                var incorrectDeleteCodeBlocks =
                                    from cb in repository.SelectionDSL()
                                        .Commits().RevisionIs(commit.Revision)
                                        .Files().PathIs(file.Path)
                                        .Modifications().InCommits().InFiles()
                                        .CodeBlocks().InModifications().Deleted()
                                    join tcb in repository.Queryable<CodeBlock>() on cb.TargetCodeBlockID equals tcb.ID
                                    join m in repository.Queryable<Modification>() on tcb.ModificationID equals m.ID
                                    join c in repository.Queryable<Commit>() on m.CommitID equals c.ID
                                    where
                                        errorCode.Select(x => x.SourceRevision).Contains(c.Revision)
                                    select new
                                    {
                                        Code = cb,
                                        TargetRevision = c.Revision
                                    };

                                foreach (var error in errorCode)
                                {
                                    var incorrectDeleteCodeBlock = incorrectDeleteCodeBlocks.SingleOrDefault(x => x.TargetRevision == error.SourceRevision);
                                    var codeBlock = incorrectDeleteCodeBlock == null ? null : incorrectDeleteCodeBlock.Code;
                                    double difference = error.CodeSize - error.RealCodeSize;
                                    if (codeBlock == null)
                                    {
                                        codeBlock = new CodeBlock()
                                        {
                                            Size = 0,
                                            Modification = repository.SelectionDSL()
                                                .Commits().RevisionIs(commit.Revision)
                                                .Files().PathIs(file.Path)
                                                .Modifications().InCommits().InFiles().Single(),
                                        };
                                        repository.Add(codeBlock);
                                    }
                                    Console.WriteLine("Fix code block size for file {0} in revision {1}:", file.Path, commit.Revision);
                                    Console.Write("Was {0}", codeBlock.Size);
                                    codeBlock.Size -= difference;
                                    if (codeBlock.Size == 0)
                                    {
                                        repository.Delete(codeBlock);
                                    }
                                    else if ((codeBlock.Size > 0) && (codeBlock.AddedInitiallyInCommitID == null))
                                    {
                                        codeBlock.AddedInitiallyInCommit = commit;
                                    }
                                    else if ((codeBlock.Size < 0) && (codeBlock.TargetCodeBlockID == null))
                                    {
                                        codeBlock.TargetCodeBlock = repository.SelectionDSL()
                                            .Commits().RevisionIs(error.SourceRevision)
                                            .Files().PathIs(file.Path)
                                            .Modifications().InFiles()
                                            .CodeBlocks().InModifications().AddedInitiallyInCommits().Single();
                                    }
                                    Console.WriteLine(", now {0}", codeBlock.Size);
                                }
                            }
                            break;
                        }
                    }
                }
            }

            return correct;
        }
 protected abstract double GetFileEstimation(ProjectFile file);
 protected void NewFile(ProjectFile file)
 {
     Estimation = repositories.SelectionDSL()
         .Commits().BeforeRevision(model.PredictionRelease)
         .Files().IdIs(file.ID)
         .Modifications().InCommits().InFiles()
         .CodeBlocks().InModifications().CalculateDefectCodeDensity(model.PredictionRelease);
 }
 public virtual void NewFile(ProjectFile file)
 {
     codeSetEstimations = new List<double>();
 }
        protected override double GetFileEstimation(ProjectFile file)
        {
            var codeBlocks = repositories.SelectionDSL()
                .Commits().TillRevision(PredictionRelease)
                .Files().IdIs(file.ID)
                .Modifications().InCommits().InFiles()
                .CodeBlocks().InModifications().CalculateRemainingCodeSize(PredictionRelease);

            var codeByRevision = (
                from rcb in codeBlocks
                join cb in repositories.Repository<CodeBlock>() on rcb.Key equals cb.ID
                join m in repositories.Repository<Modification>() on cb.ModificationID equals m.ID
                join c in repositories.Repository<Commit>() on m.CommitID equals c.ID
                join ic in repositories.Repository<Commit>() on cb.AddedInitiallyInCommitID equals ic.ID
                select new CodeSetData()
                {
                    Revision = c.Revision,
                    PathID = file.ID,
                    RemainCodeSize = rcb.Value,
                    AgeInDays = (ReleaseDate - ic.Date).TotalDays,

                    AddedCodeSizeResolver = AddedCodeSizeResolver,
                    DefectCodeSizeResolver = DefectCodeSizeResolver,
                    RemainCodeSizeFromRevisionResolver = RemainCodeSizeFromRevisionResolver,
                    AddedCodeSizeFromRevisionResolver = AddedCodeSizeFromRevisionResolver,
                    DefectCodeSizeFromRevisionResolver = DefectCodeSizeFromRevisionResolver
                }).ToArray();

            OnNewFile(file);
            foreach (var codeFromRevision in codeByRevision)
            {
                OnNewCodeSet(codeFromRevision);
            }

            return FileEstimation.FileEstimation;
        }
 protected void NewFile(ProjectFile file)
 {
     fileEstimation = DCDF[file.ID];
 }
 protected override double GetFileEstimation(ProjectFile file)
 {
     double numberOfBugsReal = NumberOfFixedDefectsForFile(file.ID);
     double numberOfBugsEstimation = regression.Predict(
         GetPredictorValuesFor(context.SetFiles(e => e.IdIs(file.ID)))[0]
     );
     double numberOfBugs = numberOfBugsEstimation - numberOfBugsReal;
     return numberOfBugs > 0 ? numberOfBugs : 0;
 }
 protected override double GetFileEstimation(ProjectFile file)
 {
     return regression.Predict(
         GetPredictorValuesFor(context.SetFiles(e => e.IdIs(file.ID)))
     );
 }