Pārlūkot izejas kodu

Reland "Add AffectedFile.Extension() in presubmit_support"

This is a reland of commit d447f412945173e398fa5d0639a82f6c53832a31

This reland excludes the change to PRESUBMIT.py which originally
caused regression and because of which the original commit was
reverted.

Original change's description:
> Add AffectedFile.Extension() in presubmit_support
>
> Add convenience method AffectedFile.Extension() for extracting file
> extension in a standard way. Add a test for this new functionality.
> Add a similar test for AffectedFile.UnixLocalPath().
>
> Bug: None
> Change-Id: If591e751fb2e4fb5355ad0b6f93f310667849d68
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/6273341
> Commit-Queue: Anton Bershanskyi <bershanskyi@gmail.com>
> Reviewed-by: Dirk Pranke <dpranke@google.com>
> Reviewed-by: Gavin Mak <gavinmak@google.com>

Bug: None
Change-Id: Ie5fc551b9c0818dfd9a1c571cc247cc157dbc8b1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/6335512
Commit-Queue: Anton Bershanskyi <bershanskyi@gmail.com>
Reviewed-by: Gavin Mak <gavinmak@google.com>
Reviewed-by: Dirk Pranke <dpranke@google.com>
Anton Bershanskyi 5 mēneši atpakaļ
vecāks
revīzija
ab918ca0bc
2 mainītis faili ar 54 papildinājumiem un 5 dzēšanām
  1. 16 2
      presubmit_support.py
  2. 38 3
      tests/presubmit_unittest.py

+ 16 - 2
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()
 

+ 38 - 3
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):