1 |
Suppress "no system list" warning if @profile is non-empty, in order to |
2 |
support @profile as an alternative to @system. Always warn if the world |
3 |
file is empty, but drop the "Proceeding is likely to break your |
4 |
installation" message and 10 second countdown. Abort if a |
5 |
PackageSetNotFound error is encountered, or if @world is completely empty. |
6 |
Fix depclean tests to have non-empty @world set. |
7 |
--- |
8 |
[PATCH v2] makes the "no world file" message always be shown when the |
9 |
world file is empty, drops the 10 second countdown, and fixes the depclean |
10 |
tests. |
11 |
|
12 |
pym/_emerge/actions.py | 50 ++++++++++++++++++----------- |
13 |
pym/portage/tests/resolver/test_depclean.py | 10 ++++-- |
14 |
2 files changed, 40 insertions(+), 20 deletions(-) |
15 |
|
16 |
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py |
17 |
index 01aef51..a872a96 100644 |
18 |
--- a/pym/_emerge/actions.py |
19 |
+++ b/pym/_emerge/actions.py |
20 |
@@ -699,35 +699,49 @@ def calc_depclean(settings, trees, ldpath_mtimes, |
21 |
protected_set = InternalPackageSet() |
22 |
protected_set_name = '____depclean_protected_set____' |
23 |
required_sets[protected_set_name] = protected_set |
24 |
- system_set = psets["system"] |
25 |
|
26 |
+ set_error = False |
27 |
set_atoms = {} |
28 |
for k in ("profile", "system", "selected"): |
29 |
try: |
30 |
set_atoms[k] = root_config.setconfig.getSetAtoms(k) |
31 |
- except portage.exception.PackageSetNotFound: |
32 |
+ except portage.exception.PackageSetNotFound as e: |
33 |
# A nested set could not be resolved, so ignore nested sets. |
34 |
set_atoms[k] = root_config.sets[k].getAtoms() |
35 |
+ writemsg_level(_("!!! The set '%s' " |
36 |
+ "contains a non-existent set named '%s'.\n") % |
37 |
+ (k, e), level=logging.ERROR, noiselevel=-1) |
38 |
+ set_error = True |
39 |
+ |
40 |
+ # Support @profile as an alternative to @system. |
41 |
+ if not (set_atoms["system"] or set_atoms["profile"]): |
42 |
+ writemsg_level(_("!!! You have no system list.\n"), |
43 |
+ level=logging.WARNING, noiselevel=-1) |
44 |
|
45 |
- if (not set_atoms["system"] or |
46 |
- not (set_atoms["selected"] or set_atoms["profile"])): |
47 |
+ if not set_atoms["selected"]: |
48 |
+ writemsg_level(_("!!! You have no world file.\n"), |
49 |
+ level=logging.WARNING, noiselevel=-1) |
50 |
|
51 |
- if not set_atoms["system"]: |
52 |
- writemsg_level("!!! You have no system list.\n", |
53 |
+ # Suppress world file warnings unless @world is completely empty, |
54 |
+ # since having an empty world file can be a valid state. |
55 |
+ try: |
56 |
+ world_atoms = bool(root_config.setconfig.getSetAtoms('world')) |
57 |
+ except portage.exception.PackageSetNotFound as e: |
58 |
+ writemsg_level(_("!!! The set '%s' " |
59 |
+ "contains a non-existent set named '%s'.\n") % |
60 |
+ ("world", e), level=logging.ERROR, noiselevel=-1) |
61 |
+ set_error = True |
62 |
+ else: |
63 |
+ if not world_atoms: |
64 |
+ writemsg_level(_("!!! Your @world set is empty.\n"), |
65 |
level=logging.ERROR, noiselevel=-1) |
66 |
+ set_error = True |
67 |
|
68 |
- # Skip this warning if @profile is non-empty, in order to |
69 |
- # support using @profile as an alternative to @selected |
70 |
- # for building a stage 4. |
71 |
- if not (set_atoms["selected"] or set_atoms["profile"]): |
72 |
- writemsg_level("!!! You have no world file.\n", |
73 |
- level=logging.WARNING, noiselevel=-1) |
74 |
- |
75 |
- writemsg_level("!!! Proceeding is likely to " + \ |
76 |
- "break your installation.\n", |
77 |
- level=logging.WARNING, noiselevel=-1) |
78 |
- if "--pretend" not in myopts: |
79 |
- countdown(int(settings["EMERGE_WARNING_DELAY"]), ">>> Depclean") |
80 |
+ if set_error: |
81 |
+ writemsg_level(_("!!! Aborting due to set configuration " |
82 |
+ "errors displayed above.\n"), |
83 |
+ level=logging.ERROR, noiselevel=-1) |
84 |
+ return 1, [], False, 0 |
85 |
|
86 |
if action == "depclean": |
87 |
emergelog(xterm_titles, " >>> depclean") |
88 |
diff --git a/pym/portage/tests/resolver/test_depclean.py b/pym/portage/tests/resolver/test_depclean.py |
89 |
index 42350be..f3c4c63 100644 |
90 |
--- a/pym/portage/tests/resolver/test_depclean.py |
91 |
+++ b/pym/portage/tests/resolver/test_depclean.py |
92 |
@@ -165,6 +165,9 @@ class DepcleanWithExcludeTestCase(TestCase): |
93 |
"dev-libs/B-1": { "RDEPEND": "dev-libs/A" }, |
94 |
} |
95 |
|
96 |
+ # depclean asserts non-empty @world set |
97 |
+ world = ["non-empty/world-set"] |
98 |
+ |
99 |
test_cases = ( |
100 |
#Without --exclude. |
101 |
ResolverPlaygroundTestCase( |
102 |
@@ -196,7 +199,7 @@ class DepcleanWithExcludeTestCase(TestCase): |
103 |
cleanlist=[]), |
104 |
) |
105 |
|
106 |
- playground = ResolverPlayground(installed=installed) |
107 |
+ playground = ResolverPlayground(installed=installed, world=world) |
108 |
try: |
109 |
for test_case in test_cases: |
110 |
playground.run_TestCase(test_case) |
111 |
@@ -253,6 +256,9 @@ class DepcleanAndWildcardsTestCase(TestCase): |
112 |
"dev-libs/B-1": {}, |
113 |
} |
114 |
|
115 |
+ # depclean asserts non-empty @world set |
116 |
+ world = ["non-empty/world-set"] |
117 |
+ |
118 |
test_cases = ( |
119 |
ResolverPlaygroundTestCase( |
120 |
["*/*"], |
121 |
@@ -276,7 +282,7 @@ class DepcleanAndWildcardsTestCase(TestCase): |
122 |
cleanlist=[]), |
123 |
) |
124 |
|
125 |
- playground = ResolverPlayground(installed=installed) |
126 |
+ playground = ResolverPlayground(installed=installed, world=world) |
127 |
try: |
128 |
for test_case in test_cases: |
129 |
playground.run_TestCase(test_case) |
130 |
-- |
131 |
2.4.9 |