public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [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