public VersionAnalysisResult AnalyzeVersions(AssemblyPublicInterface localPublicInterface,
                                                     AssemblyPublicInterface onlinePublicInterface)
        {
            var result = new VersionAnalysisResult();

            result.ActualBump     = CompareVersions(onlinePublicInterface.Version, localPublicInterface.Version, result);
            result.CalculatedBump = AnalyzeInterfaces(onlinePublicInterface, localPublicInterface, result.Changes);

            return(result);
        }
        static VersionBumpType CompareVersions(string online, string local, VersionAnalysisResult result)
        {
            if (online.MajorVersion() > local.MajorVersion())
            {
                result.Comments.Add("Cannot downgrade major version.");
                return(VersionBumpType.Downgrade);
            }

            if (online.MajorVersion() < local.MajorVersion())
            {
                if (local.MinorVersion() != 0)
                {
                    result.Comments.Add("The minor version should be reset to 0 when bumping the major version.");
                }
                else if (local.PatchVersion() != 0)
                {
                    result.Comments.Add("The patch version should be reset to 0 when bumping the major version.");
                }

                return(VersionBumpType.Major);
            }

            if (online.MinorVersion() > local.MinorVersion())
            {
                result.Comments.Add("Cannot downgrade minor version.");
                return(VersionBumpType.Downgrade);
            }

            if (online.MinorVersion() < local.MinorVersion())
            {
                if (local.PatchVersion() != 0)
                {
                    result.Comments.Add("The patch version should be reset to 0 when bumping the minor version.");
                }

                return(VersionBumpType.Minor);
            }

            if (online.PatchVersion() > local.PatchVersion())
            {
                result.Comments.Add("Cannot downgrade patch version.");
                return(VersionBumpType.Downgrade);
            }

            if (online.PatchVersion() < local.PatchVersion())
            {
                return(VersionBumpType.Patch);
            }

            return(VersionBumpType.None);
        }