* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/main/, gpackages/apps/packages/, gpackages/libs/
@ 2012-06-01 21:28 Slava Bacherikov
0 siblings, 0 replies; 2+ messages in thread
From: Slava Bacherikov @ 2012-06-01 21:28 UTC (permalink / raw
To: gentoo-commits
commit: 1d3a4e88f9ab06c21c7e536439f5e014af1bee4d
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Thu May 31 17:57:20 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Thu May 31 17:57:20 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=1d3a4e88
Add saving mtime to datase.
---
gpackages/apps/packages/models.py | 8 ++++++++
gpackages/libs/porttree.py | 20 +++++++++++++++++---
gpackages/main/settings.py | 2 +-
3 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
index 765150a..b533f37 100644
--- a/gpackages/apps/packages/models.py
+++ b/gpackages/apps/packages/models.py
@@ -60,6 +60,9 @@ class PackageModel(models.Model):
changelog = models.TextField(blank = True)
changelog_hash = models.CharField(max_length = 128)
manifest_hash = models.CharField(max_length = 128)
+ changelog_mtime = models.DateTimeField(blank = True, null = True)
+ manifest_mtime = models.DateTimeField(blank = True, null = True)
+ mtime = models.DateTimeField(blank = True, null = True)
# Different versions can have different licenses, or homepages.
objects = managers.PackageManager()
@@ -76,7 +79,10 @@ class PackageModel(models.Model):
self.category = category
def update_info(self, package):
+ self.mtime = package.mtime
+ self.changelog_mtime = package.changelog_mtime
self.changelog_hash = package.changelog_sha1
+ self.manifest_mtime = package.manifest_mtime
self.manifest_hash = package.manifest_sha1
class Meta:
@@ -106,6 +112,7 @@ class EbuildModel(models.Model):
licenses = models.ManyToManyField(LicensModel)
license = models.CharField(max_length = 254, blank = True )
ebuild_hash = models.CharField(max_length = 128)
+ ebuild_mtime = models.DateTimeField(blank = True, null = True)
ebuild_datetime = models.DateTimeField(auto_now = True)
is_deleted = models.BooleanField(default = False)
is_masked = models.BooleanField(default = False)
@@ -132,6 +139,7 @@ class EbuildModel(models.Model):
self.version = ebuild.version
self.revision = ebuild.revision
self.license = ebuild.license
+ self.ebuild_mtime = ebuild.mtime
self.ebuild_hash = ebuild.sha1
self.homepage = ebuild.homepage
self.description = ebuild.description
diff --git a/gpackages/libs/porttree.py b/gpackages/libs/porttree.py
index bfd4859..d8b3da3 100644
--- a/gpackages/libs/porttree.py
+++ b/gpackages/libs/porttree.py
@@ -5,6 +5,7 @@ from portage.exception import PortageException, FileNotFound, InvalidAtom, \
InvalidDependString, InvalidPackageName
from gentoolkit.package import Package as PackageInfo
+from datetime import datetime
import hashlib
import os
@@ -25,6 +26,9 @@ def _file_path(file_name):
def _file_hash(attr):
return lambda self: file_sha1(getattr(self, attr))
+def _file_mtime(attr):
+ return lambda self: file_mtime(getattr(self, attr))
+
def _ebuild_environment(name):
return lambda self: self.package_object.environment(name)
@@ -36,6 +40,11 @@ def file_sha1(file_path):
f.close()
return sha1
+def file_mtime(file_path):
+ if os.path.exists(file_path):
+ return datetime.fromtimestamp(os.path.getmtime(file_path))
+ else:
+ return None
class ToStrMixin(object):
def __str__(self):
@@ -167,14 +176,20 @@ class Package(ToStrMixin):
def package_path(self):
return os.path.join(self.category.porttree.porttree_path, self.package)
+ mtime = property(_file_mtime("package_path"))
+
@property
def name(self):
return self.package.split('/')[1]
manifest_path = property(_file_path('Manifest'))
changelog_path = property(_file_path('ChangeLog'))
+ #Hashes
manifest_sha1 = property(_file_hash('manifest_path'))
changelog_sha1 = property(_file_hash('changelog_path'))
+ # Modify times
+ manifest_mtime = property(_file_mtime("manifest_path"))
+ changelog_mtime = property(_file_mtime("changelog_path"))
class Ebuild(ToStrMixin):
@@ -257,9 +272,8 @@ class Ebuild(ToStrMixin):
def ebuild_path(self):
return self.package_object.ebuild_path()
- @property
- def sha1(self):
- return file_sha1(self.ebuild_path)
+ sha1 = property(_file_hash("ebuild_path"))
+ mtime = property(_file_mtime("ebuild_path"))
def __unicode__(self):
return self.ebuild
diff --git a/gpackages/main/settings.py b/gpackages/main/settings.py
index 9e6c933..dd0bab4 100644
--- a/gpackages/main/settings.py
+++ b/gpackages/main/settings.py
@@ -52,7 +52,7 @@ USE_I18N = True
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
-USE_TZ = True
+USE_TZ = False
MEDIA_ROOT = os.path.join(PROJECT_ROOT,'media')
MEDIA_URL = '/media/'
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/main/, gpackages/apps/packages/, gpackages/libs/
@ 2012-06-18 21:26 Slava Bacherikov
0 siblings, 0 replies; 2+ messages in thread
From: Slava Bacherikov @ 2012-06-18 21:26 UTC (permalink / raw
To: gentoo-commits
commit: 16e3b8755017bc7b4a93663e00bf8565a1685835
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Mon Jun 18 19:01:39 2012 +0000
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Mon Jun 18 19:01:39 2012 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=16e3b875
Colect repo sources info
---
gpackages/apps/packages/models.py | 57 +++++++++++++++++++++++++
gpackages/apps/packages/scan.py | 4 +-
gpackages/libs/repo_info.py | 85 ++++++++++++++++++++++++++++++++++---
gpackages/main/urls.py | 6 ++-
4 files changed, 142 insertions(+), 10 deletions(-)
diff --git a/gpackages/apps/packages/models.py b/gpackages/apps/packages/models.py
index 6d96b42..5140911 100644
--- a/gpackages/apps/packages/models.py
+++ b/gpackages/apps/packages/models.py
@@ -3,6 +3,7 @@ from django.db import models
from porttree import Category, Package, Ebuild
import managers
from generic import get_from_kwargs_and_del
+from repo_info import REPOS_TYPE
from django.core.validators import URLValidator, validate_email
from django.core.exceptions import ValidationError
@@ -65,9 +66,65 @@ class RepositoryModel(AbstractDateTimeModel):
self.official = repo.metadata.official
self.quality = repo.metadata.int_quality
+ def add_related_feeds(self, repo):
+ ret = []
+ for feed in repo.metadata.feeds:
+ ret.append(RepositoryFeedModel(repository = self, feed = feed))
+
+ RepositoryFeedModel.objects.bulk_create(ret)
+
+ def clear_related_feeds(self):
+ RepositoryFeedModel.objects.filter(repository = self).delete()
+
+ def update_related_feeds(self, repo):
+ self.clear_related_feeds()
+ self.add_related_feeds(repo)
+
+ def add_related_sources(self, repo):
+ ret = []
+ for source in repo.metadata.sources:
+ ret.append(RepositorySourceModel(repo_type = source.source_type,
+ url = source.source_url,
+ subpath = source.source_subpath,
+ repository = self))
+
+ RepositorySourceModel.objects.bulk_create(ret)
+
+ def clear_related_sources(self):
+ self.repositorysourcemodel_set.clear()
+
+ def update_related_sources(self, repo):
+ self.clear_related_sources()
+ self.add_related_sources(repo)
+
+ def add_related(self, repo):
+ self.add_related_feeds(repo)
+ self.add_related_sources(repo)
+
def __unicode__(self):
return self.name
+class RepositoryFeedModel(models.Model):
+ repository = models.ForeignKey(RepositoryModel)
+ feed = models.URLField()
+
+ def __unicode__(self):
+ return self.feed
+
+ class Meta:
+ unique_together = ('repository', 'feed')
+
+class RepositorySourceModel(models.Model):
+ REPO_TYPE = REPOS_TYPE.get_as_tuple()
+
+ repo_type = models.PositiveSmallIntegerField(choices = REPO_TYPE)
+ url = models.CharField(max_length = 255)
+ subpath = models.CharField(max_length = 100, blank = True, null = True)
+ repository = models.ForeignKey(RepositoryModel)
+
+ def __unicode__(self):
+ return self.url
+
class CategoryModel(models.Model):
def __init__(self, *args, **kwargs):
super(CategoryModel, self).__init__(*args, **kwargs)
diff --git a/gpackages/apps/packages/scan.py b/gpackages/apps/packages/scan.py
index 6d14237..76573ce 100644
--- a/gpackages/apps/packages/scan.py
+++ b/gpackages/apps/packages/scan.py
@@ -302,7 +302,7 @@ class Scanner(object):
try:
repo = portage.get_tree_by_name(repo_name)
except ValueError:
- self.output("Bad repository name '%s'", repo.name, 1)
+ self.output("Bad repository name '%s'\n", repo_name, 1)
else:
self.scan_repo(repo, **kwargs)
@@ -315,6 +315,8 @@ class Scanner(object):
if not repo_created:
#Update modification time
repo_obj.save(force_update = True)
+ else:
+ repo_obj.add_related(repo)
self.scanpackages(repo, repo_obj, **kwargs)
diff --git a/gpackages/libs/repo_info.py b/gpackages/libs/repo_info.py
index 4deee56..cce3d4f 100644
--- a/gpackages/libs/repo_info.py
+++ b/gpackages/libs/repo_info.py
@@ -1,3 +1,4 @@
+from functools import total_ordering
# Layman API
from layman.api import LaymanAPI
layman_api = LaymanAPI()
@@ -5,6 +6,8 @@ layman_api = LaymanAPI()
# Validators
from validators import validate_url, validate_email, ValidationError
+from generic import ToStrMixin, cached_property
+
__all__ = ('TreeMetadata',)
def _gen_funct(name):
@@ -12,6 +15,61 @@ def _gen_funct(name):
func.__name__ = name
return func
+class Enum(object):
+
+ def __init__(self, lst):
+ dct = {}
+ dct2 = {}
+ self.list = lst
+ for num, item in enumerate(lst):
+ dct[item] = num
+ dct2[num] = item
+
+ self.repo_dict = dct
+ self.num_dict = dct2
+
+ def get_as_tuple(self):
+ return tuple([(num, item) for num, item in enumerate(self.list)])
+
+
+REPO_TYPE = ( 'git',
+ 'g-common',
+ 'cvs' ,
+ 'subversion',
+ 'rsync',
+ 'tar',
+ 'bzr',
+ 'mercurial',
+ 'darcs',
+ )
+
+REPOS_TYPE = Enum(REPO_TYPE)
+
+
+@total_ordering
+class SourcesObject(ToStrMixin):
+
+ def __init__(self, source_tuple):
+ self.source_url = source_tuple[0].lower()
+ self.source_type = REPOS_TYPE.repo_dict[source_tuple[1].lower()]
+ self.source_subpath = source_tuple[2]
+
+ def __hash__(self):
+ return hash(self.source_url)
+
+ def __eq__(self, other):
+ return self.source_url == other.source_url
+
+ def __lt__(self, other):
+ return self.source_url < other.source_url
+
+ @property
+ def type(self):
+ return REPOS_TYPE.num_dict[self.source_type]
+
+ def __unicode__(self):
+ return self.source_url
+
class TreeMetadataMetaclass(type):
def __init__(cls, name, bases, dct):
@@ -19,7 +77,7 @@ class TreeMetadataMetaclass(type):
for v in cls.simple_attrs:
setattr(cls, v, property(_gen_funct(v)))
-class TreeMetadata(object):
+class TreeMetadata(ToStrMixin):
__metaclass__ = TreeMetadataMetaclass
simple_attrs = ( 'name', 'description', 'supported', 'owner_name',
@@ -29,6 +87,8 @@ class TreeMetadata(object):
qualities = {'stable': 0 , 'testing': 1, 'experimental': 2}
def __init__(self, repo_name, dct = None):
+ self.repo_name = repo_name
+
if dct is None:
dct = self._get_info(repo_name)
@@ -49,13 +109,14 @@ class TreeMetadata(object):
'quality': 'stable',
'status': 'official',
'feeds': [],
+ 'sources': [],
}
@property
def int_status(self):
return self.statuses.get(self._dct['status'], 1)
- @property
+ @cached_property
def homepage(self):
homepage = self._dct.get('homepage')
try:
@@ -65,7 +126,7 @@ class TreeMetadata(object):
else:
return homepage
- @property
+ @cached_property
def owner_email(self):
email = self._dct.get('owner_email')
try:
@@ -75,19 +136,29 @@ class TreeMetadata(object):
else:
return email
- @property
+ @cached_property
def feeds(self):
- ret = []
+ ret = set()
for feed in self._dct.get('feeds', ()):
try:
validate_url(feed)
except ValidationError:
pass
else:
- ret.append(feed)
- return ret
+ ret.add(feed)
+ return list(ret)
+
+ @cached_property
+ def sources(self):
+ ret = set()
+ for source in self._dct['sources']:
+ ret.add(SourcesObject(source))
+ return list(ret)
@property
def int_quality(self):
return self.qualities.get(self._dct['quality'], 2)
+ def __unicode__(self):
+ return self.repo_name
+
diff --git a/gpackages/main/urls.py b/gpackages/main/urls.py
index 8e8c588..9975cdc 100644
--- a/gpackages/main/urls.py
+++ b/gpackages/main/urls.py
@@ -22,13 +22,15 @@ if DEBUG:
LicenseModel, CategoryModel, Keyword, \
ArchesModel, HomepageModel, HerdsModel, \
MaintainerModel, UseFlagDescriptionModel, \
- RepositoryModel, VirtualPackageModel
+ RepositoryModel, VirtualPackageModel, \
+ RepositoryFeedModel, RepositorySourceModel
databrowse.site.register(EbuildModel, PackageModel, UseFlagModel,
LicenseModel, CategoryModel, Keyword, ArchesModel,
HomepageModel, HerdsModel, MaintainerModel,
UseFlagDescriptionModel, RepositoryModel,
- VirtualPackageModel)
+ VirtualPackageModel, RepositoryFeedModel,
+ RepositorySourceModel)
urlpatterns += (
url(r'^data/(.*)', databrowse.site.root),
url(r'^templateview/(?P<templatename>.*)/?$', TemplatesDebugView.as_view()),
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-06-18 21:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-01 21:28 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/main/, gpackages/apps/packages/, gpackages/libs/ Slava Bacherikov
-- strict thread matches above, loose matches on Subject: below --
2012-06-18 21:26 Slava Bacherikov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox