示例#1
0
 def analyze(self):
     for path in self._changelog_paths:
         self._set_filename(self._filesystem.relpath(path, self._scm.checkout_root))
         with self._filesystem.open_text_file_for_reading(path) as changelog:
             self._print_status('Parsing entries...')
             number_of_parsed_entries = self._analyze_entries(ChangeLog.parse_entries_from_file(changelog), path)
         self._print_status('Done (%d entries)' % number_of_parsed_entries)
     print()
     self._summary['contributors'] = len(self._contributors_statistics)
     self._summary['contributors_with_reviews'] = sum([1 for contributor in self._contributors_statistics.values() if contributor['reviews']['total']])
     self._summary['contributors_without_reviews'] = self._summary['contributors'] - self._summary['contributors_with_reviews']
示例#2
0
 def analyze(self):
     for path in self._changelog_paths:
         self._set_filename(self._filesystem.relpath(path, self._scm.checkout_root))
         with self._filesystem.open_text_file_for_reading(path) as changelog:
             self._print_status('Parsing entries...')
             number_of_parsed_entries = self._analyze_entries(ChangeLog.parse_entries_from_file(changelog), path)
         self._print_status('Done (%d entries)' % number_of_parsed_entries)
     print
     self._summary['contributors'] = len(self._contributors_statistics)
     self._summary['contributors_with_reviews'] = sum([1 for contributor in self._contributors_statistics.values() if contributor['reviews']['total']])
     self._summary['contributors_without_reviews'] = self._summary['contributors'] - self._summary['contributors_with_reviews']
示例#3
0
    def test_parse_log_entries_from_annotated_file(self):
        # Note that there are trailing spaces on some of the lines intentionally.
        changelog_file = StringIO(
            u"100000 [email protected] 2011-11-11  Csaba Osztrogon\u00e1c  <*****@*****.**>\n"
            u"100000 [email protected]\n"
            u"100000 [email protected]         100,000 !!!\n"
            u"100000 [email protected] \n"
            u"100000 [email protected]         Reviewed by Zoltan Herczeg.\n"
            u"100000 [email protected] \n"
            u"100000 [email protected]         * ChangeLog: Point out revision 100,000.\n"
            u"100000 [email protected] \n"
            u"93798 [email protected] 2011-08-25  Alexey Proskuryakov  <*****@*****.**>\n"
            u"93798 [email protected] \n"
            u"93798 [email protected]         Fix build when GCC 4.2 is not installed.\n"
            u"93798 [email protected] \n"
            u"93798 [email protected]         * gtest/xcode/Config/CompilerVersion.xcconfig: Copied from Source/WebCore/Configurations/CompilerVersion.xcconfig.\n"
            u"93798 [email protected]         * gtest/xcode/Config/General.xcconfig:\n"
            u"93798 [email protected]         Use the same compiler version as other projects do.\n"
            u"93798 [email protected]\n"
            u"99491 [email protected] 2011-11-03  Andreas Kling  <*****@*****.**>\n"
            u"99491 [email protected] \n"
            u"99190 [email protected]         Unreviewed build fix, sigh.\n"
            u"99190 [email protected] \n"
            u"99190 [email protected]         * css/CSSFontFaceRule.h:\n"
            u"99190 [email protected]         * css/CSSMutableStyleDeclaration.h:\n"
            u"99190 [email protected]\n"
            u"99190 [email protected] 2011-11-03  Andreas Kling  <*****@*****.**>\n"
            u"99190 [email protected] \n"
            u"99187 [email protected]         Unreviewed build fix, out-of-line StyleSheet::parentStyleSheet()\n"
            u"99187 [email protected]         again since there's a cycle in the includes between CSSRule/StyleSheet.\n"
            u"99187 [email protected] \n"
            u"99187 [email protected]         * css/StyleSheet.cpp:\n"
            u"99187 [email protected]         (WebCore::StyleSheet::parentStyleSheet):\n"
            u"99187 [email protected]         * css/StyleSheet.h:\n"
            u"99187 [email protected] \n")

        parsed_entries = list(
            ChangeLog.parse_entries_from_file(changelog_file))
        self.assertEqual(parsed_entries[0].revision(), 100000)
        self.assertEqual(parsed_entries[0].reviewer_text(), "Zoltan Herczeg")
        self.assertEqual(parsed_entries[0].author_name(),
                         u"Csaba Osztrogon\u00e1c")
        self.assertEqual(parsed_entries[0].author_email(), "*****@*****.**")
        self.assertEqual(parsed_entries[1].revision(), 93798)
        self.assertEqual(parsed_entries[1].author_name(),
                         "Alexey Proskuryakov")
        self.assertEqual(parsed_entries[2].revision(), 99190)
        self.assertEqual(parsed_entries[2].author_name(), "Andreas Kling")
        self.assertEqual(parsed_entries[3].revision(), 99187)
        self.assertEqual(parsed_entries[3].author_name(), "Andreas Kling")
示例#4
0
    def _resolve_existing_entry(self, changelog_path):
        # When this is called, the top entry in the ChangeLog was just created
        # by prepare-ChangeLog, as an clean updated version of the one below it.
        with self._tool.filesystem.open_text_file_for_reading(changelog_path) as changelog_file:
            entries_gen = ChangeLog.parse_entries_from_file(changelog_file)
            entries = zip(entries_gen, range(2))

        if not len(entries):
            raise Exception("Expected to find at least two ChangeLog entries in %s but found none." % changelog_path)
        if len(entries) == 1:
            # If we get here, it probably means we've just rolled over to a
            # new CL file, so we don't have anything to resolve.
            return

        (new_entry, _), (old_entry, _) = entries
        final_entry = self._merge_entries(old_entry, new_entry)

        changelog = ChangeLog(changelog_path, self._tool.filesystem)
        changelog.delete_entries(2)
        changelog.prepend_text(final_entry)
