Gentoo Archives: gentoo-commits

From: "André Erdmann" <dywi@×××××××.de>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/R_overlay:gsoc13/next commit in: roverlay/overlay/
Date: Wed, 05 Jun 2013 18:08:48
Message-Id: 1370455329.fc3eeb0f06119515f8db68311183172923423ded.dywi@gentoo
1 commit: fc3eeb0f06119515f8db68311183172923423ded
2 Author: André Erdmann <dywi <AT> mailerd <DOT> de>
3 AuthorDate: Wed Jun 5 18:02:09 2013 +0000
4 Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
5 CommitDate: Wed Jun 5 18:02:09 2013 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=fc3eeb0f
7
8 overlay: fix dynpool rules, remove moved ebuilds
9
10 ---
11 roverlay/overlay/category.py | 44 +++++++++++++++++++-----
12 roverlay/overlay/creator.py | 6 ++++
13 roverlay/overlay/root.py | 82 ++++++++++++++++++++++++++++++++++++++++++--
14 3 files changed, 120 insertions(+), 12 deletions(-)
15
16 diff --git a/roverlay/overlay/category.py b/roverlay/overlay/category.py
17 index 2d9b93d..baca2d1 100644
18 --- a/roverlay/overlay/category.py
19 +++ b/roverlay/overlay/category.py
20 @@ -90,6 +90,12 @@ class Category ( object ):
21 )
22 # --- end of add (...) ---
23
24 + def drop_package ( self, name ):
25 + p = self._subdirs [name]
26 + del self._subdirs [name]
27 + p.fs_destroy()
28 + # --- end of drop_package (...) ---
29 +
30 def empty ( self ):
31 """Returns True if this category contains 0 ebuilds."""
32 return (
33 @@ -98,6 +104,11 @@ class Category ( object ):
34 )
35 # --- end of empty (...) ---
36
37 + def get_nonempty ( self, name ):
38 + subdir = self._subdirs.get ( name, None )
39 + return subdir if ( subdir and not subdir.empty() ) else None
40 + # --- end of has_nonempty (...) ---
41 +
42 def has ( self, subdir ):
43 return subdir in self._subdirs
44 # --- end of has (...) ---
45 @@ -106,22 +117,37 @@ class Category ( object ):
46 return os.path.isdir ( self.physical_location + os.sep + _dir )
47 # --- end of has_category (...) ---
48
49 - def list_packages ( self, for_deprules=False ):
50 + def list_package_names ( self ):
51 + for name, subdir in self._subdirs.items():
52 + if not subdir.empty():
53 + yield name
54 + # --- end of list_package_names (...) ---
55 +
56 + def list_packages ( self,
57 + for_deprules=False, is_default_category=False
58 + ):
59 """Lists all packages in this category.
60 Yields <category>/<package name> or a dict (see for_deprules below).
61
62 arguments:
63 - * for_deprules -- if set and True:
64 - yield keyword args for dependency rules
65 + * for_deprules -- if set and True:
66 + yield keyword args for dependency rules
67 + * is_default_category -- bool indicating whether this category is the
68 + default one or not
69 """
70 -
71 - for name, subdir in self._subdirs.items():
72 - if not subdir.empty():
73 - if for_deprules:
74 + if for_deprules:
75 + for name, subdir in self._subdirs.items():
76 + if not subdir.empty():
77 yield dict (
78 - dep_str=name, resolving_package=self.name + os.sep + name
79 + dep_str = name,
80 + resolving_package = ( self.name + "/" + name ),
81 + is_selfdep = is_default_category,
82 + # prefer packages from the default category (really?)
83 + priority = 80 if is_default_category else 90,
84 )
85 - else:
86 + else:
87 + for name, subdir in self._subdirs.items():
88 + if not subdir.empty():
89 yield self.name + os.sep + name
90 # --- end of list_packages (...) ---
91
92
93 diff --git a/roverlay/overlay/creator.py b/roverlay/overlay/creator.py
94 index 8833aef..5ad86d4 100644
95 --- a/roverlay/overlay/creator.py
96 +++ b/roverlay/overlay/creator.py
97 @@ -274,6 +274,12 @@ class OverlayCreator ( object ):
98 del self.package_rules
99 # --- end of release_package_rules (...) ---
100
101 + def remove_moved_ebuilds ( self, reverse ):
102 + """See overlay.root.Overlay.remove_moved_ebuilds()."""
103 + if self.overlay.remove_duplicate_ebuilds ( reverse=reverse ):
104 + self.depresolver.reload_pools()
105 + # --- end of remove_moved_ebuilds (...) ---
106 +
107 def add_package ( self, package_info ):
108 """Adds a PackageInfo to the package queue.
109
110
111 diff --git a/roverlay/overlay/root.py b/roverlay/overlay/root.py
112 index 3adbb6e..b9030d2 100644
113 --- a/roverlay/overlay/root.py
114 +++ b/roverlay/overlay/root.py
115 @@ -259,7 +259,9 @@ class Overlay ( object ):
116 write_profiles_file ( 'repo_name', self.name + '\n' )
117
118 # profiles/categories
119 - cats = '\n'.join ( self._categories.keys() )
120 + cats = '\n'.join (
121 + k for k, v in self._categories.items() if not v.empty()
122 + )
123 if cats:
124 write_profiles_file ( 'categories', cats + '\n' )
125
126 @@ -319,6 +321,78 @@ class Overlay ( object ):
127 return os.path.isdir ( self.physical_location + os.sep + _dir )
128 # --- end of has_category (...) ---
129
130 + def find_duplicate_packages ( self, _default_category=None ):
131 + default_category = (
132 + _default_category if _default_category is None
133 + else self._categories.get ( self.default_category, None )
134 + )
135 +
136 + if default_category:
137 + duplicate_pkg = set()
138 +
139 + for category in self._categories.values():
140 + if category is not default_category:
141 + for name in category.list_package_names():
142 + if default_category.get_nonempty ( name ):
143 + duplicate_pkg.add ( name )
144 + # -- end for;
145 +
146 + return frozenset ( duplicate_pkg )
147 + else:
148 + return None
149 + # --- end of find_duplicate_packages (...) ---
150 +
151 + def remove_duplicate_ebuilds ( self, reverse ):
152 + default_category = self._categories.get ( self.default_category, None )
153 + if default_category:
154 + if reverse:
155 + d_pkg = self.find_duplicate_packages (
156 + _default_category=default_category
157 + )
158 + for pkg_name in d_pkg:
159 + default_category.drop_package ( pkg_name )
160 +
161 + else:
162 + d_pkg = set()
163 + for category in self._categories.values():
164 + if category is not default_category:
165 + for name in category.list_package_names():
166 + if default_category.get_nonempty ( name ):
167 + d_pkg.add ( name )
168 + category.drop_package ( pkg_name )
169 + # -- end for category;
170 +
171 + # -- end if;
172 +
173 + if d_pkg:
174 + self.remove_empty_categories()
175 +
176 + self.logger.info (
177 + '{} ebuilds have been removed from the default category, '
178 + 'the overlay might be broken now!'.format ( len ( d_pkg ) )
179 + )
180 + return True
181 + else:
182 + return False
183 + else:
184 + return False
185 +
186 + # --- end of remove_duplicate_ebuilds (...) ---
187 +
188 + def remove_empty_categories ( self ):
189 + catlist = self._categories.items()
190 + for cat in catlist:
191 + cat[1].remove_empty()
192 + if cat[1].empty():
193 + del self._categories [cat[0]]
194 +
195 + try:
196 + os.rmdir ( cat [1].physical_location )
197 + except OSError as ose:
198 + self.logger.exception ( ose )
199 +
200 + # --- end of remove_empty_categories (...) ---
201 +
202 def list_packages ( self, for_deprules=True ):
203 for cat in self._categories.values():
204 for package in cat.list_packages ( for_deprules=for_deprules ):
205 @@ -326,9 +400,11 @@ class Overlay ( object ):
206 # --- end of list_packages (...) ---
207
208 def list_rule_kwargs ( self ):
209 - # FIXME/TODO: depres has to recognize categories
210 for cat in self._categories.values():
211 - for kwargs in cat.list_packages ( for_deprules=True ):
212 + for kwargs in cat.list_packages (
213 + for_deprules = True,
214 + is_default_category = ( cat.name is self.default_category )
215 + ):
216 yield kwargs
217 # --- end of list_rule_kwargs (...) ---