def getDirectDependencies(self): gse_obj = GoSymbolsExtractor(self.parser_config) if not gse_obj.extract(): self.err.append(gse_obj.getError()) return False package_imports_occurence = gse_obj.getPackageImportsOccurences() ip_used = gse_obj.getImportedPackages() ipd = ImportPathsDecomposer(ip_used) if not ipd.decompose(): self.err.append(ipd.getError()) return False self.warn.append(ipd.getWarning()) classes = ipd.getClasses() sorted_classes = sorted(classes.keys()) for element in sorted_classes: if element == "Native": continue # class name starts with prefix => filter out if element.startswith(self.import_path_prefix): continue element_info = self.processElement(element) if element_info == {}: continue if self.verbose: sys.stderr.write(element + " (" + str(self.detectProjectSubpackages(element, classes[element])) + ")\n") for ip in classes[element]: info = copy.deepcopy(element_info) info["ImportPath"] = str(ip) info["ImportPathPrefix"] = element self.detected_commits[ip] = info if self.verbose: sys.stderr.write("%s\n" % str(info)) for pkg in gse_obj.getSymbols().keys(): ip, _ = pkg.split(":") if ip == ".": ip = self.import_path_prefix else: ip = "%s/%s" % (self.import_path_prefix, ip) self.defined_packages[ip] = {} return True
def getIndirectDependencies(self): """ All new deps put into local queue. Once deps_queue is done, replace it with local one. """ queue = [] for ip in self.deps_queue: # for a fiven import path construct its partial graph parser_config = self.parser_config import_path_prefix = self.detected_commits[ip]["ImportPathPrefix"] parser_config.setImportPathPrefix(import_path_prefix) # set path to SourceCodeStorage path = self.source_code_storage.getDirectory( self.detected_commits[ip]["ProviderPrefix"], self.detected_commits[ip]["Rev"] ) parser_config.setParsePath(path) subpackages = self.detectProjectSubpackages(self.detected_commits[ip]["ImportPathPrefix"], [ip]) # TODO(jchaloup): Later, add all packages of the same prefix to speed it up parser_config.setPartial(subpackages) if self.verbose: sys.stderr.write( "Scanning %s: %s\n" % (self.detected_commits[ip]["ImportPathPrefix"], ",".join(subpackages)) ) gb = ProjectDecompositionGraphBuilder(parser_config) gb.buildFromDirectory(path) partial_deps = gb.getPartial() for ip_used in partial_deps: ipd = ImportPathsDecomposer(partial_deps[ip_used]) if not ipd.decompose(): self.err.append(ipd.getError()) return False self.warn.append(ipd.getWarning()) classes = ipd.getClasses() sorted_classes = sorted(classes.keys()) for element in sorted_classes: if element == "Native": continue # class name starts with prefix => filter out if element.startswith(import_path_prefix): continue element_info = self.processElement(element) if element_info == {}: continue for ip in classes[element]: # is import path already checked in? if ip in self.detected_commits: # print "^^^^%s" % ip continue # TODO(jchaloup): or is ip in defined packages? info = copy.deepcopy(element_info) info["ImportPath"] = str(ip) info["ImportPathPrefix"] = element self.detected_commits[ip] = info if self.verbose: sys.stderr.write("%s\n" % str(info)) queue.append(ip) self.deps_queue = queue return True