예제 #1
0
    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
예제 #2
0
    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