Использование portage (python3)

legacy27 3.6.7.15
Mike Hiretsky 4 years ago
parent 3323678d07
commit dd487063b1

@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
# 2017 Calculate Ltd. 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 portage import xpak

@ -1634,14 +1634,45 @@ def unhide_packages(prefix='/', force=False):
XPAK_TMP = "/dev/shm/xpak"
class tbz2(object):
"""
Python3 portage.xpak.tbz2 simple wrapper
"""
def __init__(self, tbzfile):
self.tbzfile = tbzfile
def _escape(self, s):
return s.replace("'","\\'")
def decompose(self, workdir):
p = process('/usr/bin/python3')
p.write("from portage.xpak import tbz2\n"
"tbz2('%s').decompose('%s')" % (
self._escape(self.tbzfile),
self._escape(workdir)))
p.stdin.close()
if not p.success():
raise PackageError(_("Failed to decompose %s") % self.tbzfile)
def compose(self, workdir):
p = process('/usr/bin/python3')
p.write("from portage.xpak import tbz2\n"
"tbz2('%s').compose('%s')" % (
self._escape(self.tbzfile),
self._escape(workdir)))
p.stdin.close()
if not p.success():
raise PackageError(_("Failed to compose %s") % self.tbzfile)
class BinaryPackage(object):
"""
Объект для модификации var/db файлов бинарного пакета
"""
def __init__(self, xpak_fn, work_dn=XPAK_TMP):
from calculate.lib.cl_portage import xpak
self.work_dn = work_dn
self.tbz2 = xpak.tbz2(xpak_fn)
self.tbz2 = tbz2(xpak_fn)
self.tbz2.decompose(self.work_dn)
def __setitem__(self, item, value):

@ -603,7 +603,7 @@ def stderr_devnull():
sys.stderr = oldstderr
class PortageConfigProxy(object):
class PortageConfigWrapper(object):
def __init__(self):
self._dict = {}
self.repositories = []
@ -618,33 +618,46 @@ class PortageConfigProxy(object):
return item in self._dict
@classmethod
def getconfig(cls, chroot):
from portage.package.ebuild.config import config
def getconfig_chroot(cls, chroot):
return cls.getconfig_python(process("/usr/bin/chroot",
chroot, "/usr/bin/python3"))
def target(chroot_path, queue):
@classmethod
def getconfig(cls):
return cls.getconfig_python(process("/usr/bin/python3"))
@classmethod
def getconfig_python(cls, pythonprocess):
import json
pythonprocess.write(
"from portage.package.ebuild.config import config\n"
"import json\n"
"c = config()\n"
"obj = {}\n"
"for key in ('CONFIG_PROTECT_MASK', 'CONFIG_PROTECT',\n"
" 'FEATURES', 'DISTDIR',\n"
" 'PKGDIR', 'EMERGE_DEFAULT_OPTS', 'LINGUAS'):\n"
" obj[key] = c[key]\n"
"obj['repositories'] = {}\n"
"for x in c.repositories:\n"
" obj['repositories'][x.name] = x.location\n"
"print(json.dumps(obj))\n")
pythonprocess.stdin.close()
if pythonprocess.success():
data = pythonprocess.read()
try:
os.chroot(chroot_path)
with stderr_devnull():
c = config()
c = json.loads(data)
obj = cls()
for key in ('CONFIG_PROTECT_MASK', 'CONFIG_PROTECT',
'FEATURES',
'FEATURES', 'DISTDIR',
'PKGDIR', 'EMERGE_DEFAULT_OPTS', 'LINGUAS'):
obj[key] = c[key]
obj.repositories = [RepoConfigProxy(x.name, x.location)
for x in c.repositories]
queue.put(obj)
except Exception:
queue.put(None)
queue = multiprocessing.Queue()
p = multiprocessing.Process(target=target, args=(chroot, queue))
p.start()
p.join(10)
return queue.get(timeout=10)
def __str__(self):
return "EmergeConfig"
obj.repositories = [RepoConfigProxy(name, location)
for name, location in c['repositories'].items()]
return obj
except ValueError as e:
pass
raise VariableError(_("Failed to receive portage config"))
class VariableClEmergeConfig(ReadonlyVariable):
@ -657,16 +670,11 @@ class VariableClEmergeConfig(ReadonlyVariable):
def get(self):
try:
if self.systemRoot == '/':
from portage.package.ebuild.config import config
config.__str__ = lambda self: "EmergeConfig"
with stderr_devnull():
c = config()
if c.repositories.repoLocationList(): # and c["LINGUAS"]:
return c
c = PortageConfigWrapper.getconfig()
else:
c = PortageConfigProxy.getconfig(self.systemRoot)
return c or ""
c = PortageConfigWrapper.getconfig_chroot(self.systemRoot)
c.__str__ = lambda self: "EmergeConfig"
return c
except Exception:
pass
return ""

Loading…
Cancel
Save