示例#5
0
    def _resolve_existing_entry(self, changelog_path):
        # When this is called, the top entry in the ChangeLog was just created
        # by prepare-ChangeLog, as an clean updated version of the one below it.
        with self._tool.filesystem.open_text_file_for_reading(changelog_path) as changelog_file:
            entries_gen = ChangeLog.parse_entries_from_file(changelog_file)
            entries = zip(entries_gen, range(2))

        if not len(entries):
            raise Exception("Expected to find at least two ChangeLog entries in %s but found none." % changelog_path)
        if len(entries) == 1:
            # If we get here, it probably means we've just rolled over to a
            # new CL file, so we don't have anything to resolve.
            return

        (new_entry, _), (old_entry, _) = entries
        final_entry = self._merge_entries(old_entry, new_entry)

        changelog = ChangeLog(changelog_path, self._tool.filesystem)
        changelog.delete_entries(2)
        changelog.prepend_text(final_entry)
示例#6
0
 def test_parse_log_entries_from_changelog(self):
     changelog_file = StringIO(self._example_changelog)
     parsed_entries = list(
         ChangeLog.parse_entries_from_file(changelog_file))
     self.assertEqual(len(parsed_entries), 9)
     self.assertEqual(
         parsed_entries[0].date_line(),
         u"2009-08-17  Fr\u00e9d\u00e9ric Wang  <*****@*****.**>")
     self.assertEqual(parsed_entries[0].date(), "2009-08-17")
     self.assertEqual(parsed_entries[0].reviewer_text(), "David Levin")
     self.assertEqual(parsed_entries[0].is_touched_files_text_clean(),
                      False)
     self.assertIsNone(parsed_entries[0].bug_description())
     self.assertEqual(parsed_entries[1].date_line(),
                      "2009-08-16  David Kilzer  <*****@*****.**>")
     self.assertEqual(parsed_entries[1].date(), "2009-08-16")
     self.assertEqual(parsed_entries[1].author_email(),
                      "*****@*****.**")
     self.assertEqual(parsed_entries[1].bug_description(),
                      "Backed out r47343 which was mistakenly committed")
     self.assertEqual(
         parsed_entries[1].touched_files_text(),
         "        * Scripts/bugzilla-tool:\n        * Scripts/modules/scm.py:\n"
     )
     self.assertEqual(parsed_entries[1].is_touched_files_text_clean(), True)
     self.assertEqual(parsed_entries[2].reviewer_text(), "Mark Rowe")
     self.assertEqual(parsed_entries[2].touched_files(),
                      ["DumpRenderTree/mac/DumpRenderTreeWindow.mm"])
     self.assertEqual(
         parsed_entries[2].touched_functions(), {
             "DumpRenderTree/mac/DumpRenderTreeWindow.mm":
             ["-[DumpRenderTreeWindow close]"]
         })
     self.assertEqual(parsed_entries[2].is_touched_files_text_clean(),
                      False)
     self.assertIsNone(parsed_entries[2].bug_description())
     self.assertEqual(parsed_entries[3].author_name(), "Benjamin Poulain")
     self.assertEqual(parsed_entries[3].touched_files(), [
         "platform/cf/KURLCFNet.cpp", "platform/mac/KURLMac.mm",
         "WebCoreSupport/ChromeClientEfl.cpp", "ewk/ewk_private.h",
         "ewk/ewk_view.cpp"
     ])
     self.assertEqual(
         parsed_entries[3].touched_functions(), {
             "platform/cf/KURLCFNet.cpp": [
                 "WebCore::createCFURLFromBuffer",
                 "WebCore::KURL::createCFURL"
             ],
             "platform/mac/KURLMac.mm": [
                 "WebCore::KURL::operator NSURL *",
                 "WebCore::KURL::createCFURL"
             ],
             "WebCoreSupport/ChromeClientEfl.cpp":
             ["WebCore::ChromeClientEfl::closeWindowSoon"],
             "ewk/ewk_private.h": [],
             "ewk/ewk_view.cpp": []
         })
     self.assertEqual(
         parsed_entries[3].bug_description(),
         "[Mac] ResourceRequest's nsURLRequest() does not differentiate null and empty URLs with CFNetwork"
     )
     self.assertEqual(parsed_entries[4].reviewer_text(), "David Hyatt")
     self.assertIsNone(parsed_entries[4].bug_description())
     self.assertEqual(parsed_entries[5].reviewer_text(), "Adam Roben")
     self.assertIsNone(parsed_entries[5].bug_description())
     self.assertEqual(parsed_entries[6].reviewer_text(), "Tony Chang")
     self.assertIsNone(parsed_entries[6].bug_description())
     self.assertIsNone(parsed_entries[7].reviewer_text())
     self.assertEqual(parsed_entries[7].bug_description(),
                      "Unreviewed warning fix.")
     self.assertEqual(parsed_entries[8].reviewer_text(), 'Darin Adler')
     self.assertEqual(
         parsed_entries[8].bug_description(),
         'Resolve regular and visited link style in a single pass')