# -*- coding: utf-8 -*- # Copyright 2008-2016 Mir Calculate. http://www.calculate-linux.org # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from os import path import bz2 import os import shutil from .files import readFile, listDirectory class VardbPackage(): """ Объект для модификации пакета из /var/db/pkg """ def __init__(self, infodn): self.infodn = infodn self.CATEGORY, self.PF = path.split(infodn) self.CATEGORY = path.basename(self.CATEGORY) self.environment = path.join(self.infodn, "environment.bz2") self.depend = path.join(self.infodn, "DEPEND") self.bdepend = path.join(self.infodn, "BDEPEND") self.depend_binary = path.join(self.infodn, "DEPEND.binary") self.bdepend_binary = path.join(self.infodn, "BDEPEND.binary") self.detected_mark = path.join(self.infodn, "EMERGE_FROM") def __repr__(self): return "%s/%s"%(self.CATEGORY, self.PF) def set_detected(self, binary): with open(self.detected_mark, 'w') as f: f.write("binary" if binary else "ebuild") @property def binary(self): # detect by mark file if path.exists(self.detected_mark): return readFile(self.detected_mark).strip() == "binary" # detect by old detect if path.exists(self.bdepend_binary) or path.exists(self.depend_binary): self.set_detected(True) return True buf = None # detect by environment.bz2 with bz2.BZ2File(self.environment, 'r') as f: for n in range(0,3): if buf is None: buf = f.read(10000) else: buf += f.read(10000) if "isz=" in buf: self.set_detected(True) return True self.set_detected(False) return False def hide_depends(self): for dep, depb in [(self.depend, self.depend_binary), (self.bdepend, self.bdepend_binary)]: if path.exists(dep): os.rename(dep, depb) def unhide_depends(self): for dep, depb in [(self.depend, self.depend_binary), (self.bdepend, self.bdepend_binary)]: if path.exists(depb): os.rename(depb, dep) class Vardb(): """ Объект для получения пакетов из /var/db/pkg """ def __init__(self, dbdn): self.dbdn = dbdn def __iter__(self): for category in listDirectory(self.dbdn, fullPath=True): if path.isdir(category): for pkg in listDirectory(category, fullPath=True): if "MERGING-" not in pkg and path.isdir(pkg): yield VardbPackage(pkg) def hide_binary_depends(self): for pkg in self: if pkg.binary: pkg.hide_depends() def unhide_binary_depends(self): for pkg in self: if pkg.binary: pkg.unhide_depends()