Gentoo Archives: gentoo-commits

From: Slava Bacherikov <slava@××××××××××××××.ua>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/libs/, ...
Date: Thu, 31 May 2012 13:34:53
Message-Id: 1338471238.8d1b2afae52cb0a59442f7026c44db08854c2e24.bacher09@gentoo
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())