diff --git a/pisi/api.py b/pisi/api.py index 8765072f..a2c8b87c 100644 --- a/pisi/api.py +++ b/pisi/api.py @@ -189,6 +189,16 @@ def list_available(repo=None): """ return pisi.db.packagedb.PackageDB().list_packages(repo) +def list_newest(repo=None, since=None): + """ + Return a list of newest packages in the given repository -> list_of_strings since + last update or before. + @param repo: Repository of the packages. If repo is None than returns a list of + all the newest packages from all the repositories. + @param since: yyyy-mm-dd formatted + """ + return pisi.db.packagedb.PackageDB().list_newest(repo, since) + def list_upgradable(): """ Return a list of packages that are upgraded in the repository -> list_of_strings diff --git a/pisi/cli/pisicli.py b/pisi/cli/pisicli.py index 7897f4f6..27baf142 100644 --- a/pisi/cli/pisicli.py +++ b/pisi/cli/pisicli.py @@ -33,6 +33,7 @@ import pisi.cli.index import pisi.cli.info import pisi.cli.install import pisi.cli.history +import pisi.cli.listnewest import pisi.cli.listavailable import pisi.cli.listcomponents import pisi.cli.listinstalled diff --git a/pisi/db/historydb.py b/pisi/db/historydb.py index cf707256..0bee4ec9 100644 --- a/pisi/db/historydb.py +++ b/pisi/db/historydb.py @@ -11,6 +11,8 @@ # import os +import time +import datetime import gettext __trans = gettext.translation('pisi', fallback=True) _ = __trans.ugettext @@ -116,3 +118,15 @@ class HistoryDB(lazydb.LazyDB): hist = pisi.history.History(os.path.join(ctx.config.history_dir(), log)) hist.operation.no = int(log.split("_")[0]) yield hist.operation + + def get_last_repo_update(self, last=-1): + repoupdates = filter(lambda l:l.endswith("repoupdate.xml"), self.__logs) + repoupdates.reverse() + if not len(repoupdates) >= 2: + return None + + if last != -1 and len(repoupdates) <= last: + return None + + hist = pisi.history.History(os.path.join(ctx.config.history_dir(), repoupdates[-last])) + return hist.operation.date diff --git a/pisi/db/packagedb.py b/pisi/db/packagedb.py index 95a6106e..32bf9595 100644 --- a/pisi/db/packagedb.py +++ b/pisi/db/packagedb.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2005 - 2007, TUBITAK/UEKAE +# Copyright (C) 2005 - 2009, TUBITAK/UEKAE # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free @@ -18,8 +18,10 @@ yes, we are cheap """ import re +import time import gzip import gettext +import datetime __trans = gettext.translation('pisi', fallback=True) _ = __trans.ugettext @@ -56,17 +58,17 @@ class PackageDB(lazydb.LazyDB): def __generate_replaces(self, doc): return [x.getTagData("Name") for x in doc.tags("Package") if x.getTagData("Replaces")] - + def __generate_obsoletes(self, doc): distribution = doc.getTag("Distribution") obsoletes = distribution and distribution.getTag("Obsoletes") src_repo = doc.getTag("SpecFile") is not None - + if not obsoletes or src_repo: return [] return map(lambda x: x.firstChild().data(), obsoletes.tags("Package")) - + def __generate_packages(self, doc): return dict(map(lambda x: (x.getTagData("Name"), gzip.zlib.compress(x.toString())), doc.tags("Package"))) @@ -123,7 +125,7 @@ class PackageDB(lazydb.LazyDB): def get_obsoletes(self, repo=None): return self.odb.get_list_item(repo) - + def get_rev_deps(self, name, repo=None): try: rvdb = self.rvdb.get_item(name, repo) @@ -155,3 +157,17 @@ class PackageDB(lazydb.LazyDB): def list_packages(self, repo): return self.pdb.get_item_keys(repo) + + def list_newest(self, repo, since=None): + packages = [] + historydb = pisi.db.historydb.HistoryDB() + if since: + since_date = datetime.datetime(*time.strptime(since, "%Y-%m-%d")[0:6]) + else: + since_date = datetime.datetime(*time.strptime(historydb.get_last_repo_update(), "%Y-%m-%d")[0:6]) + + for pkg in self.list_packages(repo): + enter_date = datetime.datetime(*time.strptime(self.get_package(pkg).history[-1].date, "%Y-%m-%d")[0:6]) + if enter_date >= since_date: + packages.append(pkg) + return packages