1 |
Author: zmedico |
2 |
Date: 2009-09-29 19:35:05 +0000 (Tue, 29 Sep 2009) |
3 |
New Revision: 14462 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/Package.py |
7 |
Log: |
8 |
Add back _PackageMetadataWrapper__setitem__, removed in r14280, since removing |
9 |
it seems to cause problems. Thanks to Jeremy Olexa <darkside@g.o> for |
10 |
reporting, and Marat Radchenko <marat@××××××××××××.org> for bisecting to find |
11 |
the revision. |
12 |
|
13 |
|
14 |
Modified: main/trunk/pym/_emerge/Package.py |
15 |
=================================================================== |
16 |
--- main/trunk/pym/_emerge/Package.py 2009-09-29 06:04:42 UTC (rev 14461) |
17 |
+++ main/trunk/pym/_emerge/Package.py 2009-09-29 19:35:05 UTC (rev 14462) |
18 |
@@ -162,46 +162,42 @@ |
19 |
""" |
20 |
|
21 |
__slots__ = ("_pkg",) |
22 |
+ _wrapped_keys = frozenset( |
23 |
+ ["COUNTER", "INHERITED", "IUSE", "SLOT", "_mtime_"]) |
24 |
_use_conditional_keys = frozenset( |
25 |
['LICENSE', 'PROPERTIES', 'PROVIDE', 'RESTRICT',]) |
26 |
|
27 |
def __init__(self, pkg, metadata): |
28 |
+ dict.__init__(self) |
29 |
self._pkg = pkg |
30 |
if not pkg.built: |
31 |
# USE is lazy, but we want it to show up in self.keys(). |
32 |
self['USE'] = '' |
33 |
+ |
34 |
self.update(metadata) |
35 |
- for k, v in self.items(): |
36 |
- if k == 'INHERITED': |
37 |
- if isinstance(v, basestring): |
38 |
- v = frozenset(v.split()) |
39 |
- self._pkg.inherited = v |
40 |
- elif k == 'SLOT': |
41 |
- self._pkg.slot = v |
42 |
- elif k == 'IUSE': |
43 |
- self._pkg.iuse = self._pkg._iuse( |
44 |
- v.split(), self._pkg.root_config.iuse_implicit) |
45 |
- elif k == 'COUNTER': |
46 |
- if isinstance(v, basestring): |
47 |
- try: |
48 |
- v = long(v.strip()) |
49 |
- except ValueError: |
50 |
- v = 0 |
51 |
- self['COUNTER'] = str(v) |
52 |
- self._pkg.counter = v |
53 |
- elif k == '_mtime_': |
54 |
- if isinstance(v, basestring): |
55 |
- try: |
56 |
- v = long(v.strip()) |
57 |
- except ValueError: |
58 |
- v = 0 |
59 |
- self._pkg.mtime = v |
60 |
- elif k in self._use_conditional_keys: |
61 |
- try: |
62 |
- use_reduce(paren_reduce(v), matchall=1) |
63 |
- except portage.exception.InvalidDependString as e: |
64 |
- self._pkg._invalid_metadata(k + ".syntax", "%s: %s" % (k, e)) |
65 |
|
66 |
+ def update(self, *args, **kwargs): |
67 |
+ """dict.update() bypasses __setitem__, so override it.""" |
68 |
+ if len(args) > 1: |
69 |
+ raise TypeError( |
70 |
+ "expected at most 1 positional argument, got " + \ |
71 |
+ repr(len(args))) |
72 |
+ |
73 |
+ other = None |
74 |
+ if args: |
75 |
+ other = args[0] |
76 |
+ |
77 |
+ if other is not None: |
78 |
+ try: |
79 |
+ i = other.items() |
80 |
+ except AttributeError: |
81 |
+ i = other |
82 |
+ for k, v in i: |
83 |
+ self[k] = v |
84 |
+ |
85 |
+ if kwargs: |
86 |
+ self.update(kwargs) |
87 |
+ |
88 |
def __getitem__(self, k): |
89 |
v = dict.__getitem__(self, k) |
90 |
if k in self._use_conditional_keys: |
91 |
@@ -227,6 +223,44 @@ |
92 |
|
93 |
return v |
94 |
|
95 |
+ def __setitem__(self, k, v): |
96 |
+ dict.__setitem__(self, k, v) |
97 |
+ if k in self._wrapped_keys: |
98 |
+ getattr(self, "_set_" + k.lower())(k, v) |
99 |
+ elif k in self._use_conditional_keys: |
100 |
+ try: |
101 |
+ use_reduce(paren_reduce(v), matchall=1) |
102 |
+ except portage.exception.InvalidDependString, e: |
103 |
+ self._pkg._invalid_metadata(k + ".syntax", "%s: %s" % (k, e)) |
104 |
+ |
105 |
+ def _set_inherited(self, k, v): |
106 |
+ if isinstance(v, basestring): |
107 |
+ v = frozenset(v.split()) |
108 |
+ self._pkg.inherited = v |
109 |
+ |
110 |
+ def _set_iuse(self, k, v): |
111 |
+ self._pkg.iuse = self._pkg._iuse( |
112 |
+ v.split(), self._pkg.root_config.iuse_implicit) |
113 |
+ |
114 |
+ def _set_slot(self, k, v): |
115 |
+ self._pkg.slot = v |
116 |
+ |
117 |
+ def _set_counter(self, k, v): |
118 |
+ if isinstance(v, basestring): |
119 |
+ try: |
120 |
+ v = long(v.strip()) |
121 |
+ except ValueError: |
122 |
+ v = 0 |
123 |
+ self._pkg.counter = v |
124 |
+ |
125 |
+ def _set__mtime_(self, k, v): |
126 |
+ if isinstance(v, basestring): |
127 |
+ try: |
128 |
+ v = long(v.strip()) |
129 |
+ except ValueError: |
130 |
+ v = 0 |
131 |
+ self._pkg.mtime = v |
132 |
+ |
133 |
@property |
134 |
def properties(self): |
135 |
return self['PROPERTIES'].split() |