diff --git a/PRESUBMIT.py b/PRESUBMIT.py index 103b6e68c..ad7cb3ae7 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py @@ -150,7 +150,7 @@ def CheckCIPDManifest(input_api, output_api): tests = [] for path in affected_manifests: path = path.AbsoluteLocalPath() - if path.endswith('.txt'): + if path.Extension() == '.txt': tests.append( input_api.canned_checks.CheckCIPDManifest(input_api, output_api, diff --git a/presubmit_support.py b/presubmit_support.py index b5d10704e..68b34d567 100755 --- a/presubmit_support.py +++ b/presubmit_support.py @@ -1041,10 +1041,10 @@ class AffectedFile(object): self._path = path self._action = action self._local_root = repository_root - self._is_directory = None + self._diff_cache = diff_cache self._cached_changed_contents = None self._cached_new_contents = None - self._diff_cache = diff_cache + self._extension = None self._is_testable_file = None logging.debug('%s(%s)', self.__class__.__name__, self._path) @@ -1161,6 +1161,20 @@ class AffectedFile(object): self._cached_changed_contents = result return self._cached_changed_contents[:] + def Extension(self): + """Returns the file extension as a string. + + File extension is the portion of file name after the last dot, including the dot. + If file name has no dot (like 'OWNERS'), then returns an empty string ''. + If file has multiple extensions (like 'archive.tar.gz'), then the last + extension is returned (like '.gz') + This method is equivalent to NodeJS node:path method path.extname() + and Python3 pathlib PurePath.suffix() and os.path.splitext() + """ + if self._extension is None: + self._extension = os.path.splitext(self._path)[1] + return self._extension + def __str__(self): return self.LocalPath() diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py index 03b534753..ffe9d0a53 100755 --- a/tests/presubmit_unittest.py +++ b/tests/presubmit_unittest.py @@ -1444,9 +1444,8 @@ class InputApiUnittest(PresubmitTestsBase): self.assertEqual(results[i].LocalPath(), presubmit.normpath(item[1][i])) # Same number of expected results. - self.assertEqual( - sorted([f.LocalPath().replace(os.sep, '/') for f in results]), - sorted(item[1])) + self.assertEqual(sorted([f.UnixLocalPath() for f in results]), + sorted(item[1])) def testDefaultOverrides(self): input_api = presubmit.InputApi(self.fake_change, './PRESUBMIT.py', @@ -1792,6 +1791,42 @@ class AffectedFileUnittest(PresubmitTestsBase): self.assertEqual(2, len(output)) self.assertEqual(files[:2], output[:2]) + def testGetUnixLocalPath(self): + # If current platform already uses Unix-style paths, + # there is nothing to test + if os.path.sep == '/': + return + + # If path separator is not forward slash, then we are on Windows and + # which uses backward slash + self.assertEqual('\\', os.path.sep) + + cases = [('foo/blat.txt', 'foo/blat.txt'), + ('foo\\blat.txt', 'foo/blat.txt'), + ('C:\\development\\src\\chrome\\VERSION', + 'C:/development/src/chrome/VERSION')] + for path, expectedUnixLocalPath in cases: + unixLocalPath = presubmit.GitAffectedFile(path, 'M', + self.fake_root_dir, + None).UnixLocalPath() + self.assertEqual(expectedUnixLocalPath, unixLocalPath) + + def testGetExtension(self): + cases = [('foo/blat.txt', '.txt'), ('net/features.gni', '.gni'), + ('archive.tar.gz', '.gz'), ('sub/archive.tar.gz', '.gz'), + ('.hidden', ''), ('sub/.hidden', ''), ('OWNERS', '')] + + # If current platform uses Windows-style paths, check them too + if os.path.sep != '/': + cases.append(('foo\\blat.txt', '.txt')) + cases.append(('C:\\development\\src\\chrome\\VERSION', '')) + cases.append(('C:\\development\\src\\.hidden', '')) + + for path, expectedExtension in cases: + extension = presubmit.GitAffectedFile(path, 'M', self.fake_root_dir, + None).Extension() + self.assertEqual(expectedExtension, extension) + class ChangeUnittest(PresubmitTestsBase):