diff -r 06ff229162e9 -r 11d3954df52a bin/synchb.py --- a/bin/synchb.py Fri May 14 16:09:54 2010 +0300 +++ b/bin/synchb.py Thu May 27 13:10:59 2010 +0300 @@ -36,7 +36,8 @@ # Globals # ============================================================================ VERBOSE = False -EXCLUDE = ["hbplugins", "hbservers", "3rdparty", "internal", "tsrc", "debug", "release"] +EXCLUDE = ["hbapps", "hbplugins", "hbservers", "hbtools", "3rdparty", + "internal", "tsrc", "debug", "release", "bwins", "eabi"] COLLECTIONS = {"hbcore": "HbCore", "hbfeedback": "HbFeedback", "hbinput": "HbInput", @@ -87,8 +88,24 @@ except IOError, e: print(e) -def write_header(filepath, include): - write_file(filepath, "#include \"%s\"\n" % include) +def include_directive(header): + return "#include \"%s\"\n" % header + +def write_header(header, include, path): + filename = os.path.basename(header) + filepath = os.path.join(path, filename) + relpath = os.path.relpath(header, path).replace("\\", "/") + skip = False + if os.path.exists(filepath): + directive = include_directive(include) + oldsize = os.path.getsize(filepath) + newsize = len(directive) + if oldsize == newsize and directive == read_file(filepath): + skip = True + if not skip: + if VERBOSE: + print("INFO:\t ==> %s" % os.path.basename(filepath)) + write_file(filepath, include_directive(include)) # ============================================================================ # Component @@ -96,8 +113,8 @@ class Component: def __init__(self, name): self.name = name - self.headers = list() - self.privates = list() + self.headers = [] + self.privates = [] def read(self, path): entries = os.listdir(path) @@ -114,28 +131,24 @@ self.headers.append(entrypath) def write(self, path): + written = [] if len(self.headers) > 0: self._makedirs(path) - self._write(path, self.headers, True) + written += self._write(path, self.headers, True) if len(self.privates) > 0: privpath = os.path.join(path, "private") self._makedirs(privpath) - self._write(privpath, self.privates, False) + written += self._write(privpath, self.privates, False) + return written def _write(self, path, headers, convenience): - global VERBOSE - if VERBOSE: - print("INFO: Writing headers to '%s'" % path) + written = [] for header in headers: - filename = os.path.basename(header) - filepath = os.path.join(path, filename) - relpath = os.path.relpath(header, path) - if VERBOSE: - print("INFO:\t ==> %s" % os.path.basename(filepath)) - write_header(filepath, relpath.replace("\\", "/")) + write_header(header, header, path) + written.append(os.path.join(path, os.path.basename(header))) if convenience: - classes = list() + classes = [] content = read_file(header) for match in re.finditer("(?:class|namespace)\s+(?:HB_[^_]+_EXPORT\s+)?(Hb\w*)(\s*;)?", content): if not match.group(2): @@ -143,14 +156,12 @@ for match in re.finditer("#pragma hb_header\((\w+)\)", content): classes.append(match.group(1)) for cls in classes: - filepath = os.path.join(path, cls) - write_header(filepath, filename) + write_header(cls, os.path.basename(header), path) + written.append(os.path.join(path, cls)) + return written def _makedirs(self, path): - global VERBOSE if not os.path.exists(path): - if VERBOSE: - print("INFO: Creating include dir '%s'" % path) os.makedirs(path) # ============================================================================ @@ -171,25 +182,55 @@ self.components.append(component) def write(self, path): - global COLLECTIONS + global COLLECTIONS, VERBOSE + path = os.path.join(os.path.abspath(path), self.name) + if VERBOSE: + print("INFO: Writing headers to '%s'..." % path) + # there's no set in python 2.3 so use a list + leftovers = [] + for root, dirs, files in os.walk(path): + for file in files: + leftovers.append(os.path.abspath(os.path.join(root, file))) + # include/hbcore - includes = list() - path = os.path.join(path, self.name) + includes = [] + written = [] for component in self.components: - component.write(path) + written += component.write(path) for header in component.headers: includes.append("#include \"%s\"\n" % os.path.basename(header)) + if self.name in COLLECTIONS: - write_file(os.path.join(path, self.name + ".h"), "".join(includes)) - write_header(os.path.join(path, COLLECTIONS[self.name]), self.name + ".h") + collectionheader = os.path.join(path, self.name + ".h") + write_file(collectionheader, "".join(includes)) + written.append(collectionheader) + if collectionheader in leftovers: + leftovers.remove(collectionheader) + convenienceheader = os.path.join(path, COLLECTIONS[self.name]) + write_file(convenienceheader, include_directive(self.name + ".h")) + written.append(convenienceheader) + if convenienceheader in leftovers: + leftovers.remove(convenienceheader) + + for filepath in written: + filepath = os.path.abspath(filepath) + if filepath in leftovers: + leftovers.remove(filepath) + + if VERBOSE and len(leftovers) > 0: + print("INFO: Removing obsolete headers from '%s'..." % path) + for leftover in leftovers: + if VERBOSE: + print("INFO:\t ==> %s" % leftover) # os.path.basename(leftover)) + os.remove(leftover) # ============================================================================ # Package # ============================================================================ class Package: def __init__(self, name): - self.path = name - self.collections = list() + self.name = name + self.collections = [] def read(self, path): global EXCLUDE @@ -228,11 +269,6 @@ if not os.path.basename(os.path.normpath(options.outputdir)) == "include": options.outputdir = os.path.join(options.outputdir, "include") - if os.path.exists(options.outputdir): - if VERBOSE: - print("INFO: Removing include dir '%s'" % options.outputdir) - shutil.rmtree(options.outputdir, ignore_errors=True) - package = Package("hb") package.read(options.inputdir) package.write(options.outputdir)