def libraryFromPath(self, sAbsPath, space="", anyUser=False): sAbsPath = pathNorm(sAbsPath) if space: rcLibIter = (l for l in self.loadedLibraries.itervalues() if (l.space == space)) else: rcLibIter = self.loadedLibraries.itervalues() for rcLib in rcLibIter: if rcLib.contains(sAbsPath): return rcLib if (space != "public") and anyUser: for sSpace, sLibSection in self._iterLibrariesSpaceAndSection(space="private"): sRawLibPath = self.getPath(sSpace, sLibSection, resVars=False) parseRes = pathParse(sRawLibPath, sAbsPath) if parseRes and parseRes.named: sOwner = parseRes.named["user_name"] return self.getLibrary(sSpace, sLibSection, owner=sOwner, tokens=parseRes.named, dbNode=False, weak=True, remember=True) return None
def contextFromPath(self, entryObjOrPath, library=None, warn=True): if isinstance(entryObjOrPath, DrcEntry): drcEntry = entryObjOrPath library = drcEntry.library else: drcEntry = self.entryFromPath(entryObjOrPath, library=library, dbNode=False, weak=True, warn=warn) if not drcEntry: logMsg("no entry found for '{}'".format(entryObjOrPath), log="debug") return {"abs_path":entryObjOrPath, "rc_entry":None} elif not library: library = drcEntry.library sAbsPath = drcEntry.absPath() ctxData = {"abs_path":sAbsPath, "rc_entry":drcEntry} sFoundRcName = "" bExactRc = False if drcEntry == library: sSection = library.sectionName sSpace = library.space else: sSpace, sSection = self.sectionFromPath(sAbsPath, library=library) if not sSection: logMsg("no section found for '{}'".format(sAbsPath), log="debug") return ctxData bIsFile = isinstance(drcEntry, DrcFile) if not drcEntry.isPublic(): if bIsFile: pubEntry = drcEntry.getPublicFile(fail=True, weak=True, dbNode=False) else: pubEntry = drcEntry.getHomonym("public", weak=True) else: pubEntry = drcEntry pubLib = pubEntry.library if bIsFile and pubEntry.isVersionFile(): ctxData["version"] = pubEntry.versionFromName() pubEntry = pubEntry.getHeadFile(fail=True, dbNode=False) sPublicPath = pubEntry.absPath() sPubPathDirs = pathSplitDirs(sPublicPath) numPubDirs = len(sPubPathDirs) def sortValue(sRcPath): n = len(pathSplitDirs(sRcPath)) if n == numPubDirs: return sys.maxint else: return n sRcPathList = sorted(self.iterRcPaths("public", sSection, resVars=True), key=lambda x: sortValue(x[1]), reverse=True) sSectionPath = self.getPath("public", sSection, default="", resVars=False) if sSectionPath: sRcPathList.append(("", sSectionPath)) parseRes = None sCurPubPath = sPublicPath numCurPubDirs = numPubDirs while (not sFoundRcName) and (not pathEqual(sCurPubPath, pubLib.absPath())): for sRcName, sRcPath in sRcPathList: numRcDirs = len(pathSplitDirs(sRcPath)) if numRcDirs != numCurPubDirs: continue parseRes = pathParse(sRcPath, sCurPubPath) #print "\n", sRcPath, sCurPubPath, parseRes, sRcName if parseRes and parseRes.named: sFoundRcName = sRcName if numRcDirs == numPubDirs: bExactRc = True #print sRcName break sCurPubPath = osp.dirname(sCurPubPath) numCurPubDirs = len(pathSplitDirs(sCurPubPath)) if not parseRes: logMsg("no parsing results for '{}'".format(sCurPubPath), log="debug") return ctxData ctxData.update(parseRes.named) ctxData["section"] = sSection ctxData["space"] = sSpace ctxData["library"] = library if sFoundRcName: sRawRcPath = self.getPath("public", sSection, sFoundRcName, resVars=False) parseRes = pathParse(sRawRcPath, sPublicPath) ctxData.update((k, v) for k, v in parseRes.named.iteritems() if k not in ctxData) if bExactRc: ctxData["resource"] = sFoundRcName sStepDir = ctxData.get("step", "") if sStepDir: sSgStepDct = self.getVar(sSection, "sg_step_map", default={}) if sStepDir in sSgStepDct: ctxData['sg_step'] = sSgStepDct[sStepDir] damEntity = None if "name" in ctxData: damEntity = self._entityFromContext(ctxData, fail=False) ctxData["dam_entity"] = damEntity return ctxData