diff --git a/gitinspector/blame.py b/gitinspector/blame.py index d175aed..b012be1 100644 --- a/gitinspector/blame.py +++ b/gitinspector/blame.py @@ -1,6 +1,6 @@ # coding: utf-8 # -# Copyright © 2012-2013 Ejwa Software. All rights reserved. +# Copyright © 2012-2014 Ejwa Software. All rights reserved. # # This file is part of gitinspector. # @@ -41,7 +41,7 @@ NUM_THREADS = multiprocessing.cpu_count() class BlameEntry: rows = 0 - skew = 0 # Used when calculating average code age (time-adjusted stability value). + skew = 0 # Used when calculating average code age. comments = 0 __thread_lock__ = threading.BoundedSemaphore(NUM_THREADS) @@ -151,6 +151,13 @@ class Blame: content = re.search(" \d+\)(.*)", string) return content.group(1).lstrip() + @staticmethod + def get_stability(author, blamed_rows, changes): + if author in changes.get_authorinfo_list(): + return 100.0 * blamed_rows / changes.get_authorinfo_list()[author].insertions + + return 100 + @staticmethod def get_time(string): time = re.search(" \(.*?(\d\d\d\d-\d\d-\d\d)", string) @@ -215,8 +222,7 @@ class BlameOutput(Outputable): blame_xml += "<td>" + entry[0] + "</td>" blame_xml += "<td>" + str(entry[1].rows) + "</td>" - blame_xml += "<td>" + ("{0:.1f}".format(100.0 * entry[1].rows / - self.changes.get_authorinfo_list()[entry[0]].insertions) + "</td>") + blame_xml += "<td>" + ("{0:.1f}".format(Blame.get_stability(entry[0], entry[1].rows, self.changes)) + "</td>") blame_xml += "<td>" + "{0:.1f}".format(float(entry[1].skew) / entry[1].rows) + "</td>" blame_xml += "<td>" + "{0:.2f}".format(100.0 * entry[1].comments / entry[1].rows) + "</td>" blame_xml += "<td style=\"display: none\">" + work_percentage + "</td>" @@ -257,7 +263,7 @@ class BlameOutput(Outputable): for i in sorted(__blame__.get_summed_blames().items()): print(i[0].ljust(20)[0:20], end=" ") print(str(i[1].rows).rjust(10), end=" ") - print("{0:.1f}".format(100.0 * i[1].rows / self.changes.get_authorinfo_list()[i[0]].insertions).rjust(14), end=" ") + print("{0:.1f}".format(Blame.get_stability(i[0], i[1].rows, self.changes)).rjust(14), end=" ") print("{0:.1f}".format(float(i[1].skew) / i[1].rows).rjust(12), end=" ") print("{0:.2f}".format(100.0 * i[1].comments / i[1].rows).rjust(19)) @@ -271,8 +277,8 @@ class BlameOutput(Outputable): name_xml = "\t\t\t\t<name>" + i[0] + "</name>\n" gravatar_xml = "\t\t\t\t<gravatar>" + gravatar.get_url(author_email) + "</gravatar>\n" rows_xml = "\t\t\t\t<rows>" + str(i[1].rows) + "</rows>\n" - stability_xml = ("\t\t\t\t<stability>" + "{0:.1f}".format(100.0 * i[1].rows / - self.changes.get_authorinfo_list()[i[0]].insertions) + "</stability>\n") + stability_xml = ("\t\t\t\t<stability>" + "{0:.1f}".format(Blame.get_stability(i[0], i[1].rows, + self.changes)) + "</stability>\n") age_xml = ("\t\t\t\t<age>" + "{0:.1f}".format(float(i[1].skew) / i[1].rows) + "</age>\n") percentage_in_comments_xml = ("\t\t\t\t<percentage-in-comments>" + "{0:.2f}".format(100.0 * i[1].comments / i[1].rows) + "</percentage-in-comments>\n")