def write_report(directory, report): io.write(report) # write to screen for convenience? pathname = os.path.basename(os.path.abspath(directory)) fp = io.get_tmpfile('%s.explore_codebase' % pathname, noclobber=True) open(fp, 'w').write(report) io.write_result("Wrote file %s ." % fp)
def compute_prune_list(executable, guidlistfile): guidlist = open(guidlistfile).read() rx_guid = '[0-9a-z]{8}[-][0-9a-z]{4}[-][0-9a-z]{4}[-][0-9a-z]{4}[-][0-9a-z]{12}' rx = '(?m)^(%s)\s+(.*)\n (.*)\n' % rx_guid guiddct = {} filelist = [] for (guid, filepath, funcname) in re.findall(rx, guidlist): filelist.append(filepath) guiddct[guid] = (filepath, funcname) data = open(executable).read() exeguids = re.findall(rx_guid, data) if not exeguids: io.write_result("No guids found in executable", error=True) sys.exit() for exeguid in exeguids: try: del(guiddct[exeguid]) except KeyError: pass dct = {} for (fp, funcname) in guiddct.values(): if fp not in dct: dct[fp] = [] dct[fp].append(funcname) filelist = util.uniq(filelist) return filelist, dct
def check(cls): result = True for (src, trg) in sorted(cls.tree.items()): trg = cls.pathmerge(cls.get_basepath(cls.basepath_dcc_rel), trg, strict=True) if not os.path.exists(trg): result = False io.write_result("Missing: %s" % trg, error=True) return result
def parse_to_xml(cls, filepath, verbose_error=False): success, lab, out, err = cls.exec_gracefully(filepath, args=["-xml"]) if not success: io.write_result("Failed to parse %s" % filepath, error=True) if verbose_error: io.output(err) else: xml = out + "\n" return xml
def to_file(self, noclobber=None): filename = self.get_serialized_name() filepath = io.get_tmpfile('%s%s' % (filename, self.serialize_extension), noclobber=noclobber) flatobj = self.get_serialized_obj() # XXX use older pickle format for mixing with different python versions # pickle.dump(flatobj, open(filepath, 'wb'), pickle.HIGHEST_PROTOCOL) # open to write as binary to preempt win/lin portability bug pickle.dump(flatobj, open(filepath, 'wb')) io.write_result("Wrote file %s ." % filepath) return filepath
def find_forms(graph): # first try to do a wide sweep finding all forms in codebase # this is to find forms that are pulled in from dcus which cannot be # traced projfile = os.path.join(graph.abspath, graph.rootnode.path, graph.rootnode.filename) if projroot: io.write_next_action("Finding all forms in %s" % projroot) forms = io.ifind(projroot, "*.dfm") io.write_result("Found [%s]" % ", ".join(forms)) if forms: return forms # otherwise just return all the forms in the graph forms = graph.rootnode.collect_nodes(lambda n: n.filetype == FileTypes.Form) forms = map(lambda n: os.path.join(graph.abspath, n.path, n.filename), forms) return forms
def main(args): prog = args.pop(0) # try to locate prog on same path as sys.argv[0] if not os.path.exists(prog): path = os.path.dirname(os.path.abspath(sys.argv[0])) prog = os.path.join(path, prog) if not os.path.exists(prog): io.write_result('Not found: %s' % os.path.basename(prog), error=True) return fp = io.get_tmpfile(os.path.basename(prog) + '.profile') args = ['python', '-m', 'cProfile', '-o', fp, prog] + args io.invoke(args) strip_dirs(fp) output(fp)
def trace_deps(filepath, searchpath, stdlibpath, unitaliases, depth=0, maxdepth=None): # don't prevent calls on filepaths already in index so as to resolve # cycles properly, but catch these here to return a valid object # for a filepath already known if self.index_has(filepath): return self.index_get(filepath) io.write_next_action("Tracing %s" % os.path.basename(filepath), indent=depth) filepath, exists, filetype = classify_file(filepath, searchpath, stdlibpath) delphifile = self.new_delphifile(filepath, (filepath, exists, filetype)) if exists: searchpath = collect_searchpath(searchpath, delphifile, filepath) unitaliases = collect_unitaliases(unitaliases, delphifile, filepath) finder_function = finder_dispatch.get(filetype) if finder_function: fps = finder_function(open(filepath).read(), parent=delphifile) io.write_result('Found [%s]' % ', '.join(fps), indent=depth) fps = process_filepaths(delphifile.path, unitaliases, fps) if not maxdepth or maxdepth >= depth+1: for fp in fps: delphifile.add_node(trace_deps(fp, searchpath, stdlibpath, unitaliases, depth=depth+1, maxdepth=maxdepth)) return delphifile