OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 """Makes sure files have the right permissions. | 6 """Makes sure files have the right permissions. |
7 | 7 |
8 Some developers have broken SCM configurations that flip the executable | 8 Some developers have broken SCM configurations that flip the executable |
9 permission on for no good reason. Unix developers who run ls --color will then | 9 permission on for no good reason. Unix developers who run ls --color will then |
10 see .cc files in green and get confused. | 10 see .cc files in green and get confused. |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 return bool(permission & os.stat(full_path).st_mode) | 263 return bool(permission & os.stat(full_path).st_mode) |
264 | 264 |
265 | 265 |
266 def has_shebang_or_is_elf(full_path): | 266 def has_shebang_or_is_elf(full_path): |
267 """Returns if the file starts with #!/ or is an ELF binary. | 267 """Returns if the file starts with #!/ or is an ELF binary. |
268 | 268 |
269 full_path is the absolute path to the file. | 269 full_path is the absolute path to the file. |
270 """ | 270 """ |
271 with open(full_path, 'rb') as f: | 271 with open(full_path, 'rb') as f: |
272 data = f.read(4) | 272 data = f.read(4) |
273 return (data[:3] == '#!/', data == '\x7fELF') | 273 return (data[:3] == '#!/' or data == '#! /', data == '\x7fELF') |
274 | 274 |
275 | 275 |
276 def check_file(root_path, rel_path): | 276 def check_file(root_path, rel_path): |
277 """Checks the permissions of the file whose path is root_path + rel_path and | 277 """Checks the permissions of the file whose path is root_path + rel_path and |
278 returns an error if it is inconsistent. Returns None on success. | 278 returns an error if it is inconsistent. Returns None on success. |
279 | 279 |
280 It is assumed that the file is not ignored by is_ignored(). | 280 It is assumed that the file is not ignored by is_ignored(). |
281 | 281 |
282 If the file name is matched with must_be_executable() or | 282 If the file name is matched with must_be_executable() or |
283 must_not_be_executable(), only its executable bit is checked. | 283 must_not_be_executable(), only its executable bit is checked. |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 print '\nFAILED\n' | 471 print '\nFAILED\n' |
472 print '\n'.join('%s: %s' % (e['full_path'], e['error']) for e in errors) | 472 print '\n'.join('%s: %s' % (e['full_path'], e['error']) for e in errors) |
473 return 1 | 473 return 1 |
474 if not options.bare: | 474 if not options.bare: |
475 print '\nSUCCESS\n' | 475 print '\nSUCCESS\n' |
476 return 0 | 476 return 0 |
477 | 477 |
478 | 478 |
479 if '__main__' == __name__: | 479 if '__main__' == __name__: |
480 sys.exit(main()) | 480 sys.exit(main()) |
OLD | NEW |