Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] emerge: check for writable /var/db/pkg (490732)
Date: Tue, 18 Nov 2014 09:19:14
Message-Id: 1416302341-18857-1-git-send-email-zmedico@gentoo.org
1 If there are packages to be merged or unmerge, then bail out early if
2 /var/db/pkg is not writable.
3
4 X-Gentoo-Bug: 490732
5 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=490732
6 ---
7 pym/_emerge/actions.py | 21 +++++++++++++++++++++
8 pym/portage/dbapi/vartree.py | 9 +++++++++
9 2 files changed, 30 insertions(+)
10
11 diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py
12 index 48b0826..4a96a22 100644
13 --- a/pym/_emerge/actions.py
14 +++ b/pym/_emerge/actions.py
15 @@ -428,6 +428,21 @@ def action_build(settings, trees, mtimedb,
16 # least show warnings about missed updates and such.
17 mydepgraph.display_problems()
18
19 + if not Scheduler._opts_no_self_update.intersection(myopts):
20 +
21 + eroots = set()
22 + for x in mydepgraph.altlist():
23 + if isinstance(x, Package) and x.operation == "merge":
24 + eroots.add(x.root)
25 +
26 + for eroot in eroots:
27 + if not trees[eroot]["vartree"].dbapi.writable:
28 + writemsg_level("!!! %s\n" %
29 + _("Read-only file system: %s") %
30 + trees[eroot]["vartree"].dbapi._dbroot,
31 + level=logging.ERROR, noiselevel=-1)
32 + return 1
33 +
34 if ("--resume" in myopts):
35 favorites=mtimedb["resume"]["favorites"]
36
37 @@ -2842,6 +2857,12 @@ def action_uninstall(settings, trees, ldpath_mtimes,
38 if action == 'deselect':
39 return action_deselect(settings, trees, opts, valid_atoms)
40
41 + if not vardb.writable:
42 + writemsg_level("!!! %s\n" %
43 + _("Read-only file system: %s") % vardb._dbroot,
44 + level=logging.ERROR, noiselevel=-1)
45 + return 1
46 +
47 # Use the same logic as the Scheduler class to trigger redirection
48 # of ebuild pkg_prerm/postrm phase output to logs as appropriate
49 # for options such as --jobs, --quiet and --quiet-build.
50 diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
51 index 0fd1bd9..64b0ff6 100644
52 --- a/pym/portage/dbapi/vartree.py
53 +++ b/pym/portage/dbapi/vartree.py
54 @@ -33,6 +33,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
55 'portage.util.env_update:env_update',
56 'portage.util.listdir:dircache,listdir',
57 'portage.util.movefile:movefile',
58 + 'portage.util.path:first_existing',
59 'portage.util.writeable_check:get_ro_checker',
60 'portage.util._dyn_libs.PreservedLibsRegistry:PreservedLibsRegistry',
61 'portage.util._dyn_libs.LinkageMapELF:LinkageMapELF@LinkageMap',
62 @@ -189,6 +190,14 @@ class vardbapi(dbapi):
63 self._cached_counter = None
64
65 @property
66 + def writable(self):
67 + """
68 + @rtype: bool
69 + @return: True if var/db/pkg is writable, False otherwise
70 + """
71 + return os.access(first_existing(self._dbroot), os.W_OK)
72 +
73 + @property
74 def root(self):
75 warnings.warn("The root attribute of "
76 "portage.dbapi.vartree.vardbapi"
77 --
78 2.0.4

Replies