Benjamin Peterson | 90f5ba5 | 2010-03-11 22:53:45 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python3 |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 2 | # Check that all ".pyc" files exist and are up-to-date |
Guido van Rossum | 9a6757d | 1992-03-30 11:15:26 +0000 | [diff] [blame] | 3 | # Uses module 'os' |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 4 | |
| 5 | import sys |
Guido van Rossum | 9a6757d | 1992-03-30 11:15:26 +0000 | [diff] [blame] | 6 | import os |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 7 | from stat import ST_MTIME |
Guido van Rossum | 19b23e5 | 1998-10-07 19:45:33 +0000 | [diff] [blame] | 8 | import imp |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 9 | |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 10 | # PEP 3147 compatibility (PYC Repository Directories) |
| 11 | cache_from_source = (imp.cache_from_source if hasattr(imp, 'get_tag') else |
| 12 | lambda path: path + 'c') |
| 13 | |
| 14 | |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 15 | def main(): |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 16 | if len(sys.argv) > 1: |
| 17 | verbose = (sys.argv[1] == '-v') |
| 18 | silent = (sys.argv[1] == '-s') |
| 19 | else: |
| 20 | verbose = silent = False |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 21 | MAGIC = imp.get_magic() |
| 22 | if not silent: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 23 | print('Using MAGIC word', repr(MAGIC)) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 24 | for dirname in sys.path: |
| 25 | try: |
| 26 | names = os.listdir(dirname) |
| 27 | except os.error: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 28 | print('Cannot list directory', repr(dirname)) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 29 | continue |
| 30 | if not silent: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 31 | print('Checking ', repr(dirname), '...') |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 32 | for name in sorted(names): |
| 33 | if name.endswith('.py'): |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 34 | name = os.path.join(dirname, name) |
| 35 | try: |
| 36 | st = os.stat(name) |
| 37 | except os.error: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 38 | print('Cannot stat', repr(name)) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 39 | continue |
| 40 | if verbose: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 41 | print('Check', repr(name), '...') |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 42 | name_c = cache_from_source(name) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 43 | try: |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 44 | with open(name_c, 'rb') as f: |
| 45 | magic_str = f.read(4) |
| 46 | mtime_str = f.read(4) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 47 | except IOError: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 48 | print('Cannot open', repr(name_c)) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 49 | continue |
Georg Brandl | 8efadf5 | 2008-05-16 15:23:30 +0000 | [diff] [blame] | 50 | if magic_str != MAGIC: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 51 | print('Bad MAGIC word in ".pyc" file', end=' ') |
| 52 | print(repr(name_c)) |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 53 | continue |
| 54 | mtime = get_long(mtime_str) |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 55 | if mtime in {0, -1}: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 56 | print('Bad ".pyc" file', repr(name_c)) |
Georg Brandl | 8efadf5 | 2008-05-16 15:23:30 +0000 | [diff] [blame] | 57 | elif mtime != st[ST_MTIME]: |
Collin Winter | 6afaeb7 | 2007-08-03 17:06:41 +0000 | [diff] [blame] | 58 | print('Out-of-date ".pyc" file', end=' ') |
| 59 | print(repr(name_c)) |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 60 | |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 61 | |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 62 | def get_long(s): |
Georg Brandl | 8efadf5 | 2008-05-16 15:23:30 +0000 | [diff] [blame] | 63 | if len(s) != 4: |
Tim Peters | 70c4378 | 2001-01-17 08:48:39 +0000 | [diff] [blame] | 64 | return -1 |
Florent Xicluna | c7eaede | 2010-08-09 12:26:44 +0000 | [diff] [blame^] | 65 | return s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24) |
| 66 | |
Guido van Rossum | 5378d5c | 1991-12-18 13:38:27 +0000 | [diff] [blame] | 67 | |
Andrew M. Kuchling | e236b38 | 2004-08-09 17:27:55 +0000 | [diff] [blame] | 68 | if __name__ == '__main__': |
| 69 | main() |