1 |
If there are packages to be merged or unmerge, then bail out early |
2 |
if /var/db/pkg is not writable (in order to avoid a fatal EROFS error |
3 |
which would otherwise occur later on). Behavior remains unchanged for |
4 |
--pretend mode. For --ask mode, it will bail out just after the last |
5 |
relevant --ask prompt. |
6 |
|
7 |
In contrast to the writeable_check module, which operates on files just |
8 |
before they are merged, the new vardbapi.writable check is performed |
9 |
before anything has been built (much earlier). |
10 |
|
11 |
X-Gentoo-Bug: 490732 |
12 |
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=490732 |
13 |
--- |
14 |
PATCH v3 fixes emerge --unmerge --pretend to succeed when /var/db/pkg |
15 |
is not writable (--pretend actions may still be useful when operating |
16 |
with a readonly filesystem). |
17 |
|
18 |
pym/_emerge/actions.py | 15 +++++++++++++++ |
19 |
pym/_emerge/unmerge.py | 9 +++++++++ |
20 |
pym/portage/dbapi/vartree.py | 12 ++++++++++++ |
21 |
3 files changed, 36 insertions(+) |
22 |
|
23 |
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py |
24 |
index 48b0826..6f7dfe0 100644 |
25 |
--- a/pym/_emerge/actions.py |
26 |
+++ b/pym/_emerge/actions.py |
27 |
@@ -428,6 +428,21 @@ def action_build(settings, trees, mtimedb, |
28 |
# least show warnings about missed updates and such. |
29 |
mydepgraph.display_problems() |
30 |
|
31 |
+ if not Scheduler._opts_no_self_update.intersection(myopts): |
32 |
+ |
33 |
+ eroots = set() |
34 |
+ for x in mydepgraph.altlist(): |
35 |
+ if isinstance(x, Package) and x.operation == "merge": |
36 |
+ eroots.add(x.root) |
37 |
+ |
38 |
+ for eroot in eroots: |
39 |
+ if not trees[eroot]["vartree"].dbapi.writable: |
40 |
+ writemsg_level("!!! %s\n" % |
41 |
+ _("Read-only file system: %s") % |
42 |
+ trees[eroot]["vartree"].dbapi._dbroot, |
43 |
+ level=logging.ERROR, noiselevel=-1) |
44 |
+ return 1 |
45 |
+ |
46 |
if ("--resume" in myopts): |
47 |
favorites=mtimedb["resume"]["favorites"] |
48 |
|
49 |
diff --git a/pym/_emerge/unmerge.py b/pym/_emerge/unmerge.py |
50 |
index df29000..7f6d82a 100644 |
51 |
--- a/pym/_emerge/unmerge.py |
52 |
+++ b/pym/_emerge/unmerge.py |
53 |
@@ -10,6 +10,7 @@ import textwrap |
54 |
import portage |
55 |
from portage import os |
56 |
from portage.dbapi._expand_new_virt import expand_new_virt |
57 |
+from portage.localization import _ |
58 |
from portage.output import bold, colorize, darkgreen, green |
59 |
from portage._sets import SETPREFIX |
60 |
from portage._sets.base import EditablePackageSet |
61 |
@@ -536,6 +537,7 @@ def unmerge(root_config, myopts, unmerge_action, |
62 |
if "--pretend" in myopts: |
63 |
#we're done... return |
64 |
return os.EX_OK |
65 |
+ |
66 |
if "--ask" in myopts: |
67 |
uq = UserQuery(myopts) |
68 |
if uq.query("Would you like to unmerge these packages?", |
69 |
@@ -546,6 +548,13 @@ def unmerge(root_config, myopts, unmerge_action, |
70 |
print("Quitting.") |
71 |
print() |
72 |
return 128 + signal.SIGINT |
73 |
+ |
74 |
+ if not vartree.dbapi.writable: |
75 |
+ writemsg_level("!!! %s\n" % |
76 |
+ _("Read-only file system: %s") % vartree.dbapi._dbroot, |
77 |
+ level=logging.ERROR, noiselevel=-1) |
78 |
+ return 1 |
79 |
+ |
80 |
#the real unmerging begins, after a short delay unless we're raging.... |
81 |
if not unmerge_action == "rage-clean" and clean_delay and not autoclean: |
82 |
countdown(int(settings["CLEAN_DELAY"]), ">>> Unmerging") |
83 |
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py |
84 |
index 0fd1bd9..df031cd 100644 |
85 |
--- a/pym/portage/dbapi/vartree.py |
86 |
+++ b/pym/portage/dbapi/vartree.py |
87 |
@@ -33,6 +33,7 @@ portage.proxy.lazyimport.lazyimport(globals(), |
88 |
'portage.util.env_update:env_update', |
89 |
'portage.util.listdir:dircache,listdir', |
90 |
'portage.util.movefile:movefile', |
91 |
+ 'portage.util.path:first_existing', |
92 |
'portage.util.writeable_check:get_ro_checker', |
93 |
'portage.util._dyn_libs.PreservedLibsRegistry:PreservedLibsRegistry', |
94 |
'portage.util._dyn_libs.LinkageMapELF:LinkageMapELF@LinkageMap', |
95 |
@@ -189,6 +190,17 @@ class vardbapi(dbapi): |
96 |
self._cached_counter = None |
97 |
|
98 |
@property |
99 |
+ def writable(self): |
100 |
+ """ |
101 |
+ Check if var/db/pkg is writable, or permissions are sufficient |
102 |
+ to create it if it does not exist yet. |
103 |
+ @rtype: bool |
104 |
+ @return: True if var/db/pkg is writable or can be created, |
105 |
+ False otherwise |
106 |
+ """ |
107 |
+ return os.access(first_existing(self._dbroot), os.W_OK) |
108 |
+ |
109 |
+ @property |
110 |
def root(self): |
111 |
warnings.warn("The root attribute of " |
112 |
"portage.dbapi.vartree.vardbapi" |
113 |
-- |
114 |
2.0.4 |