1 |
commit: 8d1b2afae52cb0a59442f7026c44db08854c2e24 |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Thu May 31 13:33:58 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Thu May 31 13:33:58 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=8d1b2afa |
7 |
|
8 |
Add scaning utility |
9 |
|
10 |
--- |
11 |
.../packages/management/commands/scanpackages.py | 110 +++++++++++++++++++- |
12 |
gpackages/apps/packages/models.py | 28 +++-- |
13 |
gpackages/libs/porttree.py | 28 +++++- |
14 |
3 files changed, 151 insertions(+), 15 deletions(-) |
15 |
|
16 |
diff --git a/gpackages/apps/packages/management/commands/scanpackages.py b/gpackages/apps/packages/management/commands/scanpackages.py |
17 |
index 4bad968..ea6a3ef 100644 |
18 |
--- a/gpackages/apps/packages/management/commands/scanpackages.py |
19 |
+++ b/gpackages/apps/packages/management/commands/scanpackages.py |
20 |
@@ -1,9 +1,115 @@ |
21 |
from django.core.management.base import BaseCommand, CommandError |
22 |
+from packages import models |
23 |
+import porttree |
24 |
|
25 |
+import datetime |
26 |
+import logging |
27 |
+#l = logging.getLogger('django.db.backends') |
28 |
+#l.setLevel(logging.DEBUG) |
29 |
+#l.addHandler(logging.FileHandler('database.log')) |
30 |
|
31 |
class Command(BaseCommand): |
32 |
args = '' |
33 |
help = 'Will scan package tree and update info about it in database' |
34 |
- |
35 |
+ porttree = porttree.PortTree() |
36 |
def handle(self, *args, **options): |
37 |
- print("Not implement yet") |
38 |
+ licenses_cache = {} |
39 |
+ def get_licenses_objects(ebuild): |
40 |
+ licenses = ebuild.licenses |
41 |
+ license_objects = [] |
42 |
+ licenses_set = frozenset(licenses) |
43 |
+ cached_licenses = set(licenses_cache.keys()) |
44 |
+ # Getting from cache |
45 |
+ geted_licenses = set() |
46 |
+ for license in (cached_licenses & licenses_set): |
47 |
+ geted_licenses.add(license) |
48 |
+ license_objects.append(licenses_cache[license]) |
49 |
+ # Getting from database |
50 |
+ request_licenses = list(licenses_set - geted_licenses) |
51 |
+ if not request_licenses: |
52 |
+ return license_objects |
53 |
+ request = models.LicensModel.objects.filter(name__in = request_licenses) |
54 |
+ # Add to list with licenses |
55 |
+ license_objects.extend(request) |
56 |
+ # Update cache |
57 |
+ for license in request: |
58 |
+ licenses_cache[license.name] = license |
59 |
+ geted_licenses.add(license.name) |
60 |
+ # Create not existend licenses fast using bulk_create, works only in django 1.4 or gt |
61 |
+ need_create = list(licenses_set - geted_licenses) |
62 |
+ if not need_create: |
63 |
+ return license_objects |
64 |
+ creating_list = [] |
65 |
+ for license in need_create: |
66 |
+ creating_list.append(models.LicensModel(name = license)) |
67 |
+ |
68 |
+ models.LicensModel.objects.bulk_create(creating_list) |
69 |
+ # Retriwing created licenses from database |
70 |
+ request_created = models.LicensModel.objects.filter(name__in = need_create) |
71 |
+ license_objects.extend(request_created) |
72 |
+ # Update cache |
73 |
+ for license in request_created: |
74 |
+ licenses_cache[license.name] = license |
75 |
+ geted_licenses.add(license.name) |
76 |
+ return license_objects |
77 |
+ |
78 |
+ uses_cache = {} |
79 |
+ def get_uses_objects(ebuild): |
80 |
+ uses = [ use.name for use in ebuild.iter_uses() ] |
81 |
+ uses_objects = [] |
82 |
+ uses_set = frozenset(uses) |
83 |
+ cached_uses = set(uses_cache.keys()) |
84 |
+ # Getting from cache |
85 |
+ geted_uses = set() |
86 |
+ for use in (cached_uses & uses_set): |
87 |
+ geted_uses.add(use) |
88 |
+ uses_objects.append(uses_cache[use]) |
89 |
+ # Getting from database |
90 |
+ request_use = list(uses_set - geted_uses) |
91 |
+ if not request_use: |
92 |
+ return uses_objects |
93 |
+ request = models.UseFlagModel.objects.filter(name__in = request_use) |
94 |
+ # Add to list with licenses |
95 |
+ uses_objects.extend(request) |
96 |
+ # Update cache |
97 |
+ for use in request: |
98 |
+ uses_cache[use.name] = use |
99 |
+ geted_uses.add(use.name) |
100 |
+ # Create not existend licenses fast using bulk_create, works only in django 1.4 or gt |
101 |
+ need_create = list(uses_set - geted_uses) |
102 |
+ if not need_create: |
103 |
+ return license_objects |
104 |
+ creating_list = [] |
105 |
+ for use in need_create: |
106 |
+ creating_list.append(models.UseFlagModel(name = use)) |
107 |
+ |
108 |
+ models.UseFlagModel.objects.bulk_create(creating_list) |
109 |
+ # Retriwing created licenses from database |
110 |
+ request_created = models.UseFlagModel.objects.filter(name__in = need_create) |
111 |
+ uses_objects.extend(request_created) |
112 |
+ # Update cache |
113 |
+ for use in request_created: |
114 |
+ uses_cache[use.name] = use |
115 |
+ geted_uses.add(use.name) |
116 |
+ return uses_objects |
117 |
+ |
118 |
+ |
119 |
+ |
120 |
+ st = datetime.datetime.now() |
121 |
+ for category in self.porttree.iter_categories(): |
122 |
+ category_object, categor_created = models.CategoryModel.objects.get_or_create(category = category) |
123 |
+ for package in category.iter_packages(): |
124 |
+ print package |
125 |
+ package_object, package_created = models.PackageModel.objects.get_or_create(package = package, category = category_object) |
126 |
+ for ebuild in package.iter_ebuilds(): |
127 |
+ ebuild_object = models.EbuildModel() |
128 |
+ ebuild_object.init_by_ebuild(ebuild) |
129 |
+ ebuild_object.package = package_object |
130 |
+ # To Add some related objects it should have pk |
131 |
+ ebuild_object.save(force_insert=True) |
132 |
+ # Add licenses |
133 |
+ ebuild_object.licenses.add(*get_licenses_objects(ebuild)) |
134 |
+ ebuild_object.use_flags.add(*get_uses_objects(ebuild)) |
135 |
+ |
136 |
+ |
137 |
+ print (datetime.datetime.now() - st).total_seconds() |
138 |
|
139 |
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py |
140 |
index 0ef5e8c..765150a 100644 |
141 |
--- a/gpackages/apps/packages/models.py |
142 |
+++ b/gpackages/apps/packages/models.py |
143 |
@@ -49,7 +49,7 @@ class PackageModel(models.Model): |
144 |
|
145 |
if isinstance(package_object, Package): |
146 |
super(PackageModel, self).__init__() |
147 |
- self.init_by_package(package_object) |
148 |
+ self.init_by_package(package_object, category = kwargs.get('category')) |
149 |
else: |
150 |
super(PackageModel, self).__init__(*args, **kwargs) |
151 |
|
152 |
@@ -67,10 +67,13 @@ class PackageModel(models.Model): |
153 |
def __unicode__(self): |
154 |
return '%s/%s' % (self.category, self.name) |
155 |
|
156 |
- def init_by_package(self, package): |
157 |
+ def init_by_package(self, package, category = None): |
158 |
self.name = package.name |
159 |
self.update_info(package) |
160 |
- self.category, created = CategoryModel.objects.get_or_create(category = package.category) |
161 |
+ if category is None: |
162 |
+ self.category, created = CategoryModel.objects.get_or_create(category = package.category) |
163 |
+ elif isinstance(category, CategoryModel): |
164 |
+ self.category = category |
165 |
|
166 |
def update_info(self, package): |
167 |
self.changelog_hash = package.changelog_sha1 |
168 |
@@ -80,14 +83,14 @@ class PackageModel(models.Model): |
169 |
unique_together = ('name', 'category') |
170 |
|
171 |
class UseFlagModel(models.Model): |
172 |
- name = models.CharField(unique = True, max_length = 32) |
173 |
+ name = models.CharField(unique = True, max_length = 60) |
174 |
description = models.TextField(blank = True) |
175 |
|
176 |
def __unicode__(self): |
177 |
return self.name |
178 |
|
179 |
class LicensModel(models.Model): |
180 |
- name = models.CharField(unique = True, max_length = 40) |
181 |
+ name = models.CharField(unique = True, max_length = 60) |
182 |
#description = TextField() |
183 |
|
184 |
def __unicode__(self): |
185 |
@@ -107,13 +110,12 @@ class EbuildModel(models.Model): |
186 |
is_deleted = models.BooleanField(default = False) |
187 |
is_masked = models.BooleanField(default = False) |
188 |
|
189 |
- homepage = models.URLField(blank = True, null = True) |
190 |
+ homepage = models.URLField(blank = True, null = True, max_length=255) |
191 |
description = models.TextField(blank = True, null = True) |
192 |
|
193 |
objects = managers.EbuildManager() |
194 |
|
195 |
def __init__(self, *args, **kwargs ): |
196 |
- # TODO: Bug fix |
197 |
ebuild = None |
198 |
if 'ebuild' in kwargs: |
199 |
ebuild = kwargs['ebuild'] |
200 |
@@ -123,8 +125,8 @@ class EbuildModel(models.Model): |
201 |
self.init_with_keywords(ebuild) |
202 |
|
203 |
def __unicode__(self): |
204 |
- return '%s-%s' % (self.package, self.version) |
205 |
- |
206 |
+ return '%s-%s%s' % (self.package, self.version, ('-'+ self.revision if self.revision else '')) |
207 |
+ |
208 |
def init_by_ebuild(self, ebuild): |
209 |
self.is_masked = ebuild.is_masked |
210 |
self.version = ebuild.version |
211 |
@@ -133,7 +135,13 @@ class EbuildModel(models.Model): |
212 |
self.ebuild_hash = ebuild.sha1 |
213 |
self.homepage = ebuild.homepage |
214 |
self.description = ebuild.description |
215 |
- self.package = PackageModel.objects.get_or_create(package = ebuild.package)[0] |
216 |
+ |
217 |
+ def init_related(self, ebuild, package = None): |
218 |
+ self.init_by_ebuild(ebuild) |
219 |
+ if package is None: |
220 |
+ self.package = PackageModel.objects.get_or_create(package = ebuild.package)[0] |
221 |
+ elif isinstance(package, PackageModel): |
222 |
+ self.package = package |
223 |
self.save() |
224 |
l = [] |
225 |
for license in ebuild.licenses: |
226 |
|
227 |
diff --git a/gpackages/libs/porttree.py b/gpackages/libs/porttree.py |
228 |
index a54ef12..160aa6b 100644 |
229 |
--- a/gpackages/libs/porttree.py |
230 |
+++ b/gpackages/libs/porttree.py |
231 |
@@ -53,6 +53,16 @@ class Use(ToStrMixin): |
232 |
def __unicode__(self): |
233 |
return self.name |
234 |
|
235 |
+ def __eq__(self, other): |
236 |
+ self.name == other.name |
237 |
+ |
238 |
+ def __ne__(self, other): |
239 |
+ self.name != other.name |
240 |
+ |
241 |
+ def __hash__(self): |
242 |
+ return hash(self.name) |
243 |
+ |
244 |
+ |
245 |
|
246 |
class Keyword(ToStrMixin): |
247 |
status_repr = ['','~','-'] |
248 |
@@ -180,9 +190,12 @@ class Ebuild(ToStrMixin): |
249 |
l.append(keyword) |
250 |
return l |
251 |
|
252 |
+ def get_uses_names(self): |
253 |
+ return self.package_object.environment("IUSE").split() |
254 |
+ |
255 |
+ |
256 |
def iter_uses(self): |
257 |
- uses = self.package_object.environment("IUSE").split() |
258 |
- for use in uses: |
259 |
+ for use in self.get_uses_names(): |
260 |
yield Use(use) |
261 |
|
262 |
def get_uses(self): |
263 |
@@ -211,11 +224,20 @@ class Ebuild(ToStrMixin): |
264 |
def ebuild_path(self): |
265 |
return self.package_object.ebuild_path() |
266 |
|
267 |
- homepage = property(_ebuild_environment('HOMEPAGE')) |
268 |
+ homepage_val = property(_ebuild_environment('HOMEPAGE')) |
269 |
license = property(_ebuild_environment('LICENSE')) |
270 |
description = property(_ebuild_environment('DESCRIPTION')) |
271 |
|
272 |
@property |
273 |
+ def homepages(self): |
274 |
+ return self.homepage_val.split() |
275 |
+ |
276 |
+ @property |
277 |
+ def homepage(self): |
278 |
+ return self.homepages[0] if len(self.homepages)>=1 else '' |
279 |
+ |
280 |
+ |
281 |
+ @property |
282 |
def licenses(self): |
283 |
return filter(_license_filter, self.license.split()) |