1 #!/usr/bin/env python 2 # 3 # Copyright (C) 2012 The Android Open Source Project 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 """ 18 Prints to stdout the package names that have overlay changes between 19 current_overlays.txt and previous_overlays.txt. 20 21 Usage: diff_package_overlays.py <current_packages.txt> <current_overlays.txt> <previous_overlays.txt> 22 current_packages.txt contains all package names separated by space in the current build. 23 This script modfies current_packages.txt if necessary: if there is a package in 24 previous_overlays.txt but absent from current_packages.txt, we copy that line 25 from previous_overlays.txt over to current_packages.txt. Usually that means we 26 just don't care that package in the current build (for example we are switching 27 from a full build to a partial build with mm/mmm), and we should carry on the 28 previous overlay config so current_overlays.txt always reflects the current 29 status of the entire tree. 30 31 Format of current_overlays.txt and previous_overlays.txt: 32 <package_name> <resource_overlay> [resource_overlay ...] 33 <package_name> <resource_overlay> [resource_overlay ...] 34 ... 35 """ 36 37 import sys 38 39 def main(argv): 40 if len(argv) != 4: 41 print >> sys.stderr, __doc__ 42 sys.exit(1) 43 44 f = open(argv[1]) 45 all_packages = set(f.read().split()) 46 f.close() 47 48 def load_overlay_config(filename): 49 f = open(filename) 50 result = {} 51 for line in f: 52 line = line.strip() 53 if not line or line.startswith("#"): 54 continue 55 words = line.split() 56 result[words[0]] = " ".join(words[1:]) 57 f.close() 58 return result 59 60 current_overlays = load_overlay_config(argv[2]) 61 previous_overlays = load_overlay_config(argv[3]) 62 63 result = [] 64 carryon = [] 65 for p in current_overlays: 66 if p not in previous_overlays: 67 result.append(p) 68 elif current_overlays[p] != previous_overlays[p]: 69 result.append(p) 70 for p in previous_overlays: 71 if p not in current_overlays: 72 if p in all_packages: 73 # overlay changed 74 result.append(p) 75 else: 76 # we don't build p in the current build. 77 carryon.append(p) 78 79 # Add carryon to the current overlay config file. 80 if carryon: 81 f = open(argv[2], "a") 82 for p in carryon: 83 f.write(p + " " + previous_overlays[p] + "\n") 84 f.close() 85 86 # Print out the package names that have overlay change. 87 for r in result: 88 print r 89 90 if __name__ == "__main__": 91 main(sys.argv) 92