1 |
Author: grobian |
2 |
Date: 2008-04-14 17:48:19 +0000 (Mon, 14 Apr 2008) |
3 |
New Revision: 9892 |
4 |
|
5 |
Modified: |
6 |
main/branches/prefix/pym/portage/sets/files.py |
7 |
Log: |
8 |
Merged from trunk 9865:9866 |
9 |
|
10 |
| 9866 | store sets in a different physical location than normal | |
11 |
| genone | packages for 'world' (makes ferringb a bit happier, and might | |
12 |
| | have other advantages in the future) | |
13 |
|
14 |
This is a risky sync, as it requires Portage's ebuild to do the sets |
15 |
split from world -> world_sets. |
16 |
|
17 |
|
18 |
Modified: main/branches/prefix/pym/portage/sets/files.py |
19 |
=================================================================== |
20 |
--- main/branches/prefix/pym/portage/sets/files.py 2008-04-14 17:00:02 UTC (rev 9891) |
21 |
+++ main/branches/prefix/pym/portage/sets/files.py 2008-04-14 17:48:19 UTC (rev 9892) |
22 |
@@ -155,18 +155,75 @@ |
23 |
return rValue |
24 |
multiBuilder = classmethod(multiBuilder) |
25 |
|
26 |
-class WorldSet(StaticFileSet): |
27 |
+class WorldSet(EditablePackageSet): |
28 |
description = "Set of packages that were directly installed by the user" |
29 |
|
30 |
def __init__(self, root): |
31 |
- super(WorldSet, self).__init__(os.path.join(os.sep, root, PRIVATE_PATH.lstrip(os.sep), "world")) |
32 |
+ super(WorldSet, self).__init__() |
33 |
+ # most attributes exist twice as atoms and non-atoms are stored in |
34 |
+ # separate files |
35 |
self._lock = None |
36 |
- |
37 |
+ self._filename = os.path.join(os.sep, root, PRIVATE_PATH.lstrip(os.sep), "world") |
38 |
+ self.loader = ItemFileLoader(self._filename, self._validate) |
39 |
+ self._mtime = None |
40 |
+ |
41 |
+ self._filename2 = os.path.join(os.sep, root, PRIVATE_PATH.lstrip(os.sep), "world_sets") |
42 |
+ self.loader2 = ItemFileLoader(self._filename2, self._validate2) |
43 |
+ self._mtime2 = None |
44 |
+ |
45 |
def _validate(self, atom): |
46 |
- if atom.startswith(SETPREFIX): |
47 |
- return True |
48 |
return ValidAtomValidator(atom) |
49 |
|
50 |
+ def _validate2(self, setname): |
51 |
+ return setname.startswith(SETPREFIX) |
52 |
+ |
53 |
+ def write(self): |
54 |
+ write_atomic(self._filename, "\n".join(sorted(self._atoms))+"\n") |
55 |
+ write_atomic(self._filename2, "\n".join(sorted(self._nonatoms))+"\n") |
56 |
+ |
57 |
+ def load(self): |
58 |
+ atoms = [] |
59 |
+ nonatoms = [] |
60 |
+ # load atoms and non-atoms from different files so the worldfile is |
61 |
+ # backwards-compatible with older versions and other PMs, even though |
62 |
+ # it's supposed to be private state data :/ |
63 |
+ try: |
64 |
+ mtime = os.stat(self._filename).st_mtime |
65 |
+ except (OSError, IOError): |
66 |
+ mtime = None |
67 |
+ if (not self._loaded or self._mtime != mtime): |
68 |
+ try: |
69 |
+ data, errors = self.loader.load() |
70 |
+ for fname in errors: |
71 |
+ for e in errors[fname]: |
72 |
+ self.errors.append(fname+": "+e) |
73 |
+ except EnvironmentError, e: |
74 |
+ if e.errno != errno.ENOENT: |
75 |
+ raise |
76 |
+ del e |
77 |
+ data = {} |
78 |
+ atoms = data.keys() |
79 |
+ self._mtime = mtime |
80 |
+ try: |
81 |
+ mtime = os.stat(self._filename2).st_mtime |
82 |
+ except (OSError, IOError): |
83 |
+ mtime = None |
84 |
+ if (not self._loaded or self._mtime2 != mtime): |
85 |
+ try: |
86 |
+ data, errors = self.loader2.load() |
87 |
+ for fname in errors: |
88 |
+ for e in errors[fname]: |
89 |
+ self.errors.append(fname+": "+e) |
90 |
+ except EnvironmentError, e: |
91 |
+ if e.errno != errno.ENOENT: |
92 |
+ raise |
93 |
+ del e |
94 |
+ data = {} |
95 |
+ nonatoms = data.keys() |
96 |
+ self._mtime2 = mtime |
97 |
+ if self._atoms != atoms or self._nonatoms != nonatoms: |
98 |
+ self._setAtoms(atoms+nonatoms) |
99 |
+ |
100 |
def _ensure_dirs(self): |
101 |
ensure_dirs(os.path.dirname(self._filename), gid=portage_gid, mode=02750, mask=02) |
102 |
|
103 |
|
104 |
-- |
105 |
gentoo-commits@l.g.o mailing list |