diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py index 138ed75bf..24ae89f57 100755 --- a/presubmit_canned_checks.py +++ b/presubmit_canned_checks.py @@ -189,17 +189,44 @@ def CheckLongLines(input_api, output_api, maxlen=80, source_file_filter=None): def CheckChangeSvnEolStyle(input_api, output_api, source_file_filter=None): """Checks that the source files have svn:eol-style=LF.""" - bad = filter(lambda f: f.scm == 'svn' and f.Property('svn:eol-style') != 'LF', - input_api.AffectedSourceFiles(source_file_filter)) + return CheckSvnProperty(input_api, output_api, + 'svn:eol-style', 'LF', + input_api.AffectedSourceFiles(source_file_filter)) + + +def CheckSvnForCommonMimeTypes(input_api, output_api): + """Checks that common binary file types have the correct svn:mime-type.""" + output = [] + files = input_api.AffectedFiles(include_deletes=False) + def FilterFiles(extension): + return filter(lambda x: x.endswith(extension), files) + def JpegFiles(): + return filter(lambda x: (x.endswith('.jpg') or x.endswith('.jpeg') or + x.endswith('.jpe')), + files) + def RunCheck(mime_type, files): + output.extend(CheckSvnProperty(input_api, output_api, 'svn:mime-type', + mime_type, files)) + RunCheck('application/pdf', FilterFiles('.pdf')) + RunCheck('image/bmp', FilterFiles('.bmp')) + RunCheck('image/gif', FilterFiles('.gif')) + RunCheck('image/png', FilterFiles('.png')) + RunCheck('image/jpeg', JpegFiles()) + RunCheck('image/vnd.microsoft.icon', FilterFiles('.ico')) + return output + + +def CheckSvnProperty(input_api, output_api, prop, expected, affected_files): + """Checks that affected_files files have prop=expected.""" + bad = filter(lambda f: f.scm == 'svn' and f.Property(prop) != expected, + affected_files) if bad: if input_api.is_committing: - return [output_api.PresubmitError( - "Run `svn pset svn:eol-style LF ` on these files:", - items=bad)] + type = output_api.PresubmitError else: - return [output_api.PresubmitNotifyResult( - "Run `svn pset svn:eol-style LF ` on these files:", - items=bad)] + type = output_api.PresubmitNotifyResult + message = "Run `svn pset %s %s ` on these files:" % (prop, expected) + return [type(message, items=bad)] return [] diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py index 9915edf91..9a6ffc199 100755 --- a/tests/presubmit_unittest.py +++ b/tests/presubmit_unittest.py @@ -998,6 +998,7 @@ class CannedChecksUnittest(PresubmitTestsBase): 'CheckChangeHasNoCrAndHasOnlyOneEol', 'CheckChangeHasNoTabs', 'CheckChangeHasQaField', 'CheckChangeHasTestedField', 'CheckChangeHasTestField', 'CheckChangeSvnEolStyle', + 'CheckSvnForCommonMimeTypes', 'CheckSvnProperty', 'CheckDoNotSubmit', 'CheckDoNotSubmitInDescription', 'CheckDoNotSubmitInFiles', 'CheckLongLines', 'CheckTreeIsOpen', 'RunPythonUnitTests', @@ -1074,13 +1075,16 @@ class CannedChecksUnittest(PresubmitTestsBase): self.assertEquals(results2[0].__class__, error_type) def SvnPropertyTest(self, check, property, value1, value2, committing, - error_type): + error_type, use_source_file): input_api1 = self.MockInputApi(None, committing) files1 = [ presubmit.SvnAffectedFile('foo/bar.cc', 'A'), presubmit.SvnAffectedFile('foo.cc', 'M'), ] - input_api1.AffectedSourceFiles(None).AndReturn(files1) + if use_source_file: + input_api1.AffectedSourceFiles(None).AndReturn(files1) + else: + input_api1.AffectedFiles(include_deleted=False).AndReturn(files1) presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo/bar.cc'), property).AndReturn(value1) presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo.cc'), @@ -1090,7 +1094,11 @@ class CannedChecksUnittest(PresubmitTestsBase): presubmit.SvnAffectedFile('foo/bar.cc', 'A'), presubmit.SvnAffectedFile('foo.cc', 'M'), ] - input_api2.AffectedSourceFiles(None).AndReturn(files2) + if use_source_file: + input_api2.AffectedSourceFiles(None).AndReturn(files2) + else: + input_api2.AffectedFiles(include_deleted=False).AndReturn(files2) + presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo/bar.cc'), property).AndReturn(value2) presubmit.gcl.GetSVNFileProperty(presubmit.normpath('foo.cc'), @@ -1190,14 +1198,45 @@ class CannedChecksUnittest(PresubmitTestsBase): presubmit.OutputApi.PresubmitPromptWarning) def testCheckChangeSvnEolStyleCommit(self): + # Test CheckSvnProperty at the same time. self.SvnPropertyTest(presubmit_canned_checks.CheckChangeSvnEolStyle, 'svn:eol-style', 'LF', '', True, - presubmit.OutputApi.PresubmitError) + presubmit.OutputApi.PresubmitError, True) def testCheckChangeSvnEolStyleUpload(self): self.SvnPropertyTest(presubmit_canned_checks.CheckChangeSvnEolStyle, 'svn:eol-style', 'LF', '', False, - presubmit.OutputApi.PresubmitNotifyResult) + presubmit.OutputApi.PresubmitNotifyResult, True) + + def testCheckSvnForCommonMimeTypes(self): + self.mox.StubOutWithMock(presubmit_canned_checks, 'CheckSvnProperty') + input_api = self.MockInputApi(None, False) + output_api = presubmit.OutputApi() + input_api.AffectedFiles(include_deletes=False).AndReturn([ + 'a.pdf', 'b.bmp', 'c.gif', 'd.png', 'e.jpg', 'f.ico']) + presubmit_canned_checks.CheckSvnProperty( + input_api, output_api, 'svn:mime-type', 'application/pdf', ['a.pdf'] + ).AndReturn([1]) + presubmit_canned_checks.CheckSvnProperty( + input_api, output_api, 'svn:mime-type', 'image/bmp', ['b.bmp'] + ).AndReturn([2]) + presubmit_canned_checks.CheckSvnProperty( + input_api, output_api, 'svn:mime-type', 'image/gif', ['c.gif'] + ).AndReturn([3]) + presubmit_canned_checks.CheckSvnProperty( + input_api, output_api, 'svn:mime-type', 'image/png', ['d.png'] + ).AndReturn([4]) + presubmit_canned_checks.CheckSvnProperty( + input_api, output_api, 'svn:mime-type', 'image/jpeg', ['e.jpg'] + ).AndReturn([5]) + presubmit_canned_checks.CheckSvnProperty( + input_api, output_api, 'svn:mime-type', 'image/vnd.microsoft.icon', + ['f.ico']).AndReturn([6]) + self.mox.ReplayAll() + + results = presubmit_canned_checks.CheckSvnForCommonMimeTypes( + input_api, output_api) + self.assertEquals(results, [1, 2, 3, 4, 5, 6]) def testCannedCheckTreeIsOpenOpen(self): input_api = self.MockInputApi(None, True)