148 lines
3.8 KiB
Python
148 lines
3.8 KiB
Python
|
# common python utility routines for the Bionic tool scripts
|
||
|
|
||
|
import logging
|
||
|
import os
|
||
|
import string
|
||
|
import sys
|
||
|
|
||
|
|
||
|
def panic(msg):
|
||
|
sys.stderr.write(os.path.basename(sys.argv[0]) + ": error: ")
|
||
|
sys.stderr.write(msg)
|
||
|
sys.exit(1)
|
||
|
|
||
|
|
||
|
def get_kernel_headers_dir():
|
||
|
return os.path.join(get_android_root(), "external/kernel-headers")
|
||
|
|
||
|
|
||
|
def get_kernel_headers_original_dir():
|
||
|
return os.path.join(get_kernel_headers_dir(), "original")
|
||
|
|
||
|
|
||
|
def get_kernel_headers_modified_dir():
|
||
|
return os.path.join(get_kernel_headers_dir(), "modified")
|
||
|
|
||
|
|
||
|
def get_kernel_dir():
|
||
|
return os.path.join(get_android_root(), "bionic/libc/kernel")
|
||
|
|
||
|
|
||
|
def get_android_root():
|
||
|
if "ANDROID_BUILD_TOP" in os.environ:
|
||
|
# Verify that the current directory is in the root.
|
||
|
# If not, then print an error.
|
||
|
cwd = os.getcwd()
|
||
|
root = os.environ["ANDROID_BUILD_TOP"]
|
||
|
if len(cwd) < len(root) or not root == cwd[:len(root)]:
|
||
|
panic("Not in android tree pointed at by ANDROID_BUILD_TOP (%s)\n" % root)
|
||
|
return os.environ["ANDROID_BUILD_TOP"]
|
||
|
panic("Unable to find root of tree, did you forget to lunch a target?\n")
|
||
|
|
||
|
|
||
|
class StringOutput:
|
||
|
def __init__(self):
|
||
|
self.line = ""
|
||
|
|
||
|
def write(self,msg):
|
||
|
self.line += msg
|
||
|
logging.debug("write '%s'" % msg)
|
||
|
|
||
|
def get(self):
|
||
|
return self.line
|
||
|
|
||
|
|
||
|
def create_file_path(path):
|
||
|
dirs = []
|
||
|
while 1:
|
||
|
parent = os.path.dirname(path)
|
||
|
#print "parent: %s <- %s" % (parent, path)
|
||
|
if parent == "/" or parent == "":
|
||
|
break
|
||
|
dirs.append(parent)
|
||
|
path = parent
|
||
|
|
||
|
dirs.reverse()
|
||
|
for dir in dirs:
|
||
|
#print "dir %s" % dir
|
||
|
if os.path.isdir(dir):
|
||
|
continue
|
||
|
os.mkdir(dir)
|
||
|
|
||
|
|
||
|
class BatchFileUpdater:
|
||
|
"""a class used to edit several files at once"""
|
||
|
def __init__(self):
|
||
|
self.old_files = set()
|
||
|
self.new_files = set()
|
||
|
self.new_data = {}
|
||
|
|
||
|
def readFile(self,path):
|
||
|
#path = os.path.realpath(path)
|
||
|
if os.path.exists(path):
|
||
|
self.old_files.add(path)
|
||
|
|
||
|
def readDir(self,path):
|
||
|
#path = os.path.realpath(path)
|
||
|
for root, dirs, files in os.walk(path):
|
||
|
for f in files:
|
||
|
dst = "%s/%s" % (root,f)
|
||
|
self.old_files.add(dst)
|
||
|
|
||
|
def editFile(self,dst,data):
|
||
|
"""edit a destination file. if the file is not mapped from a source,
|
||
|
it will be added. return 0 if the file content wasn't changed,
|
||
|
1 if it was edited, or 2 if the file is new"""
|
||
|
#dst = os.path.realpath(dst)
|
||
|
result = 1
|
||
|
if os.path.exists(dst):
|
||
|
f = open(dst, "r")
|
||
|
olddata = f.read()
|
||
|
f.close()
|
||
|
if olddata == data:
|
||
|
self.old_files.remove(dst)
|
||
|
return 0
|
||
|
else:
|
||
|
result = 2
|
||
|
|
||
|
self.new_data[dst] = data
|
||
|
self.new_files.add(dst)
|
||
|
return result
|
||
|
|
||
|
def getChanges(self):
|
||
|
"""determine changes, returns (adds, deletes, edits)"""
|
||
|
adds = set()
|
||
|
edits = set()
|
||
|
deletes = set()
|
||
|
|
||
|
for dst in self.new_files:
|
||
|
if not (dst in self.old_files):
|
||
|
adds.add(dst)
|
||
|
else:
|
||
|
edits.add(dst)
|
||
|
|
||
|
for dst in self.old_files:
|
||
|
if not dst in self.new_files:
|
||
|
deletes.add(dst)
|
||
|
|
||
|
return (adds, deletes, edits)
|
||
|
|
||
|
def _writeFile(self,dst):
|
||
|
if not os.path.exists(os.path.dirname(dst)):
|
||
|
create_file_path(dst)
|
||
|
f = open(dst, "w")
|
||
|
f.write(self.new_data[dst])
|
||
|
f.close()
|
||
|
|
||
|
def updateFiles(self):
|
||
|
adds, deletes, edits = self.getChanges()
|
||
|
|
||
|
for dst in sorted(adds):
|
||
|
self._writeFile(dst)
|
||
|
|
||
|
for dst in sorted(edits):
|
||
|
self._writeFile(dst)
|
||
|
|
||
|
for dst in sorted(deletes):
|
||
|
os.remove(dst)
|