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']
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']
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")
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)
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')