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

Unified Diff: presubmit_support.py

Issue 125095: Add partial presubmit support to git checkout. (Closed)
Patch Set: . Created 11 years, 6 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') | tests/presubmit_unittest.py » ('J')
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 8936ec5b1c3f8f7bcc59e7c2f13f41082e1749d6..88a535fde05f3a6dd00564de19718edddd58d22b 100755
--- a/presubmit_support.py
+++ b/presubmit_support.py
@@ -489,6 +489,50 @@ class SvnAffectedFile(AffectedFile):
return self._is_text_file
+class GitAffectedFile(AffectedFile):
+ """Representation of a file in a change out of a git checkout."""
+
+ def __init__(self, *args, **kwargs):
+ AffectedFile.__init__(self, *args, **kwargs)
+ self._server_path = None
+ self._is_text_file = None
+ self.scm = 'git'
+
+ def ServerPath(self):
+ if self._server_path is None:
+ raise NotImplementedException() # TODO(maruel) Implement.
+ return self._server_path
+
+ def IsDirectory(self):
+ if self._is_directory is None:
+ path = self.AbsoluteLocalPath()
+ 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:
+ # raise NotImplementedException() # TODO(maruel) Implement.
+ self._is_directory = False
+ return self._is_directory
+
+ def Property(self, property_name):
+ if not property_name in self._properties:
+ raise NotImplementedException() # TODO(maruel) Implement.
+ return self._properties[property_name]
+
+ def IsTextFile(self):
+ if self._is_text_file is None:
+ if self.Action() == 'D':
+ # A deleted file is not a text file.
+ self._is_text_file = False
+ elif self.IsDirectory():
+ self._is_text_file = False
+ else:
+ # raise NotImplementedException() # TODO(maruel) Implement.
+ self._is_text_file = os.path.isfile(self.AbsoluteLocalPath())
+ return self._is_text_file
+
+
class Change(object):
"""Describe a change.
@@ -629,6 +673,10 @@ class SvnChange(Change):
_AFFECTED_FILES = SvnAffectedFile
+class GitChange(Change):
+ _AFFECTED_FILES = GitAffectedFile
+
+
def ListRelevantPresubmitFiles(files, root):
"""Finds all presubmit files that apply to a given set of source files.
@@ -783,12 +831,14 @@ def DoPresubmitChecks(change,
def ScanSubDirs(mask, recursive):
if not recursive:
- return [x for x in glob.glob(mask) if '.svn' not in x]
+ return [x for x in glob.glob(mask) if '.svn' not in x and '.git' not in x]
else:
results = []
for root, dirs, files in os.walk('.'):
if '.svn' in dirs:
dirs.remove('.svn')
+ if '.git' in dirs:
+ dirs.remove('.git')
for name in files:
if fnmatch.fnmatch(name, mask):
results.append(os.path.join(root, name))
@@ -805,33 +855,52 @@ def ParseFiles(args, recursive):
def Main(argv):
parser = optparse.OptionParser(usage="%prog [options]",
version="%prog " + str(__version__))
- parser.add_option("-c", "--commit", action="store_true",
+ parser.add_option("-c", "--commit", action="store_true", default=False,
help="Use commit instead of upload checks")
+ parser.add_option("-u", "--upload", action="store_false", dest='commit',
+ help="Use upload instead of commit checks")
parser.add_option("-r", "--recursive", action="store_true",
help="Act recursively")
- parser.add_option("-v", "--verbose", action="store_true",
+ parser.add_option("-v", "--verbose", action="store_true", default=False,
help="Verbose output")
- parser.add_option("--files", default='')
+ parser.add_option("--files")
parser.add_option("--name", default='no name')
parser.add_option("--description", default='')
parser.add_option("--issue", type='int', default=0)
parser.add_option("--patchset", type='int', default=0)
- parser.add_options("--root", default='')
- parser.add_options("--default_presubmit", default='')
- parser.add_options("--may_prompt", action='store_true')
+ parser.add_option("--root", default='')
+ parser.add_option("--default_presubmit")
+ parser.add_option("--may_prompt", action='store_true', default=False)
options, args = parser.parse_args(argv[1:])
- if not options.files:
- options.files = ParseFiles(args, options.recursive)
if not options.root:
- options.root = gcl.GetRepositoryRoot()
+ options.root = os.getcwd()
+ if os.path.isdir(os.path.join(options.root, '.git')):
+ change_class = GitChange
+ if not options.files:
+ if args:
+ options.files = ParseFiles(args, options.recursive)
+ else:
+ # Grab modified files.
+ raise NotImplementedException() # TODO(maruel) Implement.
+ elif os.path.isdir(os.path.join(options.root, '.svn')):
+ change_class = SvnChange
+ if not options.files:
+ if args:
+ options.files = ParseFiles(args, options.recursive)
+ else:
+ # Grab modified files.
+ files = gclient.CaptureSVNStatus([options.root])
+ else:
+ # Doesn't seem under source control.
+ change_class = Change
if options.verbose:
- print "Found %d files." % len(files)
- return not DoPresubmitChecks(SvnChange(options.name,
- options.description,
- options.root,
- options.files,
- options.issue,
- options.patchset),
+ print "Found %d files." % len(options.files)
+ return not DoPresubmitChecks(change_class(options.name,
+ options.description,
+ options.root,
+ options.files,
+ options.issue,
+ options.patchset),
options.commit,
options.verbose,
sys.stdout,
« no previous file with comments | « no previous file | tests/presubmit_unittest.py » ('j') | tests/presubmit_unittest.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698