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 |