private static PSPSizeMeasure consolidateMeasures(PSPSizeMeasure[] measures)
        {
            if (measures.Length == 2)
            {
                return(measures[1]);
            }
            else if (measures.Length == 1)
            {
                return(null);
            }
            else if (measures.Length == 0)
            {
                return(null);
            }

            var first = measures.First();
            var last  = measures.Last();

            PSPSizeMeasure result = new PSPSizeMeasure()
            {
                Base  = first.Base,
                Total = last.Total
            };

            for (int i = 1; i < measures.Length; i++)
            {
                result.Added    += measures[i].Added;
                result.Modified += measures[i].Modified;
                result.Deleted  += measures[i].Deleted;
            }

            return(result);
        }
        public static SizeFormModel[] ToPSPForm(this List <ComponentBase.FilePoint.CodeFile> files)
        {
            List <SizeFormModel> forms = new List <SizeFormModel>();

            foreach (var codeFile in files)
            {
                CodeHistory[]    newChanges = new CodeHistory[0];
                PSPSizeMeasure[] measures   = new PSPSizeMeasure[0];

                try
                {
                    newChanges = codeFile.Changes.SkipWhile(h => _visitedHistories.Contains(h.Id)).ToArray();
                    measures   = newChanges.Select(h => h.GetMeasurement(typeof(PSPSizeMeasure).FullName)).Cast <PSPSizeMeasure>().ToArray();

                    var measure = consolidateMeasures(measures);

                    if (measure == null || measure.NewAndChanged + measure.Deleted == 0)
                    {
                        continue;
                    }

                    forms.Add(new SizeFormModel(Guid.NewGuid())
                    {
                        Program   = codeFile.Name,
                        CreatedAt = DateTime.Now,
                        Base      = measure.Base,
                        Added     = measure.Added,
                        Modified  = measure.Modified,
                        Deleted   = measure.Deleted,
                        Reused    = measure.Reused,
                        Total     = measure.Total,
                        Solution  = GetProjectName()
                    });
                }
                catch (Exception e)
                {
                    Logger.Instance.Log(e.ToString());
                }

                for (var i = 0; i < newChanges.Length - 1; i++)
                {
                    _visitedHistories.Add(newChanges[i].Id);
                }
            }

            return(forms.ToArray());
        }
        private PSPSizeMeasure countAsBase(CodeHistory current)
        {
            var c = (LOCMeasure)loc.Measure(current);

            PSPSizeMeasure m = new PSPSizeMeasure()
            {
                Base     = c.PhysicalLOC,
                Added    = 0,
                Deleted  = 0,
                Modified = 0,
                NewReuse = 0,
                Reused   = 0,
                Total    = c.PhysicalLOC
            };

            return(m);
        }
        private PSPSizeMeasure countAsModification(CodeHistory current, CodeHistory previous)
        {
            var c1 = (LOCMeasure)loc.Measure(previous);
            var c2 = (LOCMeasure)loc.Measure(current);

            var changes = DiffHelper.SimpleDiff(current.Content, previous.Content);

            PSPSizeMeasure m = new PSPSizeMeasure()
            {
                Base     = c1.PhysicalLOC,
                Added    = changes.Count(t => t == ChangeType.Inserted),
                Deleted  = changes.Count(t => t == ChangeType.Deleted),
                Modified = changes.Count(t => t == ChangeType.Modified),
                Total    = c2.PhysicalLOC
            };

            return(m);
        }