Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Unified Diff: presubmit_support.py

Issue 113783: Factor out SVN-specific methods out of AffectedFile. (Closed)
Patch Set: 80 cols Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests/presubmit_unittest.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: presubmit_support.py
diff --git a/presubmit_support.py b/presubmit_support.py
index 9c3a6e817e4acd4eba168011ecf7b599aec4822f..3fa6a80cff085b378331cfafef6a25ee16156e2d 100755
--- a/presubmit_support.py
+++ b/presubmit_support.py
@@ -324,15 +324,18 @@ class AffectedFile(object):
def __init__(self, path, action, repository_root=''):
self.path = path
- self.action = action.strip()
+ self.action = action
self.repository_root = repository_root
+ self.server_path = None
+ self.is_directory = None
+ self.properties = {}
def ServerPath(self):
"""Returns a path string that identifies the file in the SCM system.
Returns the empty string if the file does not exist in SCM.
"""
- return gclient.CaptureSVNInfo(self.AbsoluteLocalPath()).get('URL', '')
+ return ""
def LocalPath(self):
"""Returns the path of this file on the local disk relative to client root.
@@ -347,24 +350,23 @@ class AffectedFile(object):
def IsDirectory(self):
"""Returns true if this object is a directory."""
path = self.AbsoluteLocalPath()
- if os.path.exists(path):
- # Retrieve directly from the file system; it is much faster than querying
- # subversion, especially on Windows.
- return os.path.isdir(path)
- else:
- return gclient.CaptureSVNInfo(path).get('Node Kind') in ('dir',
- 'directory')
-
- def SvnProperty(self, property_name):
- """Returns the specified SVN property of this file, or the empty string
- if no such property.
- """
- return gcl.GetSVNFileProperty(self.AbsoluteLocalPath(), property_name)
+ if self.is_directory is None:
+ self.is_directory = (os.path.exists(path) and
+ os.path.isdir(path))
+ return self.is_directory
def Action(self):
"""Returns the action on this opened file, e.g. A, M, D, etc."""
+ # TODO(maruel): Somewhat crappy, Could be "A" or "A +" for svn but
+ # different for other SCM.
return self.action
+ def Property(self, property_name):
+ """Returns the specified SCM property of this file, or None if no such
+ property.
+ """
+ return self.properties.get(property_name, None)
+
def NewContents(self):
"""Returns an iterator over the lines in the new version of file.
@@ -395,6 +397,32 @@ class AffectedFile(object):
raise NotImplementedError() # Implement if/when needed.
+class SvnAffectedFile(AffectedFile):
+ def ServerPath(self):
+ if self.server_path is None:
+ self.server_path = gclient.CaptureSVNInfo(
+ self.AbsoluteLocalPath()).get('URL', '')
+ return self.server_path
+
+ def IsDirectory(self):
+ path = self.AbsoluteLocalPath()
+ if self.is_directory is None:
+ if os.path.exists(path):
+ # Retrieve directly from the file system; it is much faster than
+ # querying subversion, especially on Windows.
+ self.is_directory = os.path.isdir(path)
+ else:
+ self.is_directory = gclient.CaptureSVNInfo(
+ path).get('Node Kind') in ('dir', 'directory')
+ return self.is_directory
+
+ def Property(self, property_name):
+ if not property_name in self.properties:
+ self.properties[property_name] = gcl.GetSVNFileProperty(
+ self.AbsoluteLocalPath(), property_name)
+ return self.properties[property_name]
+
+
class GclChange(object):
"""A gcl change. See gcl.ChangeInfo for more info."""
@@ -418,8 +446,10 @@ class GclChange(object):
self.description_without_tags = '\n'.join(self.description_without_tags)
self.description_without_tags = self.description_without_tags.rstrip()
- self.affected_files = [AffectedFile(info[1], info[0], repository_root) for
- info in change_info.files]
+ self.affected_files = [
+ SvnAffectedFile(info[1], info[0].strip(), repository_root)
+ for info in change_info.files
+ ]
def Change(self):
"""Returns the change name."""
@@ -551,7 +581,6 @@ def ListRelevantPresubmitFiles(files):
class PresubmitExecuter(object):
-
def __init__(self, change_info, committing):
"""
Args:
« no previous file with comments | « no previous file | tests/presubmit_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698