| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """A module for the history of the test expectation file.""" | 5 """A module for the history of the test expectation file.""" |
| 6 | 6 |
| 7 from datetime import datetime | 7 from datetime import datetime |
| 8 from datetime import timedelta | 8 from datetime import timedelta |
| 9 | 9 |
| 10 import re | 10 import re |
| 11 import sys | 11 import sys |
| 12 import time | 12 import time |
| 13 import pysvn | 13 import pysvn |
| 14 | 14 |
| 15 # Default Webkit SVN location for chromium test expectation file. | 15 TEST_EXPECTATIONS_ROOT = 'http://src.chromium.org/blink/trunk/' |
| 16 # A map from earliest revision to path. |
| 16 # TODO(imasaki): support multiple test expectation files. | 17 # TODO(imasaki): support multiple test expectation files. |
| 17 DEFAULT_TEST_EXPECTATION_LOCATION = ( | 18 TEST_EXPECTATIONS_LOCATIONS = { |
| 18 'http://svn.webkit.org/repository/webkit/trunk/' | 19 148348: 'LayoutTests/TestExpectations', |
| 19 'LayoutTests/platform/chromium/TestExpectations') | 20 119317: 'LayoutTests/platform/chromium/TestExpectations', |
| 20 LEGACY_TEST_EXPECTATION_LOCATION = ( | 21 0: 'LayoutTests/platform/chromium/test_expectations.txt'} |
| 21 'http://svn.webkit.org/repository/webkit/trunk/' | 22 TEST_EXPECTATIONS_DEFAULT_PATH = ( |
| 22 'LayoutTests/platform/chromium/test_expectations.txt') | 23 TEST_EXPECTATIONS_ROOT + TEST_EXPECTATIONS_LOCATIONS[148348]) |
| 23 | 24 |
| 24 class TestExpectationsHistory(object): | 25 class TestExpectationsHistory(object): |
| 25 """A class to represent history of the test expectation file. | 26 """A class to represent history of the test expectation file. |
| 26 | 27 |
| 27 The history is obtained by calling PySVN.log()/diff() APIs. | 28 The history is obtained by calling PySVN.log()/diff() APIs. |
| 28 | 29 |
| 29 TODO(imasaki): Add more functionalities here like getting some statistics | 30 TODO(imasaki): Add more functionalities here like getting some statistics |
| 30 about the test expectation file. | 31 about the test expectation file. |
| 31 """ | 32 """ |
| 32 | 33 |
| 33 @staticmethod | 34 @staticmethod |
| 35 def GetTestExpectationsPathForRevision(revision): |
| 36 for i in sorted(TEST_EXPECTATIONS_LOCATIONS.keys(), reverse=True): |
| 37 if revision >= i: |
| 38 return TEST_EXPECTATIONS_ROOT + TEST_EXPECTATIONS_LOCATIONS[i] |
| 39 |
| 40 @staticmethod |
| 34 def GetDiffBetweenTimes(start, end, testname_list, | 41 def GetDiffBetweenTimes(start, end, testname_list, |
| 35 te_location=DEFAULT_TEST_EXPECTATION_LOCATION): | 42 te_location=TEST_EXPECTATIONS_DEFAULT_PATH): |
| 36 """Get difference between time period for the specified test names. | 43 """Get difference between time period for the specified test names. |
| 37 | 44 |
| 38 Given the time period, this method first gets the revision number. Then, | 45 Given the time period, this method first gets the revision number. Then, |
| 39 it gets the diff for each revision. Finally, it keeps the diff relating to | 46 it gets the diff for each revision. Finally, it keeps the diff relating to |
| 40 the test names and returns them along with other information about | 47 the test names and returns them along with other information about |
| 41 revision. | 48 revision. |
| 42 | 49 |
| 43 Args: | 50 Args: |
| 44 start: A timestamp specifying start of the time period to be | 51 start: A timestamp specifying start of the time period to be |
| 45 looked at. | 52 looked at. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 # Prepend at the beginning of logs. | 87 # Prepend at the beginning of logs. |
| 81 logs.insert(0, logs_before_time_period[len(logs_before_time_period)-1]) | 88 logs.insert(0, logs_before_time_period[len(logs_before_time_period)-1]) |
| 82 break | 89 break |
| 83 gobackdays *= 2 | 90 gobackdays *= 2 |
| 84 | 91 |
| 85 for i in xrange(len(logs) - 1): | 92 for i in xrange(len(logs) - 1): |
| 86 old_rev = logs[i].revision.number | 93 old_rev = logs[i].revision.number |
| 87 new_rev = logs[i + 1].revision.number | 94 new_rev = logs[i + 1].revision.number |
| 88 # Parsing the actual diff. | 95 # Parsing the actual diff. |
| 89 | 96 |
| 90 # test_expectations.txt was renamed to TestExpectations at r119317. | 97 new_path = TestExpectationsHistory.GetTestExpectationsPathForRevision( |
| 91 new_path = DEFAULT_TEST_EXPECTATION_LOCATION | 98 new_rev); |
| 92 if new_rev < 119317: | 99 old_path = TestExpectationsHistory.GetTestExpectationsPathForRevision( |
| 93 new_path = LEGACY_TEST_EXPECTATION_LOCATION | 100 old_rev); |
| 94 old_path = DEFAULT_TEST_EXPECTATION_LOCATION | |
| 95 if old_rev < 119317: | |
| 96 old_path = LEGACY_TEST_EXPECTATION_LOCATION | |
| 97 | 101 |
| 98 text = client.diff('/tmp', | 102 text = client.diff('/tmp', |
| 99 url_or_path=old_path, | 103 url_or_path=old_path, |
| 100 revision1=pysvn.Revision( | 104 revision1=pysvn.Revision( |
| 101 pysvn.opt_revision_kind.number, old_rev), | 105 pysvn.opt_revision_kind.number, old_rev), |
| 102 url_or_path2=new_path, | 106 url_or_path2=new_path, |
| 103 revision2=pysvn.Revision( | 107 revision2=pysvn.Revision( |
| 104 pysvn.opt_revision_kind.number, new_rev)) | 108 pysvn.opt_revision_kind.number, new_rev)) |
| 105 lines = text.split('\n') | 109 lines = text.split('\n') |
| 106 target_lines = [] | 110 target_lines = [] |
| 107 for line in lines: | 111 for line in lines: |
| 108 for testname in testname_list: | 112 for testname in testname_list: |
| 109 matches = re.findall(testname, line) | 113 matches = re.findall(testname, line) |
| 110 if matches: | 114 if matches: |
| 111 if line[0] == '+' or line[0] == '-': | 115 if line[0] == '+' or line[0] == '-': |
| 112 target_lines.append(line) | 116 target_lines.append(line) |
| 113 if target_lines: | 117 if target_lines: |
| 114 # Needs to convert to normal date string for presentation. | 118 # Needs to convert to normal date string for presentation. |
| 115 result_list.append(( | 119 result_list.append(( |
| 116 old_rev, new_rev, logs[i + 1].author, | 120 old_rev, new_rev, logs[i + 1].author, |
| 117 datetime.fromtimestamp( | 121 datetime.fromtimestamp( |
| 118 logs[i + 1].date).strftime('%Y-%m-%d %H:%M:%S'), | 122 logs[i + 1].date).strftime('%Y-%m-%d %H:%M:%S'), |
| 119 logs[i + 1].message, target_lines)) | 123 logs[i + 1].message, target_lines)) |
| 120 return result_list | 124 return result_list |
| OLD | NEW |