| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Enables directory-specific presubmit checks to run at upload and/or commit. | 6 """Enables directory-specific presubmit checks to run at upload and/or commit. |
| 7 """ | 7 """ |
| 8 | 8 |
| 9 __version__ = '1.0.1' | 9 __version__ = '1.0.1' |
| 10 | 10 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 import subprocess # Exposed through the API. | 25 import subprocess # Exposed through the API. |
| 26 import sys # Parts exposed through API. | 26 import sys # Parts exposed through API. |
| 27 import tempfile # Exposed through the API. | 27 import tempfile # Exposed through the API. |
| 28 import types | 28 import types |
| 29 import urllib2 # Exposed through the API. | 29 import urllib2 # Exposed through the API. |
| 30 | 30 |
| 31 # Local imports. | 31 # Local imports. |
| 32 # TODO(joi) Would be cleaner to factor out utils in gcl to separate module, but | 32 # TODO(joi) Would be cleaner to factor out utils in gcl to separate module, but |
| 33 # for now it would only be a couple of functions so hardly worth it. | 33 # for now it would only be a couple of functions so hardly worth it. |
| 34 import gcl | 34 import gcl |
| 35 import gclient |
| 35 import presubmit_canned_checks | 36 import presubmit_canned_checks |
| 36 | 37 |
| 37 | 38 |
| 38 # Matches key/value (or "tag") lines in changelist descriptions. | 39 # Matches key/value (or "tag") lines in changelist descriptions. |
| 39 _tag_line_re = re.compile( | 40 _tag_line_re = re.compile( |
| 40 '^\s*(?P<key>[A-Z][A-Z_0-9]*)\s*=\s*(?P<value>.*?)\s*$') | 41 '^\s*(?P<key>[A-Z][A-Z_0-9]*)\s*=\s*(?P<value>.*?)\s*$') |
| 41 | 42 |
| 42 | 43 |
| 43 # Friendly names may be used for certain keys. All values for key-value pairs | 44 # Friendly names may be used for certain keys. All values for key-value pairs |
| 44 # in change descriptions (like BUG=123) can be retrieved from a change object | 45 # in change descriptions (like BUG=123) can be retrieved from a change object |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 | 201 |
| 201 Args: | 202 Args: |
| 202 Depot path as a string. | 203 Depot path as a string. |
| 203 | 204 |
| 204 Returns: | 205 Returns: |
| 205 The local path of the depot path under the user's current client, or None | 206 The local path of the depot path under the user's current client, or None |
| 206 if the file is not mapped. | 207 if the file is not mapped. |
| 207 | 208 |
| 208 Remember to check for the None case and show an appropriate error! | 209 Remember to check for the None case and show an appropriate error! |
| 209 """ | 210 """ |
| 210 local_path = gcl.GetSVNFileInfo(depot_path).get('Path') | 211 local_path = gclient.CaptureSVNInfo(depot_path).get('Path') |
| 211 if not local_path: | 212 if not local_path: |
| 212 return None | 213 return None |
| 213 else: | 214 else: |
| 214 return local_path | 215 return local_path |
| 215 | 216 |
| 216 @staticmethod | 217 @staticmethod |
| 217 def LocalToDepotPath(local_path): | 218 def LocalToDepotPath(local_path): |
| 218 """Translate a local path to a depot path. | 219 """Translate a local path to a depot path. |
| 219 | 220 |
| 220 Args: | 221 Args: |
| 221 Local path (relative to current directory, or absolute) as a string. | 222 Local path (relative to current directory, or absolute) as a string. |
| 222 | 223 |
| 223 Returns: | 224 Returns: |
| 224 The depot path (SVN URL) of the file if mapped, otherwise None. | 225 The depot path (SVN URL) of the file if mapped, otherwise None. |
| 225 """ | 226 """ |
| 226 depot_path = gcl.GetSVNFileInfo(local_path).get('URL') | 227 depot_path = gclient.CaptureSVNInfo(local_path).get('URL') |
| 227 if not depot_path: | 228 if not depot_path: |
| 228 return None | 229 return None |
| 229 else: | 230 else: |
| 230 return depot_path | 231 return depot_path |
| 231 | 232 |
| 232 @staticmethod | 233 @staticmethod |
| 233 def FilterTextFiles(affected_files, include_deletes=True): | 234 def FilterTextFiles(affected_files, include_deletes=True): |
| 234 """Filters out all except text files and optionally also filters out | 235 """Filters out all except text files and optionally also filters out |
| 235 deleted files. | 236 deleted files. |
| 236 | 237 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 def __init__(self, path, action, repository_root=''): | 325 def __init__(self, path, action, repository_root=''): |
| 325 self.path = path | 326 self.path = path |
| 326 self.action = action.strip() | 327 self.action = action.strip() |
| 327 self.repository_root = repository_root | 328 self.repository_root = repository_root |
| 328 | 329 |
| 329 def ServerPath(self): | 330 def ServerPath(self): |
| 330 """Returns a path string that identifies the file in the SCM system. | 331 """Returns a path string that identifies the file in the SCM system. |
| 331 | 332 |
| 332 Returns the empty string if the file does not exist in SCM. | 333 Returns the empty string if the file does not exist in SCM. |
| 333 """ | 334 """ |
| 334 return gcl.GetSVNFileInfo(self.AbsoluteLocalPath()).get('URL', '') | 335 return gclient.CaptureSVNInfo(self.AbsoluteLocalPath()).get('URL', '') |
| 335 | 336 |
| 336 def LocalPath(self): | 337 def LocalPath(self): |
| 337 """Returns the path of this file on the local disk relative to client root. | 338 """Returns the path of this file on the local disk relative to client root. |
| 338 """ | 339 """ |
| 339 return normpath(self.path) | 340 return normpath(self.path) |
| 340 | 341 |
| 341 def AbsoluteLocalPath(self): | 342 def AbsoluteLocalPath(self): |
| 342 """Returns the absolute path of this file on the local disk. | 343 """Returns the absolute path of this file on the local disk. |
| 343 """ | 344 """ |
| 344 return normpath(os.path.join(self.repository_root, self.LocalPath())) | 345 return normpath(os.path.join(self.repository_root, self.LocalPath())) |
| 345 | 346 |
| 346 def IsDirectory(self): | 347 def IsDirectory(self): |
| 347 """Returns true if this object is a directory.""" | 348 """Returns true if this object is a directory.""" |
| 348 if os.path.exists(self.path): | 349 if os.path.exists(self.path): |
| 349 # Retrieve directly from the file system; it is much faster than querying | 350 # Retrieve directly from the file system; it is much faster than querying |
| 350 # subversion, especially on Windows. | 351 # subversion, especially on Windows. |
| 351 return os.path.isdir(self.path) | 352 return os.path.isdir(self.path) |
| 352 else: | 353 else: |
| 353 return gcl.GetSVNFileInfo(self.path).get('Node Kind') == 'directory' | 354 return gclient.CaptureSVNInfo(self.path).get('Node Kind') in ('dir', |
| 355 'directory') |
| 354 | 356 |
| 355 def SvnProperty(self, property_name): | 357 def SvnProperty(self, property_name): |
| 356 """Returns the specified SVN property of this file, or the empty string | 358 """Returns the specified SVN property of this file, or the empty string |
| 357 if no such property. | 359 if no such property. |
| 358 """ | 360 """ |
| 359 return gcl.GetSVNFileProperty(self.AbsoluteLocalPath(), property_name) | 361 return gcl.GetSVNFileProperty(self.AbsoluteLocalPath(), property_name) |
| 360 | 362 |
| 361 def Action(self): | 363 def Action(self): |
| 362 """Returns the action on this opened file, e.g. A, M, D, etc.""" | 364 """Returns the action on this opened file, e.g. A, M, D, etc.""" |
| 363 return self.action | 365 return self.action |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 print "Found %d files." % len(files) | 702 print "Found %d files." % len(files) |
| 701 return DoPresubmitChecks(gcl.ChangeInfo(name='temp', files=files), | 703 return DoPresubmitChecks(gcl.ChangeInfo(name='temp', files=files), |
| 702 options.commit, | 704 options.commit, |
| 703 options.verbose, | 705 options.verbose, |
| 704 sys.stdout, | 706 sys.stdout, |
| 705 sys.stdin) | 707 sys.stdin) |
| 706 | 708 |
| 707 | 709 |
| 708 if __name__ == '__main__': | 710 if __name__ == '__main__': |
| 709 sys.exit(Main(sys.argv)) | 711 sys.exit(Main(sys.argv)) |
| OLD | NEW |