diff --git a/README.rst b/README.rst index bc939ac..353486a 100644 --- a/README.rst +++ b/README.rst @@ -15,7 +15,6 @@ DEPENDENCIES - distribute - tornado, > 2.4.1 - pyinotify, tested with 0.9.4 -- winterpy (add ``pylib`` to ``$PYTHONPATH``) NOTE ==== @@ -28,7 +27,6 @@ TODO - [high] adding and then removing it before adding complete will result in not-in-database removing -- [high] remove winterpy dependency - [middle] disable "any" architecture via config - [low] fork to background - [low] use one common command queue (now one each repo) diff --git a/archrepo2/archreposrv.py b/archrepo2/archreposrv.py index f5806f2..54f3656 100755 --- a/archrepo2/archreposrv.py +++ b/archrepo2/archreposrv.py @@ -6,7 +6,7 @@ import logging from tornado.ioloop import IOLoop -from myutils import enable_pretty_logging +from .lib.nicelogger import enable_pretty_logging enable_pretty_logging(logging.DEBUG) from .repomon import repomon diff --git a/archrepo2/lib/__init__.py b/archrepo2/lib/__init__.py new file mode 100644 index 0000000..fe2e66a --- /dev/null +++ b/archrepo2/lib/__init__.py @@ -0,0 +1,5 @@ +''' +moduels in this directory are taken from `winterpy `_. + +last sync is at 2013-08-23. +''' diff --git a/archrepo2/lib/archpkg.py b/archrepo2/lib/archpkg.py new file mode 100644 index 0000000..7761458 --- /dev/null +++ b/archrepo2/lib/archpkg.py @@ -0,0 +1,36 @@ +import os +from collections import defaultdict, namedtuple + +from pkg_resources import parse_version + +class PkgNameInfo(namedtuple('PkgNameInfo', 'name, version, release, arch')): + def __lt__(self, other): + if self.name != other.name or self.arch != other.arch: + return NotImplemented + if self.version != other.version: + return parse_version(self.version) < parse_version(other.version) + return int(self.release) < int(other.release) + + def __gt__(self, other): + # No, try the other side please. + return NotImplemented + + @property + def fullversion(self): + return '%s-%s' % (self.version, self.release) + + @classmethod + def parseFilename(cls, filename): + return cls(*trimext(filename, 3).rsplit('-', 3)) + +def trimext(name, num=1): + for i in range(num): + name = os.path.splitext(name)[0] + return name + +def finddups(pkgs, n=1): + ret = defaultdict(list) + for f in pkgs: + name, ver, build, arch = PkgNameInfo.parseFilename(os.path.split(f)[1]) + ret[name].append('%s-%s' % (ver, build)) + return {k: sorted(v) for k, v in ret.items() if len(v) > n} diff --git a/archrepo2/lib/nicelogger.py b/archrepo2/lib/nicelogger.py new file mode 100644 index 0000000..73db677 --- /dev/null +++ b/archrepo2/lib/nicelogger.py @@ -0,0 +1,69 @@ +import sys +import time +import logging + +class TornadoLogFormatter(logging.Formatter): + def __init__(self, color, *args, **kwargs): + super().__init__(self, *args, **kwargs) + self._color = color + if color: + import curses + curses.setupterm() + if sys.hexversion < 50463728: + fg_color = str(curses.tigetstr("setaf") or + curses.tigetstr("setf") or "", "ascii") + else: + fg_color = curses.tigetstr("setaf") or curses.tigetstr("setf") or b"" + self._colors = { + logging.DEBUG: str(curses.tparm(fg_color, 4), # Blue + "ascii"), + logging.INFO: str(curses.tparm(fg_color, 2), # Green + "ascii"), + logging.WARNING: str(curses.tparm(fg_color, 3), # Yellow + "ascii"), + logging.ERROR: str(curses.tparm(fg_color, 1), # Red + "ascii"), + } + self._normal = str(curses.tigetstr("sgr0"), "ascii") + + def format(self, record): + try: + record.message = record.getMessage() + except Exception as e: + record.message = "Bad message (%r): %r" % (e, record.__dict__) + record.asctime = time.strftime( + "%m-%d %H:%M:%S", self.converter(record.created)) + record.asctime += '.%03d' % ((record.created % 1) * 1000) + prefix = '[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]' % \ + record.__dict__ + if self._color: + prefix = (self._colors.get(record.levelno, self._normal) + + prefix + self._normal) + formatted = prefix + " " + record.message + if record.exc_info: + if not record.exc_text: + record.exc_text = self.formatException(record.exc_info) + if record.exc_text: + formatted = formatted.rstrip() + "\n" + record.exc_text + return formatted.replace("\n", "\n ") + +def enable_pretty_logging(level=logging.DEBUG): + logger = logging.getLogger() + h = logging.StreamHandler() + formatter = logging.Formatter('%(asctime)s:%(levelname)-7s:%(name)-12s:%(message)s') + try: + import curses + color = False + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + formatter = TornadoLogFormatter(color=color) + except: + import traceback + traceback.print_exc() + finally: + h.setLevel(level) + h.setFormatter(formatter) + logger.setLevel(level) + logger.addHandler(h) + diff --git a/archrepo2/repomon.py b/archrepo2/repomon.py index c08b044..c380030 100755 --- a/archrepo2/repomon.py +++ b/archrepo2/repomon.py @@ -19,7 +19,7 @@ Event = pyinotify.Event from tornado.ioloop import IOLoop import tornado.process -import archpkg +from .lib import archpkg from . import pkgreader from . import dbutil diff --git a/scripts/upgrade_from_0.1_to_0.2.py b/scripts/upgrade_from_0.1_to_0.2.py index 10cfdf9..2929963 100755 --- a/scripts/upgrade_from_0.1_to_0.2.py +++ b/scripts/upgrade_from_0.1_to_0.2.py @@ -7,7 +7,7 @@ import configparser import pickle import logging -from myutils import enable_pretty_logging +from archrepo2.lib.nicelogger import enable_pretty_logging enable_pretty_logging(logging.DEBUG) import archrepo2.pkgreader diff --git a/scripts/upgrade_from_0.2_to_0.3.py b/scripts/upgrade_from_0.2_to_0.3.py index 7f36278..6951f50 100755 --- a/scripts/upgrade_from_0.2_to_0.3.py +++ b/scripts/upgrade_from_0.2_to_0.3.py @@ -6,7 +6,7 @@ import sqlite3 import pickle import logging -from myutils import enable_pretty_logging +from archrepo2.lib.nicelogger import enable_pretty_logging enable_pretty_logging(logging.DEBUG) from archrepo2.dbutil import * diff --git a/setup.py b/setup.py index f5b37b9..fb17960 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name = 'archrepo2', version = archrepo2.__version__, packages = find_packages(), - install_requires = ['tornado>2.4.1', 'pyinotify'], + install_requires = ['tornado>2.4.1', 'pyinotify', 'distribute'], entry_points = { 'console_scripts': [ 'archreposrv = archrepo2.archreposrv:main',