1*8d67ca89SAndroid Build Coastguard Worker# common python utility routines for the Bionic tool scripts 2*8d67ca89SAndroid Build Coastguard Worker 3*8d67ca89SAndroid Build Coastguard Workerimport logging 4*8d67ca89SAndroid Build Coastguard Workerimport os 5*8d67ca89SAndroid Build Coastguard Workerimport string 6*8d67ca89SAndroid Build Coastguard Workerimport sys 7*8d67ca89SAndroid Build Coastguard Worker 8*8d67ca89SAndroid Build Coastguard Worker 9*8d67ca89SAndroid Build Coastguard Workerdef panic(msg): 10*8d67ca89SAndroid Build Coastguard Worker sys.stderr.write(os.path.basename(sys.argv[0]) + ": error: ") 11*8d67ca89SAndroid Build Coastguard Worker sys.stderr.write(msg) 12*8d67ca89SAndroid Build Coastguard Worker sys.exit(1) 13*8d67ca89SAndroid Build Coastguard Worker 14*8d67ca89SAndroid Build Coastguard Worker 15*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_headers_dir(): 16*8d67ca89SAndroid Build Coastguard Worker return os.path.join(get_android_root(), "external/kernel-headers") 17*8d67ca89SAndroid Build Coastguard Worker 18*8d67ca89SAndroid Build Coastguard Worker 19*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_headers_original_dir(): 20*8d67ca89SAndroid Build Coastguard Worker return os.path.join(get_kernel_headers_dir(), "original") 21*8d67ca89SAndroid Build Coastguard Worker 22*8d67ca89SAndroid Build Coastguard Worker 23*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_headers_modified_dir(): 24*8d67ca89SAndroid Build Coastguard Worker return os.path.join(get_kernel_headers_dir(), "modified") 25*8d67ca89SAndroid Build Coastguard Worker 26*8d67ca89SAndroid Build Coastguard Worker 27*8d67ca89SAndroid Build Coastguard Workerdef get_kernel_dir(): 28*8d67ca89SAndroid Build Coastguard Worker return os.path.join(get_android_root(), "bionic/libc/kernel") 29*8d67ca89SAndroid Build Coastguard Worker 30*8d67ca89SAndroid Build Coastguard Worker 31*8d67ca89SAndroid Build Coastguard Workerdef get_android_root(): 32*8d67ca89SAndroid Build Coastguard Worker if "ANDROID_BUILD_TOP" in os.environ: 33*8d67ca89SAndroid Build Coastguard Worker # Verify that the current directory is in the root. 34*8d67ca89SAndroid Build Coastguard Worker # If not, then print an error. 35*8d67ca89SAndroid Build Coastguard Worker cwd = os.getcwd() 36*8d67ca89SAndroid Build Coastguard Worker root = os.environ["ANDROID_BUILD_TOP"] 37*8d67ca89SAndroid Build Coastguard Worker if len(cwd) < len(root) or not root == cwd[:len(root)]: 38*8d67ca89SAndroid Build Coastguard Worker panic("Not in android tree pointed at by ANDROID_BUILD_TOP (%s)\n" % root) 39*8d67ca89SAndroid Build Coastguard Worker return os.environ["ANDROID_BUILD_TOP"] 40*8d67ca89SAndroid Build Coastguard Worker panic("Unable to find root of tree, did you forget to lunch a target?\n") 41*8d67ca89SAndroid Build Coastguard Worker 42*8d67ca89SAndroid Build Coastguard Worker 43*8d67ca89SAndroid Build Coastguard Workerclass StringOutput: 44*8d67ca89SAndroid Build Coastguard Worker def __init__(self): 45*8d67ca89SAndroid Build Coastguard Worker self.line = "" 46*8d67ca89SAndroid Build Coastguard Worker 47*8d67ca89SAndroid Build Coastguard Worker def write(self,msg): 48*8d67ca89SAndroid Build Coastguard Worker self.line += msg 49*8d67ca89SAndroid Build Coastguard Worker logging.debug("write '%s'" % msg) 50*8d67ca89SAndroid Build Coastguard Worker 51*8d67ca89SAndroid Build Coastguard Worker def get(self): 52*8d67ca89SAndroid Build Coastguard Worker return self.line 53*8d67ca89SAndroid Build Coastguard Worker 54*8d67ca89SAndroid Build Coastguard Worker 55*8d67ca89SAndroid Build Coastguard Workerdef create_file_path(path): 56*8d67ca89SAndroid Build Coastguard Worker dirs = [] 57*8d67ca89SAndroid Build Coastguard Worker while 1: 58*8d67ca89SAndroid Build Coastguard Worker parent = os.path.dirname(path) 59*8d67ca89SAndroid Build Coastguard Worker #print "parent: %s <- %s" % (parent, path) 60*8d67ca89SAndroid Build Coastguard Worker if parent == "/" or parent == "": 61*8d67ca89SAndroid Build Coastguard Worker break 62*8d67ca89SAndroid Build Coastguard Worker dirs.append(parent) 63*8d67ca89SAndroid Build Coastguard Worker path = parent 64*8d67ca89SAndroid Build Coastguard Worker 65*8d67ca89SAndroid Build Coastguard Worker dirs.reverse() 66*8d67ca89SAndroid Build Coastguard Worker for dir in dirs: 67*8d67ca89SAndroid Build Coastguard Worker #print "dir %s" % dir 68*8d67ca89SAndroid Build Coastguard Worker if os.path.isdir(dir): 69*8d67ca89SAndroid Build Coastguard Worker continue 70*8d67ca89SAndroid Build Coastguard Worker os.mkdir(dir) 71*8d67ca89SAndroid Build Coastguard Worker 72*8d67ca89SAndroid Build Coastguard Worker 73*8d67ca89SAndroid Build Coastguard Workerclass BatchFileUpdater: 74*8d67ca89SAndroid Build Coastguard Worker """a class used to edit several files at once""" 75*8d67ca89SAndroid Build Coastguard Worker def __init__(self): 76*8d67ca89SAndroid Build Coastguard Worker self.old_files = set() 77*8d67ca89SAndroid Build Coastguard Worker self.new_files = set() 78*8d67ca89SAndroid Build Coastguard Worker self.new_data = {} 79*8d67ca89SAndroid Build Coastguard Worker 80*8d67ca89SAndroid Build Coastguard Worker def readFile(self,path): 81*8d67ca89SAndroid Build Coastguard Worker #path = os.path.realpath(path) 82*8d67ca89SAndroid Build Coastguard Worker if os.path.exists(path): 83*8d67ca89SAndroid Build Coastguard Worker self.old_files.add(path) 84*8d67ca89SAndroid Build Coastguard Worker 85*8d67ca89SAndroid Build Coastguard Worker def readDir(self,path): 86*8d67ca89SAndroid Build Coastguard Worker #path = os.path.realpath(path) 87*8d67ca89SAndroid Build Coastguard Worker for root, dirs, files in os.walk(path): 88*8d67ca89SAndroid Build Coastguard Worker for f in files: 89*8d67ca89SAndroid Build Coastguard Worker dst = "%s/%s" % (root,f) 90*8d67ca89SAndroid Build Coastguard Worker self.old_files.add(dst) 91*8d67ca89SAndroid Build Coastguard Worker 92*8d67ca89SAndroid Build Coastguard Worker def editFile(self,dst,data): 93*8d67ca89SAndroid Build Coastguard Worker """edit a destination file. if the file is not mapped from a source, 94*8d67ca89SAndroid Build Coastguard Worker it will be added. return 0 if the file content wasn't changed, 95*8d67ca89SAndroid Build Coastguard Worker 1 if it was edited, or 2 if the file is new""" 96*8d67ca89SAndroid Build Coastguard Worker #dst = os.path.realpath(dst) 97*8d67ca89SAndroid Build Coastguard Worker result = 1 98*8d67ca89SAndroid Build Coastguard Worker if os.path.exists(dst): 99*8d67ca89SAndroid Build Coastguard Worker f = open(dst, "r") 100*8d67ca89SAndroid Build Coastguard Worker olddata = f.read() 101*8d67ca89SAndroid Build Coastguard Worker f.close() 102*8d67ca89SAndroid Build Coastguard Worker if olddata == data: 103*8d67ca89SAndroid Build Coastguard Worker self.old_files.remove(dst) 104*8d67ca89SAndroid Build Coastguard Worker return 0 105*8d67ca89SAndroid Build Coastguard Worker else: 106*8d67ca89SAndroid Build Coastguard Worker result = 2 107*8d67ca89SAndroid Build Coastguard Worker 108*8d67ca89SAndroid Build Coastguard Worker self.new_data[dst] = data 109*8d67ca89SAndroid Build Coastguard Worker self.new_files.add(dst) 110*8d67ca89SAndroid Build Coastguard Worker return result 111*8d67ca89SAndroid Build Coastguard Worker 112*8d67ca89SAndroid Build Coastguard Worker def getChanges(self): 113*8d67ca89SAndroid Build Coastguard Worker """determine changes, returns (adds, deletes, edits)""" 114*8d67ca89SAndroid Build Coastguard Worker adds = set() 115*8d67ca89SAndroid Build Coastguard Worker edits = set() 116*8d67ca89SAndroid Build Coastguard Worker deletes = set() 117*8d67ca89SAndroid Build Coastguard Worker 118*8d67ca89SAndroid Build Coastguard Worker for dst in self.new_files: 119*8d67ca89SAndroid Build Coastguard Worker if not (dst in self.old_files): 120*8d67ca89SAndroid Build Coastguard Worker adds.add(dst) 121*8d67ca89SAndroid Build Coastguard Worker else: 122*8d67ca89SAndroid Build Coastguard Worker edits.add(dst) 123*8d67ca89SAndroid Build Coastguard Worker 124*8d67ca89SAndroid Build Coastguard Worker for dst in self.old_files: 125*8d67ca89SAndroid Build Coastguard Worker if not dst in self.new_files: 126*8d67ca89SAndroid Build Coastguard Worker deletes.add(dst) 127*8d67ca89SAndroid Build Coastguard Worker 128*8d67ca89SAndroid Build Coastguard Worker return (adds, deletes, edits) 129*8d67ca89SAndroid Build Coastguard Worker 130*8d67ca89SAndroid Build Coastguard Worker def _writeFile(self,dst): 131*8d67ca89SAndroid Build Coastguard Worker if not os.path.exists(os.path.dirname(dst)): 132*8d67ca89SAndroid Build Coastguard Worker create_file_path(dst) 133*8d67ca89SAndroid Build Coastguard Worker f = open(dst, "w") 134*8d67ca89SAndroid Build Coastguard Worker f.write(self.new_data[dst]) 135*8d67ca89SAndroid Build Coastguard Worker f.close() 136*8d67ca89SAndroid Build Coastguard Worker 137*8d67ca89SAndroid Build Coastguard Worker def updateFiles(self): 138*8d67ca89SAndroid Build Coastguard Worker adds, deletes, edits = self.getChanges() 139*8d67ca89SAndroid Build Coastguard Worker 140*8d67ca89SAndroid Build Coastguard Worker for dst in sorted(adds): 141*8d67ca89SAndroid Build Coastguard Worker self._writeFile(dst) 142*8d67ca89SAndroid Build Coastguard Worker 143*8d67ca89SAndroid Build Coastguard Worker for dst in sorted(edits): 144*8d67ca89SAndroid Build Coastguard Worker self._writeFile(dst) 145*8d67ca89SAndroid Build Coastguard Worker 146*8d67ca89SAndroid Build Coastguard Worker for dst in sorted(deletes): 147*8d67ca89SAndroid Build Coastguard Worker os.remove(dst) 148