rebuild_check.py (1631B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 import errno 6 import os 7 8 9 def mtime(path): 10 try: 11 return os.stat(path).st_mtime 12 except OSError as e: 13 if e.errno == errno.ENOENT: 14 return -1 15 raise 16 17 18 def rebuild_check(args): 19 target = args[0] 20 deps = args[1:] 21 t = mtime(target) 22 if t < 0: 23 print(target) 24 return 25 26 newer = [] 27 removed = [] 28 for dep in deps: 29 deptime = mtime(dep) 30 if deptime < 0: 31 removed.append(dep) 32 elif deptime > t: 33 newer.append(dep) 34 35 def format_filelist(filelist): 36 if not filelist: 37 return None 38 39 limit = 5 40 length = len(filelist) 41 if length < limit: 42 return ", ".join(filelist) 43 44 truncated = filelist[:limit] 45 remaining = length - limit 46 47 return "%s (and %d other files)" % (", ".join(truncated), remaining) 48 49 newer = format_filelist(newer) 50 removed = format_filelist(removed) 51 52 if newer and removed: 53 print( 54 "Rebuilding %s because %s changed and %s was removed" 55 % (target, newer, removed) 56 ) 57 elif newer: 58 print("Rebuilding %s because %s changed" % (target, newer)) 59 elif removed: 60 print("Rebuilding %s because %s was removed" % (target, removed)) 61 else: 62 print("Rebuilding %s for an unknown reason" % target) 63 64 65 if __name__ == "__main__": 66 import sys 67 68 rebuild_check(sys.argv[1:])