1 |
commit: d986533d1aee9e79a33da4aeac2508fc946e69e0 |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Tue Jun 5 21:45:57 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Tue Jun 5 21:45:57 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=d986533d |
7 |
|
8 |
Changes in layer over portage |
9 |
|
10 |
--- |
11 |
gpackages/libs/porttree.py | 62 ++++++++++++++++++++++++++++++++++++++++--- |
12 |
gpackages/libs/use_info.py | 2 + |
13 |
2 files changed, 59 insertions(+), 5 deletions(-) |
14 |
|
15 |
diff --git a/gpackages/libs/porttree.py b/gpackages/libs/porttree.py |
16 |
index fe2c9cf..5a4da3a 100644 |
17 |
--- a/gpackages/libs/porttree.py |
18 |
+++ b/gpackages/libs/porttree.py |
19 |
@@ -7,6 +7,7 @@ from portage.exception import PortageException, FileNotFound, InvalidAtom, \ |
20 |
from gentoolkit.package import Package as PackageInfo |
21 |
from gentoolkit.metadata import MetaData |
22 |
from generic import ToStrMixin, file_sha1, file_mtime, cached_property |
23 |
+from use_info import get_uses_info, get_local_uses_info |
24 |
import os |
25 |
|
26 |
BINDB = portage.db[portage.root]["bintree"].dbapi |
27 |
@@ -33,6 +34,13 @@ def _ebuild_environment(name): |
28 |
return lambda self: self.package_object.environment(name) |
29 |
|
30 |
|
31 |
+def _get_info_by_func(func, path1, path2): |
32 |
+ path = os.path.join(path1, path2) |
33 |
+ try: |
34 |
+ return func(path) |
35 |
+ except IOError: |
36 |
+ return None |
37 |
+ |
38 |
class Use(ToStrMixin): |
39 |
"Represend Use flag as object" |
40 |
__slots__ = ('name',) |
41 |
@@ -89,27 +97,59 @@ class Keyword(ToStrMixin): |
42 |
"Return arch name" |
43 |
return self.name |
44 |
|
45 |
+def _gen_all_use(func, iterator): |
46 |
+ use_g = iterator |
47 |
+ use_all_dict = next(use_g) |
48 |
+ for use_dict in use_g: |
49 |
+ if use_dict is not None: |
50 |
+ func(use_all_dict, use_dict) |
51 |
+ return use_all_dict |
52 |
|
53 |
class Portage(object): |
54 |
|
55 |
def iter_trees(self): |
56 |
- for tree in PORTDB.porttrees: |
57 |
- yield PortTree(tree) |
58 |
+ tree_dict = PORTDB.repositories.treemap |
59 |
+ for tree_name in PORTDB.repositories.prepos_order: |
60 |
+ yield PortTree(tree_dict[tree_name], tree_name) |
61 |
+ |
62 |
+ def iter_packages(): |
63 |
+ for tree in self.iter_trees(): |
64 |
+ for package in tree.iter_package(): |
65 |
+ yield package |
66 |
|
67 |
def iter_ebuilds(): |
68 |
for tree in self.iter_trees(): |
69 |
for ebuild in tree.iter_ebuilds(): |
70 |
yield ebuild |
71 |
|
72 |
+ def iter_use_desc(self): |
73 |
+ for tree in self.iter_trees(): |
74 |
+ yield tree.use_desc |
75 |
+ |
76 |
+ def iter_use_local_desc(self): |
77 |
+ for tree in self.iter_trees(): |
78 |
+ yield tree.use_local_desc |
79 |
+ |
80 |
+ def get_all_use_desc(self): |
81 |
+ return _gen_all_use(lambda x,y: x.update(y), self.iter_use_desc()) |
82 |
+ |
83 |
+ def get_all_use_local_desc(self): |
84 |
+ def action(all_dict, use_dict): |
85 |
+ for key, value in use_dict.iteritems(): |
86 |
+ all_dict[key].update(value) |
87 |
+ |
88 |
+ return _gen_all_use(action, self.iter_use_local_desc()) |
89 |
+ |
90 |
|
91 |
class PortTree(ToStrMixin): |
92 |
"Represent portage tree as object" |
93 |
|
94 |
- def __init__(self, porttree = '/usr/portage'): |
95 |
+ def __init__(self, tree_path = '/usr/portage', name = 'main'): |
96 |
"""Args: |
97 |
- porttree -- full path to portage tree as str |
98 |
+ tree_path -- full path to portage tree as str |
99 |
""" |
100 |
- self.porttree = porttree # TODO: it should be read-only |
101 |
+ self.porttree = tree_path |
102 |
+ self.name = name |
103 |
|
104 |
def iter_categories(self): |
105 |
for category in sorted(PORTDB.settings.categories): |
106 |
@@ -134,6 +174,18 @@ class PortTree(ToStrMixin): |
107 |
"Full path to portage tree" |
108 |
return self.porttree |
109 |
|
110 |
+ @cached_property |
111 |
+ def use_desc(self): |
112 |
+ return _get_info_by_func(get_uses_info, |
113 |
+ self.porttree_path, |
114 |
+ 'profiles/use.desc') |
115 |
+ |
116 |
+ @cached_property |
117 |
+ def use_local_desc(self): |
118 |
+ return _get_info_by_func(get_local_uses_info, |
119 |
+ self.porttree_path, |
120 |
+ 'profiles/use.local.desc') |
121 |
+ |
122 |
|
123 |
class Category(ToStrMixin): |
124 |
"Represent category of portage tree as object" |
125 |
|
126 |
diff --git a/gpackages/libs/use_info.py b/gpackages/libs/use_info.py |
127 |
index b45cda7..c89dfe6 100644 |
128 |
--- a/gpackages/libs/use_info.py |
129 |
+++ b/gpackages/libs/use_info.py |
130 |
@@ -1,6 +1,8 @@ |
131 |
import re |
132 |
from collections import defaultdict |
133 |
|
134 |
+__all__ = ('get_uses_info', 'get_local_uses_info') |
135 |
+ |
136 |
USES_RE = r'(?P<use>[^#].*) - (?P<description>.*)' |
137 |
USES_DESC_RE = r'^%s$' % USES_RE |
138 |
USES_LOCAL_DESC_RE = r'^(?P<package>[^#].*):%s$' % USES_RE |