15d3fef0da
The previous versions of the scripts did a lot of redundant changes and were hard to follow. I rewrote most of update_all.py so that it's clear about what's going on. I updated clean_header.py to change the cleanupFile function so that there is no magic about where the destination file is going to wind up. Now the caller specifies the final location. I updated utils.py so that if you are trying to do an update in one location, but your lunch target is from another location, it causes an error. Bug: 35726570 Change-Id: Ic5a44d90c2774a627eecde34c0c403bc925a497c Test: Ran the updater and verified it works properly. Test: Verified that doing an update in one tree to another tree Test: fails.
164 lines
4.3 KiB
Python
164 lines
4.3 KiB
Python
# common python utility routines for the Bionic tool scripts
|
|
|
|
import commands
|
|
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)
|
|
|
|
def updateGitFiles(self):
|
|
adds, deletes, edits = self.getChanges()
|
|
|
|
if adds:
|
|
for dst in sorted(adds):
|
|
self._writeFile(dst)
|
|
commands.getoutput("git add " + " ".join(adds))
|
|
|
|
if deletes:
|
|
commands.getoutput("git rm " + " ".join(deletes))
|
|
|
|
if edits:
|
|
for dst in sorted(edits):
|
|
self._writeFile(dst)
|
|
commands.getoutput("git add " + " ".join(edits))
|